X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=examples%2Funion-example%2Funion_example.go;h=6d4619dbc387c3ce110a9060983c6e5e40e118d3;hb=ceed73403bdb61387d04be8b47183e9c4a970749;hp=d4563c666f747609334637eb9c26009955df9458;hpb=fa21c9d726ebb807895a8571af9a16dab5cd8d6e;p=govpp.git diff --git a/examples/union-example/union_example.go b/examples/union-example/union_example.go index d4563c6..6d4619d 100644 --- a/examples/union-example/union_example.go +++ b/examples/union-example/union_example.go @@ -16,71 +16,82 @@ package main import ( - "bytes" "fmt" "log" "net" + "reflect" - "git.fd.io/govpp.git/examples/bin_api/ip" - "github.com/lunixbochs/struc" + "git.fd.io/govpp.git/codec" + "git.fd.io/govpp.git/examples/binapi/ip" + "git.fd.io/govpp.git/examples/binapi/ip_types" ) +func init() { + log.SetFlags(0) +} + func main() { + constructExample() + encodingExample() - usageExample() + + // convert IP from string form into Address type containing union + convertIP("10.10.1.1") + convertIP("ff80::1") } -func encodingExample() { - // create union with IPv4 address - var unionIP4 ip.AddressUnion - unionIP4.SetIP4(ip.IP4Address{192, 168, 1, 10}) - - // use it in the Address type - addr := &ip.Address{ - Af: ip.ADDRESS_IP4, - Un: ip.AddressUnionIP4(ip.IP4Address{192, 168, 1, 10}), - } - log.Printf("encoding union IPv4: %v", addr.Un.GetIP4()) +func constructExample() { + var union ip_types.AddressUnion - // encode the address with union - data := encode(addr) - // decode the address with union - addr2 := decode(data) + // create AddressUnion with AdressUnionXXX constructors + union = ip_types.AddressUnionIP4(ip.IP4Address{192, 168, 1, 10}) + union = ip_types.AddressUnionIP6(ip.IP6Address{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}) - log.Printf("decoded union IPv4: %v", addr2.Un.GetIP4()) + // set AddressUnion with SetXXX methods + union.SetIP4(ip.IP4Address{192, 168, 1, 10}) + union.SetIP6(ip.IP6Address{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}) } -func encode(addr *ip.Address) []byte { - log.Printf("encoding address: %#v", addr) - buf := new(bytes.Buffer) - if err := struc.Pack(buf, addr); err != nil { - panic(err) +func encodingExample() { + var c = codec.DefaultCodec + + // encode this message + var msg = ip.IPPuntRedirect{ + Punt: ip.PuntRedirect{ + Nh: ip_types.Address{ + Af: ip_types.ADDRESS_IP4, + Un: ip_types.AddressUnionIP4(ip.IP4Address{192, 168, 1, 10}), + }, + }, + IsAdd: true, } - return buf.Bytes() -} + log.Printf("encoding message: %+v", msg) -func decode(data []byte) *ip.Address { - addr := new(ip.Address) - buf := bytes.NewReader(data) - if err := struc.Unpack(buf, addr); err != nil { - panic(err) + b, err := c.EncodeMsg(&msg, 1) + if err != nil { + log.Fatal(err) } - log.Printf("decoded address: %#v", addr) - return addr -} -func usageExample() { - var convAddr = func(ip string) { - addr, err := ipToAddress(ip) - if err != nil { - log.Printf("converting ip %q failed: %v", ip, err) - } - fmt.Printf("% 0X\n", addr) + // decode into this message + var msg2 ip.IPPuntRedirect + if err := c.DecodeMsg(b, &msg2); err != nil { + log.Fatal(err) } + log.Printf("decoded message: %+v", msg2) - convAddr("10.10.10.10") - convAddr("::1") - convAddr("") + // compare the messages + if !reflect.DeepEqual(msg, msg2) { + log.Fatal("messages are not equal") + } +} + +func convertIP(ip string) { + addr, err := ipToAddress(ip) + if err != nil { + log.Printf("error converting IP: %v", err) + return + } + fmt.Printf("converted IP %q to: %+v\n", ip, addr) } func ipToAddress(ipstr string) (addr ip.Address, err error) { @@ -89,14 +100,14 @@ func ipToAddress(ipstr string) (addr ip.Address, err error) { return ip.Address{}, fmt.Errorf("invalid IP: %q", ipstr) } if ip4 := netIP.To4(); ip4 == nil { - addr.Af = ip.ADDRESS_IP6 + addr.Af = ip_types.ADDRESS_IP6 var ip6addr ip.IP6Address copy(ip6addr[:], netIP.To16()) addr.Un.SetIP6(ip6addr) } else { - addr.Af = ip.ADDRESS_IP4 + addr.Af = ip_types.ADDRESS_IP4 var ip4addr ip.IP4Address - copy(ip4addr[:], ip4) + copy(ip4addr[:], ip4.To4()) addr.Un.SetIP4(ip4addr) } return