Skip to content
Snippets Groups Projects
Unverified Commit 4c9f4c45 authored by Daniel Czerwonk's avatar Daniel Czerwonk Committed by GitHub
Browse files

Merge branch 'master' into fix/conn_mock

parents f718478b e9e5c326
Branches
Tags
No related merge requests found
......@@ -24,6 +24,7 @@ type Peer struct {
RouteServerClient bool
RouteReflectorClient bool
RouteReflectorClusterID uint32
AdvertiseIPv4MultiProtocol bool
IPv4 *AddressFamilyConfig
IPv6 *AddressFamilyConfig
}
......
......
......@@ -182,6 +182,10 @@ func (s *openSentState) processMultiProtocolCapability(cap packet.MultiProtocolC
return
}
if cap.AFI == packet.IPv4AFI && !s.fsm.peer.ipv4MultiProtocolAdvertised {
return
}
f := s.fsm.addressFamily(cap.AFI, cap.SAFI)
if f != nil {
f.multiProtocol = true
......
......
......@@ -87,3 +87,114 @@ func TestOpenMsgReceived(t *testing.T) {
})
}
}
func TestProcessMultiProtocolCapability(t *testing.T) {
tests := []struct {
name string
peer *peer
caps []packet.MultiProtocolCapability
expectIPv4MultiProtocol bool
expectIPv6MultiProtocol bool
}{
{
name: "IPv4 only without multi protocol configuration",
peer: &peer{
ipv4: &peerAddressFamily{},
},
caps: []packet.MultiProtocolCapability{
packet.MultiProtocolCapability{
AFI: packet.IPv4AFI,
SAFI: packet.UnicastSAFI,
},
},
},
{
name: "IPv4 only with multi protocol configuration",
peer: &peer{
ipv4: &peerAddressFamily{},
ipv4MultiProtocolAdvertised: true,
},
caps: []packet.MultiProtocolCapability{
packet.MultiProtocolCapability{
AFI: packet.IPv4AFI,
SAFI: packet.UnicastSAFI,
},
},
expectIPv4MultiProtocol: true,
},
{
name: "IPv6 only",
peer: &peer{
ipv6: &peerAddressFamily{},
},
caps: []packet.MultiProtocolCapability{
packet.MultiProtocolCapability{
AFI: packet.IPv6AFI,
SAFI: packet.UnicastSAFI,
},
},
expectIPv6MultiProtocol: true,
},
{
name: "IPv4 and IPv6, only IPv6 configured as multi protocol",
peer: &peer{
ipv4: &peerAddressFamily{},
ipv6: &peerAddressFamily{},
},
caps: []packet.MultiProtocolCapability{
packet.MultiProtocolCapability{
AFI: packet.IPv6AFI,
SAFI: packet.UnicastSAFI,
},
packet.MultiProtocolCapability{
AFI: packet.IPv4AFI,
SAFI: packet.UnicastSAFI,
},
},
expectIPv6MultiProtocol: true,
},
{
name: "IPv4 and IPv6 configured as multi protocol",
peer: &peer{
ipv4: &peerAddressFamily{},
ipv6: &peerAddressFamily{},
ipv4MultiProtocolAdvertised: true,
},
caps: []packet.MultiProtocolCapability{
packet.MultiProtocolCapability{
AFI: packet.IPv6AFI,
SAFI: packet.UnicastSAFI,
},
packet.MultiProtocolCapability{
AFI: packet.IPv4AFI,
SAFI: packet.UnicastSAFI,
},
},
expectIPv4MultiProtocol: true,
expectIPv6MultiProtocol: true,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
fsm := newFSM(test.peer)
fsm.con = &btesting.MockConn{}
s := &openSentState{
fsm: fsm,
}
for _, cap := range test.caps {
s.processMultiProtocolCapability(cap)
}
if fsm.ipv4Unicast != nil {
assert.Equal(t, test.expectIPv4MultiProtocol, fsm.ipv4Unicast.multiProtocol)
}
if fsm.ipv6Unicast != nil {
assert.Equal(t, test.expectIPv6MultiProtocol, fsm.ipv6Unicast.multiProtocol)
}
})
}
}
......@@ -36,6 +36,7 @@ type peer struct {
optOpenParams []packet.OptParam
routeServerClient bool
routeReflectorClient bool
ipv4MultiProtocolAdvertised bool
clusterID uint32
ipv4 *peerAddressFamily
......@@ -162,6 +163,11 @@ func newPeer(c config.Peer, server *bgpServer) (*peer, error) {
caps = append(caps, asn4Capability(c))
if c.IPv4 != nil && c.AdvertiseIPv4MultiProtocol {
caps = append(caps, multiProtocolCapability(packet.IPv4AFI))
p.ipv4MultiProtocolAdvertised = true
}
if c.IPv6 != nil {
p.ipv6 = &peerAddressFamily{
rib: c.IPv6.RIB,
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment