Skip to content

Commit

Permalink
change mpls vpn message format
Browse files Browse the repository at this point in the history
Signed-off-by: Peng Xiao <xiaoquwl@gmail.com>
  • Loading branch information
xiaopeng163 committed Jan 22, 2016
1 parent fb44ffe commit 6bd08bd
Show file tree
Hide file tree
Showing 9 changed files with 55 additions and 34 deletions.
6 changes: 2 additions & 4 deletions doc/source/msg_format.rst
Original file line number Diff line number Diff line change
Expand Up @@ -370,8 +370,7 @@ IPv4 MPLSVPN
{
"label": [25],
"rd": "100:100",
"rd_type": 0,
"str": "11.11.11.11/32"}]}
"prefix": "11.11.11.11/32"}]}
}
}
Expand Down Expand Up @@ -427,8 +426,7 @@ IPv4 MPLSVPN
"withdraw": [
{
"rd": "100:100",
"rd_type": 0,
"str": "11.11.11.11/32"}]}
"prefix": "11.11.11.11/32"}]}
}
}
Expand Down
8 changes: 7 additions & 1 deletion yabgp/common/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@
# route distinguisher type
BGP_ROUTE_DISTINGUISHER_TYPE_0 = 0x0000
BGP_ROUTE_DISTINGUISHER_TYPE_1 = 0x0001
BGP_ROUTE_DISTINGUISHER_TYPE_2 = 0x0001
BGP_ROUTE_DISTINGUISHER_TYPE_2 = 0x0002

# NLRI type as define in BGP flow spec RFC
BGPNLRI_FSPEC_DST_PFIX = 1 # RFC 5575
Expand All @@ -135,6 +135,12 @@
BGPNLRI_FSPEC_DSCP = 11 # RFC 5575
BGPNLRI_FSPEC_FRAGMENT = 12 # RFC 5575

# NLRI type as define in BGP EVPN
BGPNLRI_EVPN_ETHERNET_AUTO_DISCOVERY = 1
BGPNLRI_EVPN_MAC_IP_ADVERTISEMENT = 2
BGPNLRI_EVPN_INCLUSIVE_MULTICAST_ETHERNET_TAG = 3
BGPNLRI_EVPN_ETHERNET_SEGMENT = 4

# BGP message Constants
VERSION = 4
PORT = 179
Expand Down
8 changes: 4 additions & 4 deletions yabgp/message/attribute/nlri/ipv4_mpls_vpn.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,11 @@ def parse(cls, value, iswithdraw=False):
else:
nlri_dict['label'] = [MPLSVPN.WITHDARW_LABEL]

nlri_dict['rd_type'], nlri_dict['rd'] = MPLSVPN.parse_rd(value[4:12])
nlri_dict['rd'] = MPLSVPN.parse_rd(value[4:12])
prefix = value[12:prefix_byte_len + 1]
if len(prefix) < 4:
prefix += b'\x00' * (4 - len(prefix))
nlri_dict['str'] = str(netaddr.IPAddress(struct.unpack('!I', prefix)[0])) +\
nlri_dict['prefix'] = str(netaddr.IPAddress(struct.unpack('!I', prefix)[0])) +\
'/%s' % (prefix_bit_len - 88)
value = value[prefix_byte_len + 1:]
nlri_list.append(nlri_dict)
Expand All @@ -99,9 +99,9 @@ def construct(cls, value, iswithdraw=False):
else:
label_hex = MPLSVPN.construct_mpls_label_stack(nlri['label'])
# construct rd
rd_hex = MPLSVPN.construct_rd(nlri)
rd_hex = MPLSVPN.construct_rd(nlri['rd'])
# construct prefix
prefix_str, prefix_len = nlri['str'].split('/')
prefix_str, prefix_len = nlri['prefix'].split('/')
prefix_len = int(prefix_len)
prefix_hex = struct.pack('!I', netaddr.IPAddress(prefix_str).value)
prefix_hex = label_hex + rd_hex + prefix_hex
Expand Down
19 changes: 11 additions & 8 deletions yabgp/message/attribute/nlri/mpls_vpn.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,18 @@ def parse_rd(cls, data):
else:
# fixme(by xiaopeng163) for other rd type process
rd = str(rd_value)
return rd_type, rd
return rd

@classmethod
def construct_rd(cls, data):
# fixme(by xiaopeng163) for other rd type process
if 'rd_type' not in data:
data['rd_type'] = bgp_cons.BGP_ROUTE_DISTINGUISHER_TYPE_0
if data['rd_type'] == bgp_cons.BGP_ROUTE_DISTINGUISHER_TYPE_0:
asn, an = data['rd'].split(':')
rd_hex = struct.pack('!HI', int(asn), int(an))
rd_hex = struct.pack('!H', data['rd_type']) + rd_hex
return rd_hex
data = data.split(':')
if '.' in data[0]:
return struct.pack('!H', bgp_cons.BGP_ROUTE_DISTINGUISHER_TYPE_1) + netaddr.IPAddress(data[0]).packed + \
struct.pack('!H', int(data[1]))
else:
data = [int(x) for x in data]
if data[0] <= 0xffff:
return struct.pack('!HHI', bgp_cons.BGP_ROUTE_DISTINGUISHER_TYPE_0, data[0], data[1])
else:
return struct.pack('!HIH', bgp_cons.BGP_ROUTE_DISTINGUISHER_TYPE_2, data[0], data[1])
10 changes: 5 additions & 5 deletions yabgp/tests/unit/message/attribute/nlri/test_ipv4_mpls_vpn.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,23 @@ class TestIPv4MPLSVPN(unittest.TestCase):
def test_parse(self):
nlri_hex = b'\x78\x00\x01\x91\x00\x00\x00\x64\x00\x00\x00\x64\xaa\x00\x00\x00'
self.assertEqual(
[{'label': [25], 'rd': '100:100', 'rd_type': 0, 'str': '170.0.0.0/32'}], IPv4MPLSVPN.parse(nlri_hex))
[{'label': [25], 'rd': '100:100', 'prefix': '170.0.0.0/32'}], IPv4MPLSVPN.parse(nlri_hex))

def test_construct_1(self):
nlri_hex = b'\x76\x00\x01\x41\x00\x00\xfd\xea\x00\x00\x00\x01\x17\x00\x00\x00'
nlri_list = [{'label': [20], 'rd': '65002:1', 'rd_type': 0, 'str': '23.0.0.0/30'}]
nlri_list = [{'label': [20], 'rd': '65002:1', 'prefix': '23.0.0.0/30'}]
self.assertEqual(nlri_list, IPv4MPLSVPN.parse(nlri_hex))
self.assertEqual(nlri_hex, IPv4MPLSVPN.construct(nlri_list), )

def test_construct_2(self):
nlri_hex = b'\x78\x00\x01\x91\x00\x00\x00\x64\x00\x00\x00\x64\xaa\x00\x00\x00'
nlri_list = [{'label': [25], 'rd': '100:100', 'rd_type': 0, 'str': '170.0.0.0/32'}]
nlri_list = [{'label': [25], 'rd': '100:100', 'prefix': '170.0.0.0/32'}]
self.assertEqual(nlri_hex, IPv4MPLSVPN.construct(nlri_list))

def test_construct_multi(self):
nlri_list = [
{'label': [25], 'rd': '100:100', 'rd_type': 0, 'str': '170.0.0.0/32'},
{'label': [20], 'rd': '65002:1', 'rd_type': 0, 'str': '23.0.0.0/30'}
{'label': [25], 'rd': '100:100', 'prefix': '170.0.0.0/32'},
{'label': [20], 'rd': '65002:1', 'prefix': '23.0.0.0/30'}
]
self.assertEqual(nlri_list, IPv4MPLSVPN.parse(IPv4MPLSVPN.construct(nlri_list)))

Expand Down
20 changes: 20 additions & 0 deletions yabgp/tests/unit/message/attribute/nlri/test_mpls_vpn.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,25 @@ def test_construct_mpls_label_stack(self):
label_bin = b'\x00\x01\x41'
self.assertEqual(label_bin, MPLSVPN.construct_mpls_label_stack(labels=[20]))

def test_parse_and_construct_rd_type0(self):
# for rd type 0
rd_bin = b'\x00\x00\xfd\xea\x00\x00\x00\x01'
rd_parsed = '65002:1'
self.assertEqual(rd_parsed, MPLSVPN.parse_rd(rd_bin))
self.assertEqual(rd_bin, MPLSVPN.construct_rd(rd_parsed))

def test_parse_and_construct_rd_type1(self):

rd_bin = b'\x00\x01\xac\x11\x00\x03\x00\x02'
rd_parsed = '172.17.0.3:2'
self.assertEqual(rd_parsed, MPLSVPN.parse_rd(rd_bin))
self.assertEqual(rd_bin, MPLSVPN.construct_rd(rd_parsed))

def test_parse_and_construct_rd_type2(self):
rd_bin = b'\x00\x02\x00\x01\x00\x00\x00\x02'
rd_parsed = '65536:2'
self.assertEqual(rd_parsed, MPLSVPN.parse_rd(rd_bin))
self.assertEqual(rd_bin, MPLSVPN.construct_rd(rd_parsed))

if __name__ == '__main__':
unittest.main()
6 changes: 2 additions & 4 deletions yabgp/tests/unit/message/attribute/test_mpreachnlri.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@ def test_ipv4_mpls_vpn_parse(self):
'nexthop': {'rd': '0:0', 'str': '2.2.2.2'},
'nlri': [{'label': [25],
'rd': '100:100',
'rd_type': 0,
'str': '170.0.0.0/32'}]}
'prefix': '170.0.0.0/32'}]}
self.assertEqual(data_hoped, MpReachNLRI.parse(data_bin[3:]))

def test_ipv4_mpsl_vpn_construct_nexthop(self):
Expand All @@ -44,8 +43,7 @@ def test_ipv4_mpls_vpn_construct(self):
'nexthop': {'rd': '0:0', 'str': '2.2.2.2'},
'nlri': [{'label': [25],
'rd': '100:100',
'rd_type': 0,
'str': '170.0.0.0/32'}]}
'prefix': '170.0.0.0/32'}]}
self.assertEqual(data_parsed, MpReachNLRI.parse(MpReachNLRI.construct(data_parsed)[3:]))

def test_ipv6_unicast(self):
Expand Down
6 changes: 2 additions & 4 deletions yabgp/tests/unit/message/attribute/test_mpunreachnlri.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,15 @@ def test_ipv4_mpls_vpn_parse(self):
data_hoped = {'afi_safi': (1, 128),
'withdraw': [{'label': [524288],
'rd': '2:2',
'rd_type': 0,
'str': '192.168.201.0/24'}]}
'prefix': '192.168.201.0/24'}]}
self.assertEqual(data_hoped, MpUnReachNLRI.parse(data_bin[3:]))

def test_ipv4_mpls_vpn_construct(self):
data_bin = b'\x80\x0f\x13\x00\x01\x80\x70\x80\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\xc0\xa8\xc9\x00'
data_hoped = {'afi_safi': (1, 128),
'withdraw': [{'label': [524288],
'rd': '2:2',
'rd_type': 0,
'str': '192.168.201.0/24'}]}
'prefix': '192.168.201.0/24'}]}
self.assertEqual(data_bin, MpUnReachNLRI.construct(data_hoped))

def test_ipv6_unicast_parse(self):
Expand Down
6 changes: 2 additions & 4 deletions yabgp/tests/unit/message/test_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,7 @@ def test_parse_ipv4_mpls_vpn_update(self):
'nexthop': {'rd': '0:0', 'str': '192.168.1.6'},
'nlri': [{'label': [29],
'rd': '2:2',
'rd_type': 0,
'str': '192.168.201.0/24'}]},
'prefix': '192.168.201.0/24'}]},
16: [[2, '2:2']]}}
self.maxDiff = None
self.assertEqual(data_hoped['attr'], Update.parse(None, data_bin[HDR_LEN:], True)['attr'])
Expand All @@ -169,8 +168,7 @@ def test_parse_ipv4_mpls_vpn_withdraw(self):
data_hoped = {'attr': {15: {'afi_safi': (1, 128),
'withdraw': [{'label': [524288],
'rd': '2:2',
'rd_type': 0,
'str': '192.168.201.0/24'}]}}}
'prefix': '192.168.201.0/24'}]}}}
self.assertEqual(data_hoped['attr'], Update.parse(None, data_bin[HDR_LEN:], True)['attr'])

if __name__ == '__main__':
Expand Down

0 comments on commit 6bd08bd

Please sign in to comment.