Refactored binapi generator with message encoding
[govpp.git] / codec / marshaler_test.go
diff --git a/codec/marshaler_test.go b/codec/marshaler_test.go
new file mode 100644 (file)
index 0000000..9a1887b
--- /dev/null
@@ -0,0 +1,712 @@
+//  Copyright (c) 2020 Cisco and/or its affiliates.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at:
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package codec_test
+
+import (
+       "bytes"
+       "encoding/binary"
+       "reflect"
+       "testing"
+
+       "github.com/lunixbochs/struc"
+
+       "git.fd.io/govpp.git/api"
+       "git.fd.io/govpp.git/codec"
+       "git.fd.io/govpp.git/examples/binapi/fib_types"
+       "git.fd.io/govpp.git/examples/binapi/interface_types"
+       "git.fd.io/govpp.git/examples/binapi/interfaces"
+       "git.fd.io/govpp.git/examples/binapi/ip"
+       "git.fd.io/govpp.git/examples/binapi/ip_types"
+       "git.fd.io/govpp.git/examples/binapi/sr"
+)
+
+/*func TestNewCodecEncodeDecode(t *testing.T) {
+       tests := []struct {
+               name string
+               msg  Codec
+       }{
+               {
+                       "", &TestAllMsg{
+                               Bool:        true,
+                               AliasUint32: 5,
+                               AliasArray:  MacAddress{0x11, 0x22, 0x33, 0x44, 0x55, 0x66},
+                               BaseArray:   []uint32{0x00, 0x00, 0x00, 0x00},
+                               Enum:        IF_STATUS_API_FLAG_LINK_UP,
+                               Uint8:       8,
+                               Uint16:      16,
+                               Uint32:      32,
+                               Int8:        88,
+                               Int16:       1616,
+                               Int32:       3232,
+                               Slice:       []byte{10, 20, 30, 40, 0, 0, 0},
+                               String:      "abcdefghikl",
+                               SizeOf:      2,
+                               VariableSlice: []SliceType{
+                                       {Proto: IP_API_PROTO_AH},
+                                       {Proto: IP_API_PROTO_ESP},
+                               },
+                               TypeUnion: Address{
+                                       Af: ADDRESS_IP4,
+                                       Un: AddressUnionIP4(IP4Address{1, 2, 3, 4}),
+                               },
+                       },
+               },
+       }
+       for _, test := range tests {
+               t.Run(test.name, func(t *testing.T) {
+                       data, err := test.msg.Marshal()
+                       if err != nil {
+                               t.Fatalf("expected nil error, got: %v", err)
+                       }
+
+                       var m2 TestAllMsg
+                       if err := m2.Unmarshal(data); err != nil {
+                               t.Fatalf("expected nil error, got: %v", err)
+                       }
+
+                       t.Logf("Data:\nOLD: %+v\nNEW: %+v", m, &m2)
+
+                       if !reflect.DeepEqual(m, &m2) {
+                               t.Fatalf("newData differs from oldData")
+                       }
+               })
+       }
+}*/
+
+func NewTestAllMsg() *TestAllMsg {
+       return &TestAllMsg{
+               Bool:        true,
+               AliasUint32: 5,
+               AliasArray:  MacAddress{0x11, 0x22, 0x33, 0x44, 0x55, 0x66},
+               BaseArray:   []uint32{0x00, 0x00, 0x00, 0x00},
+               Enum:        IF_STATUS_API_FLAG_LINK_UP,
+               Uint8:       8,
+               Uint16:      16,
+               Uint32:      32,
+               Int8:        88,
+               Int16:       1616,
+               Int32:       3232,
+               Slice:       []byte{10, 20, 30, 40, 0, 0, 0},
+               String:      "abcdefghikl",
+               SizeOf:      2,
+               VariableSlice: []SliceType{
+                       {Proto: IP_API_PROTO_AH},
+                       {Proto: IP_API_PROTO_ESP},
+               },
+               TypeUnion: Address{
+                       Af: ADDRESS_IP4,
+                       Un: AddressUnionIP4(IP4Address{1, 2, 3, 4}),
+               },
+       }
+}
+
+func TestNewCodecEncodeDecode_(t *testing.T) {
+       m := NewTestAllMsg()
+
+       data, err := m.Marshal(nil)
+       if err != nil {
+               t.Fatalf("expected nil error, got: %v", err)
+       }
+
+       var m2 TestAllMsg
+       if err := m2.Unmarshal(data); err != nil {
+               t.Fatalf("expected nil error, got: %v", err)
+       }
+
+       t.Logf("Data:\nOLD: %+v\nNEW: %+v", m, &m2)
+
+       if !reflect.DeepEqual(m, &m2) {
+               t.Fatalf("newData differs from oldData")
+       }
+}
+
+// -------------
+
+func TestNewCodecEncodeDecode3(t *testing.T) {
+       m := NewTestAllMsg()
+       data, err := m.Marshal(nil)
+       if err != nil {
+               t.Fatalf("expected nil error, got: %v", err)
+       }
+
+       var m2 TestAllMsg
+       if err := m2.Unmarshal(data); err != nil {
+               t.Fatalf("expected nil error, got: %v", err)
+       }
+
+       t.Logf("Data:\nOLD: %+v\nNEW: %+v", m, &m2)
+
+       if !reflect.DeepEqual(m, &m2) {
+               t.Fatalf("newData differs from oldData")
+       }
+}
+func TestNewCodecEncodeDecode4(t *testing.T) {
+       m := &interfaces.SwInterfaceSetRxMode{
+               Mode:         interface_types.RX_MODE_API_POLLING,
+               QueueID:      70000,
+               QueueIDValid: true,
+               SwIfIndex:    300,
+       }
+
+       b := make([]byte, 2+m.Size())
+
+       data, err := m.Marshal(b[2:])
+       if err != nil {
+               t.Fatalf("expected nil error, got: %v", err)
+       }
+
+       t.Logf("ENCODED DATA(%d): % 03x", len(data), data)
+
+       var m2 interfaces.SwInterfaceSetRxMode
+       if err := m2.Unmarshal(b[2:]); err != nil {
+               t.Fatalf("expected nil error, got: %v", err)
+       }
+
+       t.Logf("Data:\nOLD: %+v\nNEW: %+v", m, &m2)
+
+       if !reflect.DeepEqual(m, &m2) {
+               t.Fatalf("newData differs from oldData")
+       }
+}
+func TestNewCodecEncodeDecode2(t *testing.T) {
+       m := &sr.SrPoliciesDetails{
+               Bsid:        sr.IP6Address{00, 11, 22, 33, 44, 55, 66, 77, 88, 99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
+               IsSpray:     true,
+               IsEncap:     false,
+               FibTable:    33,
+               NumSidLists: 1,
+               SidLists: []sr.Srv6SidList{
+                       {
+                               Weight:  555,
+                               NumSids: 2,
+                               Sids: [16]sr.IP6Address{
+                                       {99},
+                                       {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
+                               },
+                       },
+               },
+       }
+
+       b := make([]byte, 0, m.Size())
+       data, err := m.Marshal(b)
+       if err != nil {
+               t.Fatalf("expected nil error, got: %v", err)
+       }
+
+       t.Logf("ENCODED DATA(%d): % 03x", len(data), data)
+
+       var m2 sr.SrPoliciesDetails
+       if err := m2.Unmarshal(data); err != nil {
+               t.Fatalf("expected nil error, got: %v", err)
+       }
+
+       t.Logf("Data:\nOLD: %+v\nNEW: %+v", m, &m2)
+
+       if !reflect.DeepEqual(m, &m2) {
+               t.Fatalf("newData differs from oldData")
+       }
+}
+
+func TestNewCodecEncode(t *testing.T) {
+       //m := NewIPRouteLookupReply()
+       m := &sr.SrPoliciesDetails{
+               Bsid:        sr.IP6Address{00, 11, 22, 33, 44, 55, 66, 77, 88, 99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
+               IsSpray:     true,
+               IsEncap:     false,
+               FibTable:    33,
+               NumSidLists: 1,
+               SidLists: []sr.Srv6SidList{
+                       {
+                               Weight:  555,
+                               NumSids: 2,
+                               Sids: [16]sr.IP6Address{
+                                       {99},
+                                       {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
+                               },
+                       },
+               },
+       }
+
+       size := m.Size()
+       t.Logf("size: %d", size)
+
+       var err error
+       var oldData, newData []byte
+       {
+               var c codec.OldCodec
+               oldData, err = c.Marshal(m)
+               if err != nil {
+                       t.Fatalf("expected nil error, got: %v", err)
+               }
+       }
+       {
+               newData, err = m.Marshal(nil)
+               if err != nil {
+                       t.Fatalf("expected nil error, got: %v", err)
+               }
+       }
+       t.Logf("Data:\nOLD[%d]: % 03x\nNEW[%d]: % 03x", len(oldData), oldData, len(newData), newData)
+
+       if !bytes.Equal(oldData, newData) {
+               t.Fatalf("newData differs from oldData")
+       }
+}
+
+func TestNewCodecDecode(t *testing.T) {
+       /*m := &ip.IPRouteLookupReply{}
+       size := m.Size()
+       t.Logf("size: %d", size)*/
+       data := []byte{
+               0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03,
+               0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00,
+               0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00,
+               0x00, 0x00, 0x08, 0x09, 0x0a, 0x00, 0x00, 0x00,
+               0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+               0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+               0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0x09, 0x00,
+               0x00, 0x00, 0x08, 0x07, 0x06, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       }
+
+       var err error
+       var oldData, newData ip.IPRouteLookupReply
+       {
+               var c codec.OldCodec
+               err = c.Unmarshal(data, &oldData)
+               if err != nil {
+                       t.Errorf("expected nil error, got: %v", err)
+               }
+       }
+       {
+               err = newData.Unmarshal(data)
+               if err != nil {
+                       t.Errorf("expected nil error, got: %v", err)
+               }
+       }
+       t.Logf("Data:\nOLD: %+v\nNEW: %+v", oldData, newData)
+
+       if !reflect.DeepEqual(oldData, newData) {
+               t.Fatalf("newData differs from oldData")
+       }
+}
+
+func NewIPRouteLookupReply() *ip.IPRouteLookupReply {
+       return &ip.IPRouteLookupReply{
+               Retval: 1,
+               Route: ip.IPRoute{
+                       TableID:    3,
+                       StatsIndex: 5,
+                       Prefix: ip.Prefix{
+                               Address: ip_types.Address{
+                                       Af: fib_types.ADDRESS_IP6,
+                                       Un: ip_types.AddressUnion{},
+                               },
+                               Len: 24,
+                       },
+                       NPaths: 2,
+                       Paths: []ip.FibPath{
+                               {
+                                       SwIfIndex:  5,
+                                       TableID:    6,
+                                       RpfID:      8,
+                                       Weight:     9,
+                                       Preference: 10,
+                                       Type:       11,
+                                       Flags:      1,
+                                       Proto:      2,
+                                       Nh: ip.FibPathNh{
+                                               Address:            ip.AddressUnion{},
+                                               ViaLabel:           3,
+                                               ObjID:              1,
+                                               ClassifyTableIndex: 2,
+                                       },
+                                       NLabels: 1,
+                                       LabelStack: [16]ip.FibMplsLabel{
+                                               {
+                                                       IsUniform: 9,
+                                                       Label:     8,
+                                                       TTL:       7,
+                                                       Exp:       6,
+                                               },
+                                       },
+                               },
+                               {
+                                       SwIfIndex:  7,
+                                       TableID:    6,
+                                       RpfID:      8,
+                                       Weight:     9,
+                                       Preference: 10,
+                                       Type:       11,
+                                       Flags:      1,
+                                       Proto:      1,
+                                       Nh: ip.FibPathNh{
+                                               Address:            ip.AddressUnion{},
+                                               ViaLabel:           3,
+                                               ObjID:              1,
+                                               ClassifyTableIndex: 2,
+                                       },
+                                       NLabels: 2,
+                                       LabelStack: [16]ip.FibMplsLabel{
+                                               {
+                                                       IsUniform: 9,
+                                                       Label:     8,
+                                                       TTL:       7,
+                                                       Exp:       6,
+                                               },
+                                               {
+                                                       IsUniform: 10,
+                                                       Label:     8,
+                                                       TTL:       7,
+                                                       Exp:       6,
+                                               },
+                                       },
+                               },
+                       },
+               },
+       }
+}
+
+func TestSize(t *testing.T) {
+       m := NewTestAllMsg()
+       size := binary.Size(*m)
+       t.Logf("size: %v", size)
+}
+
+func (m *TestAllMsg) Marshal(b []byte) ([]byte, error) {
+       order := binary.BigEndian
+       tmp := make([]byte, 143)
+       pos := 0
+
+       tmp[pos] = boolToUint(m.Bool)
+       pos += 1
+
+       tmp[pos] = m.Uint8
+       pos += 1
+
+       order.PutUint16(tmp[pos:pos+2], m.Uint16)
+       pos += 2
+
+       order.PutUint32(tmp[pos:pos+4], m.Uint32)
+       pos += 4
+
+       tmp[pos] = byte(m.Int8)
+       pos += 1
+
+       order.PutUint16(tmp[pos:pos+2], uint16(m.Int16))
+       pos += 2
+
+       order.PutUint32(tmp[pos:pos+4], uint32(m.Int32))
+       pos += 4
+
+       order.PutUint32(tmp[pos:pos+4], uint32(m.AliasUint32))
+       pos += 4
+
+       copy(tmp[pos:pos+6], m.AliasArray[:])
+       pos += 6
+
+       order.PutUint32(tmp[pos:pos+4], uint32(m.Enum))
+       pos += 4
+
+       for i := 0; i < 4; i++ {
+               var x uint32
+               if i < len(m.BaseArray) {
+                       x = m.BaseArray[i]
+               }
+               order.PutUint32(tmp[pos:pos+4], uint32(x))
+               pos += 4
+       }
+
+       copy(tmp[pos:pos+7], m.Slice)
+       pos += 7
+
+       copy(tmp[pos:pos+64], m.String)
+       pos += 64
+
+       order.PutUint32(tmp[pos:pos+4], uint32(len(m.VlaStr)) /*m.SizeOf*/)
+       pos += 4
+
+       copy(tmp[pos:pos+len(m.VlaStr)], m.VlaStr[:])
+       pos += len(m.VlaStr)
+
+       order.PutUint32(tmp[pos:pos+4], uint32(len(m.VariableSlice)) /*m.SizeOf*/)
+       pos += 4
+
+       for i := range m.VariableSlice {
+               tmp[pos+i*1] = uint8(m.VariableSlice[i].Proto)
+               //copy(tmp[102+i:103+i], []byte{byte(m.VariableSlice[i].Proto)})
+       }
+       pos += len(m.VariableSlice) * 1
+
+       tmp[pos] = uint8(m.TypeUnion.Af)
+       pos += 1
+
+       copy(tmp[pos:pos+16], m.TypeUnion.Un.XXX_UnionData[:])
+       pos += 16
+
+       return tmp, nil
+
+       /*_, err := buf.Write(tmp)
+       if err != nil {
+               return nil, err
+       }
+       return buf.Bytes(), nil*/
+}
+
+func (m *TestAllMsg) Unmarshal(tmp []byte) error {
+       order := binary.BigEndian
+
+       //tmp := make([]byte, 143)
+       pos := 0
+
+       m.Bool = tmp[pos] != 0
+       pos += 1
+
+       //tmp[pos] = m.Uint8
+       m.Uint8 = tmp[pos]
+       pos += 1
+
+       //order.PutUint16(tmp[pos:pos+2], m.Uint16)
+       m.Uint16 = order.Uint16(tmp[pos : pos+2])
+       pos += 2
+
+       //order.PutUint32(tmp[pos:pos+4], m.Uint32)
+       m.Uint32 = order.Uint32(tmp[pos : pos+4])
+       pos += 4
+
+       //tmp[pos] = byte(m.Int8)
+       m.Int8 = int8(tmp[pos])
+       pos += 1
+
+       //order.PutUint16(tmp[pos:pos+2], uint16(m.Int16))
+       m.Int16 = int16(order.Uint16(tmp[pos : pos+2]))
+       pos += 2
+
+       //order.PutUint32(tmp[pos:pos+4], uint32(m.Int32))
+       m.Int32 = int32(order.Uint32(tmp[pos : pos+4]))
+       pos += 4
+
+       //order.PutUint32(tmp[pos:pos+4], uint32(m.AliasUint32))
+       m.AliasUint32 = InterfaceIndex(order.Uint32(tmp[pos : pos+4]))
+       pos += 4
+
+       //copy(tmp[pos:pos+6], m.AliasArray[:])
+       copy(m.AliasArray[:], tmp[pos:pos+6])
+       pos += 6
+
+       //order.PutUint32(tmp[pos:pos+4], uint32(m.Enum))
+       m.Enum = IfStatusFlags(order.Uint32(tmp[pos : pos+4]))
+       pos += 4
+
+       m.BaseArray = make([]uint32, 4)
+       for i := 0; i < 4; i++ {
+               /*var x uint32
+               if i < len(m.BaseArray) {
+                       x = m.BaseArray[i]
+               }
+               order.PutUint32(tmp[pos:pos+4], uint32(x))*/
+               m.BaseArray[i] = order.Uint32(tmp[pos : pos+4])
+               pos += 4
+       }
+
+       m.Slice = make([]byte, 7)
+       copy(m.Slice[:7], tmp[pos:pos+7])
+       //copy(tmp[pos:pos+7], m.Slice)
+       pos += 7
+
+       i := bytes.Index(tmp[pos:pos+64], []byte{0x00})
+       m.String = string(tmp[pos : pos+i])
+       //copy(tmp[pos:pos+64], m.String)
+       pos += 64
+
+       //order.PutUint32(tmp[pos:pos+4], uint32(len(m.VlaStr)) /*m.SizeOf*/)
+       VlaStrLen := int(order.Uint32(tmp[pos : pos+4]))
+       pos += 4
+
+       m.VlaStr = string(tmp[pos : pos+VlaStrLen])
+       //copy(m.VlaStr[pos:pos+VlaStrLen], tmp[pos:pos+64])
+       pos += len(m.VlaStr)
+
+       m.SizeOf = uint32(order.Uint32(tmp[pos : pos+4]))
+       pos += 4
+
+       /*order.PutUint32(tmp[pos:pos+4], uint32(len(m.VariableSlice)))
+       m.VariableSlice = IfStatusFlags(order.Uint32(tmp[pos : pos+4]))
+       pos += 4*/
+
+       m.VariableSlice = make([]SliceType, m.SizeOf)
+       for i := range m.VariableSlice {
+               //tmp[pos+i*1] = uint8(m.VariableSlice[i].Proto)
+               m.VariableSlice[i].Proto = IPProto(tmp[pos+i*1])
+               //copy(tmp[102+i:103+i], []byte{byte(m.VariableSlice[i].Proto)})
+       }
+       pos += len(m.VariableSlice) * 1
+
+       //tmp[pos] = uint8(m.TypeUnion.Af)
+       m.TypeUnion.Af = AddressFamily(tmp[pos])
+       pos += 1
+
+       //copy(tmp[pos:pos+16], m.TypeUnion.Un.XXX_UnionData[:])
+       copy(m.TypeUnion.Un.XXX_UnionData[:], tmp[pos:pos+16])
+       pos += 16
+
+       return nil
+       /*_, err := buf.Write(tmp)
+       if err != nil {
+               return nil, err
+       }
+       return buf.Bytes(), nil*/
+}
+
+func boolToUint(b bool) uint8 {
+       if b {
+               return 1
+       }
+       return 0
+}
+
+// SwInterfaceDetails represents VPP binary API message 'sw_interface_details'.
+type TestAllMsg struct {
+       Bool          bool
+       Uint8         uint8
+       Uint16        uint16
+       Uint32        uint32
+       Int8          int8
+       Int16         int16
+       Int32         int32
+       AliasUint32   InterfaceIndex
+       AliasArray    MacAddress
+       Enum          IfStatusFlags
+       BaseArray     []uint32 `struc:"[4]uint32"`
+       Slice         []byte   `struc:"[7]byte"`
+       String        string   `struc:"[64]byte"`
+       XXX_VlaStrLen uint32   `struc:"sizeof=VlaStr"`
+       VlaStr        string
+       SizeOf        uint32 `struc:"sizeof=VariableSlice"`
+       VariableSlice []SliceType
+       TypeUnion     Address
+}
+
+type InterfaceIndex uint32
+type MacAddress [6]uint8
+type IfStatusFlags uint32
+
+const (
+       IF_STATUS_API_FLAG_ADMIN_UP IfStatusFlags = 1
+       IF_STATUS_API_FLAG_LINK_UP  IfStatusFlags = 2
+)
+
+// Address represents VPP binary API type 'address'.
+type Address struct {
+       Af AddressFamily
+       Un AddressUnion
+}
+
+// AddressFamily represents VPP binary API enum 'address_family'.
+type AddressFamily uint8
+
+const (
+       ADDRESS_IP4 AddressFamily = 0
+       ADDRESS_IP6 AddressFamily = 1
+)
+
+// AddressUnion represents VPP binary API union 'address_union'.
+type AddressUnion struct {
+       XXX_UnionData [16]byte
+}
+
+func (*AddressUnion) GetTypeName() string { return "address_union" }
+
+func AddressUnionIP4(a IP4Address) (u AddressUnion) {
+       u.SetIP4(a)
+       return
+}
+func (u *AddressUnion) SetIP4(a IP4Address) {
+       var b = new(bytes.Buffer)
+       if err := struc.Pack(b, &a); err != nil {
+               return
+       }
+       copy(u.XXX_UnionData[:], b.Bytes())
+}
+func (u *AddressUnion) GetIP4() (a IP4Address) {
+       var b = bytes.NewReader(u.XXX_UnionData[:])
+       struc.Unpack(b, &a)
+       return
+}
+
+func AddressUnionIP6(a IP6Address) (u AddressUnion) {
+       u.SetIP6(a)
+       return
+}
+func (u *AddressUnion) SetIP6(a IP6Address) {
+       var b = new(bytes.Buffer)
+       if err := struc.Pack(b, &a); err != nil {
+               return
+       }
+       copy(u.XXX_UnionData[:], b.Bytes())
+}
+func (u *AddressUnion) GetIP6() (a IP6Address) {
+       var b = bytes.NewReader(u.XXX_UnionData[:])
+       struc.Unpack(b, &a)
+       return
+}
+
+// IP4Address represents VPP binary API alias 'ip4_address'.
+type IP4Address [4]uint8
+
+// IP6Address represents VPP binary API alias 'ip6_address'.
+type IP6Address [16]uint8
+
+type SliceType struct {
+       Proto IPProto
+}
+
+type IPProto uint8
+
+const (
+       IP_API_PROTO_HOPOPT   IPProto = 0
+       IP_API_PROTO_ICMP     IPProto = 1
+       IP_API_PROTO_IGMP     IPProto = 2
+       IP_API_PROTO_TCP      IPProto = 6
+       IP_API_PROTO_UDP      IPProto = 17
+       IP_API_PROTO_GRE      IPProto = 47
+       IP_API_PROTO_ESP      IPProto = 50
+       IP_API_PROTO_AH       IPProto = 51
+       IP_API_PROTO_ICMP6    IPProto = 58
+       IP_API_PROTO_EIGRP    IPProto = 88
+       IP_API_PROTO_OSPF     IPProto = 89
+       IP_API_PROTO_SCTP     IPProto = 132
+       IP_API_PROTO_RESERVED IPProto = 255
+)
+
+func (m *TestAllMsg) Reset()                        { *m = TestAllMsg{} }
+func (*TestAllMsg) GetMessageName() string          { return "sw_interface_details" }
+func (*TestAllMsg) GetCrcString() string            { return "17b69fa2" }
+func (*TestAllMsg) GetMessageType() api.MessageType { return api.ReplyMessage }