X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=examples%2Funion-example%2Funion_example.go;h=cdba2faebc1723db764a5c3a02cee0565951ea09;hb=c7ae74a95d1bd6fefcbb061f5f045c60c11e32fc;hp=22fb362fcd78e9a1e593be8c6a97a062aa2cbac0;hpb=c4522fe10317b1729a0820dc880afc78c663f64d;p=govpp.git diff --git a/examples/union-example/union_example.go b/examples/union-example/union_example.go index 22fb362..cdba2fa 100644 --- a/examples/union-example/union_example.go +++ b/examples/union-example/union_example.go @@ -16,88 +16,115 @@ package main import ( - "bytes" "fmt" - "log" - "net" - + "git.fd.io/govpp.git/codec" + "git.fd.io/govpp.git/examples/binapi/interfaces" "git.fd.io/govpp.git/examples/binapi/ip" - "github.com/lunixbochs/struc" + "git.fd.io/govpp.git/examples/binapi/ip_types" + "log" + "reflect" ) +func init() { + log.SetFlags(0) +} + func main() { - encodingExample() - usageExample() + constructExample() + + encodingExampleIP() + + // convert IP from string form into Address type containing union + convertIP("10.10.1.1") + convertIP("ff80::1") + + // convert IP from string form into Prefix type + convertIPPrefix("20.10.1.1/24") + convertIPPrefix("21.10.1.1") + convertIPPrefix("ff90::1/64") + convertIPPrefix("ff91::1") + + // convert MAC address from string into MacAddress + convertToMacAddress("00:10:ab:4f:00:01") +} + +func constructExample() { + var union ip_types.AddressUnion + + // create AddressUnion with AdressUnionXXX constructors + union = ip_types.AddressUnionIP4(ip_types.IP4Address{192, 168, 1, 10}) + union = ip_types.AddressUnionIP6(ip_types.IP6Address{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}) + + // set AddressUnion with SetXXX methods + union.SetIP4(ip_types.IP4Address{192, 168, 1, 10}) + union.SetIP6(ip_types.IP6Address{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}) } -func encodingExample() { - // create union with IPv4 address - var unionIP4 ip.AddressUnion - unionIP4.SetIP4(ip.IP4Address{192, 168, 1, 10}) +func encodingExampleIP() { + var c = codec.DefaultCodec - // use it in the Address type - addr := &ip.Address{ - Af: ip.ADDRESS_IP4, - Un: ip.AddressUnionIP4(ip.IP4Address{192, 168, 1, 10}), + // encode this message + var msg = ip.IPPuntRedirect{ + Punt: ip.PuntRedirect{ + Nh: ip_types.Address{ + Af: ip_types.ADDRESS_IP4, + Un: ip_types.AddressUnionIP4(ip_types.IP4Address{192, 168, 1, 10}), + }, + }, + IsAdd: true, } - log.Printf("encoding union IPv4: %v", addr.Un.GetIP4()) + log.Printf("encoding message: %+v", msg) - // encode the address with union - data := encode(addr) - // decode the address with union - addr2 := decode(data) + b, err := c.EncodeMsg(&msg, 1) + if err != nil { + log.Fatal(err) + } - log.Printf("decoded union IPv4: %v", addr2.Un.GetIP4()) -} + // 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) -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) + // compare the messages + if !reflect.DeepEqual(msg, msg2) { + log.Fatal("messages are not equal") } - return buf.Bytes() } -func decode(data []byte) *ip.Address { - addr := new(ip.Address) - buf := bytes.NewReader(data) - if err := struc.Unpack(buf, addr); err != nil { - panic(err) +func convertIP(ip string) { + addr, err := ip_types.ParseAddress(ip) + if err != nil { + log.Printf("error converting IP to Address: %v", err) + return } - log.Printf("decoded address: %#v", addr) - return addr + fmt.Printf("converted IP %q to: %+v\n", ip, addr) + + ipStr := addr.ToString() + fmt.Printf("Address converted back to string IP %+v to: %q\n", addr, ipStr) } -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) +func convertIPPrefix(ip string) { + prefix, err := ip_types.ParsePrefix(ip) + if err != nil { + log.Printf("error converting prefix to IP4Prefix: %v", err) + return } + fmt.Printf("converted prefix %q to: %+v\n", ip, prefix) - convAddr("10.10.10.10") - convAddr("::1") - convAddr("") + ipStr := prefix.ToString() + fmt.Printf("IP4Prefix converted back to string prefix %+v to: %q\n", prefix, ipStr) } -func ipToAddress(ipstr string) (addr ip.Address, err error) { - netIP := net.ParseIP(ipstr) - if netIP == nil { - return ip.Address{}, fmt.Errorf("invalid IP: %q", ipstr) - } - if ip4 := netIP.To4(); ip4 == nil { - addr.Af = ip.ADDRESS_IP6 - var ip6addr ip.IP6Address - copy(ip6addr[:], netIP.To16()) - addr.Un.SetIP6(ip6addr) - } else { - addr.Af = ip.ADDRESS_IP4 - var ip4addr ip.IP4Address - copy(ip4addr[:], ip4) - addr.Un.SetIP4(ip4addr) +func convertToMacAddress(mac string) { + parsedMac, err := interfaces.ParseMAC(mac) + if err != nil { + log.Printf("error converting MAC to MacAddress: %v", err) + return } - return -} + fmt.Printf("converted prefix %q to: %+v\n", mac, parsedMac) + + macStr := parsedMac.ToString() + fmt.Printf("MacAddress converted back to string %+v to: %q\n", parsedMac, macStr) +} \ No newline at end of file