--- sys/netinet/myloop_masklen.h +++ sys/netinet/myloop_masklen.h @@ -0,0 +1,7 @@ +#include "opt_myloop_masklen.h" + +#ifndef MYLOOP_MASKLEN +#define IN_MY_LOOP(i) (((u_int32_t)(i) & IN_CLASSA_NET) == (IN_LOOPBACKNET << IN_CLASSA_NSHIFT)) +#else +#define IN_MY_LOOP(i) (((u_int32_t)(i) & (INADDR_BROADCAST << (32 - MYLOOP_MASKLEN))) == (IN_LOOPBACKNET << IN_CLASSA_NSHIFT)) +#endif --- sys/conf/options +++ sys/conf/options @@ -419,6 +419,8 @@ # # # +# For interconnect beetween kernels in claster +MYLOOP_MASKLEN opt_myloop_masklen.h # Netgraph(4). Use option NETGRAPH to enable the base netgraph code. # Each netgraph node type can be either be compiled into the kernel --- sys/netinet/in.c +++ sys/netinet/in.c @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD: src/sys/netinet/in.c,v 1.102.2.4 2009/02/18 20:12:08 jamie Exp $"); #include "opt_carp.h" +#include "opt_myloop_masklen.h" #include #include @@ -127,15 +128,9 @@ in_canforward(struct in_addr in) { register u_long i = ntohl(in.s_addr); - register u_long net; - if (IN_EXPERIMENTAL(i) || IN_MULTICAST(i) || IN_LINKLOCAL(i)) + if (IN_EXPERIMENTAL(i) || IN_MULTICAST(i) || IN_LINKLOCAL(i) || IN_ZERONET(i) || IN_LOOPBACK(i)) return (0); - if (IN_CLASSA(i)) { - net = i & IN_CLASSA_NET; - if (net == 0 || net == (IN_LOOPBACKNET << IN_CLASSA_NSHIFT)) - return (0); - } return (1); } --- sys/netinet/in.h +++ sys/netinet/in.h @@ -378,8 +378,13 @@ #define IN_EXPERIMENTAL(i) (((u_int32_t)(i) & 0xf0000000) == 0xf0000000) #define IN_BADCLASS(i) (((u_int32_t)(i) & 0xf0000000) == 0xf0000000) +#ifndef MYLOOP_MASKLEN +# define MYLOOP_MASKLEN 8 +#endif + +#define INADDR_LOOPBACK (u_int32_t)0x7f000001 #define IN_LINKLOCAL(i) (((u_int32_t)(i) & 0xffff0000) == 0xa9fe0000) -#define IN_LOOPBACK(i) (((u_int32_t)(i) & 0xff000000) == 0x7f000000) +#define IN_LOOPBACK(i) ((((u_int32_t)(i) ^ INADDR_LOOPBACK) & (INADDR_BROADCAST << (32 - MYLOOP_MASKLEN))) == 0) #define IN_ZERONET(i) (((u_int32_t)(i) & 0xff000000) == 0) #define IN_PRIVATE(i) ((((u_int32_t)(i) & 0xff000000) == 0x0a000000) || \ @@ -390,7 +395,6 @@ #define IN_ANY_LOCAL(i) (IN_LINKLOCAL(i) || IN_LOCAL_GROUP(i)) -#define INADDR_LOOPBACK (u_int32_t)0x7f000001 #ifndef _KERNEL #define INADDR_NONE 0xffffffff /* -1 return */ #endif --- sys/netinet/ip_fastfwd.c +++ sys/netinet/ip_fastfwd.c @@ -78,6 +78,7 @@ #include "opt_ipfw.h" #include "opt_ipstealth.h" +#include "opt_myloop_masklen.h" #include #include @@ -271,8 +272,8 @@ /* * Is packet from or to 127/8? */ - if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET || - (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) { + if (IN_LOOPBACK(ntohl(ip->ip_dst.s_addr)) || + IN_LOOPBACK(ntohl(ip->ip_src.s_addr))) { ipstat.ips_badaddr++; goto drop; } --- sys/netinet/ip_input.c +++ sys/netinet/ip_input.c @@ -38,6 +38,7 @@ #include "opt_ipsec.h" #include "opt_mac.h" #include "opt_carp.h" +#include "opt_myloop_masklen.h" #include #include @@ -336,8 +337,8 @@ } /* 127/8 must not appear on wire - RFC1122 */ - if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET || - (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) { + if (IN_LOOPBACK(ntohl(ip->ip_dst.s_addr)) || + IN_LOOPBACK(ntohl(ip->ip_src.s_addr))) { if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) == 0) { ipstat.ips_badaddr++; goto bad; --- sys/netinet/ip_output.c +++ sys/netinet/ip_output.c @@ -35,6 +35,7 @@ #include "opt_ipfw.h" #include "opt_ipsec.h" #include "opt_mac.h" +#include "opt_myloop_masklen.h" #include "opt_mbuf_stress_test.h" #include @@ -497,8 +498,8 @@ passout: /* 127/8 must not appear on wire - RFC1122. */ - if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET || - (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) { + if (IN_LOOPBACK(ntohl(ip->ip_dst.s_addr)) || + IN_LOOPBACK(ntohl(ip->ip_src.s_addr))) { if ((ifp->if_flags & IFF_LOOPBACK) == 0) { ipstat.ips_badaddr++; error = EADDRNOTAVAIL;