From a3be9fa1a70eb68608fc67d1b406e7a91702fcd3 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Mon, 27 Aug 2018 15:34:36 -0400 Subject: [PATCH] zebra: Move rtadv to zebra_router The rtadv setting was not per namespace it is per router. Signed-off-by: Donald Sharp --- zebra/rtadv.c | 63 ++++++++++++++++++++------------------------ zebra/zebra_ns.h | 4 --- zebra/zebra_router.h | 4 +++ 3 files changed, 32 insertions(+), 39 deletions(-) diff --git a/zebra/rtadv.c b/zebra/rtadv.c index 3bb75f3446..a22f6395c9 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -45,6 +45,7 @@ #include "zebra/zebra_ns.h" #include "zebra/zebra_vrf.h" #include "zebra/zebra_errors.h" +#include "zebra/zebra_router.h" extern struct zebra_privs_t zserv_privs; @@ -391,8 +392,8 @@ static int rtadv_timer(struct thread *thread) struct zebra_if *zif; int period; - zns->rtadv.ra_timer = NULL; - if (zns->rtadv.adv_msec_if_count == 0) { + zrouter.rtadv.ra_timer = NULL; + if (zrouter.rtadv.adv_msec_if_count == 0) { period = 1000; /* 1 s */ rtadv_event(zns, RTADV_TIMER, 1 /* 1 s */); } else { @@ -424,7 +425,8 @@ static int rtadv_timer(struct thread *thread) "Fast RA Rexmit on interface %s", ifp->name); - rtadv_send_packet(zns->rtadv.sock, ifp); + rtadv_send_packet(zrouter.rtadv.sock, + ifp); } else { zif->rtadv.AdvIntervalTimer -= period; if (zif->rtadv.AdvIntervalTimer <= 0) { @@ -437,7 +439,8 @@ static int rtadv_timer(struct thread *thread) zif->rtadv .MaxRtrAdvInterval; rtadv_send_packet( - zns->rtadv.sock, ifp); + zrouter.rtadv.sock, + ifp); } } } @@ -452,7 +455,7 @@ static void rtadv_process_solicit(struct interface *ifp) struct zebra_ns *zns = zvrf->zns; assert(zns); - rtadv_send_packet(zns->rtadv.sock, ifp); + rtadv_send_packet(zrouter.rtadv.sock, ifp); } /* @@ -649,7 +652,7 @@ static int rtadv_read(struct thread *thread) struct zebra_ns *zns = THREAD_ARG(thread); sock = THREAD_FD(thread); - zns->rtadv.ra_read = NULL; + zrouter.rtadv.ra_read = NULL; /* Register myself. */ rtadv_event(zns, RTADV_READ, sock); @@ -808,18 +811,18 @@ static void ipv6_nd_suppress_ra_set(struct interface *ifp, if (zif->rtadv.AdvSendAdvertisements) { zif->rtadv.AdvSendAdvertisements = 0; zif->rtadv.AdvIntervalTimer = 0; - zns->rtadv.adv_if_count--; + zrouter.rtadv.adv_if_count--; - if_leave_all_router(zns->rtadv.sock, ifp); + if_leave_all_router(zrouter.rtadv.sock, ifp); - if (zns->rtadv.adv_if_count == 0) + if (zrouter.rtadv.adv_if_count == 0) rtadv_event(zns, RTADV_STOP, 0); } } else { if (!zif->rtadv.AdvSendAdvertisements) { zif->rtadv.AdvSendAdvertisements = 1; zif->rtadv.AdvIntervalTimer = 0; - zns->rtadv.adv_if_count++; + zrouter.rtadv.adv_if_count++; if (zif->rtadv.MaxRtrAdvInterval >= 1000) { /* Enable Fast RA only when RA interval is in @@ -829,10 +832,11 @@ static void ipv6_nd_suppress_ra_set(struct interface *ifp, RTADV_NUM_FAST_REXMITS; } - if_join_all_router(zns->rtadv.sock, ifp); + if_join_all_router(zrouter.rtadv.sock, ifp); - if (zns->rtadv.adv_if_count == 1) - rtadv_event(zns, RTADV_START, zns->rtadv.sock); + if (zrouter.rtadv.adv_if_count == 1) + rtadv_event(zns, RTADV_START, + zrouter.rtadv.sock); } } } @@ -972,10 +976,7 @@ DEFUN (ipv6_nd_ra_interval_msec, VTY_DECLVAR_CONTEXT(interface, ifp); unsigned interval; struct zebra_if *zif = ifp->info; - struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id); - struct zebra_ns *zns; - zns = zvrf->zns; interval = strtoul(argv[idx_number]->arg, NULL, 10); if ((zif->rtadv.AdvDefaultLifetime != -1 && interval > (unsigned)zif->rtadv.AdvDefaultLifetime * 1000)) { @@ -985,10 +986,10 @@ DEFUN (ipv6_nd_ra_interval_msec, } if (zif->rtadv.MaxRtrAdvInterval % 1000) - zns->rtadv.adv_msec_if_count--; + zrouter.rtadv.adv_msec_if_count--; if (interval % 1000) - zns->rtadv.adv_msec_if_count++; + zrouter.rtadv.adv_msec_if_count++; SET_FLAG(zif->rtadv.ra_configured, VTY_RA_INTERVAL_CONFIGURED); zif->rtadv.MaxRtrAdvInterval = interval; @@ -1010,10 +1011,7 @@ DEFUN (ipv6_nd_ra_interval, VTY_DECLVAR_CONTEXT(interface, ifp); unsigned interval; struct zebra_if *zif = ifp->info; - struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id); - struct zebra_ns *zns; - zns = zvrf->zns; interval = strtoul(argv[idx_number]->arg, NULL, 10); if ((zif->rtadv.AdvDefaultLifetime != -1 && interval > (unsigned)zif->rtadv.AdvDefaultLifetime)) { @@ -1023,7 +1021,7 @@ DEFUN (ipv6_nd_ra_interval, } if (zif->rtadv.MaxRtrAdvInterval % 1000) - zns->rtadv.adv_msec_if_count--; + zrouter.rtadv.adv_msec_if_count--; /* convert to milliseconds */ interval = interval * 1000; @@ -1049,14 +1047,9 @@ DEFUN (no_ipv6_nd_ra_interval, { VTY_DECLVAR_CONTEXT(interface, ifp); struct zebra_if *zif = ifp->info; - struct zebra_vrf *zvrf; - struct zebra_ns *zns; - - zvrf = vrf_info_lookup(ifp->vrf_id); - zns = zvrf->zns; if (zif->rtadv.MaxRtrAdvInterval % 1000) - zns->rtadv.adv_msec_if_count--; + zrouter.rtadv.adv_msec_if_count--; UNSET_FLAG(zif->rtadv.ra_configured, VTY_RA_INTERVAL_CONFIGURED); @@ -1701,7 +1694,7 @@ static int rtadv_config_write(struct vty *vty, struct interface *ifp) static void rtadv_event(struct zebra_ns *zns, enum rtadv_event event, int val) { - struct rtadv *rtadv = &zns->rtadv; + struct rtadv *rtadv = &zrouter.rtadv; switch (event) { case RTADV_START: @@ -1740,19 +1733,19 @@ static void rtadv_event(struct zebra_ns *zns, enum rtadv_event event, int val) void rtadv_init(struct zebra_ns *zns) { - zns->rtadv.sock = rtadv_make_socket(zns->ns_id); + zrouter.rtadv.sock = rtadv_make_socket(zns->ns_id); } void rtadv_terminate(struct zebra_ns *zns) { rtadv_event(zns, RTADV_STOP, 0); - if (zns->rtadv.sock >= 0) { - close(zns->rtadv.sock); - zns->rtadv.sock = -1; + if (zrouter.rtadv.sock >= 0) { + close(zrouter.rtadv.sock); + zrouter.rtadv.sock = -1; } - zns->rtadv.adv_if_count = 0; - zns->rtadv.adv_msec_if_count = 0; + zrouter.rtadv.adv_if_count = 0; + zrouter.rtadv.adv_msec_if_count = 0; } void rtadv_cmd_init(void) diff --git a/zebra/zebra_ns.h b/zebra/zebra_ns.h index 2498be7162..c1a9b41b8d 100644 --- a/zebra/zebra_ns.h +++ b/zebra/zebra_ns.h @@ -53,10 +53,6 @@ struct zebra_ns { struct route_table *if_table; -#if defined(HAVE_RTADV) - struct rtadv rtadv; -#endif /* HAVE_RTADV */ - /* Back pointer */ struct ns *ns; }; diff --git a/zebra/zebra_router.h b/zebra/zebra_router.h index 6f7013acd5..d6b8b66087 100644 --- a/zebra/zebra_router.h +++ b/zebra/zebra_router.h @@ -58,6 +58,10 @@ struct zebra_router { struct hash *ipset_entry_hash; struct hash *iptable_hash; + +#if defined(HAVE_RTADV) + struct rtadv rtadv; +#endif /* HAVE_RTADV */ }; extern struct zebra_router zrouter; -- 2.39.5