1 // Copyright (c) 2018 Cisco and/or its affiliates.
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at:
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
15 // union-example is an example to show how to use unions in VPP binary API.
20 "git.fd.io/govpp.git/codec"
21 "git.fd.io/govpp.git/examples/binapi/interfaces"
22 "git.fd.io/govpp.git/examples/binapi/ip"
23 "git.fd.io/govpp.git/examples/binapi/ip_types"
37 // convert IP from string form into Address type containing union
38 convertIP("10.10.1.1")
41 // convert IP from string form into Prefix type
42 convertIPPrefix("20.10.1.1/24")
43 convertIPPrefix("21.10.1.1")
44 convertIPPrefix("ff90::1/64")
45 convertIPPrefix("ff91::1")
47 // convert MAC address from string into MacAddress
48 convertToMacAddress("00:10:ab:4f:00:01")
51 func constructExample() {
52 var union ip_types.AddressUnion
54 // create AddressUnion with AdressUnionXXX constructors
55 union = ip_types.AddressUnionIP4(ip_types.IP4Address{192, 168, 1, 10})
56 union = ip_types.AddressUnionIP6(ip_types.IP6Address{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02})
58 // set AddressUnion with SetXXX methods
59 union.SetIP4(ip_types.IP4Address{192, 168, 1, 10})
60 union.SetIP6(ip_types.IP6Address{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02})
63 func encodingExampleIP() {
64 var c = codec.DefaultCodec
66 // encode this message
67 var msg = ip.IPPuntRedirect{
68 Punt: ip.PuntRedirect{
70 Af: ip_types.ADDRESS_IP4,
71 Un: ip_types.AddressUnionIP4(ip_types.IP4Address{192, 168, 1, 10}),
76 log.Printf("encoding message: %+v", msg)
78 b, err := c.EncodeMsg(&msg, 1)
83 // decode into this message
84 var msg2 ip.IPPuntRedirect
85 if err := c.DecodeMsg(b, &msg2); err != nil {
88 log.Printf("decoded message: %+v", msg2)
90 // compare the messages
91 if !reflect.DeepEqual(msg, msg2) {
92 log.Fatal("messages are not equal")
96 func convertIP(ip string) {
97 addr, err := ip_types.ParseAddress(ip)
99 log.Printf("error converting IP to Address: %v", err)
102 fmt.Printf("converted IP %q to: %+v\n", ip, addr)
104 ipStr := addr.ToString()
105 fmt.Printf("Address converted back to string IP %+v to: %q\n", addr, ipStr)
108 func convertIPPrefix(ip string) {
109 prefix, err := ip_types.ParsePrefix(ip)
111 log.Printf("error converting prefix to IP4Prefix: %v", err)
114 fmt.Printf("converted prefix %q to: %+v\n", ip, prefix)
116 ipStr := prefix.ToString()
117 fmt.Printf("IP4Prefix converted back to string prefix %+v to: %q\n", prefix, ipStr)
120 func convertToMacAddress(mac string) {
121 parsedMac, err := interfaces.ParseMAC(mac)
123 log.Printf("error converting MAC to MacAddress: %v", err)
126 fmt.Printf("converted prefix %q to: %+v\n", mac, parsedMac)
128 macStr := parsedMac.ToString()
129 fmt.Printf("MacAddress converted back to string %+v to: %q\n", parsedMac, macStr)