Skip to content
Snippets Groups Projects
Unverified Commit e9e5c326 authored by takt's avatar takt Committed by GitHub
Browse files

Merge pull request #115 from bio-routing/feature/ipv4_mp

added flag to allow ipv4 being advertised as MP
parents 6169d537 770229cd
No related branches found
No related tags found
No related merge requests found
......@@ -11,21 +11,22 @@ import (
// Peer defines the configuration for a BGP session
type Peer struct {
AdminEnabled bool
ReconnectInterval time.Duration
KeepAlive time.Duration
HoldTime time.Duration
LocalAddress bnet.IP
PeerAddress bnet.IP
LocalAS uint32
PeerAS uint32
Passive bool
RouterID uint32
RouteServerClient bool
RouteReflectorClient bool
RouteReflectorClusterID uint32
IPv4 *AddressFamilyConfig
IPv6 *AddressFamilyConfig
AdminEnabled bool
ReconnectInterval time.Duration
KeepAlive time.Duration
HoldTime time.Duration
LocalAddress bnet.IP
PeerAddress bnet.IP
LocalAS uint32
PeerAS uint32
Passive bool
RouterID uint32
RouteServerClient bool
RouteReflectorClient bool
RouteReflectorClusterID uint32
AdvertiseIPv4MultiProtocol bool
IPv4 *AddressFamilyConfig
IPv6 *AddressFamilyConfig
}
// AddressFamilyConfig represents all configuration parameters specific for an address family
......
......@@ -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)
}
})
}
}
......@@ -29,14 +29,15 @@ type peer struct {
fsms []*FSM
fsmsMu sync.Mutex
routerID uint32
reconnectInterval time.Duration
keepaliveTime time.Duration
holdTime time.Duration
optOpenParams []packet.OptParam
routeServerClient bool
routeReflectorClient bool
clusterID uint32
routerID uint32
reconnectInterval time.Duration
keepaliveTime time.Duration
holdTime time.Duration
optOpenParams []packet.OptParam
routeServerClient bool
routeReflectorClient bool
ipv4MultiProtocolAdvertised bool
clusterID uint32
ipv4 *peerAddressFamily
ipv6 *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 register or to comment