All three files: make COMPAT_IPFW==0 case work again.

ip_input.c:
	- delete some dusty code
	- _IP_VHL
	- use fast inline header checksum when possible
This commit is contained in:
Garrett Wollman 1996-10-07 19:21:46 +00:00
parent 011acecf50
commit 5893891624
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=18797
3 changed files with 46 additions and 30 deletions

View File

@ -31,9 +31,12 @@
* SUCH DAMAGE.
*
* @(#)ip_input.c 8.2 (Berkeley) 1/4/94
* $Id: ip_input.c,v 1.46 1996/08/21 21:37:00 sos Exp $
* $Id: ip_input.c,v 1.47 1996/09/08 13:45:49 davidg Exp $
* $ANA: ip_input.c,v 1.5 1996/09/18 14:34:59 wollman Exp $
*/
#define _IP_VHL
#include "opt_ipfw.h"
#include <sys/param.h>
@ -61,6 +64,7 @@
#include <netinet/in_var.h>
#include <netinet/ip_var.h>
#include <netinet/ip_icmp.h>
#include <machine/in_cksum.h>
#include <sys/socketvar.h>
@ -110,6 +114,14 @@ SYSCTL_INT(_net_inet_ip, IPCTL_DEFMTU, mtu, CTLFLAG_RW,
&ip_mtu, 0, "");
#endif
#if !defined(COMPAT_IPFW) || COMPAT_IPFW == 1
#undef COMPAT_IPFW
#define COMPAT_IPFW 1
#else
#undef COMPAT_IPFW
#endif
#ifdef COMPAT_IPFW
/* Firewall hooks */
ip_fw_chk_t *ip_fw_chk_ptr;
ip_fw_ctl_t *ip_fw_ctl_ptr;
@ -117,6 +129,7 @@ ip_fw_ctl_t *ip_fw_ctl_ptr;
/* IP Network Address Translation (NAT) hooks */
ip_nat_t *ip_nat_ptr;
ip_nat_ctl_t *ip_nat_ctl_ptr;
#endif
/*
* We need to save the IP options in case a protocol wants to respond
@ -152,7 +165,7 @@ static struct ip *
ip_reass __P((struct ipasfrag *, struct ipq *));
static struct in_ifaddr *
ip_rtaddr __P((struct in_addr));
static void ipintr __P((void));
static void ipintr __P((void));
/*
* IP initialization: fill in IP protocol switch table.
* All protocols not implemented in kernel go to raw IP protocol handler.
@ -202,7 +215,7 @@ ip_input(struct mbuf *m)
#ifdef DIAGNOSTIC
if ((m->m_flags & M_PKTHDR) == 0)
panic("ipintr no HDR");
panic("ip_input no HDR");
#endif
/*
* If no IP addresses have been set yet but the interfaces
@ -211,17 +224,28 @@ ip_input(struct mbuf *m)
if (in_ifaddr == NULL)
goto bad;
ipstat.ips_total++;
if (m->m_pkthdr.len < sizeof(struct ip))
goto tooshort;
#ifdef DIAGNOSTIC
if (m->m_len < sizeof(struct ip))
panic("ipintr mbuf too short");
#endif
if (m->m_len < sizeof (struct ip) &&
(m = m_pullup(m, sizeof (struct ip))) == 0) {
ipstat.ips_toosmall++;
return;
}
ip = mtod(m, struct ip *);
if (ip->ip_v != IPVERSION) {
if (IP_VHL_V(ip->ip_vhl) != IPVERSION) {
ipstat.ips_badvers++;
goto bad;
}
hlen = ip->ip_hl << 2;
hlen = IP_VHL_HL(ip->ip_vhl) << 2;
if (hlen < sizeof(struct ip)) { /* minimum header length */
ipstat.ips_badhlen++;
goto bad;
@ -233,7 +257,11 @@ ip_input(struct mbuf *m)
}
ip = mtod(m, struct ip *);
}
ip->ip_sum = in_cksum(m, hlen);
if (hlen == sizeof(struct ip)) {
ip->ip_sum = in_cksum_hdr(ip);
} else {
ip->ip_sum = in_cksum(m, hlen);
}
if (ip->ip_sum) {
ipstat.ips_badsum++;
goto bad;
@ -257,6 +285,7 @@ ip_input(struct mbuf *m)
* Drop packet if shorter than we expect.
*/
if (m->m_pkthdr.len < ip->ip_len) {
tooshort:
ipstat.ips_tooshort++;
goto bad;
}
@ -278,6 +307,7 @@ ip_input(struct mbuf *m)
* - Encapsulate: put it in another IP and send out. <unimp.>
*/
#ifdef COMPAT_IPFW
if (ip_fw_chk_ptr) {
int action;
@ -301,6 +331,7 @@ ip_input(struct mbuf *m)
if (ip_nat_ptr && !(*ip_nat_ptr)(&ip, &m, IP_NAT_IN))
return;
#endif
/*
* Process options and, if not destined for us,
@ -330,26 +361,11 @@ ip_input(struct mbuf *m)
if (IA_SIN(ia)->sin_addr.s_addr == ip->ip_dst.s_addr)
goto ours;
if (ia->ia_ifp && ia->ia_ifp->if_flags & IFF_BROADCAST) {
#if 0
u_long t;
#endif
if (satosin(&ia->ia_broadaddr)->sin_addr.s_addr ==
ip->ip_dst.s_addr)
goto ours;
if (ip->ip_dst.s_addr == ia->ia_netbroadcast.s_addr)
goto ours;
#if 0 /* XXX - this should go away */
/*
* Look for all-0's host part (old broadcast addr),
* either for subnet or net.
*/
t = ntohl(ip->ip_dst.s_addr);
if (t == ia->ia_subnet)
goto ours;
if (t == ia->ia_net)
goto ours;
#endif /* compatibility cruft */
}
}
if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) {
@ -515,7 +531,7 @@ ipintr(void)
}
NETISR_SET(NETISR_IP, ipintr);
/*
* Take incoming datagram fragment and try to
* reassemble it into whole datagram. If a chain for
@ -790,7 +806,7 @@ ip_dooptions(m)
dst = ip->ip_dst;
cp = (u_char *)(ip + 1);
cnt = (ip->ip_hl << 2) - sizeof (struct ip);
cnt = (IP_VHL_HL(ip->ip_vhl) << 2) - sizeof (struct ip);
for (; cnt > 0; cnt -= optlen, cp += optlen) {
opt = cp[IPOPT_OPTVAL];
if (opt == IPOPT_EOL)
@ -972,7 +988,7 @@ ip_dooptions(m)
}
return (0);
bad:
ip->ip_len -= ip->ip_hl << 2; /* XXX icmp_error adds in hdr length */
ip->ip_len -= IP_VHL_HL(ip->ip_vhl) << 2; /* XXX icmp_error adds in hdr length */
icmp_error(m, type, code, 0, 0);
ipstat.ips_badoptions++;
return (1);
@ -1115,14 +1131,14 @@ ip_stripoptions(m, mopt)
register caddr_t opts;
int olen;
olen = (ip->ip_hl<<2) - sizeof (struct ip);
olen = (IP_VHL_HL(ip->ip_vhl) << 2) - sizeof (struct ip);
opts = (caddr_t)(ip + 1);
i = m->m_len - (sizeof (struct ip) + olen);
bcopy(opts + olen, opts, (unsigned)i);
m->m_len -= olen;
if (m->m_flags & M_PKTHDR)
m->m_pkthdr.len -= olen;
ip->ip_hl = sizeof(struct ip) >> 2;
ip->ip_vhl = IP_MAKE_VHL(IPVERSION, sizeof(struct ip) >> 2);
}
u_char inetctlerrmap[PRC_NCMDS] = {

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ip_output.c 8.3 (Berkeley) 1/21/94
* $Id: ip_output.c,v 1.41 1996/07/10 19:44:26 julian Exp $
* $Id: ip_output.c,v 1.42 1996/08/21 21:37:04 sos Exp $
*/
#define _IP_VHL
@ -339,12 +339,12 @@ sendit:
* - Encapsulate: put it in another IP and send out. <unimp.>
*/
#ifdef COMPAT_IPFW
if (ip_nat_ptr && !(*ip_nat_ptr)(&ip, &m, IP_NAT_OUT)) {
error = EACCES;
goto done;
}
#ifdef COMPAT_IPFW
/*
* Check with the firewall...
*/

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)raw_ip.c 8.7 (Berkeley) 5/15/95
* $Id: raw_ip.c,v 1.34 1996/08/21 21:37:07 sos Exp $
* $Id: raw_ip.c,v 1.35 1996/08/27 20:52:27 sos Exp $
*/
#include <sys/param.h>
@ -250,7 +250,6 @@ rip_ctloutput(op, so, level, optname, m)
return(EINVAL);
}
return (*ip_fw_ctl_ptr)(optname, m);
#endif
case IP_NAT:
if (ip_nat_ctl_ptr == NULL) {
@ -259,6 +258,7 @@ rip_ctloutput(op, so, level, optname, m)
}
return (*ip_nat_ctl_ptr)(op, m);
#endif
case IP_RSVP_ON:
return ip_rsvp_init(so);
break;