diff --git a/protocols/bgp/server/bmp_server_test.go b/protocols/bgp/server/bmp_server_test.go index 79f5d10d47f0fc5cf3be4854550461be9e7c558a..086ec90ede76cff15810e30e02971391a02476be 100644 --- a/protocols/bgp/server/bmp_server_test.go +++ b/protocols/bgp/server/bmp_server_test.go @@ -1449,6 +1449,8 @@ func TestIntegrationPeerUpRouteMonitorIPv6WithClientBeforeBMPPeer(t *testing.T) name string afi uint8 unregister bool + doubleSubscribe bool + doubleUnsubscribe bool input []byte expectedRouteCount int }{ @@ -1684,6 +1686,240 @@ func TestIntegrationPeerUpRouteMonitorIPv6WithClientBeforeBMPPeer(t *testing.T) }, expectedRouteCount: 1, }, + { + name: "IPv4 with double unregister", + afi: packet.IPv4AFI, + doubleUnsubscribe: true, + unregister: true, + input: []byte{ + // Common Header + 3, // Version + 0, 0, 0, 142, // Message Length + 3, // Msg Type = Peer Up Notification + + // Per Peer Header + 0, // Peer Type + 0, // Peer Flags + 0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address + 0, 0, 0, 100, // Peer AS + 0, 0, 0, 255, // Peer BGP ID + 0, 0, 0, 0, // Timestamp s + 0, 0, 0, 0, // Timestamp µs + + // Peer Up Notification + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 41, // 10.20.30.41 local address + 0, 123, // Local Port + 0, 234, // Remote Port + + // Sent OPEN message + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 37, // Length + 1, // Open message type + 4, // BGP Version + 0, 200, // AS + 0, 180, // Hold Time + 1, 0, 0, 1, // BGP Identifier + 8, // Opt param length + 2, 6, + 1, 4, // MP BGP + 0, 2, // IPv6 + 0, 1, // Unicast + + // Received OPEN message + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 37, // Length + 1, // Open message type + 4, // BGP Version + 0, 100, // AS + 0, 180, // Hold Time + 1, 0, 0, 255, // BGP Identifier + 8, // Opt param length + 2, 6, + 1, 4, // MP BGP + 0, 2, // IPv6 + 0, 1, // Unicast + + // SECOND MESSAGE: + + // Common Header + 3, // Version + 0, 0, 0, 116, // Message Length + 0, // Msg Type = Route Monitoring Message + + // Per Peer Header + 0, // Peer Type + 0, // Peer Flags + 0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address + 0, 0, 0, 100, // Peer AS + 0, 0, 0, 255, // Peer BGP ID + 0, 0, 0, 0, // Timestamp s + 0, 0, 0, 0, // Timestamp µs + + // BGP Update + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 68, // Length + 2, // Update + + 0, 0, // Withdrawn Routes Length + 0, 41, // Total Path Attribute Length + + 255, // Attribute flags + 1, // Attribute Type code (ORIGIN) + 0, 1, // Length + 2, // INCOMPLETE + + 0, // Attribute flags + 2, // Attribute Type code (AS Path) + 12, // Length + 2, // Type = AS_SEQUENCE + 2, // Path Segment Length + 59, 65, // AS15169 + 12, 248, // AS3320 + 1, // Type = AS_SET + 2, // Path Segment Length + 59, 65, // AS15169 + 12, 248, // AS3320 + + 0, // Attribute flags + 3, // Attribute Type code (Next Hop) + 4, // Length + 10, 11, 12, 13, // Next Hop + + 0, // Attribute flags + 4, // Attribute Type code (MED) + 4, // Length + 0, 0, 1, 0, // MED 256 + + 0, // Attribute flags + 5, // Attribute Type code (Local Pref) + 4, // Length + 0, 0, 1, 0, // Local Pref 256 + + // NLRI + 24, + 192, 168, 0, + }, + expectedRouteCount: 1, + }, + { + name: "IPv4 with double register", + afi: packet.IPv4AFI, + doubleSubscribe: true, + unregister: true, + input: []byte{ + // Common Header + 3, // Version + 0, 0, 0, 142, // Message Length + 3, // Msg Type = Peer Up Notification + + // Per Peer Header + 0, // Peer Type + 0, // Peer Flags + 0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address + 0, 0, 0, 100, // Peer AS + 0, 0, 0, 255, // Peer BGP ID + 0, 0, 0, 0, // Timestamp s + 0, 0, 0, 0, // Timestamp µs + + // Peer Up Notification + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 41, // 10.20.30.41 local address + 0, 123, // Local Port + 0, 234, // Remote Port + + // Sent OPEN message + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 37, // Length + 1, // Open message type + 4, // BGP Version + 0, 200, // AS + 0, 180, // Hold Time + 1, 0, 0, 1, // BGP Identifier + 8, // Opt param length + 2, 6, + 1, 4, // MP BGP + 0, 2, // IPv6 + 0, 1, // Unicast + + // Received OPEN message + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 37, // Length + 1, // Open message type + 4, // BGP Version + 0, 100, // AS + 0, 180, // Hold Time + 1, 0, 0, 255, // BGP Identifier + 8, // Opt param length + 2, 6, + 1, 4, // MP BGP + 0, 2, // IPv6 + 0, 1, // Unicast + + // SECOND MESSAGE: + + // Common Header + 3, // Version + 0, 0, 0, 116, // Message Length + 0, // Msg Type = Route Monitoring Message + + // Per Peer Header + 0, // Peer Type + 0, // Peer Flags + 0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address + 0, 0, 0, 100, // Peer AS + 0, 0, 0, 255, // Peer BGP ID + 0, 0, 0, 0, // Timestamp s + 0, 0, 0, 0, // Timestamp µs + + // BGP Update + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 68, // Length + 2, // Update + + 0, 0, // Withdrawn Routes Length + 0, 41, // Total Path Attribute Length + + 255, // Attribute flags + 1, // Attribute Type code (ORIGIN) + 0, 1, // Length + 2, // INCOMPLETE + + 0, // Attribute flags + 2, // Attribute Type code (AS Path) + 12, // Length + 2, // Type = AS_SEQUENCE + 2, // Path Segment Length + 59, 65, // AS15169 + 12, 248, // AS3320 + 1, // Type = AS_SET + 2, // Path Segment Length + 59, 65, // AS15169 + 12, 248, // AS3320 + + 0, // Attribute flags + 3, // Attribute Type code (Next Hop) + 4, // Length + 10, 11, 12, 13, // Next Hop + + 0, // Attribute flags + 4, // Attribute Type code (MED) + 4, // Length + 0, 0, 1, 0, // MED 256 + + 0, // Attribute flags + 5, // Attribute Type code (Local Pref) + 4, // Length + 0, 0, 1, 0, // Local Pref 256 + + // NLRI + 24, + 192, 168, 0, + }, + expectedRouteCount: 1, + }, { name: "IPv6 without unregister", afi: packet.IPv6AFI, @@ -1820,9 +2056,15 @@ func TestIntegrationPeerUpRouteMonitorIPv6WithClientBeforeBMPPeer(t *testing.T) client := locRIB.New() r.subscribeRIBs(client, test.afi) + if test.doubleSubscribe { + r.subscribeRIBs(client, test.afi) + } if test.unregister { r.unsubscribeRIBs(client, test.afi) + if test.doubleUnsubscribe { + r.unsubscribeRIBs(client, test.afi) + } } go r.serve(conB)