diff options
Diffstat (limited to 'packet/bgp/bgp_test.go')
-rw-r--r-- | packet/bgp/bgp_test.go | 1194 |
1 files changed, 0 insertions, 1194 deletions
diff --git a/packet/bgp/bgp_test.go b/packet/bgp/bgp_test.go deleted file mode 100644 index a4801f27..00000000 --- a/packet/bgp/bgp_test.go +++ /dev/null @@ -1,1194 +0,0 @@ -// Copyright (C) 2016 Nippon Telegraph and Telephone Corporation. -// -// 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 bgp - -import ( - "bytes" - "encoding/binary" - "net" - "reflect" - "strconv" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func keepalive() *BGPMessage { - return NewBGPKeepAliveMessage() -} - -func notification() *BGPMessage { - return NewBGPNotificationMessage(1, 2, nil) -} - -func refresh() *BGPMessage { - return NewBGPRouteRefreshMessage(1, 2, 10) -} - -var result []string - -func BenchmarkNormalizeFlowSpecOpValues(b *testing.B) { - var r []string - for n := 0; n < b.N; n++ { - r = normalizeFlowSpecOpValues([]string{"&<=80"}) - } - result = r -} - -func Test_Message(t *testing.T) { - l := []*BGPMessage{keepalive(), notification(), refresh(), NewTestBGPOpenMessage(), NewTestBGPUpdateMessage()} - - for _, m1 := range l { - buf1, err := m1.Serialize() - assert.NoError(t, err) - - t.Log("LEN =", len(buf1)) - m2, err := ParseBGPMessage(buf1) - assert.NoError(t, err) - - // FIXME: shouldn't but workaround for some structs. - _, err = m2.Serialize() - assert.NoError(t, err) - - assert.True(t, reflect.DeepEqual(m1, m2)) - } -} - -func Test_IPAddrPrefixString(t *testing.T) { - ipv4 := NewIPAddrPrefix(24, "129.6.10.0") - assert.Equal(t, "129.6.10.0/24", ipv4.String()) - ipv4 = NewIPAddrPrefix(24, "129.6.10.1") - assert.Equal(t, "129.6.10.0/24", ipv4.String()) - ipv4 = NewIPAddrPrefix(22, "129.6.129.0") - assert.Equal(t, "129.6.128.0/22", ipv4.String()) - - ipv6 := NewIPv6AddrPrefix(64, "3343:faba:3903::0") - assert.Equal(t, "3343:faba:3903::/64", ipv6.String()) - ipv6 = NewIPv6AddrPrefix(64, "3343:faba:3903::1") - assert.Equal(t, "3343:faba:3903::/64", ipv6.String()) - ipv6 = NewIPv6AddrPrefix(63, "3343:faba:3903:129::0") - assert.Equal(t, "3343:faba:3903:128::/63", ipv6.String()) -} - -func Test_RouteTargetMembershipNLRIString(t *testing.T) { - assert := assert.New(t) - - // TwoOctetAsSpecificExtended - buf := make([]byte, 13) - buf[0] = 96 // in bit length - binary.BigEndian.PutUint32(buf[1:5], 65546) - buf[5] = byte(EC_TYPE_TRANSITIVE_TWO_OCTET_AS_SPECIFIC) // typehigh - binary.BigEndian.PutUint16(buf[7:9], 65000) - binary.BigEndian.PutUint32(buf[9:], 65546) - r := &RouteTargetMembershipNLRI{} - err := r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:65000:65546", r.String()) - buf, err = r.Serialize() - assert.Equal(nil, err) - err = r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:65000:65546", r.String()) - - // IPv4AddressSpecificExtended - buf = make([]byte, 13) - buf[0] = 96 // in bit length - binary.BigEndian.PutUint32(buf[1:5], 65546) - buf[5] = byte(EC_TYPE_TRANSITIVE_IP4_SPECIFIC) // typehigh - ip := net.ParseIP("10.0.0.1").To4() - copy(buf[7:11], []byte(ip)) - binary.BigEndian.PutUint16(buf[11:], 65000) - r = &RouteTargetMembershipNLRI{} - err = r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:10.0.0.1:65000", r.String()) - buf, err = r.Serialize() - assert.Equal(nil, err) - err = r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:10.0.0.1:65000", r.String()) - - // FourOctetAsSpecificExtended - buf = make([]byte, 13) - buf[0] = 96 // in bit length - binary.BigEndian.PutUint32(buf[1:5], 65546) - buf[5] = byte(EC_TYPE_TRANSITIVE_FOUR_OCTET_AS_SPECIFIC) // typehigh - buf[6] = byte(EC_SUBTYPE_ROUTE_TARGET) // subtype - binary.BigEndian.PutUint32(buf[7:], 65546) - binary.BigEndian.PutUint16(buf[11:], 65000) - r = &RouteTargetMembershipNLRI{} - err = r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:1.10:65000", r.String()) - buf, err = r.Serialize() - assert.Equal(nil, err) - err = r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:1.10:65000", r.String()) - - // OpaqueExtended - buf = make([]byte, 13) - buf[0] = 96 // in bit length - binary.BigEndian.PutUint32(buf[1:5], 65546) - buf[5] = byte(EC_TYPE_TRANSITIVE_OPAQUE) // typehigh - binary.BigEndian.PutUint32(buf[9:], 1000000) - r = &RouteTargetMembershipNLRI{} - err = r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:1000000", r.String()) - buf, err = r.Serialize() - assert.Equal(nil, err) - err = r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:1000000", r.String()) - - // Unknown - buf = make([]byte, 13) - buf[0] = 96 // in bit length - binary.BigEndian.PutUint32(buf[1:5], 65546) - buf[5] = 0x04 // typehigh - binary.BigEndian.PutUint32(buf[9:], 1000000) - r = &RouteTargetMembershipNLRI{} - err = r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:1000000", r.String()) - buf, err = r.Serialize() - assert.Equal(nil, err) - err = r.DecodeFromBytes(buf) - assert.Equal(nil, err) - assert.Equal("65546:1000000", r.String()) - -} - -func Test_MalformedUpdateMsg(t *testing.T) { - assert := assert.New(t) - - // Invalid AGGREGATOR - bufin := []byte{ - 0x00, 0x00, // Withdraws(0) - 0x00, 0x16, // Attrs Len(22) - 0xc0, 0x07, 0x05, // Flag, Type(7), Length(5) - 0x00, 0x00, 0x00, 0x64, // aggregator - invalid length - 0x00, - 0x40, 0x01, 0x01, 0x00, // Attr(ORIGIN) - 0x40, 0x03, 0x04, 0xc0, // Attr(NEXT_HOP) - 0xa8, 0x01, 0x64, - 0x40, 0x02, 0x00, // Attr(AS_PATH) - } - - u := &BGPUpdate{} - err := u.DecodeFromBytes(bufin) - assert.Error(err) - assert.Equal(ERROR_HANDLING_ATTRIBUTE_DISCARD, err.(*MessageError).ErrorHandling) - - // Invalid MP_REACH_NLRI - bufin = []byte{ - 0x00, 0x00, // Withdraws(0) - 0x00, 0x27, // Attrs Len(39) - 0x80, 0x0e, 0x1d, // Flag, Type(14), Length(29) - 0x00, 0x02, 0x01, // afi(2), safi(1) - 0x0f, 0x00, 0x00, 0x00, // nexthop - invalid nexthop length - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, - 0xff, 0x0a, 0x00, 0x00, - 0x00, // SNPA(0) - 0x40, 0x20, 0x01, 0x0d, // NLRI - 0xb8, 0x00, 0x01, 0x00, - 0x00, - 0x40, 0x01, 0x01, 0x00, // Attr(ORIGIN) - 0x40, 0x02, 0x00, // Attr(AS_PATH) - } - - err = u.DecodeFromBytes(bufin) - assert.Error(err) - assert.Equal(ERROR_HANDLING_AFISAFI_DISABLE, err.(*MessageError).ErrorHandling) - - // Invalid flag - bufin = []byte{ - 0x00, 0x00, // Withdraws(0) - 0x00, 0x0e, // Attrs Len(14) - 0xc0, 0x01, 0x01, 0x00, // Attr(ORIGIN) - invalid flag - 0x40, 0x03, 0x04, 0xc0, // Attr(NEXT_HOP) - 0xa8, 0x01, 0x64, - 0x40, 0x02, 0x00, // Attr(AS_PATH) - } - - err = u.DecodeFromBytes(bufin) - assert.Error(err) - assert.Equal(ERROR_HANDLING_TREAT_AS_WITHDRAW, err.(*MessageError).ErrorHandling) - - // Invalid AGGREGATOR and MULTI_EXIT_DESC - bufin = []byte{ - 0x00, 0x00, // Withdraws(0) - 0x00, 0x1e, // Attrs Len(30) - 0xc0, 0x07, 0x05, 0x00, // Attr(AGGREGATOR) - invalid length - 0x00, 0x00, 0x64, 0x00, - 0x80, 0x04, 0x05, 0x00, // Attr(MULTI_EXIT_DESC) - invalid length - 0x00, 0x00, 0x00, 0x64, - 0x40, 0x01, 0x01, 0x00, // Attr(ORIGIN) - 0x40, 0x02, 0x00, // Attr(AS_PATH) - 0x40, 0x03, 0x04, 0xc0, // Attr(NEXT_HOP) - 0xa8, 0x01, 0x64, - 0x20, 0xc8, 0xc8, 0xc8, // NLRI - 0xc8, - } - - err = u.DecodeFromBytes(bufin) - assert.Error(err) - assert.Equal(ERROR_HANDLING_TREAT_AS_WITHDRAW, err.(*MessageError).ErrorHandling) -} - -func Test_RFC5512(t *testing.T) { - assert := assert.New(t) - - buf := make([]byte, 8) - buf[0] = byte(EC_TYPE_TRANSITIVE_OPAQUE) - buf[1] = byte(EC_SUBTYPE_COLOR) - binary.BigEndian.PutUint32(buf[4:], 1000000) - ec, err := ParseExtended(buf) - assert.Equal(nil, err) - assert.Equal("1000000", ec.String()) - buf, err = ec.Serialize() - assert.Equal(nil, err) - assert.Equal([]byte{0x3, 0xb, 0x0, 0x0, 0x0, 0xf, 0x42, 0x40}, buf) - - buf = make([]byte, 8) - buf[0] = byte(EC_TYPE_TRANSITIVE_OPAQUE) - buf[1] = byte(EC_SUBTYPE_ENCAPSULATION) - binary.BigEndian.PutUint16(buf[6:], uint16(TUNNEL_TYPE_VXLAN)) - ec, err = ParseExtended(buf) - assert.Equal(nil, err) - assert.Equal("VXLAN", ec.String()) - buf, err = ec.Serialize() - assert.Equal(nil, err) - assert.Equal([]byte{0x3, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8}, buf) - - tlv := NewTunnelEncapTLV(TUNNEL_TYPE_VXLAN, []TunnelEncapSubTLVInterface{NewTunnelEncapSubTLVColor(10)}) - attr := NewPathAttributeTunnelEncap([]*TunnelEncapTLV{tlv}) - - buf1, err := attr.Serialize() - assert.Equal(nil, err) - - p, err := GetPathAttribute(buf1) - assert.Equal(nil, err) - - err = p.DecodeFromBytes(buf1) - assert.Equal(nil, err) - - buf2, err := p.Serialize() - assert.Equal(nil, err) - assert.Equal(buf1, buf2) - - n1 := NewEncapNLRI("10.0.0.1") - buf1, err = n1.Serialize() - assert.Equal(nil, err) - - n2 := NewEncapNLRI("") - err = n2.DecodeFromBytes(buf1) - assert.Equal(nil, err) - assert.Equal("10.0.0.1", n2.String()) - - n3 := NewEncapv6NLRI("2001::1") - buf1, err = n3.Serialize() - assert.Equal(nil, err) - - n4 := NewEncapv6NLRI("") - err = n4.DecodeFromBytes(buf1) - assert.Equal(nil, err) - assert.Equal("2001::1", n4.String()) -} - -func Test_ASLen(t *testing.T) { - assert := assert.New(t) - - aspath := AsPathParam{ - Num: 2, - AS: []uint16{65000, 65001}, - } - aspath.Type = BGP_ASPATH_ATTR_TYPE_SEQ - assert.Equal(2, aspath.ASLen()) - - aspath.Type = BGP_ASPATH_ATTR_TYPE_SET - assert.Equal(1, aspath.ASLen()) - - aspath.Type = BGP_ASPATH_ATTR_TYPE_CONFED_SEQ - assert.Equal(0, aspath.ASLen()) - - aspath.Type = BGP_ASPATH_ATTR_TYPE_CONFED_SET - assert.Equal(0, aspath.ASLen()) - - as4path := As4PathParam{ - Num: 2, - AS: []uint32{65000, 65001}, - } - as4path.Type = BGP_ASPATH_ATTR_TYPE_SEQ - assert.Equal(2, as4path.ASLen()) - - as4path.Type = BGP_ASPATH_ATTR_TYPE_SET - assert.Equal(1, as4path.ASLen()) - - as4path.Type = BGP_ASPATH_ATTR_TYPE_CONFED_SEQ - assert.Equal(0, as4path.ASLen()) - - as4path.Type = BGP_ASPATH_ATTR_TYPE_CONFED_SET - assert.Equal(0, as4path.ASLen()) - -} - -func Test_MPLSLabelStack(t *testing.T) { - assert := assert.New(t) - mpls := NewMPLSLabelStack() - buf, err := mpls.Serialize() - assert.Nil(err) - assert.Equal(true, bytes.Equal(buf, []byte{0, 0, 1})) - - mpls = &MPLSLabelStack{} - assert.Nil(mpls.DecodeFromBytes(buf)) - assert.Equal(1, len(mpls.Labels)) - assert.Equal(uint32(0), mpls.Labels[0]) - - mpls = NewMPLSLabelStack(WITHDRAW_LABEL) - buf, err = mpls.Serialize() - assert.Nil(err) - assert.Equal(true, bytes.Equal(buf, []byte{128, 0, 0})) - - mpls = &MPLSLabelStack{} - assert.Nil(mpls.DecodeFromBytes(buf)) - assert.Equal(1, len(mpls.Labels)) - assert.Equal(WITHDRAW_LABEL, mpls.Labels[0]) -} - -func Test_FlowSpecNlri(t *testing.T) { - assert := assert.New(t) - cmp := make([]FlowSpecComponentInterface, 0) - cmp = append(cmp, NewFlowSpecDestinationPrefix(NewIPAddrPrefix(24, "10.0.0.0"))) - cmp = append(cmp, NewFlowSpecSourcePrefix(NewIPAddrPrefix(24, "10.0.0.0"))) - item1 := NewFlowSpecComponentItem(DEC_NUM_OP_EQ, TCP) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_IP_PROTO, []*FlowSpecComponentItem{item1})) - item2 := NewFlowSpecComponentItem(DEC_NUM_OP_GT_EQ, 20) - item3 := NewFlowSpecComponentItem(DEC_NUM_OP_AND|DEC_NUM_OP_LT_EQ, 30) - item4 := NewFlowSpecComponentItem(DEC_NUM_OP_GT_EQ, 10) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_PORT, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_DST_PORT, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_SRC_PORT, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_ICMP_TYPE, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_ICMP_CODE, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_PKT_LEN, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_DSCP, []*FlowSpecComponentItem{item2, item3, item4})) - isFragment := uint64(0x02) - lastFragment := uint64(0x08) - item5 := NewFlowSpecComponentItem(BITMASK_FLAG_OP_MATCH, isFragment) - item6 := NewFlowSpecComponentItem(BITMASK_FLAG_OP_AND, lastFragment) - - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_FRAGMENT, []*FlowSpecComponentItem{item5, item6})) - item7 := NewFlowSpecComponentItem(0, TCP_FLAG_ACK) - item8 := NewFlowSpecComponentItem(BITMASK_FLAG_OP_AND|BITMASK_FLAG_OP_NOT, TCP_FLAG_URGENT) - - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_TCP_FLAG, []*FlowSpecComponentItem{item7, item8})) - n1 := NewFlowSpecIPv4Unicast(cmp) - - buf1, err := n1.Serialize() - assert.Nil(err) - - n2, err := NewPrefixFromRouteFamily(RouteFamilyToAfiSafi(RF_FS_IPv4_UC)) - assert.Nil(err) - - err = n2.DecodeFromBytes(buf1) - assert.Nil(err) - // should be equal - assert.Equal(n1, n2) -} - -func Test_FlowSpecExtended(t *testing.T) { - assert := assert.New(t) - exts := make([]ExtendedCommunityInterface, 0) - exts = append(exts, NewTrafficRateExtended(100, 9600.0)) - exts = append(exts, NewTrafficActionExtended(true, false)) - exts = append(exts, NewRedirectTwoOctetAsSpecificExtended(1000, 1000)) - exts = append(exts, NewRedirectIPv4AddressSpecificExtended("10.0.0.1", 1000)) - exts = append(exts, NewRedirectFourOctetAsSpecificExtended(10000000, 1000)) - exts = append(exts, NewTrafficRemarkExtended(10)) - m1 := NewPathAttributeExtendedCommunities(exts) - buf1, err := m1.Serialize() - require.NoError(t, err) - - m2 := NewPathAttributeExtendedCommunities(nil) - err = m2.DecodeFromBytes(buf1) - require.NoError(t, err) - - _, err = m2.Serialize() - require.NoError(t, err) - - assert.Equal(m1, m2) -} - -func Test_IP6FlowSpecExtended(t *testing.T) { - exts := make([]ExtendedCommunityInterface, 0) - exts = append(exts, NewRedirectIPv6AddressSpecificExtended("2001:db8::68", 1000)) - m1 := NewPathAttributeIP6ExtendedCommunities(exts) - buf1, err := m1.Serialize() - require.NoError(t, err) - - m2 := NewPathAttributeIP6ExtendedCommunities(nil) - err = m2.DecodeFromBytes(buf1) - require.NoError(t, err) - - _, err = m2.Serialize() - require.NoError(t, err) - - assert.Equal(t, m1, m2) -} - -func Test_FlowSpecNlriv6(t *testing.T) { - cmp := make([]FlowSpecComponentInterface, 0) - cmp = append(cmp, NewFlowSpecDestinationPrefix6(NewIPv6AddrPrefix(64, "2001::"), 12)) - cmp = append(cmp, NewFlowSpecSourcePrefix6(NewIPv6AddrPrefix(64, "2001::"), 12)) - item1 := NewFlowSpecComponentItem(DEC_NUM_OP_EQ, TCP) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_IP_PROTO, []*FlowSpecComponentItem{item1})) - item2 := NewFlowSpecComponentItem(DEC_NUM_OP_GT_EQ, 20) - item3 := NewFlowSpecComponentItem(DEC_NUM_OP_AND|DEC_NUM_OP_LT_EQ, 30) - item4 := NewFlowSpecComponentItem(DEC_NUM_OP_EQ, 10) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_PORT, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_DST_PORT, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_SRC_PORT, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_ICMP_TYPE, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_ICMP_CODE, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_PKT_LEN, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_DSCP, []*FlowSpecComponentItem{item2, item3, item4})) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_LABEL, []*FlowSpecComponentItem{item2, item3, item4})) - isFragment := uint64(0x02) - item5 := NewFlowSpecComponentItem(BITMASK_FLAG_OP_MATCH, isFragment) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_FRAGMENT, []*FlowSpecComponentItem{item5})) - item6 := NewFlowSpecComponentItem(0, TCP_FLAG_ACK) - item7 := NewFlowSpecComponentItem(BITMASK_FLAG_OP_AND|BITMASK_FLAG_OP_NOT, TCP_FLAG_URGENT) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_TCP_FLAG, []*FlowSpecComponentItem{item6, item7})) - n1 := NewFlowSpecIPv6Unicast(cmp) - buf1, err := n1.Serialize() - require.NoError(t, err) - - n2, err := NewPrefixFromRouteFamily(RouteFamilyToAfiSafi(RF_FS_IPv6_UC)) - require.NoError(t, err) - - err = n2.DecodeFromBytes(buf1) - require.NoError(t, err) - - _, err = n2.Serialize() - require.NoError(t, err) - - assert.Equal(t, n1, n2) -} - -func Test_Aigp(t *testing.T) { - assert := assert.New(t) - m := NewAigpTLVIgpMetric(1000) - a1 := NewPathAttributeAigp([]AigpTLVInterface{m}) - buf1, err := a1.Serialize() - require.NoError(t, err) - - a2 := NewPathAttributeAigp(nil) - err = a2.DecodeFromBytes(buf1) - require.NoError(t, err) - - assert.Equal(a1, a2) -} - -func Test_FlowSpecNlriL2(t *testing.T) { - assert := assert.New(t) - mac, _ := net.ParseMAC("01:23:45:67:89:ab") - cmp := make([]FlowSpecComponentInterface, 0) - cmp = append(cmp, NewFlowSpecDestinationMac(mac)) - cmp = append(cmp, NewFlowSpecSourceMac(mac)) - item1 := NewFlowSpecComponentItem(DEC_NUM_OP_EQ, uint64(IPv4)) - cmp = append(cmp, NewFlowSpecComponent(FLOW_SPEC_TYPE_ETHERNET_TYPE, []*FlowSpecComponentItem{item1})) - rd, _ := ParseRouteDistinguisher("100:100") - n1 := NewFlowSpecL2VPN(rd, cmp) - buf1, err := n1.Serialize() - assert.Nil(err) - n2, err := NewPrefixFromRouteFamily(RouteFamilyToAfiSafi(RF_FS_L2_VPN)) - assert.Nil(err) - err = n2.DecodeFromBytes(buf1) - assert.Nil(err) - - assert.Equal(n1, n2) -} - -func Test_NotificationErrorCode(t *testing.T) { - // boundary check - t.Log(NewNotificationErrorCode(BGP_ERROR_MESSAGE_HEADER_ERROR, BGP_ERROR_SUB_BAD_MESSAGE_TYPE).String()) - t.Log(NewNotificationErrorCode(BGP_ERROR_MESSAGE_HEADER_ERROR, BGP_ERROR_SUB_BAD_MESSAGE_TYPE+1).String()) - t.Log(NewNotificationErrorCode(BGP_ERROR_MESSAGE_HEADER_ERROR, 0).String()) - t.Log(NewNotificationErrorCode(0, BGP_ERROR_SUB_BAD_MESSAGE_TYPE).String()) - t.Log(NewNotificationErrorCode(BGP_ERROR_ROUTE_REFRESH_MESSAGE_ERROR+1, 0).String()) -} - -func Test_FlowSpecNlriVPN(t *testing.T) { - assert := assert.New(t) - cmp := make([]FlowSpecComponentInterface, 0) - cmp = append(cmp, NewFlowSpecDestinationPrefix(NewIPAddrPrefix(24, "10.0.0.0"))) - cmp = append(cmp, NewFlowSpecSourcePrefix(NewIPAddrPrefix(24, "10.0.0.0"))) - rd, _ := ParseRouteDistinguisher("100:100") - n1 := NewFlowSpecIPv4VPN(rd, cmp) - buf1, err := n1.Serialize() - assert.Nil(err) - n2, err := NewPrefixFromRouteFamily(RouteFamilyToAfiSafi(RF_FS_IPv4_VPN)) - assert.Nil(err) - err = n2.DecodeFromBytes(buf1) - require.NoError(t, err) - - assert.Equal(n1, n2) -} - -func Test_EVPNIPPrefixRoute(t *testing.T) { - assert := assert.New(t) - rd, _ := ParseRouteDistinguisher("100:100") - r := &EVPNIPPrefixRoute{ - RD: rd, - ESI: EthernetSegmentIdentifier{ - Type: ESI_ARBITRARY, - Value: make([]byte, 9), - }, - ETag: 10, - IPPrefixLength: 24, - IPPrefix: net.IP{10, 10, 10, 0}, - GWIPAddress: net.IP{10, 10, 10, 10}, - Label: 1000, - } - n1 := NewEVPNNLRI(EVPN_IP_PREFIX, r) - buf1, err := n1.Serialize() - assert.Nil(err) - n2, err := NewPrefixFromRouteFamily(RouteFamilyToAfiSafi(RF_EVPN)) - assert.Nil(err) - err = n2.DecodeFromBytes(buf1) - assert.Nil(err) - - assert.Equal(n1, n2) -} - -func Test_CapExtendedNexthop(t *testing.T) { - assert := assert.New(t) - tuple := NewCapExtendedNexthopTuple(RF_IPv4_UC, AFI_IP6) - n1 := NewCapExtendedNexthop([]*CapExtendedNexthopTuple{tuple}) - buf1, err := n1.Serialize() - assert.Nil(err) - n2, err := DecodeCapability(buf1) - assert.Nil(err) - - assert.Equal(n1, n2) -} - -func Test_AddPath(t *testing.T) { - assert := assert.New(t) - opt := &MarshallingOption{AddPath: map[RouteFamily]BGPAddPathMode{RF_IPv4_UC: BGP_ADD_PATH_BOTH}} - { - n1 := NewIPAddrPrefix(24, "10.10.10.0") - assert.Equal(n1.PathIdentifier(), uint32(0)) - n1.SetPathLocalIdentifier(10) - assert.Equal(n1.PathLocalIdentifier(), uint32(10)) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := &IPAddrPrefix{} - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(10)) - } - { - n1 := NewIPv6AddrPrefix(64, "2001::") - n1.SetPathIdentifier(10) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewIPv6AddrPrefix(0, "") - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(0)) - } - opt = &MarshallingOption{AddPath: map[RouteFamily]BGPAddPathMode{RF_IPv4_UC: BGP_ADD_PATH_BOTH, RF_IPv6_UC: BGP_ADD_PATH_BOTH}} - { - n1 := NewIPv6AddrPrefix(64, "2001::") - n1.SetPathLocalIdentifier(10) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewIPv6AddrPrefix(0, "") - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(10)) - } - opt = &MarshallingOption{AddPath: map[RouteFamily]BGPAddPathMode{RF_IPv4_VPN: BGP_ADD_PATH_BOTH, RF_IPv6_VPN: BGP_ADD_PATH_BOTH}} - { - rd, _ := ParseRouteDistinguisher("100:100") - labels := NewMPLSLabelStack(100, 200) - n1 := NewLabeledVPNIPAddrPrefix(24, "10.10.10.0", *labels, rd) - n1.SetPathLocalIdentifier(20) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewLabeledVPNIPAddrPrefix(0, "", MPLSLabelStack{}, nil) - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(20)) - } - { - rd, _ := ParseRouteDistinguisher("100:100") - labels := NewMPLSLabelStack(100, 200) - n1 := NewLabeledVPNIPv6AddrPrefix(64, "2001::", *labels, rd) - n1.SetPathLocalIdentifier(20) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewLabeledVPNIPAddrPrefix(0, "", MPLSLabelStack{}, nil) - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(20)) - } - opt = &MarshallingOption{AddPath: map[RouteFamily]BGPAddPathMode{RF_IPv4_MPLS: BGP_ADD_PATH_BOTH, RF_IPv6_MPLS: BGP_ADD_PATH_BOTH}} - { - labels := NewMPLSLabelStack(100, 200) - n1 := NewLabeledIPAddrPrefix(24, "10.10.10.0", *labels) - n1.SetPathLocalIdentifier(20) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewLabeledIPAddrPrefix(0, "", MPLSLabelStack{}) - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(20)) - } - { - labels := NewMPLSLabelStack(100, 200) - n1 := NewLabeledIPv6AddrPrefix(64, "2001::", *labels) - n1.SetPathLocalIdentifier(20) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewLabeledIPAddrPrefix(0, "", MPLSLabelStack{}) - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(20)) - } - opt = &MarshallingOption{AddPath: map[RouteFamily]BGPAddPathMode{RF_RTC_UC: BGP_ADD_PATH_BOTH}} - { - rt, _ := ParseRouteTarget("100:100") - n1 := NewRouteTargetMembershipNLRI(65000, rt) - n1.SetPathLocalIdentifier(30) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewRouteTargetMembershipNLRI(0, nil) - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(30)) - } - opt = &MarshallingOption{AddPath: map[RouteFamily]BGPAddPathMode{RF_EVPN: BGP_ADD_PATH_BOTH}} - { - n1 := NewEVPNNLRI(EVPN_ROUTE_TYPE_ETHERNET_AUTO_DISCOVERY, - &EVPNEthernetAutoDiscoveryRoute{NewRouteDistinguisherFourOctetAS(5, 6), - EthernetSegmentIdentifier{ESI_ARBITRARY, make([]byte, 9)}, 2, 2}) - n1.SetPathLocalIdentifier(40) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewEVPNNLRI(0, nil) - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(40)) - } - opt = &MarshallingOption{AddPath: map[RouteFamily]BGPAddPathMode{RF_IPv4_ENCAP: BGP_ADD_PATH_BOTH}} - { - n1 := NewEncapNLRI("10.10.10.0") - n1.SetPathLocalIdentifier(50) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewEncapNLRI("") - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(50)) - } - opt = &MarshallingOption{AddPath: map[RouteFamily]BGPAddPathMode{RF_FS_IPv4_UC: BGP_ADD_PATH_BOTH}} - { - n1 := NewFlowSpecIPv4Unicast([]FlowSpecComponentInterface{NewFlowSpecDestinationPrefix(NewIPAddrPrefix(24, "10.0.0.0"))}) - n1.SetPathLocalIdentifier(60) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := NewFlowSpecIPv4Unicast(nil) - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(60)) - } - opt = &MarshallingOption{AddPath: map[RouteFamily]BGPAddPathMode{RF_OPAQUE: BGP_ADD_PATH_BOTH}} - { - n1 := NewOpaqueNLRI([]byte("key"), []byte("value")) - n1.SetPathLocalIdentifier(70) - bits, err := n1.Serialize(opt) - assert.Nil(err) - n2 := &OpaqueNLRI{} - err = n2.DecodeFromBytes(bits, opt) - assert.Nil(err) - assert.Equal(n2.PathIdentifier(), uint32(70)) - } - -} - -func Test_CompareFlowSpecNLRI(t *testing.T) { - assert := assert.New(t) - cmp, err := ParseFlowSpecComponents(RF_FS_IPv4_UC, "destination 10.0.0.2/32 source 10.0.0.1/32 destination-port ==3128 protocol tcp") - assert.Nil(err) - // Note: Use NewFlowSpecIPv4Unicast() for the consistent ordered rules. - n1 := NewFlowSpecIPv4Unicast(cmp).FlowSpecNLRI - cmp, err = ParseFlowSpecComponents(RF_FS_IPv4_UC, "source 10.0.0.0/24 destination-port ==3128 protocol tcp") - assert.Nil(err) - n2 := NewFlowSpecIPv4Unicast(cmp).FlowSpecNLRI - r, err := CompareFlowSpecNLRI(&n1, &n2) - assert.Nil(err) - assert.True(r > 0) - cmp, err = ParseFlowSpecComponents(RF_FS_IPv4_UC, "source 10.0.0.9/32 port ==80 ==8080 destination-port >8080&<8080 ==3128 source-port >1024 protocol ==udp ==tcp") - n3 := NewFlowSpecIPv4Unicast(cmp).FlowSpecNLRI - assert.Nil(err) - cmp, err = ParseFlowSpecComponents(RF_FS_IPv4_UC, "destination 192.168.0.2/32") - n4 := NewFlowSpecIPv4Unicast(cmp).FlowSpecNLRI - assert.Nil(err) - r, err = CompareFlowSpecNLRI(&n3, &n4) - assert.Nil(err) - assert.True(r < 0) -} - -func Test_MpReachNLRIWithIPv4MappedIPv6Prefix(t *testing.T) { - assert := assert.New(t) - n1 := NewIPv6AddrPrefix(120, "::ffff:10.0.0.0") - buf1, err := n1.Serialize() - assert.Nil(err) - n2, err := NewPrefixFromRouteFamily(RouteFamilyToAfiSafi(RF_IPv6_UC)) - assert.Nil(err) - err = n2.DecodeFromBytes(buf1) - assert.Nil(err) - - assert.Equal(n1, n2) - - label := NewMPLSLabelStack(2) - - n3 := NewLabeledIPv6AddrPrefix(120, "::ffff:10.0.0.0", *label) - buf1, err = n3.Serialize() - assert.Nil(err) - n4, err := NewPrefixFromRouteFamily(RouteFamilyToAfiSafi(RF_IPv6_MPLS)) - assert.Nil(err) - err = n4.DecodeFromBytes(buf1) - assert.Nil(err) - - assert.Equal(n3, n4) -} - -func Test_MpReachNLRIWithIPv6PrefixWithIPv4Peering(t *testing.T) { - assert := assert.New(t) - bufin := []byte{ - 0x80, 0x0e, 0x1e, // flags(1), type(1), length(1) - 0x00, 0x02, 0x01, 0x10, // afi(2), safi(1), nexthoplen(1) - 0x00, 0x00, 0x00, 0x00, // nexthop(16) - 0x00, 0x00, 0x00, 0x00, // = "::ffff:172.20.0.1" - 0x00, 0x00, 0xff, 0xff, - 0xac, 0x14, 0x00, 0x01, - 0x00, // reserved(1) - 0x40, 0x20, 0x01, 0x0d, // nlri(9) - 0xb8, 0x00, 0x01, 0x00, // = "2001:db8:1:1::/64" - 0x01, - } - // Test DecodeFromBytes() - p := &PathAttributeMpReachNLRI{} - err := p.DecodeFromBytes(bufin) - assert.Nil(err) - // Test decoded values - assert.Equal(BGPAttrFlag(0x80), p.Flags) - assert.Equal(BGPAttrType(0xe), p.Type) - assert.Equal(uint16(0x1e), p.Length) - assert.Equal(uint16(AFI_IP6), p.AFI) - assert.Equal(uint8(SAFI_UNICAST), p.SAFI) - assert.Equal(net.ParseIP("::ffff:172.20.0.1"), p.Nexthop) - assert.Equal(net.ParseIP(""), p.LinkLocalNexthop) - value := []AddrPrefixInterface{ - NewIPv6AddrPrefix(64, "2001:db8:1:1::"), - } - assert.Equal(value, p.Value) - // Set NextHop as IPv4 address (because IPv4 peering) - p.Nexthop = net.ParseIP("172.20.0.1") - // Test Serialize() - bufout, err := p.Serialize() - assert.Nil(err) - // Test serialised value - assert.Equal(bufin, bufout) -} - -func Test_MpReachNLRIWithIPv6(t *testing.T) { - assert := assert.New(t) - bufin := []byte{ - 0x90, 0x0e, 0x00, 0x1e, // flags(1), type(1), length(2), - 0x00, 0x02, 0x01, 0x10, // afi(2), safi(1), nexthoplen(1) - 0x20, 0x01, 0x0d, 0xb8, // nexthop(16) - 0x00, 0x01, 0x00, 0x00, // = "2001:db8:1::1" - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, // reserved(1) - 0x40, 0x20, 0x01, 0x0d, // nlri(9) - 0xb8, 0x00, 0x53, 0x00, // = "2001:db8:53::/64" - 0x00, - } - // Test DecodeFromBytes() - p := &PathAttributeMpReachNLRI{} - err := p.DecodeFromBytes(bufin) - assert.Nil(err) - // Test decoded values - assert.Equal(BGPAttrFlag(0x90), p.Flags) - assert.Equal(BGPAttrType(0xe), p.Type) - assert.Equal(uint16(0x1e), p.Length) - assert.Equal(uint16(AFI_IP6), p.AFI) - assert.Equal(uint8(SAFI_UNICAST), p.SAFI) - assert.Equal(net.ParseIP("2001:db8:1::1"), p.Nexthop) - value := []AddrPrefixInterface{ - NewIPv6AddrPrefix(64, "2001:db8:53::"), - } - assert.Equal(value, p.Value) -} - -func Test_MpUnreachNLRIWithIPv6(t *testing.T) { - assert := assert.New(t) - bufin := []byte{ - 0x90, 0x0f, 0x00, 0x0c, // flags(1), type(1), length(2), - 0x00, 0x02, 0x01, // afi(2), safi(1), - 0x40, 0x20, 0x01, 0x0d, // nlri(9) - 0xb8, 0x00, 0x53, 0x00, // = "2001:db8:53::/64" - 0x00, - } - // Test DecodeFromBytes() - p := &PathAttributeMpUnreachNLRI{} - err := p.DecodeFromBytes(bufin) - assert.Nil(err) - // Test decoded values - assert.Equal(BGPAttrFlag(0x90), p.Flags) - assert.Equal(BGPAttrType(0xf), p.Type) - assert.Equal(uint16(0x0c), p.Length) - assert.Equal(uint16(AFI_IP6), p.AFI) - assert.Equal(uint8(SAFI_UNICAST), p.SAFI) - value := []AddrPrefixInterface{ - NewIPv6AddrPrefix(64, "2001:db8:53::"), - } - assert.Equal(value, p.Value) -} - -func Test_MpReachNLRIWithIPv6PrefixWithLinkLocalNexthop(t *testing.T) { - assert := assert.New(t) - bufin := []byte{ - 0x80, 0x0e, 0x2c, // flags(1), type(1), length(1) - 0x00, 0x02, 0x01, 0x20, // afi(2), safi(1), nexthoplen(1) - 0x20, 0x01, 0x0d, 0xb8, // nexthop(32) - 0x00, 0x01, 0x00, 0x00, // = "2001:db8:1::1" - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0xfe, 0x80, 0x00, 0x00, // + "fe80::1" (link local) - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, // reserved(1) - 0x30, 0x20, 0x10, 0x0a, // nlri(7) - 0xb8, 0x00, 0x01, // = "2010:ab8:1::/48" - } - // Test DecodeFromBytes() - p := &PathAttributeMpReachNLRI{} - err := p.DecodeFromBytes(bufin) - assert.Nil(err) - // Test decoded values - assert.Equal(BGPAttrFlag(0x80), p.Flags) - assert.Equal(BGPAttrType(0xe), p.Type) - assert.Equal(uint16(0x2c), p.Length) - assert.Equal(uint16(AFI_IP6), p.AFI) - assert.Equal(uint8(SAFI_UNICAST), p.SAFI) - assert.Equal(net.ParseIP("2001:db8:1::1"), p.Nexthop) - assert.Equal(net.ParseIP("fe80::1"), p.LinkLocalNexthop) - value := []AddrPrefixInterface{ - NewIPv6AddrPrefix(48, "2010:ab8:1::"), - } - assert.Equal(value, p.Value) - // Test Serialize() - bufout, err := p.Serialize() - assert.Nil(err) - // Test serialised value - assert.Equal(bufin, bufout) -} - -func Test_MpReachNLRIWithVPNv4Prefix(t *testing.T) { - assert := assert.New(t) - bufin := []byte{ - 0x80, 0x0e, 0x20, // flags(1), type(1), length(1) - 0x00, 0x01, 0x80, 0x0c, // afi(2), safi(1), nexthoplen(1) - 0x00, 0x00, 0x00, 0x00, // nexthop(12) - 0x00, 0x00, 0x00, 0x00, // = (rd:"0:0",) "172.20.0.1" - 0xac, 0x14, 0x00, 0x01, - 0x00, // reserved(1) - 0x70, 0x00, 0x01, 0x01, // nlri(15) - 0x00, 0x00, 0xfd, 0xe8, // = label:16, rd:"65000:100", prefix:"10.1.1.0/24" - 0x00, 0x00, 0x00, 0x64, - 0x0a, 0x01, 0x01, - } - // Test DecodeFromBytes() - p := &PathAttributeMpReachNLRI{} - err := p.DecodeFromBytes(bufin) - assert.Nil(err) - // Test decoded values - assert.Equal(BGPAttrFlag(0x80), p.Flags) - assert.Equal(BGPAttrType(0xe), p.Type) - assert.Equal(uint16(0x20), p.Length) - assert.Equal(uint16(AFI_IP), p.AFI) - assert.Equal(uint8(SAFI_MPLS_VPN), p.SAFI) - assert.Equal(net.ParseIP("172.20.0.1").To4(), p.Nexthop) - assert.Equal(net.ParseIP(""), p.LinkLocalNexthop) - value := []AddrPrefixInterface{ - NewLabeledVPNIPAddrPrefix(24, "10.1.1.0", *NewMPLSLabelStack(16), - NewRouteDistinguisherTwoOctetAS(65000, 100)), - } - assert.Equal(value, p.Value) - // Test Serialize() - bufout, err := p.Serialize() - assert.Nil(err) - // Test serialised value - assert.Equal(bufin, bufout) -} - -func Test_MpReachNLRIWithVPNv6Prefix(t *testing.T) { - assert := assert.New(t) - bufin := []byte{ - 0x80, 0x0e, 0x39, // flags(1), type(1), length(1) - 0x00, 0x02, 0x80, 0x18, // afi(2), safi(1), nexthoplen(1) - 0x00, 0x00, 0x00, 0x00, // nexthop(24) - 0x00, 0x00, 0x00, 0x00, // = (rd:"0:0",) "2001:db8:1::1" - 0x20, 0x01, 0x0d, 0xb8, - 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, // reserved(1) - 0xd4, 0x00, 0x01, 0x01, // nlri(28) - 0x00, 0x00, 0xfd, 0xe8, // = label:16, rd:"65000:100", prefix:"2001:1::/124" - 0x00, 0x00, 0x00, 0x64, - 0x20, 0x01, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - } - // Test DecodeFromBytes() - p := &PathAttributeMpReachNLRI{} - err := p.DecodeFromBytes(bufin) - assert.Nil(err) - // Test decoded values - assert.Equal(BGPAttrFlag(0x80), p.Flags) - assert.Equal(BGPAttrType(0xe), p.Type) - assert.Equal(uint16(0x39), p.Length) - assert.Equal(uint16(AFI_IP6), p.AFI) - assert.Equal(uint8(SAFI_MPLS_VPN), p.SAFI) - assert.Equal(net.ParseIP("2001:db8:1::1"), p.Nexthop) - assert.Equal(net.ParseIP(""), p.LinkLocalNexthop) - value := []AddrPrefixInterface{ - NewLabeledVPNIPv6AddrPrefix(124, "2001:1::", *NewMPLSLabelStack(16), - NewRouteDistinguisherTwoOctetAS(65000, 100)), - } - assert.Equal(value, p.Value) - // Test Serialize() - bufout, err := p.Serialize() - assert.Nil(err) - // Test serialised value - assert.Equal(bufin, bufout) -} - -func Test_MpReachNLRIWithIPv4PrefixWithIPv6Nexthop(t *testing.T) { - assert := assert.New(t) - bufin := []byte{ - 0x80, 0x0e, 0x19, // flags(1), type(1), length(1) - 0x00, 0x01, 0x01, 0x10, // afi(1), safi(1), nexthoplen(1) - 0x20, 0x01, 0x0d, 0xb8, // nexthop(32) - 0x00, 0x01, 0x00, 0x00, // = "2001:db8:1::1" - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x00, // reserved(1) - 0x18, 0xc0, 0xa8, 0x0a, // nlri(7) - } - // Test DecodeFromBytes() - p := &PathAttributeMpReachNLRI{} - err := p.DecodeFromBytes(bufin) - assert.Nil(err) - // Test decoded values - assert.Equal(BGPAttrFlag(0x80), p.Flags) - assert.Equal(BGPAttrType(0xe), p.Type) - assert.Equal(uint16(0x19), p.Length) - assert.Equal(uint16(AFI_IP), p.AFI) - assert.Equal(uint8(SAFI_UNICAST), p.SAFI) - assert.Equal(net.ParseIP("2001:db8:1::1"), p.Nexthop) - value := []AddrPrefixInterface{ - NewIPAddrPrefix(24, "192.168.10.0"), - } - assert.Equal(value, p.Value) - // Test Serialize() - bufout, err := p.Serialize() - assert.Nil(err) - // Test serialised value - assert.Equal(bufin, bufout) -} - -func Test_ParseRouteDistinguisher(t *testing.T) { - assert := assert.New(t) - - rd, _ := ParseRouteDistinguisher("100:1000") - rdType0, ok := rd.(*RouteDistinguisherTwoOctetAS) - if !ok { - t.Fatal("Type of RD interface is not RouteDistinguisherTwoOctetAS") - } - - assert.Equal(uint16(100), rdType0.Admin) - assert.Equal(uint32(1000), rdType0.Assigned) - - rd, _ = ParseRouteDistinguisher("10.0.0.0:100") - rdType1, ok := rd.(*RouteDistinguisherIPAddressAS) - if !ok { - t.Fatal("Type of RD interface is not RouteDistinguisherIPAddressAS") - } - - assert.Equal("10.0.0.0", rdType1.Admin.String()) - assert.Equal(uint16(100), rdType1.Assigned) - - rd, _ = ParseRouteDistinguisher("100.1000:10000") - rdType2, ok := rd.(*RouteDistinguisherFourOctetAS) - if !ok { - t.Fatal("Type of RD interface is not RouteDistinguisherFourOctetAS") - } - - assert.Equal(uint32((100<<16)|1000), rdType2.Admin) - assert.Equal(uint16(10000), rdType2.Assigned) -} - -func Test_ParseEthernetSegmentIdentifier(t *testing.T) { - assert := assert.New(t) - - // "single-homed" - esiZero := EthernetSegmentIdentifier{} - args := make([]string, 0) - esi, err := ParseEthernetSegmentIdentifier(args) - assert.Nil(err) - assert.Equal(esiZero, esi) - args = []string{"single-homed"} - esi, err = ParseEthernetSegmentIdentifier(args) - assert.Nil(err) - assert.Equal(esiZero, esi) - - // ESI_ARBITRARY - args = []string{"ARBITRARY", "11:22:33:44:55:66:77:88:99"} // omit "ESI_" - esi, err = ParseEthernetSegmentIdentifier(args) - assert.Nil(err) - assert.Equal(EthernetSegmentIdentifier{ - Type: ESI_ARBITRARY, - Value: []byte{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}, - }, esi) - - // ESI_LACP - args = []string{"lacp", "aa:bb:cc:dd:ee:ff", strconv.FormatInt(0x1122, 10)} // lower case - esi, err = ParseEthernetSegmentIdentifier(args) - assert.Nil(err) - assert.Equal(EthernetSegmentIdentifier{ - Type: ESI_LACP, - Value: []byte{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x00}, - }, esi) - - // ESI_MSTP - args = []string{"esi_mstp", "aa:bb:cc:dd:ee:ff", strconv.FormatInt(0x1122, 10)} // omit "ESI_" + lower case - esi, err = ParseEthernetSegmentIdentifier(args) - assert.Nil(err) - assert.Equal(EthernetSegmentIdentifier{ - Type: ESI_MSTP, - Value: []byte{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x00}, - }, esi) - - // ESI_MAC - args = []string{"ESI_MAC", "aa:bb:cc:dd:ee:ff", strconv.FormatInt(0x112233, 10)} - esi, err = ParseEthernetSegmentIdentifier(args) - assert.Nil(err) - assert.Equal(EthernetSegmentIdentifier{ - Type: ESI_MAC, - Value: []byte{0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0x33}, - }, esi) - - // ESI_ROUTERID - args = []string{"ESI_ROUTERID", "1.1.1.1", strconv.FormatInt(0x11223344, 10)} - esi, err = ParseEthernetSegmentIdentifier(args) - assert.Nil(err) - assert.Equal(EthernetSegmentIdentifier{ - Type: ESI_ROUTERID, - Value: []byte{0x01, 0x01, 0x01, 0x01, 0x11, 0x22, 0x33, 0x44, 0x00}, - }, esi) - - // ESI_AS - args = []string{"ESI_AS", strconv.FormatInt(0xaabbccdd, 10), strconv.FormatInt(0x11223344, 10)} - esi, err = ParseEthernetSegmentIdentifier(args) - assert.Nil(err) - assert.Equal(EthernetSegmentIdentifier{ - Type: ESI_AS, - Value: []byte{0xaa, 0xbb, 0xcc, 0xdd, 0x11, 0x22, 0x33, 0x44, 0x00}, - }, esi) - - // Other - args = []string{"99", "11:22:33:44:55:66:77:88:99"} - esi, err = ParseEthernetSegmentIdentifier(args) - assert.Nil(err) - assert.Equal(EthernetSegmentIdentifier{ - Type: ESIType(99), - Value: []byte{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}, - }, esi) -} - -func TestParseBogusShortData(t *testing.T) { - var bodies = []BGPBody{ - &BGPOpen{}, - &BGPUpdate{}, - &BGPNotification{}, - &BGPKeepAlive{}, - &BGPRouteRefresh{}, - } - - for _, b := range bodies { - b.DecodeFromBytes([]byte{0}) - } -} - -func TestFuzzCrashers(t *testing.T) { - var crashers = []string{ - "000000000000000000\x01", - } - - for _, f := range crashers { - ParseBGPMessage([]byte(f)) - } -} - -func TestNormalizeFlowSpecOpValues(t *testing.T) { - tests := []struct { - msg string - args []string - want []string - }{ - { - msg: "valid match", - args: []string{" & <=80", " tcp != udp ", " =! SA & =U! F", " = is-fragment+last-fragment"}, - want: []string{"<=80", "tcp", "!=udp", "=!SA", "&=U", "!F", "=is-fragment+last-fragment"}, - }, - { - msg: "RFC5575 trims & prefix", - args: []string{"&<=80"}, - want: []string{"<=80"}, - }, - } - - for _, tt := range tests { - t.Run(tt.msg, func(t *testing.T) { - got := normalizeFlowSpecOpValues(tt.args) - assert.Equal(t, tt.want, got) - }) - } -} |