diff --git a/protocols/bgp/packet/nlri_test.go b/protocols/bgp/packet/nlri_test.go index 1efb81eaf44e758685923c2e553d3890a92c5592..e9e786bc77299bedbc5320fc3801ceb135c4a904 100644 --- a/protocols/bgp/packet/nlri_test.go +++ b/protocols/bgp/packet/nlri_test.go @@ -60,6 +60,42 @@ func TestDecodeNLRIs(t *testing.T) { } } +func TestDecodeNLRIv6(t *testing.T) { + tests := []struct { + name string + input []byte + addPath bool + wantFail bool + expected *NLRI + }{ + { + name: "IPv6 default", + input: []byte{ + 0, + }, + wantFail: false, + expected: &NLRI{ + Prefix: bnet.NewPfx(bnet.IPv6FromBlocks(0, 0, 0, 0, 0, 0, 0, 0), 0), + }, + }, + } + + for _, test := range tests { + buf := bytes.NewBuffer(test.input) + res, _, err := decodeNLRI(buf, IPv6AFI, test.addPath) + + if test.wantFail && err == nil { + t.Errorf("Expected error did not happen for test %q", test.name) + } + + if !test.wantFail && err != nil { + t.Errorf("Unexpected failure for test %q: %v", test.name, err) + } + + assert.Equal(t, test.expected, res) + } +} + func TestDecodeNLRI(t *testing.T) { tests := []struct { name string diff --git a/protocols/bgp/server/bmp_router.go b/protocols/bgp/server/bmp_router.go index 46f0f0a80230acf1e2ae9ceb73fab4febafef723..7f572ed2f20319efbe24e09222f4d794f5931851 100644 --- a/protocols/bgp/server/bmp_router.go +++ b/protocols/bgp/server/bmp_router.go @@ -267,12 +267,11 @@ func (r *router) processPeerUpNotification(msg *bmppkt.PeerUpNotification) error }, fsm) fsm.ipv4Unicast.bmpInit() - /*fsm.ipv6Unicast = newFSMAddressFamily(packet.IPv6AFI, packet.UnicastSAFI, &peerAddressFamily{ + fsm.ipv6Unicast = newFSMAddressFamily(packet.IPv6AFI, packet.UnicastSAFI, &peerAddressFamily{ rib: r.rib6, importFilter: filter.NewAcceptAllFilter(), - //exportFilter: filter.NewDrainFilter(), }, fsm) - fsm.ipv6Unicast.bmpInit()*/ + fsm.ipv6Unicast.bmpInit() fsm.state = newOpenSentState(fsm) openSent := fsm.state.(*openSentState) @@ -318,12 +317,6 @@ func (p *peer) configureBySentOpen(msg *packet.BGPOpen) { case packet.ASN4CapabilityCode: asn4Cap := cap.Value.(packet.ASN4Capability) p.localASN = asn4Cap.ASN4 - // TODO: Make 4Byte ASN configurable - case packet.MultiProtocolCapabilityCode: - /*mpCap := cap.Value.(packet.MultiProtocolCapability) - p := fsm.peer.addressFamily(mpCap.AFI, mpCap.SAFI) - p.multiProtocol = true*/ - // FIXME! } } } diff --git a/protocols/bgp/server/bmp_router_test.go b/protocols/bgp/server/bmp_router_test.go index 7ccd96b638d291271079128a37be18f2c326843f..c67ca1846af6ae01ca1007c118264400e0be049f 100644 --- a/protocols/bgp/server/bmp_router_test.go +++ b/protocols/bgp/server/bmp_router_test.go @@ -329,6 +329,12 @@ func TestProcessPeerUpNotification(t *testing.T) { adjRIBIn: adjRIBIn.New(filter.NewAcceptAllFilter(), &routingtable.ContributingASNs{}, 169090600, 0, false), importFilter: filter.NewAcceptAllFilter(), }, + ipv6Unicast: &fsmAddressFamily{ + afi: 2, + safi: 1, + adjRIBIn: adjRIBIn.New(filter.NewAcceptAllFilter(), &routingtable.ContributingASNs{}, 169090600, 0, false), + importFilter: filter.NewAcceptAllFilter(), + }, }, }, }, diff --git a/protocols/bgp/server/bmp_server_test.go b/protocols/bgp/server/bmp_server_test.go index e2853952e6bdf949839af899bebe515bb279ad53..34a1e27b95a4b9be0f267f3271353588f6af0bfe 100644 --- a/protocols/bgp/server/bmp_server_test.go +++ b/protocols/bgp/server/bmp_server_test.go @@ -150,6 +150,579 @@ func TestIntegrationPeerUpRouteMonitor(t *testing.T) { conA.Close() } +func TestIntegrationPeerUpRouteMonitorIPv6IPv4(t *testing.T) { + addr := net.IP{10, 20, 30, 40} + port := uint16(12346) + + rib4 := locRIB.New() + rib6 := locRIB.New() + + r := newRouter(addr, port, rib4, rib6) + conA, conB := net.Pipe() + + go r.serve(conB) + + // Peer Up Notification + _, err := conA.Write([]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, 138, // 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, 90, // Length + 2, // Update + + 0, 0, // Withdrawn Routes Length + 0, 67, // Total Path Attribute Length + + 255, + 14, // MP REACH NLRI + 0, 22, // Length + 0, 2, // IPv6 + 1, // Unicast + 16, // IPv6 Next Hop + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0, // Reserved + 0, // Pfxlen /0 + + 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 + + // THIRD MESSAGE + // Common Header + 3, // Version + 0, 0, 0, 113, // 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, 65, // 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 + + 0, // /0 + }) + + if err != nil { + panic("write failed") + } + + time.Sleep(time.Millisecond * 50) + assert.NotEmpty(t, r.neighbors) + + time.Sleep(time.Millisecond * 50) + + count := rib6.RouteCount() + if count != 1 { + t.Errorf("Unexpected IPv6 route count. Expected: 1 Got: %d", count) + } + + count = rib4.RouteCount() + if count != 1 { + t.Errorf("Unexpected IPv4 route count. Expected: 1 Got: %d", count) + } + + conA.Close() +} + +func TestIntegrationPeerUpRouteMonitorIPv4IPv6(t *testing.T) { + addr := net.IP{10, 20, 30, 40} + port := uint16(12346) + + rib4 := locRIB.New() + rib6 := locRIB.New() + + r := newRouter(addr, port, rib4, rib6) + conA, conB := net.Pipe() + + go r.serve(conB) + + // Peer Up Notification + _, err := conA.Write([]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, 113, // 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, 65, // 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 + + 0, // /0 + + // THIRD MESSAGE + + // Common Header + 3, // Version + 0, 0, 0, 138, // 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, 90, // Length + 2, // Update + + 0, 0, // Withdrawn Routes Length + 0, 67, // Total Path Attribute Length + + 255, + 14, // MP REACH NLRI + 0, 22, // Length + 0, 2, // IPv6 + 1, // Unicast + 16, // IPv6 Next Hop + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0, // Reserved + 0, // Pfxlen /0 + + 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 + }) + + if err != nil { + panic("write failed") + } + + time.Sleep(time.Millisecond * 50) + assert.NotEmpty(t, r.neighbors) + + time.Sleep(time.Millisecond * 50) + + count := rib6.RouteCount() + if count != 1 { + t.Errorf("Unexpected IPv6 route count. Expected: 1 Got: %d", count) + } + + count = rib4.RouteCount() + if count != 1 { + t.Errorf("Unexpected IPv4 route count. Expected: 1 Got: %d", count) + } + + conA.Close() +} + +func TestIntegrationPeerUpRouteMonitorIPv6(t *testing.T) { + addr := net.IP{10, 20, 30, 40} + port := uint16(12346) + + rib4 := locRIB.New() + rib6 := locRIB.New() + + r := newRouter(addr, port, rib4, rib6) + conA, conB := net.Pipe() + + go r.serve(conB) + + // Peer Up Notification + _, err := conA.Write([]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, 138, // 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, 90, // Length + 2, // Update + + 0, 0, // Withdrawn Routes Length + 0, 67, // Total Path Attribute Length + + 255, + 14, // MP REACH NLRI + 0, 22, // Length + 0, 2, // IPv6 + 1, // Unicast + 16, // IPv6 Next Hop + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0, // Reserved + 0, // Pfxlen /0 + + 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 + }) + + if err != nil { + panic("write failed") + } + + time.Sleep(time.Millisecond * 50) + assert.NotEmpty(t, r.neighbors) + + time.Sleep(time.Millisecond * 50) + + count := rib6.RouteCount() + if count != 1 { + t.Errorf("Unexpected IPv6 route count. Expected: 1 Got: %d", count) + } + + count = rib4.RouteCount() + if count != 0 { + t.Errorf("Unexpected IPv4 route count. Expected: 0 Got: %d", count) + } + + conA.Close() +} + func TestIntegrationIncompleteBMPMsg(t *testing.T) { addr := net.IP{10, 20, 30, 40} port := uint16(12346) diff --git a/protocols/bgp/server/fsm_address_family.go b/protocols/bgp/server/fsm_address_family.go index ac1ace92cb7894b4fdf179497e6375a74598b0a7..6bd56ad05d8df357f808885a810f558da1d8c54d 100644 --- a/protocols/bgp/server/fsm_address_family.go +++ b/protocols/bgp/server/fsm_address_family.go @@ -103,13 +103,11 @@ func (f *fsmAddressFamily) processUpdate(u *packet.BGPUpdate) { return } - if f.multiProtocol { - f.multiProtocolUpdates(u) - return + f.multiProtocolUpdates(u) + if f.afi == packet.IPv4AFI { + f.withdraws(u) + f.updates(u) } - - f.withdraws(u) - f.updates(u) } func (f *fsmAddressFamily) withdraws(u *packet.BGPUpdate) { @@ -200,6 +198,8 @@ func (f *fsmAddressFamily) processAttributes(attrs *packet.PathAttribute, path * path.BGPPath.OriginatorID = pa.Value.(uint32) case packet.ClusterListAttr: path.BGPPath.ClusterList = pa.Value.([]uint32) + case packet.MultiProtocolReachNLRICode: + case packet.MultiProtocolUnreachNLRICode: default: unknownAttr := f.processUnknownAttribute(pa) if unknownAttr != nil { diff --git a/routingtable/locRIB/loc_rib.go b/routingtable/locRIB/loc_rib.go index d9ad2b46f29ee95d8a0d6b42ff513bd7172e067f..aa60b9243aab1846bdb6dd010f9ced6155071268 100644 --- a/routingtable/locRIB/loc_rib.go +++ b/routingtable/locRIB/loc_rib.go @@ -64,7 +64,6 @@ func (a *LocRIB) RouteCount() int64 { func (a *LocRIB) AddPath(pfx net.Prefix, p *route.Path) error { a.mu.Lock() defer a.mu.Unlock() - logrus.WithFields(map[string]interface{}{ "Prefix": pfx, "Route": p,