summaryrefslogtreecommitdiffstats
path: root/sys/contrib/ipfilter/netinet/ip_fil.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/ipfilter/netinet/ip_fil.c')
-rw-r--r--sys/contrib/ipfilter/netinet/ip_fil.c157
1 files changed, 52 insertions, 105 deletions
diff --git a/sys/contrib/ipfilter/netinet/ip_fil.c b/sys/contrib/ipfilter/netinet/ip_fil.c
index 8fcd05d..da64a49 100644
--- a/sys/contrib/ipfilter/netinet/ip_fil.c
+++ b/sys/contrib/ipfilter/netinet/ip_fil.c
@@ -3,6 +3,7 @@
*
* See the IPFILTER.LICENCE file for details on licencing.
*/
+
#ifndef SOLARIS
#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
#endif
@@ -24,7 +25,7 @@
# include <osreldate.h>
# endif
#endif
-#if defined(__sgi) && (IRIX > 602)
+#ifdef __sgi
# define _KMEMUSER
# include <sys/ptimers.h>
#endif
@@ -117,17 +118,15 @@
# include <sys/kernel.h>
extern int ip_optcopy __P((struct ip *, struct ip *));
#endif
-#if defined(OpenBSD) && (OpenBSD >= 200211) && defined(_KERNEL)
-extern int ip6_getpmtu(struct route_in6 *, struct route_in6 *,
- struct ifnet *, struct in6_addr *, u_long *);
-#endif
+
+#include <machine/in_cksum.h>
#if !defined(lint)
static const char sccsid[] = "@(#)ip_fil.c 2.41 6/5/96 (C) 1993-2000 Darren Reed";
-static const char rcsid[] = "@(#)$Id: ip_fil.c,v 2.42.2.64 2002/12/06 11:45:45 darrenr Exp $";
+/* static const char rcsid[] = "@(#)$Id: ip_fil.c,v 2.42.2.34 2001/07/23 13:49:57 darrenr Exp $"; */
+static const char rcsid[] = "@(#)$FreeBSD$";
#endif
-
extern struct protosw inetsw[];
#ifndef _KERNEL
@@ -196,15 +195,6 @@ struct timeout ipfr_slowtimer_ch;
toid_t ipfr_slowtimer_ch;
#endif
-#if defined(__NetBSD__) && (__NetBSD_Version__ >= 106080000) && \
- defined(_KERNEL)
-# include <sys/conf.h>
-const struct cdevsw ipl_cdevsw = {
- iplopen, iplclose, iplread, nowrite, iplioctl,
- nostop, notty, nopoll, nommap,
-};
-#endif
-
#if (_BSDI_VERSION >= 199510) && defined(_KERNEL)
# include <sys/device.h>
# include <sys/conf.h>
@@ -221,7 +211,8 @@ struct devsw iplsw = {
};
#endif /* _BSDI_VERSION >= 199510 && _KERNEL */
-#if defined(__NetBSD__) || defined(__OpenBSD__) || (_BSDI_VERSION >= 199701)
+#if defined(__NetBSD__) || defined(__OpenBSD__) || \
+ (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 500011)
# include <sys/conf.h>
# if defined(NETBSD_PF)
# include <net/pfil.h>
@@ -332,7 +323,7 @@ int count;
# endif
-# if defined(__NetBSD__) || defined(__OpenBSD__)
+# if defined(__NetBSD__)
int ipl_enable()
# else
int iplattach()
@@ -340,7 +331,8 @@ int iplattach()
{
char *defpass;
int s;
-# if defined(__sgi) || (defined(NETBSD_PF) && (__NetBSD_Version__ >= 104200000))
+# if defined(__sgi) || (defined(NETBSD_PF) && \
+ ((__NetBSD_Version__ >= 104200000) || (__FreeBSD_version >= 500011)))
int error = 0;
# endif
#if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 105110000)
@@ -376,13 +368,10 @@ int iplattach()
# ifdef NETBSD_PF
# if (__NetBSD_Version__ >= 104200000) || (__FreeBSD_version >= 500011)
# if __NetBSD_Version__ >= 105110000
- ph_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET);
-# ifdef USE_INET6
- ph_inet6 = pfil_head_get(PFIL_TYPE_AF, AF_INET6);
-# endif
- if (ph_inet == NULL
+ if (
+ !(ph_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET))
# ifdef USE_INET6
- && ph_inet6 == NULL
+ && !(ph_inet6 = pfil_head_get(PFIL_TYPE_AF, AF_INET6))
# endif
)
return ENODEV;
@@ -499,7 +488,7 @@ int ipl_disable()
int ipldetach()
# endif
{
- int s, i;
+ int s, i = FR_INQUE|FR_OUTQUE;
#if defined(NETBSD_PF) && \
((__NetBSD_Version__ >= 104200000) || (__FreeBSD_version >= 500011))
int error = 0;
@@ -541,8 +530,8 @@ int ipldetach()
printf("%s unloaded\n", ipfilter_version);
fr_checkp = fr_savep;
- i = frflush(IPL_LOGIPF, 0, FR_INQUE|FR_OUTQUE|FR_INACTIVE);
- i += frflush(IPL_LOGIPF, 0, FR_INQUE|FR_OUTQUE);
+ i = frflush(IPL_LOGIPF, FR_INQUE|FR_OUTQUE|FR_INACTIVE);
+ i += frflush(IPL_LOGIPF, FR_INQUE|FR_OUTQUE);
fr_running = 0;
# ifdef NETBSD_PF
@@ -629,8 +618,8 @@ int IPL_EXTERN(ioctl)(dev, cmd, data, mode
# if (defined(_KERNEL) && ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || \
(NetBSD >= 199511) || (__FreeBSD_version >= 220000) || \
defined(__OpenBSD__)))
-, p)
-struct proc *p;
+, td)
+struct thread *td;
# else
)
# endif
@@ -651,7 +640,7 @@ int mode;
int error = 0, unit = 0, tmp;
#if (BSD >= 199306) && defined(_KERNEL)
- if ((securelevel >= 2) && (mode & FWRITE))
+ if ((securelevel >= 3) && (mode & FWRITE))
return EPERM;
#endif
#ifdef _KERNEL
@@ -687,16 +676,7 @@ int mode;
if (!fr_running)
error = EIO;
else
- if ((cmd == SIOCADAFR) || (cmd == SIOCRMAFR)) {
- if (!(mode & FWRITE)) {
- error = EPERM;
- } else {
- error = frrequest(unit, cmd, data,
- fr_active);
- }
- } else {
- error = fr_auth_ioctl(data, mode, cmd);
- }
+ error = fr_auth_ioctl(data, mode, cmd, NULL, NULL);
SPL_X(s);
return error;
}
@@ -720,7 +700,7 @@ int mode;
if (error)
break;
if (enable)
-# if defined(__NetBSD__) || defined(__OpenBSD__)
+# if defined(__NetBSD__)
error = ipl_enable();
# else
error = iplattach();
@@ -793,26 +773,12 @@ int mode;
else {
error = IRCOPY(data, (caddr_t)&tmp, sizeof(tmp));
if (!error) {
- tmp = frflush(unit, 4, tmp);
- error = IWCOPY((caddr_t)&tmp, data,
- sizeof(tmp));
- }
- }
- break;
-#ifdef USE_INET6
- case SIOCIPFL6 :
- if (!(mode & FWRITE))
- error = EPERM;
- else {
- error = IRCOPY(data, (caddr_t)&tmp, sizeof(tmp));
- if (!error) {
- tmp = frflush(unit, 6, tmp);
+ tmp = frflush(unit, tmp);
error = IWCOPY((caddr_t)&tmp, data,
sizeof(tmp));
}
}
break;
-#endif
case SIOCSTLCK :
error = IRCOPY(data, (caddr_t)&tmp, sizeof(tmp));
if (!error) {
@@ -837,6 +803,12 @@ int mode;
if (error)
error = EFAULT;
break;
+ case SIOCAUTHW :
+ case SIOCAUTHR :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ break;
+ }
case SIOCFRSYN :
if (!(mode & FWRITE))
error = EPERM;
@@ -1042,9 +1014,6 @@ caddr_t data;
return EBUSY;
if (fg && fg->fg_head)
fg->fg_head->fr_ref--;
- if (unit == IPL_LOGAUTH) {
- return fr_preauthcmd(req, f, ftail);
- }
if (f->fr_grhead)
fr_delgroup((u_int)f->fr_grhead, fp->fr_flags,
unit, set);
@@ -1059,9 +1028,6 @@ caddr_t data;
if (f)
error = EEXIST;
else {
- if (unit == IPL_LOGAUTH) {
- return fr_preauthcmd(req, fp, ftail);
- }
KMALLOC(f, frentry_t *);
if (f != NULL) {
if (fg && fg->fg_head)
@@ -1098,9 +1064,9 @@ int IPL_EXTERN(open)(dev_t dev, int flags)
int IPL_EXTERN(open)(dev, flags
# if ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || (NetBSD >= 199511) || \
(__FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL)
-, devtype, p)
+, devtype, td)
int devtype;
-struct proc *p;
+struct thread *td;
# else
)
# endif
@@ -1128,9 +1094,9 @@ int IPL_EXTERN(close)(dev_t dev, int flags, int devtype, cred_t *cp)
int IPL_EXTERN(close)(dev, flags
# if ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || (NetBSD >= 199511) || \
(__FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL)
-, devtype, p)
+, devtype, td)
int devtype;
-struct proc *p;
+struct thread *td;
# else
)
# endif
@@ -1194,9 +1160,9 @@ fr_info_t *fin;
if (tcp->th_flags & TH_RST)
return -1; /* feedback loop */
# if (BSD < 199306) || defined(__sgi)
- m = m_get(M_DONTWAIT, MT_HEADER);
+ m = m_get(M_NOWAIT, MT_HEADER);
# else
- m = m_gethdr(M_DONTWAIT, MT_HEADER);
+ m = m_gethdr(M_NOWAIT, MT_HEADER);
# endif
if (m == NULL)
return ENOBUFS;
@@ -1287,8 +1253,7 @@ struct mbuf **mp;
ip->ip_tos = oip->ip_tos;
ip->ip_id = oip->ip_id;
-# if defined(__NetBSD__) || \
- (defined(__OpenBSD__) && (OpenBSD >= 200012))
+# if defined(__NetBSD__) || defined(__OpenBSD__)
if (ip_mtudisc != 0)
ip->ip_off = IP_DF;
# else
@@ -1372,10 +1337,10 @@ int dst;
# if (BSD < 199306) || defined(__sgi)
avail = MLEN;
- m = m_get(M_DONTWAIT, MT_HEADER);
+ m = m_get(M_NOWAIT, MT_HEADER);
# else
avail = MHLEN;
- m = m_gethdr(M_DONTWAIT, MT_HEADER);
+ m = m_gethdr(M_NOWAIT, MT_HEADER);
# endif
if (m == NULL)
return ENOBUFS;
@@ -1399,11 +1364,11 @@ int dst;
if (type == ICMP6_DST_UNREACH)
code = icmptoicmp6unreach[code];
- MGETHDR(m, M_DONTWAIT, MT_HEADER);
+ MGETHDR(m, M_NOWAIT, MT_HEADER);
if (!m)
return ENOBUFS;
- MCLGET(m, M_DONTWAIT);
+ MCLGET(m, M_NOWAIT);
if ((m->m_flags & M_EXT) == 0) {
m_freem(m);
return ENOBUFS;
@@ -1412,7 +1377,7 @@ int dst;
m->m_len = 0;
avail = M_TRAILINGSPACE(m);
# else
- avail = (m->m_flags & M_EXT) ? MCLBYTES : MHLEN;
+ avail = MCLBYTES;
# endif
xtra = MIN(ntohs(oip6->ip6_plen) + sizeof(ip6_t),
avail - hlen - sizeof(*icmp) - max_linkhdr);
@@ -1523,7 +1488,7 @@ void
iplinit()
{
-# if defined(__NetBSD__) || defined(__OpenBSD__)
+# if defined(__NetBSD__)
if (ipl_enable() != 0)
# else
if (iplattach() != 0)
@@ -1599,7 +1564,7 @@ frdest_t *fdp;
* problem.
*/
if (M_WRITABLE(m) == 0) {
- if ((m0 = m_dup(m, M_DONTWAIT)) != NULL) {
+ if ((m0 = m_dup(m, M_NOWAIT)) != NULL) {
m_freem(*mpp);
*mpp = m0;
m = m0;
@@ -1628,7 +1593,7 @@ frdest_t *fdp;
/*
* Route packet.
*/
-#if defined(__sgi) && (IRIX >= 605)
+#ifdef __sgi
ROUTE_RDLOCK();
#endif
bzero((caddr_t)ro, sizeof (*ro));
@@ -1668,7 +1633,7 @@ frdest_t *fdp;
rtalloc(ro);
# endif
-#if defined(__sgi) && (IRIX > 602)
+#ifdef __sgi
ROUTE_UNLOCK();
#endif
@@ -1782,9 +1747,9 @@ frdest_t *fdp;
mhlen = sizeof (struct ip);
for (off = hlen + len; off < ip->ip_len; off += len) {
# ifdef MGETHDR
- MGETHDR(m, M_DONTWAIT, MT_HEADER);
+ MGETHDR(m, M_NOWAIT, MT_HEADER);
# else
- MGET(m, M_DONTWAIT, MT_HEADER);
+ MGET(m, M_NOWAIT, MT_HEADER);
# endif
if (m == 0) {
error = ENOBUFS;
@@ -1939,12 +1904,6 @@ frdest_t *fdp;
struct route_in6 *ro;
struct ifnet *ifp;
frentry_t *fr;
-#if defined(OpenBSD) && (OpenBSD >= 200211)
- struct route_in6 *ro_pmtu = NULL;
- struct in6_addr finaldst;
- ip6_t *ip6;
-#endif
- u_long mtu;
int error;
ifp = NULL;
@@ -1982,23 +1941,11 @@ frdest_t *fdp;
dst6 = (struct sockaddr_in6 *)ro->ro_rt->rt_gateway;
ro->ro_rt->rt_use++;
-#if defined(OpenBSD) && (OpenBSD >= 200211)
- ip6 = mtod(m0, ip6_t *);
- ro_pmtu = ro;
- finaldst = ip6->ip6_dst;
- error = ip6_getpmtu(ro_pmtu, ro, ifp, &finaldst, &mtu);
- if (error == 0) {
-#else
- mtu = nd_ifinfo[ifp->if_index].linkmtu;
-#endif
- if (m0->m_pkthdr.len <= mtu)
- error = nd6_output(ifp, fin->fin_ifp, m0,
- dst6, ro->ro_rt);
- else
- error = EMSGSIZE;
-#if defined(OpenBSD) && (OpenBSD >= 200211)
- }
-#endif
+ if (m0->m_pkthdr.len <= nd_ifinfo[ifp->if_index].linkmtu)
+ error = nd6_output(ifp, fin->fin_ifp, m0, dst6,
+ ro->ro_rt);
+ else
+ error = EMSGSIZE;
}
if (ro->ro_rt != NULL) {
OpenPOWER on IntegriCloud