| *** ip6_input.c.orig	Sat Jul 15 07:14:34 2000 | 
 | --- ip6_input.c	Thu Oct 19 17:14:37 2000 | 
 | *************** | 
 | *** 120,125 **** | 
 | --- 120,127 ---- | 
 |    | 
 |   extern struct domain inet6domain; | 
 |   extern struct ip6protosw inet6sw[]; | 
 | + extern int (*fr_checkp) __P((struct ip *, int, struct ifnet *, int, | 
 | + 			     struct mbuf **)); | 
 |    | 
 |   u_char ip6_protox[IPPROTO_MAX]; | 
 |   static int ip6qmaxlen = IFQ_MAXLEN; | 
 | *************** | 
 | *** 289,294 **** | 
 | --- 291,305 ---- | 
 |   		ip6stat.ip6s_badvers++; | 
 |   		in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr); | 
 |   		goto bad; | 
 | + 	} | 
 | +  | 
 | + 	if (fr_checkp) { | 
 | + 		struct	mbuf	*m1 = m; | 
 | +  | 
 | + 		if ((*fr_checkp)(ip6, sizeof(*ip6), m->m_pkthdr.rcvif, | 
 | + 				 0, &m1) || !m1) | 
 | + 			return; | 
 | + 		ip6 = mtod(m = m1, struct ip6_hdr *); | 
 |   	} | 
 |    | 
 |   	ip6stat.ip6s_nxthist[ip6->ip6_nxt]++; | 
 |  | 
 | *** ip6_output.c.orig	Sat Jul 15 07:14:35 2000 | 
 | --- ip6_output.c	Thu Oct 19 17:13:53 2000 | 
 | *************** | 
 | *** 106,111 **** | 
 | --- 106,113 ---- | 
 |   #include <netinet6/ip6_fw.h> | 
 |   #endif | 
 |    | 
 | + extern int (*fr_checkp) __P((struct ip *, int, struct ifnet *, int, struct mbuf **)); | 
 | +  | 
 |   static MALLOC_DEFINE(M_IPMOPTS, "ip6_moptions", "internet multicast options"); | 
 |    | 
 |   struct ip6_exthdrs { | 
 | *************** | 
 | *** 787,792 **** | 
 | --- 789,803 ---- | 
 |   			ip6->ip6_src.s6_addr16[1] = 0; | 
 |   		if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst)) | 
 |   			ip6->ip6_dst.s6_addr16[1] = 0; | 
 | + 	} | 
 | +  | 
 | + 	if (fr_checkp) { | 
 | + 		struct  mbuf    *m1 = m; | 
 | +  | 
 | + 		if ((error = (*fr_checkp)(ip6, sizeof(*ip6), ifp, 1, &m1)) || | 
 | + 		    !m1) | 
 | + 			goto done; | 
 | + 		ip6 = mtod(m = m1, struct ip6_hdr *); | 
 |   	} | 
 |    | 
 |   #ifdef IPV6FIREWALL |