diff options
-rw-r--r-- | ospf6d/Makefile.am | 2 | ||||
-rw-r--r-- | ospf6d/ospf6_asbr.c | 53 | ||||
-rw-r--r-- | ospf6d/ospf6_main.c | 6 | ||||
-rw-r--r-- | ospf6d/ospf6_network.c | 8 | ||||
-rw-r--r-- | ospf6d/ospf6_top.c | 3 |
5 files changed, 60 insertions, 12 deletions
diff --git a/ospf6d/Makefile.am b/ospf6d/Makefile.am index e1b78cbc..680e89b8 100644 --- a/ospf6d/Makefile.am +++ b/ospf6d/Makefile.am @@ -28,7 +28,7 @@ noinst_HEADERS = \ ospf6d_SOURCES = \ ospf6_main.c $(libospf6_a_SOURCES) -ospf6d_LDADD = ../lib/libzebra.a +ospf6d_LDADD = -L../lib -lzebra sysconf_DATA = ospf6d.conf.sample diff --git a/ospf6d/ospf6_asbr.c b/ospf6d/ospf6_asbr.c index 00a2b66c..deb708ac 100644 --- a/ospf6d/ospf6_asbr.c +++ b/ospf6d/ospf6_asbr.c @@ -412,8 +412,9 @@ ospf6_asbr_external_lsa_refresh (void *data) struct ospf6_lsa_as_external *e; struct prefix prefix; struct route_node *node; - struct ospf6_external_route *route; - struct ospf6_external_info *info; + struct ospf6_external_route *route = NULL; + struct ospf6_external_info *info = NULL; + struct ospf6_external_info *match = NULL; if (IS_OSPF6_DUMP_ASBR) zlog_info ("ASBR: refresh %s", lsa->str); @@ -424,6 +425,29 @@ ospf6_asbr_external_lsa_refresh (void *data) prefix.family = AF_INET6; apply_mask_ipv6 ((struct prefix_ipv6 *) &prefix); + for (node = route_top (external_table); node; node = route_next (node)) + { + route = node->info; + if (route == NULL) + continue; + + for (info = route->info_head; info; info = info->next) + { + if (lsa->header->id == htonl (info->id)) + match = info; + } + } + + if (match == NULL) + { + ospf6_lsa_premature_aging (lsa); + return 0; + } + + ospf6_asbr_schedule_external (match); + return 0; + +#if 0 node = route_node_lookup (external_table, &prefix); if (! node || ! node->info) { @@ -450,6 +474,7 @@ ospf6_asbr_external_lsa_refresh (void *data) ospf6_lsa_premature_aging (lsa); return 0; +#endif } void @@ -461,6 +486,18 @@ ospf6_asbr_route_add (int type, int ifindex, struct prefix *prefix, struct ospf6_external_route *route; struct ospf6_external_info *info, tinfo; +#if defined (MUSICA) || defined (LINUX) + /* XXX As long as the OSPFv3 redistribution is applied to all the connected + * routes, one needs to filter the ::/96 prefixes. + * However it could be a wanted case, it will be removed soon. + */ + struct prefix_ipv6 *p = (prefix_ipv6 *)prefix; + + if ((IN6_IS_ADDR_V4COMPAT(&p->prefix)) || + (IN6_IS_ADDR_UNSPECIFIED (&p->prefix) && (p->prefixlen == 96))) + return; +#endif /* MUSICA or LINUX */ + if (! ospf6_zebra_is_redistribute (type)) return; @@ -567,6 +604,18 @@ ospf6_asbr_route_remove (int type, int ifindex, struct prefix *prefix) struct ospf6_external_info *info; struct ospf6_lsa *lsa; +#if defined (MUSICA) || defined (LINUX) + /* XXX As long as the OSPFv3 redistribution is applied to all the connected + * routes, one needs to filter the ::/96 prefixes. + * However it could be a wanted case, it will be removed soon. + */ + struct prefix_ipv6 *p = (prefix_ipv6 *)prefix; + + if ((IN6_IS_ADDR_V4COMPAT(&p->prefix)) || + (IN6_IS_ADDR_UNSPECIFIED (&p->prefix) && (p->prefixlen == 96))) + return; +#endif /* MUSICA or LINUX */ + node = route_node_get (external_table, prefix); route = node->info; diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c index 3f3d5508..10203bf8 100644 --- a/ospf6d/ospf6_main.c +++ b/ospf6d/ospf6_main.c @@ -283,10 +283,10 @@ main (int argc, char *argv[], char *envp[]) if (! daemon_mode) flag = ZLOG_STDOUT; else - flag = 0; + flag = ZLOG_NOLOG; zlog_default = openzlog (progname, flag, ZLOG_OSPF6, - LOG_CONS|LOG_NDELAY|LOG_PERROR|LOG_PID, + LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON); signal_init (); cmd_init (1); @@ -315,9 +315,11 @@ main (int argc, char *argv[], char *envp[]) /* Make ospf vty socket. */ vty_serv_sock (vty_addr, vty_port, OSPF6_VTYSH_PATH); +#ifdef DEBUG /* Print start message */ zlog_notice ("OSPF6d (Zebra-%s ospf6d-%s) starts", ZEBRA_VERSION, OSPF6_DAEMON_VERSION); +#endif /* Start finite state machine, here we go! */ while (thread_fetch (master, &thread)) diff --git a/ospf6d/ospf6_network.c b/ospf6d/ospf6_network.c index 041d829b..e90614e5 100644 --- a/ospf6d/ospf6_network.c +++ b/ospf6d/ospf6_network.c @@ -255,10 +255,8 @@ ospf6_leave_allspfrouters (u_int ifindex) &mreq6, sizeof (mreq6)) < 0) zlog_warn ("Network: Leave AllSPFRouters on ifindex %d Failed: %s", ifindex, strerror (errno)); -#if 0 else zlog_info ("Network: Leave AllSPFRouters on ifindex %d", ifindex); -#endif } void @@ -275,10 +273,8 @@ ospf6_join_alldrouters (u_int ifindex) &mreq6, sizeof (mreq6)) < 0) zlog_warn ("Network: Join AllDRouters on ifindex %d Failed: %s", ifindex, strerror (errno)); -#if 0 else zlog_info ("Network: Join AllDRouters on ifindex %d", ifindex); -#endif } void @@ -294,10 +290,8 @@ ospf6_leave_alldrouters (u_int ifindex) if (setsockopt (ospf6_sock, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &mreq6, sizeof (mreq6)) < 0) zlog_warn ("Network: Leave AllDRouters on ifindex %d Failed", ifindex); -#if 0 else zlog_info ("Network: Leave AllDRouters on ifindex %d", ifindex); -#endif } /* setsockopt ReUseAddr to on */ @@ -340,7 +334,7 @@ void ospf6_set_checksum () { int offset = 12; -#ifndef DISABLE_IPV6_CHECKSUM +#if !defined(DISABLE_IPV6_CHECKSUM) if (setsockopt (ospf6_sock, IPPROTO_IPV6, IPV6_CHECKSUM, &offset, sizeof (offset)) < 0) zlog_warn ("Network: set IPV6_CHECKSUM failed: %s", strerror (errno)); diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c index a8a058f2..f9cc3299 100644 --- a/ospf6d/ospf6_top.c +++ b/ospf6d/ospf6_top.c @@ -286,6 +286,9 @@ ospf6_create (unsigned long process_id) void ospf6_delete (struct ospf6 *ospf6) { + if (!ospf6) + return; + ospf6_route_remove_all (ospf6->route_table); ospf6_free (ospf6); } |