On Oct 15, 2011, at 9:41 PM, Gleb Smirnoff wrote:

> Author: glebius
> Date: Sat Oct 15 18:41:25 2011
> New Revision: 226402
> URL: http://svn.freebsd.org/changeset/base/226402
> 
> Log:
>  Add support for IPv4 /31 prefixes, as described in RFC3021.
> 
>  To run a /31 network, participating hosts MUST drop support
>  for directed broadcasts, and treat the first and last addresses
>  on subnet as unicast. The broadcast address for the prefix
>  should be the link local broadcast address, INADDR_BROADCAST.
> 
> Modified:
>  head/sys/netinet/in.c
>  head/sys/netinet/in.h
> 
> Modified: head/sys/netinet/in.c
> ==============================================================================
> --- head/sys/netinet/in.c     Sat Oct 15 16:28:06 2011        (r226401)
> +++ head/sys/netinet/in.c     Sat Oct 15 18:41:25 2011        (r226402)
> @@ -897,8 +897,11 @@ in_ifinit(struct ifnet *ifp, struct in_i
>        */
>       ia->ia_ifa.ifa_metric = ifp->if_metric;
>       if (ifp->if_flags & IFF_BROADCAST) {
> -             ia->ia_broadaddr.sin_addr.s_addr =
> -                     htonl(ia->ia_subnet | ~ia->ia_subnetmask);
> +             if (ia->ia_subnetmask == IN_RFC3021_MASK)
> +                     ia->ia_broadaddr.sin_addr.s_addr = INADDR_BROADCAST;
> +             else
> +                     ia->ia_broadaddr.sin_addr.s_addr =
> +                         htonl(ia->ia_subnet | ~ia->ia_subnetmask);
>       } else if (ifp->if_flags & IFF_LOOPBACK) {
>               ia->ia_dstaddr = ia->ia_addr;
>               flags |= RTF_HOST;
> @@ -1230,9 +1233,11 @@ in_broadcast(struct in_addr in, struct i
>               if (ifa->ifa_addr->sa_family == AF_INET &&
>                   (in.s_addr == ia->ia_broadaddr.sin_addr.s_addr ||
>                    /*
> -                   * Check for old-style (host 0) broadcast.
> +                   * Check for old-style (host 0) broadcast, but
> +                   * taking into account that RFC 3021 obsoletes it.
>                     */
> -                  t == ia->ia_subnet) &&
> +                  (ia->ia_subnetmask != IN_RFC3021_MASK &&
> +                  t == ia->ia_subnet)) &&
>                    /*
>                     * Check for an all one subnetmask. These
>                     * only exist when an interface gets a secondary
> 
> Modified: head/sys/netinet/in.h
> ==============================================================================
> --- head/sys/netinet/in.h     Sat Oct 15 16:28:06 2011        (r226401)
> +++ head/sys/netinet/in.h     Sat Oct 15 18:41:25 2011        (r226402)
> @@ -392,6 +392,8 @@ __END_DECLS
> 
> #define       IN_LOOPBACKNET          127                     /* official! */
> 
> +#define      IN_RFC3021_MASK         (u_int32_t)0xfffffffe
> +
> /*
>  * Options for use with [gs]etsockopt at the IP level.
>  * First word of comment is data type; bool is stored in int.
> 

That's great! Thanks!
Any plans for MFC?

Regards,
Nikolay

_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to