--- sys/conf/options +++ sys/conf/options @@ -453,6 +453,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.174.2.15 2012/11/17 11:37:20 svnexp Exp $"); #include "opt_mpath.h" +#include "opt_myloop_masklen.h" #include #include @@ -138,15 +139,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 @@ -365,8 +365,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) || \ @@ -377,7 +382,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_input.c +++ sys/netinet/ip_input.c @@ -37,6 +37,7 @@ #include "opt_ipstealth.h" #include "opt_ipsec.h" #include "opt_route.h" +#include "opt_myloop_masklen.h" #include #include @@ -430,8 +431,8 @@ /* 127/8 must not appear on wire - RFC1122 */ ifp = m->m_pkthdr.rcvif; - 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_INC(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_route.h" +#include "opt_myloop_masklen.h" #include "opt_mbuf_stress_test.h" #include "opt_mpath.h" #include "opt_sctp.h" @@ -576,8 +577,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_INC(ips_badaddr); error = EADDRNOTAVAIL; --- 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/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 @@ -274,8 +275,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_INC(ips_badaddr); goto drop; }