diff options
| -rw-r--r-- | lib/command.c | 11 | ||||
| -rw-r--r-- | lib/sockunion.c | 5 | ||||
| -rw-r--r-- | lib/zebra.h | 4 | ||||
| -rw-r--r-- | zebra/connected.c | 3 | ||||
| -rw-r--r-- | zebra/interface.h | 4 | ||||
| -rw-r--r-- | zebra/ioctl.c | 4 | ||||
| -rw-r--r-- | zebra/kernel_socket.c | 7 | ||||
| -rw-r--r-- | zebra/zebra_rib.c | 8 | ||||
| -rw-r--r-- | zebra/zserv.c | 14 | ||||
| -rw-r--r-- | zebra/zserv.h | 6 | 
10 files changed, 60 insertions, 6 deletions
diff --git a/lib/command.c b/lib/command.c index f57cf5ca..5d429338 100644 --- a/lib/command.c +++ b/lib/command.c @@ -718,6 +718,8 @@ cmd_ipv6_match (char *str)    int state = STATE_START;    int colons = 0, nums = 0, double_colon = 0;    char *sp = NULL; +  struct sockaddr_in6 sin6_dummy; +  int ret;    if (str == NULL)      return partly_match; @@ -725,6 +727,15 @@ cmd_ipv6_match (char *str)    if (strspn (str, IPV6_ADDR_STR) != strlen (str))      return no_match; +  /* use inet_pton that has a better support, +   * for example inet_pton can support the automatic addresses: +   *  ::1.2.3.4 +   */ +  ret = inet_pton(AF_INET6, str, &sin6_dummy.sin6_addr); +    +  if (ret == 1) +    return exact_match; +    while (*str != '\0')      {        switch (state) diff --git a/lib/sockunion.c b/lib/sockunion.c index 13b0be6b..e4b311c7 100644 --- a/lib/sockunion.c +++ b/lib/sockunion.c @@ -344,8 +344,13 @@ sockunion_connect (int fd, union sockunion *peersu, unsigned short port,  	{  #ifdef HAVE_SIN6_SCOPE_ID  	  /* su.sin6.sin6_scope_id = ifindex; */ +#ifdef MUSICA +	  su.sin6.sin6_scope_id = ifindex;  +#endif  #endif /* HAVE_SIN6_SCOPE_ID */ +#ifndef MUSICA  	  SET_IN6_LINKLOCAL_IFINDEX (su.sin6.sin6_addr, ifindex); +#endif  	}  #endif /* KAME */        break; diff --git a/lib/zebra.h b/lib/zebra.h index 175eb6e2..baad6d6a 100644 --- a/lib/zebra.h +++ b/lib/zebra.h @@ -143,6 +143,10 @@ typedef int socklen_t;  #include <netinet/in_var.h>  #endif /* HAVE_NETINET_IN_VAR_H */ +#ifdef HAVE_NETINET6_IN6_VAR_H +#include <netinet6/in6_var.h> +#endif /* HAVE_NETINET6_IN6_VAR_H */ +  #ifdef HAVE_NETINET_IN6_VAR_H  #include <netinet/in6_var.h>  #endif /* HAVE_NETINET_IN6_VAR_H */ diff --git a/zebra/connected.c b/zebra/connected.c index 5d1c6b66..280e423e 100644 --- a/zebra/connected.c +++ b/zebra/connected.c @@ -263,8 +263,11 @@ connected_up_ipv6 (struct interface *ifp, struct connected *ifc)    /* Apply mask to the network. */    apply_mask_ipv6 (&p); +#if ! defined (MUSICA) && ! defined (LINUX) +  /* XXX: It is already done by rib_bogus_ipv6 within rib_add_ipv6 */    if (IN6_IS_ADDR_UNSPECIFIED (&p.prefix))      return; +#endif    rib_add_ipv6 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, ifp->ifindex, 0); diff --git a/zebra/interface.h b/zebra/interface.h index dbfa8221..3ab624f2 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -31,7 +31,9 @@  /* Router advertisement feature. */  #if (defined(LINUX_IPV6) && (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1)) || defined(KAME) -#define RTADV +  #ifdef HAVE_RTADV +    #define RTADV +  #endif  #endif  #ifdef RTADV diff --git a/zebra/ioctl.c b/zebra/ioctl.c index 13afba29..3e5d1d2f 100644 --- a/zebra/ioctl.c +++ b/zebra/ioctl.c @@ -474,8 +474,10 @@ if_prefix_add_ipv6 (struct interface *ifp, struct connected *ifc)  #endif    memcpy (&addreq.ifra_prefixmask, &mask, sizeof (struct sockaddr_in6)); +#ifdef HAVE_IFRA_LIFETIME     addreq.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;     addreq.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;  +#endif    ret = if_ioctl_ipv6 (SIOCAIFADDR_IN6, (caddr_t) &addreq);    if (ret < 0) @@ -513,8 +515,10 @@ if_prefix_delete_ipv6 (struct interface *ifp, struct connected *ifc)  #endif    memcpy (&addreq.ifra_prefixmask, &mask, sizeof (struct sockaddr_in6)); +#ifdef HAVE_IFRA_LIFETIME    addreq.ifra_lifetime.ia6t_pltime = ND6_INFINITE_LIFETIME;     addreq.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;  +#endif    ret = if_ioctl_ipv6 (SIOCDIFADDR_IN6, (caddr_t) &addreq);    if (ret < 0) diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c index 1e915d1d..17893a87 100644 --- a/zebra/kernel_socket.c +++ b/zebra/kernel_socket.c @@ -763,9 +763,8 @@ kernel_read (struct thread *thread)    thread_add_read (master, kernel_read, NULL, sock); -#ifdef DEBUG -  rtmsg_debug (&buf.r.rtm); -#endif /* DEBUG */ +  if (IS_ZEBRA_DEBUG_KERNEL) +    rtmsg_debug (&buf.r.rtm);    rtm = &buf.r.rtm; @@ -788,6 +787,8 @@ kernel_read (struct thread *thread)        break;  #endif /* RTM_IFANNOUNCE */      default: +      if (IS_ZEBRA_DEBUG_KERNEL) +        zlog_info("Unprocessed RTM_type: %d", rtm->rtm_type);        break;      }    return 0; diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 74edfbb8..d7f8bdab 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -1539,8 +1539,14 @@ int  rib_bogus_ipv6 (int type, struct prefix_ipv6 *p,  		struct in6_addr *gate, unsigned int ifindex, int table)  { -  if (type == ZEBRA_ROUTE_CONNECT && IN6_IS_ADDR_UNSPECIFIED (&p->prefix)) +  if (type == ZEBRA_ROUTE_CONNECT && IN6_IS_ADDR_UNSPECIFIED (&p->prefix)) { +#if defined (MUSICA) || defined (LINUX) +    /* IN6_IS_ADDR_V4COMPAT(&p->prefix) */ +    if (p->prefixlen == 96) +      return 0; +#endif /* MUSICA */      return 1; +  }    if (type == ZEBRA_ROUTE_KERNEL && IN6_IS_ADDR_UNSPECIFIED (&p->prefix)        && p->prefixlen == 96 && gate && IN6_IS_ADDR_UNSPECIFIED (gate))      { diff --git a/zebra/zserv.c b/zebra/zserv.c index 4753f577..ae1e0445 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -448,6 +448,7 @@ zsend_ipv4_add_multipath (struct zserv *client, struct prefix *p,  	{  	  stream_putc (s, 1); +	  /* XXX: Waht's about NEXTHOP_TYPE_IPV4_IFNAME ? */  	  if (nexthop->type == NEXTHOP_TYPE_IPV4  	      || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)  	    stream_put_in_addr (s, &nexthop->gate.ipv4); @@ -529,6 +530,8 @@ zsend_ipv4_delete_multipath (struct zserv *client, struct prefix *p,    return 0;  } +#if 0 +#warning oldies  int  zsend_ipv4_add (struct zserv *client, int type, int flags,  		struct prefix_ipv4 *p, struct in_addr *nexthop, @@ -610,8 +613,11 @@ zsend_ipv4_delete (struct zserv *client, int type, int flags,    return 0;  } +#endif /* oldies */  #ifdef HAVE_IPV6 +#if 0 +#warning oldies  int  zsend_ipv6_add (struct zserv *client, int type, int flags,  		struct prefix_ipv6 *p, struct in6_addr *nexthop, @@ -652,6 +658,7 @@ zsend_ipv6_add (struct zserv *client, int type, int flags,    return 0;  } +#endif /* oldies */  int  zsend_ipv6_add_multipath (struct zserv *client, struct prefix *p, @@ -687,7 +694,9 @@ zsend_ipv6_add_multipath (struct zserv *client, struct prefix *p,  	{  	  stream_putc (s, 1); -	  if (nexthop->type == NEXTHOP_TYPE_IPV6) +	  if (nexthop->type == NEXTHOP_TYPE_IPV6 +	      || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX +	      || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)  	    stream_write (s, (u_char *) &nexthop->gate.ipv6, 16);  	  else  	    stream_write (s, (u_char *) &empty, 16); @@ -711,6 +720,8 @@ zsend_ipv6_add_multipath (struct zserv *client, struct prefix *p,    return 0;  } +#if 0 +#warning oldies  int  zsend_ipv6_delete (struct zserv *client, int type, int flags,  		   struct prefix_ipv6 *p, struct in6_addr *nexthop, @@ -751,6 +762,7 @@ zsend_ipv6_delete (struct zserv *client, int type, int flags,    return 0;  } +#endif /* oldies */  int  zsend_ipv6_delete_multipath (struct zserv *client, struct prefix *p, diff --git a/zebra/zserv.h b/zebra/zserv.h index a083611f..ec3c9f4b 100644 --- a/zebra/zserv.h +++ b/zebra/zserv.h @@ -89,6 +89,8 @@ zsend_interface_up (struct zserv *, struct interface *);  int  zsend_interface_down (struct zserv *, struct interface *); +#if 0 +#warning oldies  int  zsend_ipv4_add (struct zserv *client, int type, int flags,  		struct prefix_ipv4 *p, struct in_addr *nexthop, @@ -98,6 +100,7 @@ int  zsend_ipv4_delete (struct zserv *client, int type, int flags,  		   struct prefix_ipv4 *p, struct in_addr *nexthop,  		   unsigned int ifindex); +#endif  int  zsend_ipv4_add_multipath (struct zserv *, struct prefix *, struct rib *); @@ -106,6 +109,8 @@ int  zsend_ipv4_delete_multipath (struct zserv *, struct prefix *, struct rib *);  #ifdef HAVE_IPV6 +#if 0 +#warning oldies  int  zsend_ipv6_add (struct zserv *client, int type, int flags,  		struct prefix_ipv6 *p, struct in6_addr *nexthop, @@ -115,6 +120,7 @@ int  zsend_ipv6_delete (struct zserv *client, int type, int flags,  		   struct prefix_ipv6 *p, struct in6_addr *nexthop,  		   unsigned int ifindex); +#endif  int  zsend_ipv6_add_multipath (struct zserv *, struct prefix *, struct rib *);  | 
