packet.bgp: implement RFC 4893
Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
95a1cfbba2
commit
3151190870
@ -71,6 +71,10 @@ BGP_ATTR_TYPE_ATOMIC_AGGREGATE = 6 # 0 bytes
|
|||||||
BGP_ATTR_TYPE_AGGREGATOR = 7 # AS number and IPv4 address
|
BGP_ATTR_TYPE_AGGREGATOR = 7 # AS number and IPv4 address
|
||||||
BGP_ATTR_TYPE_MP_REACH_NLRI = 14 # RFC 4760
|
BGP_ATTR_TYPE_MP_REACH_NLRI = 14 # RFC 4760
|
||||||
BGP_ATTR_TYPE_MP_UNREACH_NLRI = 15 # RFC 4760
|
BGP_ATTR_TYPE_MP_UNREACH_NLRI = 15 # RFC 4760
|
||||||
|
BGP_ATTR_TYPE_AS4_PATH = 17 # RFC 4893
|
||||||
|
BGP_ATTR_TYPE_AS4_AGGREGATOR = 18 # RFC 4893
|
||||||
|
|
||||||
|
AS_TRANS = 23456 # RFC 4893
|
||||||
|
|
||||||
|
|
||||||
def pad(bin, len_):
|
def pad(bin, len_):
|
||||||
@ -247,12 +251,11 @@ class BGPPathAttributeOrigin(_PathAttribute):
|
|||||||
_ATTR_FLAGS = BGP_ATTR_FLAG_TRANSITIVE
|
_ATTR_FLAGS = BGP_ATTR_FLAG_TRANSITIVE
|
||||||
|
|
||||||
|
|
||||||
@_PathAttribute.register_type(BGP_ATTR_TYPE_AS_PATH)
|
class _BGPPathAttributeAsPathCommon(_PathAttribute):
|
||||||
class BGPPathAttributeAsPath(_PathAttribute):
|
|
||||||
_AS_SET = 1
|
_AS_SET = 1
|
||||||
_AS_SEQUENCE = 2
|
_AS_SEQUENCE = 2
|
||||||
_SEG_HDR_PACK_STR = '!BB'
|
_SEG_HDR_PACK_STR = '!BB'
|
||||||
_AS_PACK_STR = '!H'
|
_AS_PACK_STR = None
|
||||||
_ATTR_FLAGS = BGP_ATTR_FLAG_TRANSITIVE
|
_ATTR_FLAGS = BGP_ATTR_FLAG_TRANSITIVE
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -296,6 +299,24 @@ class BGPPathAttributeAsPath(_PathAttribute):
|
|||||||
return buf
|
return buf
|
||||||
|
|
||||||
|
|
||||||
|
@_PathAttribute.register_type(BGP_ATTR_TYPE_AS_PATH)
|
||||||
|
class BGPPathAttributeAsPath(_BGPPathAttributeAsPathCommon):
|
||||||
|
# XXX currently this implementation assumes 16 bit AS numbers.
|
||||||
|
# depends on negotiated capability, AS numbers can be 32 bit.
|
||||||
|
# while wireshark seems to attempt auto-detect, it seems that
|
||||||
|
# there's no way to detect it reliably. for example, the
|
||||||
|
# following byte sequence can be interpreted in two ways.
|
||||||
|
# 01 02 99 88 77 66 02 01 55 44
|
||||||
|
# AS_SET num=2 9988 7766 AS_SEQUENCE num=1 5544
|
||||||
|
# AS_SET num=2 99887766 02015544
|
||||||
|
_AS_PACK_STR = '!H'
|
||||||
|
|
||||||
|
|
||||||
|
@_PathAttribute.register_type(BGP_ATTR_TYPE_AS4_PATH)
|
||||||
|
class BGPPathAttributeAs4Path(_BGPPathAttributeAsPathCommon):
|
||||||
|
_AS_PACK_STR = '!I'
|
||||||
|
|
||||||
|
|
||||||
@_PathAttribute.register_type(BGP_ATTR_TYPE_NEXT_HOP)
|
@_PathAttribute.register_type(BGP_ATTR_TYPE_NEXT_HOP)
|
||||||
class BGPPathAttributeNextHop(_PathAttribute):
|
class BGPPathAttributeNextHop(_PathAttribute):
|
||||||
_VALUE_PACK_STR = '!4s'
|
_VALUE_PACK_STR = '!4s'
|
||||||
@ -337,15 +358,14 @@ class BGPPathAttributeAtomicAggregate(_PathAttribute):
|
|||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
@_PathAttribute.register_type(BGP_ATTR_TYPE_AGGREGATOR)
|
class _BGPPathAttributeAggregatorCommon(_PathAttribute):
|
||||||
class BGPPathAttributeAggregator(_PathAttribute):
|
_VALUE_PACK_STR = None
|
||||||
_VALUE_PACK_STR = '!H4s'
|
|
||||||
_ATTR_FLAGS = BGP_ATTR_FLAG_OPTIONAL | BGP_ATTR_FLAG_TRANSITIVE
|
_ATTR_FLAGS = BGP_ATTR_FLAG_OPTIONAL | BGP_ATTR_FLAG_TRANSITIVE
|
||||||
|
|
||||||
def __init__(self, as_number, ip_addr, flags=0, type_=None, length=None):
|
def __init__(self, as_number, ip_addr, flags=0, type_=None, length=None):
|
||||||
super(BGPPathAttributeAggregator, self).__init__(flags=flags,
|
super(_BGPPathAttributeAggregatorCommon, self).__init__(flags=flags,
|
||||||
type_=type_,
|
type_=type_,
|
||||||
length=length)
|
length=length)
|
||||||
self.as_number = as_number
|
self.as_number = as_number
|
||||||
self.ip_addr = ip_addr
|
self.ip_addr = ip_addr
|
||||||
|
|
||||||
@ -365,6 +385,17 @@ class BGPPathAttributeAggregator(_PathAttribute):
|
|||||||
return buf
|
return buf
|
||||||
|
|
||||||
|
|
||||||
|
@_PathAttribute.register_type(BGP_ATTR_TYPE_AGGREGATOR)
|
||||||
|
class BGPPathAttributeAggregator(_BGPPathAttributeAggregatorCommon):
|
||||||
|
# XXX currently this implementation assumes 16 bit AS numbers.
|
||||||
|
_VALUE_PACK_STR = '!H4s'
|
||||||
|
|
||||||
|
|
||||||
|
@_PathAttribute.register_type(BGP_ATTR_TYPE_AS4_AGGREGATOR)
|
||||||
|
class BGPPathAttributeAs4Aggregator(_BGPPathAttributeAggregatorCommon):
|
||||||
|
_VALUE_PACK_STR = '!I4s'
|
||||||
|
|
||||||
|
|
||||||
class BGPNLRI(_IPAddrPrefix):
|
class BGPNLRI(_IPAddrPrefix):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -78,6 +78,10 @@ class Test_bgp(unittest.TestCase):
|
|||||||
bgp.BGPPathAttributeAtomicAggregate(),
|
bgp.BGPPathAttributeAtomicAggregate(),
|
||||||
bgp.BGPPathAttributeAggregator(as_number=40000,
|
bgp.BGPPathAttributeAggregator(as_number=40000,
|
||||||
ip_addr='192.0.2.99'),
|
ip_addr='192.0.2.99'),
|
||||||
|
bgp.BGPPathAttributeAs4Path(value=[[1000000], set([1000001, 1002]),
|
||||||
|
[1003, 1000004]]),
|
||||||
|
bgp.BGPPathAttributeAs4Aggregator(as_number=100040000,
|
||||||
|
ip_addr='192.0.2.99'),
|
||||||
bgp.BGPPathAttributeUnknown(flags=0, type_=100, value=300*'bar')
|
bgp.BGPPathAttributeUnknown(flags=0, type_=100, value=300*'bar')
|
||||||
]
|
]
|
||||||
nlri = [
|
nlri = [
|
||||||
|
Loading…
Reference in New Issue
Block a user