From: Chirag Shah Date: Mon, 12 Feb 2018 21:22:04 +0000 (-0800) Subject: ospf6d: router-id change notify to restart ospf6d X-Git-Tag: frr-5.0-dev~229^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=d6927cf390119c731be022acb878f76c3e106521;p=mirror%2Ffrr.git ospf6d: router-id change notify to restart ospf6d Notify user to store config and restart ospf6d as part of router-id change cli if any of the area active. Store zebra router-id under ospf6, when static router-id removed restore zebra router-id, ask to restart ospf6d. Signed-off-by: Chirag Shah --- diff --git a/ospf6d/ospf6_area.h b/ospf6d/ospf6_area.h index b7cd9b4b09..e162d21cd2 100644 --- a/ospf6d/ospf6_area.h +++ b/ospf6d/ospf6_area.h @@ -99,6 +99,8 @@ struct ospf6_area { /* Time stamps. */ struct timeval ts_spf; /* SPF calculation time stamp. */ + + uint32_t full_nbrs; /* Fully adjacent neighbors. */ }; #define OSPF6_AREA_ENABLE 0x01 diff --git a/ospf6d/ospf6_neighbor.c b/ospf6d/ospf6_neighbor.c index 35d0b0a646..05bc254951 100644 --- a/ospf6d/ospf6_neighbor.c +++ b/ospf6d/ospf6_neighbor.c @@ -193,7 +193,11 @@ static void ospf6_neighbor_state_change(u_char next_state, if (prev_state == OSPF6_NEIGHBOR_LOADING && next_state == OSPF6_NEIGHBOR_FULL) { OSPF6_AS_EXTERN_LSA_SCHEDULE(on->ospf6_if); + on->ospf6_if->area->full_nbrs++; } + + if (prev_state == OSPF6_NEIGHBOR_FULL) + on->ospf6_if->area->full_nbrs--; } if ((prev_state == OSPF6_NEIGHBOR_EXCHANGE diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c index db39420548..c17b8918ec 100644 --- a/ospf6d/ospf6_top.c +++ b/ospf6d/ospf6_top.c @@ -335,6 +335,8 @@ DEFUN(ospf6_router_id, int ret; const char *router_id_str; u_int32_t router_id; + struct ospf6_area *oa; + struct listnode *node; argv_find(argv, argc, "A.B.C.D", &idx); router_id_str = argv[idx]->arg; @@ -346,8 +348,17 @@ DEFUN(ospf6_router_id, } o->router_id_static = router_id; - if (o->router_id == 0) - o->router_id = router_id; + + for (ALL_LIST_ELEMENTS_RO(o->area_list, node, oa)) { + if (oa->full_nbrs) { + vty_out(vty, + "For this router-id change to take effect," + " save config and restart ospf6d\n"); + return CMD_SUCCESS; + } + } + + o->router_id = router_id; return CMD_SUCCESS; } @@ -360,8 +371,22 @@ DEFUN(no_ospf6_router_id, V4NOTATION_STR) { VTY_DECLVAR_CONTEXT(ospf6, o); + struct ospf6_area *oa; + struct listnode *node; + o->router_id_static = 0; + + for (ALL_LIST_ELEMENTS_RO(o->area_list, node, oa)) { + if (oa->full_nbrs) { + vty_out(vty, + "For this router-id change to take effect," + " save config and restart ospf6d\n"); + return CMD_SUCCESS; + } + } o->router_id = 0; + if (o->router_id_zebra.s_addr) + o->router_id = (uint32_t)o->router_id_zebra.s_addr; return CMD_SUCCESS; } diff --git a/ospf6d/ospf6_top.h b/ospf6d/ospf6_top.h index 8f99cc33f4..d7a3766b80 100644 --- a/ospf6d/ospf6_top.h +++ b/ospf6d/ospf6_top.h @@ -32,6 +32,8 @@ struct ospf6 { /* static router id */ u_int32_t router_id_static; + struct in_addr router_id_zebra; + /* start time */ struct timeval starttime; diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c index cc87c499ee..4fb959b952 100644 --- a/ospf6d/ospf6_zebra.c +++ b/ospf6d/ospf6_zebra.c @@ -46,8 +46,6 @@ unsigned char conf_debug_ospf6_zebra = 0; /* information about zebra. */ struct zclient *zclient = NULL; -struct in_addr router_id_zebra; - /* Router-id update message from zebra. */ static int ospf6_router_id_update_zebra(int command, struct zclient *zclient, zebra_size_t length, vrf_id_t vrf_id) @@ -56,13 +54,14 @@ static int ospf6_router_id_update_zebra(int command, struct zclient *zclient, struct ospf6 *o = ospf6; zebra_router_id_update_read(zclient->ibuf, &router_id); - router_id_zebra = router_id.u.prefix4; if (o == NULL) return 0; + o->router_id_zebra = router_id.u.prefix4; + if (o->router_id == 0) - o->router_id = (u_int32_t)router_id_zebra.s_addr; + o->router_id = (uint32_t)o->router_id_zebra.s_addr; return 0; }