@@ -65,6 +65,9 @@ def build_topo(tgen):
65
65
switch .add_link (tgen .gears ["r2" ])
66
66
switch .add_link (tgen .gears ["r3" ])
67
67
68
+ # Create a p2p connection between r1 and r2
69
+ tgen .add_link (tgen .gears ["r1" ], tgen .gears ["r2" ])
70
+
68
71
69
72
#####################################################
70
73
##
@@ -222,6 +225,50 @@ def test_zebra_kernel_route_blackhole_add():
222
225
result , _ = topotest .run_and_expect (test_func , None , count = 20 , wait = 1 )
223
226
assert result , "Blackhole Route should have not been removed\n {}" .format (_ )
224
227
228
+ def test_zebra_kernel_route_interface_linkdown ():
229
+ "Test that a kernel routes should be affected by interface change"
230
+
231
+ tgen = get_topogen ()
232
+ if tgen .routers_have_failure ():
233
+ pytest .skip (tgen .errors )
234
+
235
+ router = tgen .gears ["r1" ]
236
+ router .run ("ip route add 5.5.6.7/32 via 10.0.1.66 dev r1-eth2" )
237
+
238
+ kernel = "{}/{}/ip_route_kernel_interface_up.json" .format (CWD , router .name )
239
+ expected = json .loads (open (kernel ).read ())
240
+
241
+ test_func = partial (
242
+ topotest .router_json_cmp , router , "show ip route 5.5.6.7/32 json" , expected
243
+ )
244
+ result , _ = topotest .run_and_expect (test_func , None , count = 20 , wait = 1 )
245
+ assert result , "Kernel Route should be selected:\n {}" .format (_ )
246
+
247
+ # link down
248
+ router2 = tgen .gears ["r2" ]
249
+ router2 .run ("ip link set dev r2-eth2 down" )
250
+
251
+ kernel = "{}/{}/ip_route_kernel_interface_down.json" .format (CWD , router .name )
252
+ expected = json .loads (open (kernel ).read ())
253
+
254
+ test_func = partial (
255
+ topotest .router_json_cmp , router , "show ip route 5.5.6.7/32 json" , expected
256
+ )
257
+ result , _ = topotest .run_and_expect (test_func , None , count = 20 , wait = 1 )
258
+ assert result , "Kernel Route should not be selected:\n {}" .format (_ )
259
+
260
+ # link up
261
+ router2 = tgen .gears ["r2" ]
262
+ router2 .run ("ip link set dev r2-eth2 up" )
263
+
264
+ kernel = "{}/{}/ip_route_kernel_interface_up.json" .format (CWD , router .name )
265
+ expected = json .loads (open (kernel ).read ())
266
+
267
+ test_func = partial (
268
+ topotest .router_json_cmp , router , "show ip route 5.5.6.7/32 json" , expected
269
+ )
270
+ result , _ = topotest .run_and_expect (test_func , None , count = 20 , wait = 1 )
271
+ assert result , "Kernel Route should be selected:\n {}" .format (_ )
225
272
226
273
if __name__ == "__main__" :
227
274
args = ["-s" ] + sys .argv [1 :]
0 commit comments