Skip to content

Commit 51ebdf4

Browse files
nikos-githubShuotian Cheng
authored andcommitted
[frr]: Support for nhopself, keepalive and holdtime timers, prefer global ebgp nexthop (#1024)
* RR client support in minigraph for FRR * Fix python warning from previous rrclient commit and move config handling to a more relevant place for this cmd * Add config support for nhopself, keepalive and holdtime timers. * Add route-map to prefer global nexthops for ebgp learned prefixes.
1 parent 6c15acc commit 51ebdf4

File tree

3 files changed

+34
-8
lines changed

3 files changed

+34
-8
lines changed

dockers/docker-fpm-frr/bgpd.conf.j2

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
5151
{% if bgp_session['asn'] | int != 0 %}
5252
neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }}
5353
neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }}
54+
neighbor {{ neighbor_addr }} timers {{ bgp_session['keepalive'] }} {{ bgp_session['holdtime'] }}
5455
{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %}
5556
neighbor {{ neighbor_addr }} allowas-in 1
5657
{% endif %}
@@ -59,6 +60,9 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
5960
neighbor {{ neighbor_addr }} activate
6061
{% if bgp_session['rrclient'] | int != 0 %}
6162
neighbor {{ neighbor_addr }} route-reflector-client
63+
{% endif %}
64+
{% if bgp_session['nhopself'] | int != 0 %}
65+
neighbor {{ neighbor_addr }} next-hop-self
6266
{% endif %}
6367
maximum-paths 64
6468
exit-address-family
@@ -68,6 +72,12 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
6872
neighbor {{ neighbor_addr }} activate
6973
{% if bgp_session['rrclient'] | int != 0 %}
7074
neighbor {{ neighbor_addr }} route-reflector-client
75+
{% endif %}
76+
{% if bgp_session['nhopself'] | int != 0 %}
77+
neighbor {{ neighbor_addr }} next-hop-self
78+
{% endif %}
79+
{% if bgp_session['asn'] != DEVICE_METADATA['localhost']['bgp_asn'] %}
80+
neighbor {{ neighbor_addr }} route-map set-next-hop-global-v6 in
7181
{% endif %}
7282
maximum-paths 64
7383
exit-address-family
@@ -81,3 +91,6 @@ maximum-paths 64
8191
route-map ISOLATE permit 10
8292
set as-path prepend {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
8393
!
94+
route-map set-next-hop-global-v6 permit 10
95+
set ipv6 next-hop prefer-global
96+
!

src/sonic-config-engine/minigraph.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -224,24 +224,38 @@ def parse_cpg(cpg, hname):
224224
start_peer = session.find(str(QName(ns, "StartPeer"))).text
225225
end_router = session.find(str(QName(ns, "EndRouter"))).text
226226
end_peer = session.find(str(QName(ns, "EndPeer"))).text
227+
rrclient = 1 if session.find(str(QName(ns, "RRClient"))) is not None else 0
228+
if session.find(str(QName(ns, "HoldTime"))) is not None:
229+
holdtime = session.find(str(QName(ns, "HoldTime"))).text
230+
else:
231+
holdtime = 180
232+
if session.find(str(QName(ns, "KeepAliveTime"))) is not None:
233+
keepalive = session.find(str(QName(ns, "KeepAliveTime"))).text
234+
else:
235+
keepalive = 60
236+
nhopself = 1 if session.find(str(QName(ns, "NextHopSelf"))) is not None else 0
227237
if end_router == hname:
228238
bgp_sessions[start_peer] = {
229239
'name': start_router,
230-
'local_addr': end_peer
240+
'local_addr': end_peer,
241+
'rrclient': rrclient,
242+
'holdtime': holdtime,
243+
'keepalive': keepalive,
244+
'nhopself': nhopself
231245
}
232246
else:
233247
bgp_sessions[end_peer] = {
234248
'name': end_router,
235-
'local_addr': start_peer
249+
'local_addr': start_peer,
250+
'rrclient': rrclient,
251+
'holdtime': holdtime,
252+
'keepalive': keepalive,
253+
'nhopself': nhopself
236254
}
237255
elif child.tag == str(QName(ns, "Routers")):
238256
for router in child.findall(str(QName(ns1, "BGPRouterDeclaration"))):
239257
asn = router.find(str(QName(ns1, "ASN"))).text
240258
hostname = router.find(str(QName(ns1, "Hostname"))).text
241-
if router.find(str(QName(ns1, "RRClient"))):
242-
rrclient = '1'
243-
else:
244-
rrclient = '0'
245259
if hostname == hname:
246260
myasn = asn
247261
peers = router.find(str(QName(ns1, "Peers")))
@@ -260,7 +274,6 @@ def parse_cpg(cpg, hname):
260274
bgp_session = bgp_sessions[peer]
261275
if hostname == bgp_session['name']:
262276
bgp_session['asn'] = asn
263-
bgp_session['rrclient'] = rrclient
264277

265278
return bgp_sessions, myasn, bgp_peers_with_range
266279

src/sonic-config-engine/tests/test_cfggen.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def test_minigraph_neighbors(self):
113113
def test_minigraph_bgp(self):
114114
argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v "BGP_NEIGHBOR[\'10.0.0.59\']"'
115115
output = self.run_script(argument)
116-
self.assertEqual(output.strip(), "{'rrclient': '0', 'local_addr': '10.0.0.58', 'asn': '64600', 'name': 'ARISTA02T1'}")
116+
self.assertEqual(output.strip(), "{'rrclient': 0, 'name': 'ARISTA02T1', 'local_addr': '10.0.0.58', 'nhopself': 0, 'holdtime': '180', 'asn': '64600', 'keepalive': '60'}")
117117

118118
def test_minigraph_peers_with_range(self):
119119
argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v BGP_PEER_RANGE.values\(\)'

0 commit comments

Comments
 (0)