| *** ip6_input.c.orig Sun Sep 2 12:51:02 2001 |
| --- ip6_input.c Mon Sep 3 22:25:23 2001 |
| *************** |
| *** 130,135 **** |
| --- 130,138 ---- |
| #ifdef PULLDOWN_TEST |
| static struct mbuf *ip6_pullexthdr __P((struct mbuf *, size_t, int)); |
| #endif |
| + #if defined(IPFILTER) || defined(IPFILTER_LKM) |
| + extern int (*fr_checkp) __P((struct ip *, int, struct ifnet *, int, struct mbuf **)); |
| + #endif |
| |
| /* |
| * IP6 initialization: fill in IP6 protocol switch table. |
| *************** |
| *** 274,279 **** |
| --- 277,302 ---- |
| in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr); |
| goto bad; |
| } |
| + |
| + #if defined(IPFILTER) || defined(IPFILTER_LKM) |
| + /* |
| + * Check if we want to allow this packet to be processed. |
| + * Consider it to be bad if not. |
| + */ |
| + if (fr_checkp != NULL) { |
| + struct mbuf *m0 = m; |
| + |
| + if ((*fr_checkp)((struct ip *)ip6, sizeof(*ip6), |
| + m->m_pkthdr.rcvif, 0, &m0)) { |
| + return; |
| + } |
| + m = m0; |
| + if (m == 0) { /* in case of 'fastroute' */ |
| + return; |
| + } |
| + ip6 = mtod(m, struct ip6_hdr *); |
| + } |
| + #endif |
| |
| ip6stat.ip6s_nxthist[ip6->ip6_nxt]++; |
| |
| *** ip6_output.c.orig Sun Sep 2 12:51:21 2001 |
| --- ip6_output.c Mon Sep 3 22:27:46 2001 |
| *************** |
| *** 113,118 **** |
| --- 113,122 ---- |
| struct mbuf *ip6e_dest2; |
| }; |
| |
| + #if defined(IPFILTER) || defined(IPFILTER_LKM) |
| + extern int (*fr_checkp) __P((struct ip *, int, struct ifnet *, int, struct mbuf **)); |
| + #endif |
| + |
| static int ip6_pcbopts __P((struct ip6_pktopts **, struct mbuf *, |
| struct socket *)); |
| static int ip6_setmoptions __P((int, struct ip6_moptions **, struct mbuf *)); |
| *************** |
| *** 910,915 **** |
| --- 914,938 ---- |
| m->m_pkthdr.rcvif = NULL; |
| } |
| |
| + |
| + #if defined(IPFILTER) || defined(IPFILTER_LKM) |
| + /* |
| + * looks like most checking has been done now...do a filter check |
| + */ |
| + if (fr_checkp != NULL) { |
| + struct mbuf *m1 = m; |
| + if ((*fr_checkp)((struct ip *)ip6, sizeof(*ip6), ifp, 1, &m1)) { |
| + error = EHOSTUNREACH; |
| + goto done; |
| + } |
| + m = m1; |
| + if (m1 == 0) { /* in case of 'fastroute' */ |
| + error = 0; |
| + goto done; |
| + } |
| + ip6 = mtod(m, struct ip6_hdr *); |
| + } |
| + #endif |
| /* |
| * Send the packet to the outgoing interface. |
| * If necessary, do IPv6 fragmentation before sending. |