summaryrefslogtreecommitdiff
path: root/ospf6d
diff options
context:
space:
mode:
authorChirag Shah <chirag@cumulusnetworks.com>2018-02-27 11:24:16 -0800
committerChirag Shah <chirag@cumulusnetworks.com>2018-03-01 14:19:15 -0800
commit78c6ba61db8a84d1d262a9896e81bea97976753c (patch)
tree607d9fa931ef2de7d3653cc4c27399f4d157f485 /ospf6d
parentc98f4d81aa5d4113ceea58ce6db4bebab5c99735 (diff)
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 <chirag@cumulusnetworks.com>
Diffstat (limited to 'ospf6d')
-rw-r--r--ospf6d/ospf6_main.c3
-rw-r--r--ospf6d/ospf6_top.c26
-rw-r--r--ospf6d/ospf6_top.h8
-rw-r--r--ospf6d/ospf6_zebra.c13
4 files changed, 46 insertions, 4 deletions
diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c
index 88f03d8f64..9580d87cf0 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 25d968fb68..28379458d2 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 d7a3766b80..3ffcad0564 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 4fb959b952..0decc09a29 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;
}