Module Name: src Committed By: rmind Date: Sat Sep 25 00:25:31 UTC 2010
Modified Files: src/sys/net/npf: npf.h npf_alg_icmp.c npf_inet.c npf_instr.c npf_mbuf.c npf_sendpkt.c Log Message: Add nbuf_advfetch() and simplify some code slightly. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/net/npf/npf.h src/sys/net/npf/npf_alg_icmp.c \ src/sys/net/npf/npf_inet.c src/sys/net/npf/npf_instr.c \ src/sys/net/npf/npf_mbuf.c cvs rdiff -u -r1.1 -r1.2 src/sys/net/npf/npf_sendpkt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/npf/npf.h diff -u src/sys/net/npf/npf.h:1.2 src/sys/net/npf/npf.h:1.3 --- src/sys/net/npf/npf.h:1.2 Thu Sep 16 04:53:27 2010 +++ src/sys/net/npf/npf.h Sat Sep 25 00:25:31 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: npf.h,v 1.2 2010/09/16 04:53:27 rmind Exp $ */ +/* $NetBSD: npf.h,v 1.3 2010/09/25 00:25:31 rmind Exp $ */ /*- * Copyright (c) 2009-2010 The NetBSD Foundation, Inc. @@ -110,6 +110,7 @@ /* Network buffer interface. */ void * nbuf_dataptr(void *); void * nbuf_advance(nbuf_t **, void *, u_int); +int nbuf_advfetch(nbuf_t **, void **, u_int, size_t, void *); int nbuf_fetch_datum(nbuf_t *, void *, size_t, void *); int nbuf_store_datum(nbuf_t *, void *, size_t, void *); Index: src/sys/net/npf/npf_alg_icmp.c diff -u src/sys/net/npf/npf_alg_icmp.c:1.2 src/sys/net/npf/npf_alg_icmp.c:1.3 --- src/sys/net/npf/npf_alg_icmp.c:1.2 Thu Sep 16 04:53:27 2010 +++ src/sys/net/npf/npf_alg_icmp.c Sat Sep 25 00:25:31 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_alg_icmp.c,v 1.2 2010/09/16 04:53:27 rmind Exp $ */ +/* $NetBSD: npf_alg_icmp.c,v 1.3 2010/09/25 00:25:31 rmind Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_alg_icmp.c,v 1.2 2010/09/16 04:53:27 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_alg_icmp.c,v 1.3 2010/09/25 00:25:31 rmind Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -119,6 +119,8 @@ { const int proto = npc->npc_proto; void *n_ptr = nbuf_dataptr(nbuf); + u_int offby; + uint8_t ttl; /* Handle TCP/UDP traceroute - check for port range. */ if (proto != IPPROTO_TCP && proto != IPPROTO_UDP) { @@ -131,17 +133,11 @@ } /* Check for low TTL. */ - const u_int offby = offsetof(struct ip, ip_ttl); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) { + offby = offsetof(struct ip, ip_ttl); + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint8_t), &ttl)) return false; - } - uint8_t ttl; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint8_t), &ttl)) { - return false; - } - if (ttl > TR_MAX_TTL) { + if (ttl > TR_MAX_TTL) return false; - } /* Associate ALG with translation entry. */ npf_nat_t *nt = ntptr; @@ -194,10 +190,7 @@ case ICMP_IREQREPLY: /* Should contain ICMP query ID. */ offby = offsetof(struct icmp, icmp_id); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) { - return false; - } - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint16_t), + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint16_t), &npc->npc_icmp_id)) { return false; } @@ -286,10 +279,7 @@ /* Advance to ICMP checksum and fetch it. */ offby = npc->npc_hlen + offsetof(struct icmp, icmp_cksum); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) { - return false; - } - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint16_t), &cksum)) { + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint16_t), &cksum)) { return false; } Index: src/sys/net/npf/npf_inet.c diff -u src/sys/net/npf/npf_inet.c:1.2 src/sys/net/npf/npf_inet.c:1.3 --- src/sys/net/npf/npf_inet.c:1.2 Thu Sep 16 04:53:27 2010 +++ src/sys/net/npf/npf_inet.c Sat Sep 25 00:25:31 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_inet.c,v 1.2 2010/09/16 04:53:27 rmind Exp $ */ +/* $NetBSD: npf_inet.c,v 1.3 2010/09/25 00:25:31 rmind Exp $ */ /*- * Copyright (c) 2009-2010 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.2 2010/09/16 04:53:27 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_inet.c,v 1.3 2010/09/25 00:25:31 rmind Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -106,28 +106,23 @@ hlen = (val8 & 0xf) << 2; if (hlen < sizeof(struct ip)) return false; - offby = offsetof(struct ip, ip_off); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; /* IPv4 header: check fragment offset. */ - error = nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint8_t), &val8); + offby = offsetof(struct ip, ip_off); + error = nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint8_t), &val8); if (error || (val8 & ~htons(IP_DF | IP_RF))) return false; /* Get and match protocol. */ KASSERT(offsetof(struct ip, ip_p) > offby); offby = offsetof(struct ip, ip_p) - offby; - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint8_t), &val8)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint8_t), &val8)) return false; /* IP checksum. */ offby = offsetof(struct ip, ip_sum) - offsetof(struct ip, ip_p); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint16_t), &npc->npc_ipsum)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, + sizeof(uint16_t), &npc->npc_ipsum)) return false; /* Cache: IPv4, protocol, header length. */ @@ -145,20 +140,17 @@ bool npf_fetch_ip4addrs(npf_cache_t *npc, nbuf_t *nbuf, void *n_ptr) { + in_addr_t *src = &npc->npc_srcip, *dst = &npc->npc_dstip; u_int offby; /* Source address. */ offby = offsetof(struct ip, ip_src); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(in_addr_t), &npc->npc_srcip)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(in_addr_t), src)) return false; /* Destination address. */ offby = offsetof(struct ip, ip_dst) - offby; - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(in_addr_t), &npc->npc_dstip)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(in_addr_t), dst)) return false; /* Both addresses are cached. */ @@ -216,28 +208,23 @@ bool npf_fetch_icmp(npf_cache_t *npc, nbuf_t *nbuf, void *n_ptr) { + uint8_t *type = &npc->npc_icmp_type, *code = &npc->npc_icmp_code; u_int offby; - uint8_t type; KASSERT(npf_iscached(npc, NPC_IP46)); /* ICMP type. */ offby = npc->npc_hlen; CTASSERT(offsetof(struct icmp, icmp_type) == 0); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint8_t), &type)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint8_t), type)) return false; /* ICMP code. */ offby = offsetof(struct icmp, icmp_code); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint8_t), &npc->npc_icmp_code)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint8_t), code)) return false; /* Mark as cached. */ - npc->npc_icmp_type = type; npc->npc_info |= NPC_ICMP; return true; } @@ -248,14 +235,12 @@ bool npf_fetch_tcpfl(npf_cache_t *npc, nbuf_t *nbuf, void *n_ptr) { - u_int offby; + const u_int offby = npc->npc_hlen + offsetof(struct tcphdr, th_flags); + uint8_t *tcpfl = &npc->npc_tcp_flags; - /* Get TCP flags. */ - offby = npc->npc_hlen + offsetof(struct tcphdr, th_flags); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint8_t), &npc->npc_tcp_flags)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint8_t), tcpfl)) { return false; + } return true; } @@ -346,10 +331,9 @@ return false; /* Advance and update TCP/UDP checksum. */ - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, toff)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint16_t), &cksum)) + if (nbuf_advfetch(&nbuf, &n_ptr, toff, sizeof(uint16_t), &cksum)) { return false; + } if (__predict_true(cksum || proto == IPPROTO_TCP)) { cksum = npf_fixup32_cksum(cksum, oaddr, naddr); cksum = npf_fixup16_cksum(cksum, oport, port); Index: src/sys/net/npf/npf_instr.c diff -u src/sys/net/npf/npf_instr.c:1.2 src/sys/net/npf/npf_instr.c:1.3 --- src/sys/net/npf/npf_instr.c:1.2 Thu Sep 16 04:53:27 2010 +++ src/sys/net/npf/npf_instr.c Sat Sep 25 00:25:31 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_instr.c,v 1.2 2010/09/16 04:53:27 rmind Exp $ */ +/* $NetBSD: npf_instr.c,v 1.3 2010/09/25 00:25:31 rmind Exp $ */ /*- * Copyright (c) 2009-2010 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_instr.c,v 1.2 2010/09/16 04:53:27 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_instr.c,v 1.3 2010/09/25 00:25:31 rmind Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -71,10 +71,7 @@ /* Ethernet header: check EtherType. */ offby = offsetof(struct ether_header, ether_type); again: - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) { - return -1; - } - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint16_t), &val16)) { + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint16_t), &val16)) { return -1; } val16 = ntohs(val16); Index: src/sys/net/npf/npf_mbuf.c diff -u src/sys/net/npf/npf_mbuf.c:1.2 src/sys/net/npf/npf_mbuf.c:1.3 --- src/sys/net/npf/npf_mbuf.c:1.2 Thu Sep 16 04:53:27 2010 +++ src/sys/net/npf/npf_mbuf.c Sat Sep 25 00:25:31 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_mbuf.c,v 1.2 2010/09/16 04:53:27 rmind Exp $ */ +/* $NetBSD: npf_mbuf.c,v 1.3 2010/09/25 00:25:31 rmind Exp $ */ /*- * Copyright (c) 2009-2010 The NetBSD Foundation, Inc. @@ -38,7 +38,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_mbuf.c,v 1.2 2010/09/16 04:53:27 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_mbuf.c,v 1.3 2010/09/25 00:25:31 rmind Exp $"); #endif #include <sys/param.h> @@ -188,6 +188,21 @@ } /* + * nbuf_advfetch: advance and fetch the datum. + * WARNING: Values of nbuf and n_ptr are undefined on error. + */ +int +nbuf_advfetch(nbuf_t **nbuf, void **n_ptr, u_int n, size_t len, void *buf) +{ + + *n_ptr = nbuf_advance(nbuf, *n_ptr, n); + if (__predict_false(*n_ptr == NULL)) { + return EINVAL; + } + return nbuf_fetch_datum(*nbuf, n_ptr, len, buf); +} + +/* * nbuf_add_tag: add a tag to specified network buffer. * * => Returns 0 on success, or errno on failure. Index: src/sys/net/npf/npf_sendpkt.c diff -u src/sys/net/npf/npf_sendpkt.c:1.1 src/sys/net/npf/npf_sendpkt.c:1.2 --- src/sys/net/npf/npf_sendpkt.c:1.1 Thu Sep 16 04:53:27 2010 +++ src/sys/net/npf/npf_sendpkt.c Sat Sep 25 00:25:31 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: npf_sendpkt.c,v 1.1 2010/09/16 04:53:27 rmind Exp $ */ +/* $NetBSD: npf_sendpkt.c,v 1.2 2010/09/25 00:25:31 rmind Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #ifdef _KERNEL #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: npf_sendpkt.c,v 1.1 2010/09/16 04:53:27 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: npf_sendpkt.c,v 1.2 2010/09/25 00:25:31 rmind Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -70,23 +70,17 @@ /* Fetch total length of IP. */ offby = offsetof(struct ip, ip_len); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint16_t), &iplen)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint16_t), &iplen)) return false; /* Fetch SEQ and ACK numbers. */ offby = (npc->npc_hlen - offby) + offsetof(struct tcphdr, th_seq); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(seqack), seqack)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(seqack), seqack)) return false; /* Fetch TCP data offset (header length) value. */ offby = sizeof(seqack); - if ((n_ptr = nbuf_advance(&nbuf, n_ptr, offby)) == NULL) - return false; - if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint8_t), &toff)) + if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint8_t), &toff)) return false; toff >>= 4;