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);  }  | 
