--- 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 <sys/param.h>
 #include <sys/systm.h>
@@ -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 <sys/param.h>
 #include <sys/systm.h>
@@ -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 <sys/param.h>
 #include <sys/systm.h>
@@ -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 <sys/param.h>
@@ -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;