mirror of
https://github.com/faucetsdn/ryu.git
synced 2026-05-08 13:56:09 +02:00
BGPSpeaker: Support to advertise Type 1, 2 Route Target
Currently, BGPSpeaker supports only type 0 (Two-Octet AS-Specific) Route Target (or Route Distinguisher). This patch enables to advertise Type 1 (IPv4-Address-Specific) and Type 2 (Four-Octet AS-Specific) Route Targets. Reported-by: Albert Siersema <albert@mediacaster.nl> Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
6c92a75aa8
commit
c4218ccde3
@ -30,7 +30,6 @@ from ryu.lib.packet.bgp import BGPPathAttributeOrigin
|
||||
from ryu.lib.packet.bgp import BGPPathAttributeAsPath
|
||||
from ryu.lib.packet.bgp import EvpnEthernetSegmentNLRI
|
||||
from ryu.lib.packet.bgp import BGPPathAttributeExtendedCommunities
|
||||
from ryu.lib.packet.bgp import BGPTwoOctetAsSpecificExtendedCommunity
|
||||
from ryu.lib.packet.bgp import BGPPathAttributeMultiExitDisc
|
||||
from ryu.lib.packet.bgp import BGPEncapsulationExtendedCommunity
|
||||
from ryu.lib.packet.bgp import BGPEvpnEsiLabelExtendedCommunity
|
||||
@ -47,6 +46,7 @@ from ryu.services.protocols.bgp.constants import VRF_TABLE
|
||||
from ryu.services.protocols.bgp.info_base.base import Destination
|
||||
from ryu.services.protocols.bgp.info_base.base import Path
|
||||
from ryu.services.protocols.bgp.info_base.base import Table
|
||||
from ryu.services.protocols.bgp.utils.bgp import create_rt_extended_community
|
||||
from ryu.services.protocols.bgp.utils.stats import LOCAL_ROUTES
|
||||
from ryu.services.protocols.bgp.utils.stats import REMOTE_ROUTES
|
||||
from ryu.services.protocols.bgp.utils.stats import RESOURCE_ID
|
||||
@ -267,19 +267,9 @@ class VrfTable(Table):
|
||||
es_import=es_import))
|
||||
|
||||
for rt in vrf_conf.export_rts:
|
||||
as_num, local_admin = rt.split(':')
|
||||
subtype = 2
|
||||
communities.append(BGPTwoOctetAsSpecificExtendedCommunity(
|
||||
as_number=int(as_num),
|
||||
local_administrator=int(local_admin),
|
||||
subtype=subtype))
|
||||
communities.append(create_rt_extended_community(rt, 2))
|
||||
for soo in vrf_conf.soo_list:
|
||||
as_num, local_admin = soo.split(':')
|
||||
subtype = 3
|
||||
communities.append(BGPTwoOctetAsSpecificExtendedCommunity(
|
||||
as_number=int(as_num),
|
||||
local_administrator=int(local_admin),
|
||||
subtype=subtype))
|
||||
communities.append(create_rt_extended_community(soo, 3))
|
||||
|
||||
# Set Tunnel Encapsulation Attribute
|
||||
tunnel_type = kwargs.get('tunnel_type', None)
|
||||
|
||||
@ -19,6 +19,8 @@
|
||||
import logging
|
||||
import socket
|
||||
|
||||
import netaddr
|
||||
|
||||
from ryu.lib.packet.bgp import (
|
||||
BGPUpdate,
|
||||
RF_IPv4_UC,
|
||||
@ -36,6 +38,9 @@ from ryu.lib.packet.bgp import (
|
||||
BGPPathAttributeUnknown,
|
||||
BGP_ATTR_FLAG_OPTIONAL,
|
||||
BGP_ATTR_FLAG_TRANSITIVE,
|
||||
BGPTwoOctetAsSpecificExtendedCommunity,
|
||||
BGPIPv4AddressSpecificExtendedCommunity,
|
||||
BGPFourOctetAsSpecificExtendedCommunity,
|
||||
)
|
||||
from ryu.services.protocols.bgp.info_base.rtc import RtcPath
|
||||
from ryu.services.protocols.bgp.info_base.ipv4 import Ipv4Path
|
||||
@ -141,3 +146,36 @@ def create_end_of_rib_update():
|
||||
|
||||
# Bgp update message instance that can used as End of RIB marker.
|
||||
UPDATE_EOR = create_end_of_rib_update()
|
||||
|
||||
|
||||
def create_rt_extended_community(value, subtype=2):
|
||||
"""
|
||||
Creates an instance of the BGP Route Target Community (if "subtype=2")
|
||||
or Route Origin Community ("subtype=3").
|
||||
|
||||
:param value: String of Route Target or Route Origin value.
|
||||
:param subtype: Subtype of Extended Community.
|
||||
:return: An instance of Route Target or Route Origin Community.
|
||||
"""
|
||||
global_admin, local_admin = value.split(':')
|
||||
local_admin = int(local_admin)
|
||||
if global_admin.isdigit() and 0 <= int(global_admin) <= 0xffff:
|
||||
ext_com = BGPTwoOctetAsSpecificExtendedCommunity(
|
||||
subtype=subtype,
|
||||
as_number=int(global_admin),
|
||||
local_administrator=local_admin)
|
||||
elif global_admin.isdigit() and 0xffff < int(global_admin) <= 0xffffffff:
|
||||
ext_com = BGPFourOctetAsSpecificExtendedCommunity(
|
||||
subtype=subtype,
|
||||
as_number=int(global_admin),
|
||||
local_administrator=local_admin)
|
||||
elif netaddr.valid_ipv4(global_admin):
|
||||
ext_com = BGPIPv4AddressSpecificExtendedCommunity(
|
||||
subtype=subtype,
|
||||
ipv4_address=global_admin,
|
||||
local_administrator=local_admin)
|
||||
else:
|
||||
raise ValueError(
|
||||
'Invalid Route Target or Route Origin value: %s' % value)
|
||||
|
||||
return ext_com
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user