svn commit: r200959 - user/luigi/ipfw3-head/sys/netinet/ipfw
Luigi Rizzo
luigi at FreeBSD.org
Thu Dec 24 19:06:13 UTC 2009
Author: luigi
Date: Thu Dec 24 19:06:13 2009
New Revision: 200959
URL: http://svn.freebsd.org/changeset/base/200959
Log:
better form of endiannes adaptation
Modified:
user/luigi/ipfw3-head/sys/netinet/ipfw/ip_fw2.c
Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_fw2.c
==============================================================================
--- user/luigi/ipfw3-head/sys/netinet/ipfw/ip_fw2.c Thu Dec 24 18:50:59 2009 (r200958)
+++ user/luigi/ipfw3-head/sys/netinet/ipfw/ip_fw2.c Thu Dec 24 19:06:13 2009 (r200959)
@@ -606,11 +606,12 @@ send_reject(struct ip_fw_args *args, int
#endif
if (code != ICMP_REJECT_RST) { /* Send an ICMP unreach */
/* We need the IP header in host order for icmp_error(). */
- if (args->eh != NULL) {
#ifndef HAVE_NET_IPLEN
+ if (args->eh != NULL)
+#endif /* !HAVE_NET_IPLEN */
+ {
ip->ip_len = ntohs(ip->ip_len);
ip->ip_off = ntohs(ip->ip_off);
-#endif /* !HAVE_NET_IPLEN */
}
icmp_error(args->m, ICMP_UNREACH, code, 0L, 0);
} else if (args->f_id.proto == IPPROTO_TCP) {
@@ -1097,14 +1098,14 @@ do { \
src_ip = ip->ip_src;
dst_ip = ip->ip_dst;
#ifndef HAVE_NET_IPLEN
- if (args->eh != NULL) { /* layer 2 packets are as on the wire */
- offset = ntohs(ip->ip_off) & IP_OFFMASK;
- ip_len = ntohs(ip->ip_len);
- } else
-#endif /* !HAVE_NET_IPLEN */
- {
+ if (args->eh == NULL) { /* on l3 these are in host format */
offset = ip->ip_off & IP_OFFMASK;
ip_len = ip->ip_len;
+ } else
+#endif /* !HAVE_NET_IPLEN */
+ { /* otherwise they are in net format */
+ offset = ntohs(ip->ip_off) & IP_OFFMASK;
+ ip_len = ntohs(ip->ip_len);
}
pktlen = ip_len < pktlen ? ip_len : pktlen;
@@ -2166,10 +2167,13 @@ do { \
ip = mtod(m, struct ip *);
hlen = ip->ip_hl << 2;
#ifndef HAVE_NET_IPLEN
- /* revert len & off for layer2 pkts */
+ /* revert len. & off to net format if needed */
if (args->eh != NULL)
- ip->ip_len = htons(ip->ip_len);
#endif /* !HAVE_NET_IPLEN */
+ {
+ ip->ip_len = htons(ip->ip_len);
+ ip->ip_off = htons(ip->ip_off);
+ }
ip->ip_sum = 0;
if (hlen == sizeof(struct ip))
ip->ip_sum = in_cksum_hdr(ip);
More information about the svn-src-user
mailing list