From: Chirag Shah Date: Tue, 27 Feb 2018 19:24:16 +0000 (-0800) Subject: ospf6d: assign zebra router-id to ospf6 instance X-Git-Tag: frr-5.0-dev~180^2 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=78c6ba61db8a84d1d262a9896e81bea97976753c;p=mirror_frr.git ospf6d: assign zebra router-id to ospf6 instance Store zebra router-id in global structure. Before router ospf6 instance created, zebra router-id callback called. During ospf6 main execution zebra init happens, but default instance does not execute until cli replay 'router ospf6'. Call ospf6_router_id_change during 'router ospf6' to assign zebra router id to ospf6 instance. Ticket:CM-19937 Testing Done: Assign Loopback /32 (6.6.6.6/32) address, restart frr with (router ospf6 in frr.conf). ospf6 default instance assigned 6.6.6.6 router-id. Signed-off-by: Chirag Shah --- diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c index 88f03d8f6..9580d87cf 100644 --- a/ospf6d/ospf6_main.c +++ b/ospf6d/ospf6_main.c @@ -202,6 +202,9 @@ int main(int argc, char *argv[], char *envp[]) exit(1); } + /* OSPF6 master init. */ + ospf6_master_init(); + /* thread master */ master = frr_init(); diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c index 25d968fb6..28379458d 100644 --- a/ospf6d/ospf6_top.c +++ b/ospf6d/ospf6_top.c @@ -53,6 +53,8 @@ DEFINE_QOBJ_TYPE(ospf6) /* global ospf6d variable */ struct ospf6 *ospf6; +static struct ospf6_master ospf6_master; +struct ospf6_master *om6; static void ospf6_disable(struct ospf6 *o); @@ -230,6 +232,13 @@ static void ospf6_disable(struct ospf6 *o) } } +void ospf6_master_init(void) +{ + memset(&ospf6_master, 0, sizeof(struct ospf6_master)); + + om6 = &ospf6_master; +} + static int ospf6_maxage_remover(struct thread *thread) { struct ospf6 *o = (struct ospf6 *)THREAD_ARG(thread); @@ -285,6 +294,17 @@ void ospf6_maxage_remove(struct ospf6 *o) &o->maxage_remover); } +void ospf6_router_id_update(void) +{ + if (!ospf6) + return; + + if (ospf6->router_id_static != 0) + ospf6->router_id = ospf6->router_id_static; + else + ospf6->router_id = om6->zebra_router_id; +} + /* start ospf6 */ DEFUN_NOSH (router_ospf6, router_ospf6_cmd, @@ -292,9 +312,11 @@ DEFUN_NOSH (router_ospf6, ROUTER_STR OSPF6_STR) { - if (ospf6 == NULL) + if (ospf6 == NULL) { ospf6 = ospf6_create(); - + if (ospf6->router_id == 0) + ospf6_router_id_update(); + } /* set current ospf point. */ VTY_PUSH_CONTEXT(OSPF6_NODE, ospf6); diff --git a/ospf6d/ospf6_top.h b/ospf6d/ospf6_top.h index d7a3766b8..3ffcad056 100644 --- a/ospf6d/ospf6_top.h +++ b/ospf6d/ospf6_top.h @@ -24,6 +24,11 @@ #include "qobj.h" #include "routemap.h" +struct ospf6_master { + + uint32_t zebra_router_id; +}; + /* OSPFv3 top level data structure */ struct ospf6 { /* my router id */ @@ -109,10 +114,13 @@ DECLARE_QOBJ_TYPE(ospf6) /* global pointer for OSPF top data structure */ extern struct ospf6 *ospf6; +extern struct ospf6_master *om6; /* prototypes */ +extern void ospf6_master_init(void); extern void ospf6_top_init(void); extern void ospf6_delete(struct ospf6 *o); +extern void ospf6_router_id_update(void); extern void ospf6_maxage_remove(struct ospf6 *o); diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c index 4fb959b95..0decc09a2 100644 --- a/ospf6d/ospf6_zebra.c +++ b/ospf6d/ospf6_zebra.c @@ -55,13 +55,22 @@ static int ospf6_router_id_update_zebra(int command, struct zclient *zclient, zebra_router_id_update_read(zclient->ibuf, &router_id); + om6->zebra_router_id = router_id.u.prefix4.s_addr; + if (o == NULL) return 0; o->router_id_zebra = router_id.u.prefix4; + if (IS_OSPF6_DEBUG_ZEBRA(RECV)) { + char buf[INET_ADDRSTRLEN]; + + zlog_debug("%s: zebra router-id %s update", + __PRETTY_FUNCTION__, + inet_ntop(AF_INET, &router_id.u.prefix4, + buf, INET_ADDRSTRLEN)); + } - if (o->router_id == 0) - o->router_id = (uint32_t)o->router_id_zebra.s_addr; + ospf6_router_id_update(); return 0; }