summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIWASE Yusuke <iwase.yusuke0@gmail.com>2018-06-13 15:57:29 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2018-06-20 12:04:30 +0900
commitdb7338b8dbc7e92415d0674c0345b50550027b40 (patch)
tree8bed6aa89c7b40a318bdd7284872503d88a32cdf
parenta6bda030d376137157840862fe6087f8e20e943f (diff)
BGPSpeaker: Advertise local routes to RR clients
The current implementation misses the mandatory attributes when sending locally generated routes to its Route Reflector (RR) clients, then the clients will reject the received routes. This patch fixes to add or update attributes to for sending locally generated routes its RR clients. Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/services/protocols/bgp/peer.py47
1 files changed, 21 insertions, 26 deletions
diff --git a/ryu/services/protocols/bgp/peer.py b/ryu/services/protocols/bgp/peer.py
index 70b486c0..2a0e2a9f 100644
--- a/ryu/services/protocols/bgp/peer.py
+++ b/ryu/services/protocols/bgp/peer.py
@@ -989,37 +989,32 @@ class Peer(Source, Sink, NeighborConfListener, Activity):
elif self.is_route_server_client:
nlri_list = [path.nlri]
new_pathattr.extend(pathattr_map.values())
- elif self.is_route_reflector_client:
- nlri_list = [path.nlri]
+ else:
+ if self.is_route_reflector_client:
+ # Append ORIGINATOR_ID attribute if not already exist.
+ if BGP_ATTR_TYPE_ORIGINATOR_ID not in pathattr_map:
+ originator_id = path.source
+ if originator_id is None:
+ originator_id = self._common_conf.router_id
+ elif isinstance(path.source, Peer):
+ originator_id = path.source.ip_address
+ new_pathattr.append(
+ BGPPathAttributeOriginatorId(value=originator_id))
- # Append ORIGINATOR_ID attribute if not already exists.
- if BGP_ATTR_TYPE_ORIGINATOR_ID not in pathattr_map:
- originator_id = path.source
- if originator_id is None:
- originator_id = self._common_conf.router_id
- elif isinstance(path.source, Peer):
- originator_id = path.source.ip_address
- new_pathattr.append(
- BGPPathAttributeOriginatorId(value=originator_id))
-
- # Append CLUSTER_LIST attribute if not already exists.
- if BGP_ATTR_TYPE_CLUSTER_LIST not in pathattr_map:
- new_pathattr.append(
- BGPPathAttributeClusterList(
- [self._common_conf.cluster_id]))
-
- for t, path_attr in pathattr_map.items():
- if t == BGP_ATTR_TYPE_CLUSTER_LIST:
- # Append own CLUSTER_ID into CLUSTER_LIST attribute
- # if already exists.
- cluster_list = list(path_attr.value)
+ # Preppend own CLUSTER_ID into CLUSTER_LIST attribute if exist.
+ # Otherwise append CLUSTER_LIST attribute.
+ cluster_lst_attr = pathattr_map.get(BGP_ATTR_TYPE_CLUSTER_LIST)
+ if cluster_lst_attr:
+ cluster_list = list(cluster_lst_attr.value)
if self._common_conf.cluster_id not in cluster_list:
- cluster_list.append(self._common_conf.cluster_id)
+ cluster_list.insert(0, self._common_conf.cluster_id)
new_pathattr.append(
BGPPathAttributeClusterList(cluster_list))
else:
- new_pathattr.append(path_attr)
- else:
+ new_pathattr.append(
+ BGPPathAttributeClusterList(
+ [self._common_conf.cluster_id]))
+
# Supported and un-supported/unknown attributes.
origin_attr = None
nexthop_attr = None