@@ -77,6 +77,8 @@ int allow_delete = 0;
77
77
/* Don't delete kernel route. */
78
78
int keep_kernel_mode = 0 ;
79
79
80
+ int graceful_restart ;
81
+
80
82
bool v6_rr_semantics = false;
81
83
82
84
#ifdef HAVE_NETLINK
@@ -95,6 +97,7 @@ struct option longopts[] = {
95
97
{"label_socket" , no_argument , NULL , 'l' },
96
98
{"retain" , no_argument , NULL , 'r' },
97
99
{"vrfdefaultname" , required_argument , NULL , 'o' },
100
+ {"graceful_restart" , required_argument , NULL , 'K' },
98
101
#ifdef HAVE_NETLINK
99
102
{"vrfwnetns" , no_argument , NULL , 'n' },
100
103
{"nl-bufsize" , required_argument , NULL , 's' },
@@ -264,13 +267,14 @@ int main(int argc, char **argv)
264
267
char * netlink_fuzzing = NULL ;
265
268
#endif /* HANDLE_NETLINK_FUZZING */
266
269
270
+ graceful_restart = 0 ;
267
271
vrf_configure_backend (VRF_BACKEND_VRF_LITE );
268
272
logicalrouter_configure_backend (LOGICALROUTER_BACKEND_NETNS );
269
273
270
274
frr_preinit (& zebra_di , argc , argv );
271
275
272
276
frr_opt_add (
273
- "bakz:e:l:o:r "
277
+ "bakz:e:l:o:rK: "
274
278
#ifdef HAVE_NETLINK
275
279
"s:n"
276
280
#endif
@@ -282,24 +286,25 @@ int main(int argc, char **argv)
282
286
#endif /* HANDLE_NETLINK_FUZZING */
283
287
,
284
288
longopts ,
285
- " -b, --batch Runs in batch mode\n"
286
- " -a, --allow_delete Allow other processes to delete zebra routes\n"
287
- " -z, --socket Set path of zebra socket\n"
288
- " -e, --ecmp Specify ECMP to use.\n"
289
- " -l, --label_socket Socket to external label manager\n"
290
- " -k, --keep_kernel Don't delete old routes which were installed by zebra.\n"
291
- " -r, --retain When program terminates, retain added route by zebra.\n"
292
- " -o, --vrfdefaultname Set default VRF name.\n"
289
+ " -b, --batch Runs in batch mode\n"
290
+ " -a, --allow_delete Allow other processes to delete zebra routes\n"
291
+ " -z, --socket Set path of zebra socket\n"
292
+ " -e, --ecmp Specify ECMP to use.\n"
293
+ " -l, --label_socket Socket to external label manager\n"
294
+ " -k, --keep_kernel Don't delete old routes which were installed by zebra.\n"
295
+ " -r, --retain When program terminates, retain added route by zebra.\n"
296
+ " -o, --vrfdefaultname Set default VRF name.\n"
297
+ " -K, --graceful_restart Graceful restart at the kernel level, timer in seconds for expiration\n"
293
298
#ifdef HAVE_NETLINK
294
- " -n, --vrfwnetns Use NetNS as VRF backend\n"
295
- " -s, --nl-bufsize Set netlink receive buffer size\n"
296
- " --v6-rr-semantics Use v6 RR semantics\n"
299
+ " -n, --vrfwnetns Use NetNS as VRF backend\n"
300
+ " -s, --nl-bufsize Set netlink receive buffer size\n"
301
+ " --v6-rr-semantics Use v6 RR semantics\n"
297
302
#endif /* HAVE_NETLINK */
298
303
#if defined(HANDLE_ZAPI_FUZZING )
299
- " -c <file> Bypass normal startup and use this file for testing of zapi\n"
304
+ " -c <file> Bypass normal startup and use this file for testing of zapi\n"
300
305
#endif /* HANDLE_ZAPI_FUZZING */
301
306
#if defined(HANDLE_NETLINK_FUZZING )
302
- " -w <file> Bypass normal startup and use this file for testing of netlink input\n"
307
+ " -w <file> Bypass normal startup and use this file for testing of netlink input\n"
303
308
#endif /* HANDLE_NETLINK_FUZZING */
304
309
);
305
310
@@ -319,6 +324,10 @@ int main(int argc, char **argv)
319
324
allow_delete = 1 ;
320
325
break ;
321
326
case 'k' :
327
+ if (graceful_restart ) {
328
+ zlog_err ("Graceful Restart initiated, we cannot keep the existing kernel routes" );
329
+ return 1 ;
330
+ }
322
331
keep_kernel_mode = 1 ;
323
332
break ;
324
333
case 'e' :
@@ -350,6 +359,15 @@ int main(int argc, char **argv)
350
359
case 'r' :
351
360
retain_mode = 1 ;
352
361
break ;
362
+ case 'K' :
363
+ if (keep_kernel_mode ) {
364
+ zlog_err ("Keep Kernel mode specified, graceful restart incompatible" );
365
+ return 1 ;
366
+ }
367
+ graceful_restart = atoi (optarg );
368
+ if (graceful_restart > 5 * GRACEFUL_RESTART_TIME )
369
+ graceful_restart = 5 * GRACEFUL_RESTART_TIME ;
370
+ break ;
353
371
#ifdef HAVE_NETLINK
354
372
case 's' :
355
373
nl_rcvbufsize = atoi (optarg );
@@ -437,8 +455,9 @@ int main(int argc, char **argv)
437
455
* will be equal to the current getpid(). To know about such routes,
438
456
* we have to have route_read() called before.
439
457
*/
440
- if (!keep_kernel_mode )
441
- rib_sweep_route ();
458
+ zrouter .startup = time (NULL );
459
+ thread_add_timer (zrouter .master , rib_sweep_route ,
460
+ NULL , graceful_restart , NULL );
442
461
443
462
/* Needed for BSD routing socket. */
444
463
pid = getpid ();
0 commit comments