diff options
| -rw-r--r-- | bgpd/bgp_route.c | 2 | ||||
| -rwxr-xr-x | configure.ac | 6 | ||||
| -rw-r--r-- | lib/sockunion.c | 60 | ||||
| -rw-r--r-- | ospfd/ospf_packet.c | 44 | ||||
| -rw-r--r-- | ospfd/ospfd.c | 4 | 
5 files changed, 51 insertions, 65 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 9ff64654..50407e4e 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -10291,7 +10291,7 @@ ALIAS (show_ip_bgp_view_rsclient,  DEFUN (show_ip_bgp_view_rsclient_route,         show_ip_bgp_view_rsclient_route_cmd, -       "show bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D", +       "show ip bgp view WORD rsclient (A.B.C.D|X:X::X:X) A.B.C.D",         SHOW_STR         IP_STR         BGP_STR diff --git a/configure.ac b/configure.ac index 547b6866..a974daa4 100755 --- a/configure.ac +++ b/configure.ac @@ -8,7 +8,7 @@  ## $Id$  AC_PREREQ(2.53) -AC_INIT(Quagga, 0.99.10, [http://bugzilla.quagga.net]) +AC_INIT(Quagga, 0.99.11, [http://bugzilla.quagga.net])  AC_CONFIG_SRCDIR(lib/zebra.h)  dnl ----------------------------------- @@ -1390,10 +1390,8 @@ CONFDATE=`date '+%Y%m%d'`  AC_SUBST(CONFDATE)  dnl Conditionally enable PIE support for GNU toolchains. -enable_pie=yes -  AC_ARG_ENABLE(pie, AS_HELP_STRING([--disable-pie], [Do not build tools as a Position Independent Executables])) -if test "$enable_pie" = "yes"; then +if test "$enable_pie" != "no"; then    AC_CACHE_CHECK([whether $CC accepts PIE flags], [ap_cv_cc_pie], [      save_CFLAGS=$CFLAGS      save_LDFLAGS=$LDFLAGS diff --git a/lib/sockunion.c b/lib/sockunion.c index cfd3bf9a..8fbe3450 100644 --- a/lib/sockunion.c +++ b/lib/sockunion.c @@ -227,6 +227,24 @@ sockunion_su2str (union sockunion *su)    return XSTRDUP (MTYPE_TMP, str);  } +/* Convert IPv4 compatible IPv6 address to IPv4 address. */ +static void +sockunion_normalise_mapped (union sockunion *su) +{ +  struct sockaddr_in sin; +   +#ifdef HAVE_IPV6 +  if (su->sa.sa_family == AF_INET6  +      && IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) +    { +      memset (&sin, 0, sizeof (struct sockaddr_in)); +      sin.sin_family = AF_INET; +      memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4); +      memcpy (su, &sin, sizeof (struct sockaddr_in)); +    } +#endif /* HAVE_IPV6 */ +} +  /* Return socket of sockunion. */  int  sockunion_socket (union sockunion *su) @@ -253,23 +271,6 @@ sockunion_accept (int sock, union sockunion *su)    len = sizeof (union sockunion);    client_sock = accept (sock, (struct sockaddr *) su, &len); -  /* Convert IPv4 compatible IPv6 address to IPv4 address. */ -#if 0 -#ifdef HAVE_IPV6 -  if (su->sa.sa_family == AF_INET6) -    { -      if (IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) -	{ -	  struct sockaddr_in sin; - -	  memset (&sin, 0, sizeof (struct sockaddr_in)); -	  sin.sin_family = AF_INET; -	  memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4); -	  memcpy (su, &sin, sizeof (struct sockaddr_in)); -	} -    } -#endif /* HAVE_IPV6 */ -#endif    return client_sock;  } @@ -592,18 +593,7 @@ sockunion_getsockname (int fd)      {        su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion));        memcpy (su, &name, sizeof (struct sockaddr_in6)); - -#if 0 -      if (IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) -	{ -	  struct sockaddr_in sin; - -	  sin.sin_family = AF_INET; -	  memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4); -	  sin.sin_port = su->sin6.sin6_port; -	  memcpy (su, &sin, sizeof (struct sockaddr_in)); -	} -#endif +      sockunion_normalise_mapped (su);        return su;      }  #endif /* HAVE_IPV6 */ @@ -648,17 +638,7 @@ sockunion_getpeername (int fd)      {        su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion));        memcpy (su, &name, sizeof (struct sockaddr_in6)); -#if 0 -      if (IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr)) -	{ -	  struct sockaddr_in sin; - -	  sin.sin_family = AF_INET; -	  memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4); -	  sin.sin_port = su->sin6.sin6_port; -	  memcpy (su, &sin, sizeof (struct sockaddr_in)); -	} -#endif +      sockunion_normalise_mapped (su);        return su;      }  #endif /* HAVE_IPV6 */ diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index ed342e7f..5f0d99da 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -765,24 +765,6 @@ ospf_hello (struct ip *iph, struct ospf_header *ospfh,        return;      } -  /* If incoming interface is passive one, ignore Hello. */ -  if (OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_PASSIVE) { -    char buf[3][INET_ADDRSTRLEN]; -    zlog_debug ("ignoring HELLO from router %s sent to %s, " -	        "received on a passive interface, %s", -	        inet_ntop(AF_INET, &ospfh->router_id, buf[0], sizeof(buf[0])), -	        inet_ntop(AF_INET, &iph->ip_dst, buf[1], sizeof(buf[1])), -	        inet_ntop(AF_INET, &oi->address->u.prefix4, -	      		  buf[2], sizeof(buf[2]))); -    if (iph->ip_dst.s_addr == htonl(OSPF_ALLSPFROUTERS)) -      { -        /* Try to fix multicast membership. */ -        OI_MEMBER_JOINED(oi, MEMBER_ALLROUTERS); -        ospf_if_set_multicast(oi); -      } -    return; -  } -    /* get neighbor prefix. */    p.family = AF_INET;    p.prefixlen = ip_masklen (hello->network_mask); @@ -2393,6 +2375,32 @@ ospf_read (struct thread *thread)    /* associate packet with ospf interface */    oi = ospf_if_lookup_recv_if (ospf, iph->ip_src); +  /* If incoming interface is passive one, ignore it. */ +  if (oi && OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_PASSIVE) +    { +      char buf[3][INET_ADDRSTRLEN]; + +      if (IS_DEBUG_OSPF_EVENT) +	zlog_debug ("ignoring packet from router %s sent to %s, " +		    "received on a passive interface, %s", +		    inet_ntop(AF_INET, &ospfh->router_id, buf[0], sizeof(buf[0])), +		    inet_ntop(AF_INET, &iph->ip_dst, buf[1], sizeof(buf[1])), +		    inet_ntop(AF_INET, &oi->address->u.prefix4, +			      buf[2], sizeof(buf[2]))); + +      if (iph->ip_dst.s_addr == htonl(OSPF_ALLSPFROUTERS)) +	{ +	  /* Try to fix multicast membership. +	   * Some OS:es may have problems in this area, +	   * make sure it is removed. +	   */ +	  OI_MEMBER_JOINED(oi, MEMBER_ALLROUTERS); +	  ospf_if_set_multicast(oi); +	} +      return 0; +  } + +    /* if no local ospf_interface,      * or header area is backbone but ospf_interface is not     * check for VLINK interface diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index 32580ccf..c951a29a 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -998,8 +998,8 @@ ospf_if_update (struct ospf *ospf, struct interface *ifp)    if (!ospf)      ospf = ospf_lookup (); -  /* Router-ID must be configured. */ -  if (ospf->router_id.s_addr == 0) +  /* OSPF must be on and Router-ID must be configured. */ +  if (!ospf || ospf->router_id.s_addr == 0)      return;    /* Run each netowrk for this interface. */  | 
