Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions yabgp/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,6 @@
cfg.BoolOpt('enhanced_route_refresh',
default=True,
help='If support enhanced route refresh'),
cfg.StrOpt('add_path',
choices=['ipv4_send', 'ipv4_receive', 'ipv4_both'],
help='BGP additional path feature and supported address family'),
cfg.BoolOpt('graceful_restart',
default=True,
help='if support graceful restart'),
Expand Down Expand Up @@ -80,7 +77,10 @@
'rib',
default=False,
help='maintain rib in or not, default is False'
)
),
cfg.ListOpt('local_add_path',
default=['ipv4_both'],
help='The Local BGP add path configuration')
]

CONF.register_cli_opts(BGP_PEER_CONFIG_OPTS, group='bgp')
Expand Down Expand Up @@ -134,7 +134,10 @@ def get_bgp_config():
'enhanced_route_refresh': CONF.bgp.enhanced_route_refresh,
'graceful_restart': CONF.bgp.graceful_restart,
'cisco_multi_session': CONF.bgp.cisco_multi_session,
'add_path': CONF.bgp.add_path
'add_path': [
{'afi_safi': item.rsplit('_', 1)[0], 'send/receive': item.rsplit('_', 1)[1]}
for item in CONF.bgp.local_add_path
]
},
'remote': {}
}
Expand Down
36 changes: 25 additions & 11 deletions yabgp/core/protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ def __init__(self):
self.adj_rib_in = {k: {} for k in CONF.bgp.afi_safi}
self.adj_rib_out = {k: {} for k in CONF.bgp.afi_safi}
self.adj_rib_in_ipv4_tree = Radix()
self.afi_add_path = None

# statistic
self.msg_sent_stat = {
Expand Down Expand Up @@ -263,7 +264,7 @@ def _update_received(self, timestamp, msg):
"""Called when a BGP Update message was received."""
# TODO: Need to convert `self.add_path_ipv4_receive` and `self.add_path_ipv4_send` into a unified
# `afi_add_path` format.
result = Update().parse(timestamp, msg, self.fourbytesas, afi_add_path={})
result = Update().parse(timestamp, msg, self.fourbytesas, afi_add_path=self.afi_add_path)
if result['sub_error']:
msg = {
'attr': result['attr'],
Expand Down Expand Up @@ -470,11 +471,9 @@ def send_open(self):
# check add path feature, send add path condition:
# local support send or both
# remote support receive or both
if cfg.CONF.bgp.running_config['capability']['local']['add_path'] in \
['ipv4_send', 'ipv4_both']:
if cfg.CONF.bgp.running_config['capability']['remote'].get('add_path') in \
['ipv4_receive', 'ipv4_both']:
self.add_path_ipv4_send = True
local_add_path = cfg.CONF.bgp.running_config['capability']['local']['add_path']
remote_add_path = cfg.CONF.bgp.running_config['capability']['remote'].get('add_path')
self.afi_add_path = self.compare_add_path(local_add_path, remote_add_path)
# send message
self.transport.write(open_msg)
self.msg_sent_stat['Opens'] += 1
Expand Down Expand Up @@ -519,11 +518,9 @@ def _open_received(self, timestamp, msg):
if key == 'four_bytes_as':
self.fourbytesas = True
elif key == 'add_path':
if cfg.CONF.bgp.running_config['capability']['remote']['add_path'] in \
['ipv4_send', 'ipv4_both']:
if cfg.CONF.bgp.running_config['capability']['local']['add_path'] in \
['ipv4_receive', 'ipv4_both']:
self.add_path_ipv4_receive = True
self.afi_add_path = self.compare_add_path(
cfg.CONF.bgp.running_config['capability']['local']['add_path'],
cfg.CONF.bgp.running_config['capability']['remote'].get('add_path'))

LOG.info("--%s = %s", key, cfg.CONF.bgp.running_config['capability']['remote'][key])

Expand Down Expand Up @@ -853,3 +850,20 @@ def update_receive_verion(self, attr, nlri, withdraw):
del self.mpls_vpn_receive_dict[str(key)]
else:
LOG.info("Do not have %s in receive mpls_vpn dict" % key)

def compare_add_path(self, local_add_path, remote_add_path):
if not local_add_path or not remote_add_path:
return None

afi_add_path = {}
for local in local_add_path:
for remote in remote_add_path:
if local.get('afi_safi') == remote.get('afi_safi'):
local_send_receive = local.get('send/receive')
remote_send_receive = remote.get('send/receive')
if local_send_receive in ['receive', 'both'] and remote_send_receive in ['send', 'both']:
afi_add_path[local.get('afi_safi')] = True
else:
afi_add_path[local.get('afi_safi')] = False

return afi_add_path
25 changes: 17 additions & 8 deletions yabgp/message/open.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

from yabgp.common import exception as excp
from yabgp.common import constants as bgp_cons
from yabgp.common.constants import AFI_SAFI_STR_DICT


class Open(object):
Expand Down Expand Up @@ -420,9 +421,13 @@ def construct(self, my_capability=None):
return afisafi
# for add path
elif self.capa_code == self.ADD_PATH:
afi_safi, value = convert_addpath_str_to_int(self.capa_value)
addpath_int_list = convert_addpath_str_to_int(self.capa_value)
length = len(addpath_int_list) * 4
add_path = struct.pack(
'!BBBBHBB', 2, 6, self.ADD_PATH, self.capa_length, afi_safi[0], afi_safi[1], value)
'!BBBB', 2, length + 1 + 1, self.ADD_PATH, length)
for (afi_safi, value) in addpath_int_list:
afi, safi = afi_safi
add_path += struct.pack('!HBB', afi, safi, value)
return add_path

# (10) Extended Next Hop Encoding Capability
Expand All @@ -445,10 +450,14 @@ def construct(self, my_capability=None):
return struct.pack('!BBBB', 2, 2, self.ENHANCED_ROUTE_REFRESH, 0)


def convert_addpath_str_to_int(addpath_str):
addpath_dict = {
'ipv4_receive': [(1, 1), 1],
'ipv4_send': [(1, 1), 2],
'ipv4_both': [(1, 1), 3]
def convert_addpath_str_to_int(addpath_list):
addpath_int_list = []
send_receive_dict = {
'receive': 1,
'send': 2,
'both': 3
}
return addpath_dict[addpath_str]
for addpath in addpath_list:
addpath_int_list.append([AFI_SAFI_STR_DICT[addpath['afi_safi']], send_receive_dict[addpath['send/receive']]])

return addpath_int_list
Loading
Loading