Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/net/npf Add nbuf_advfetch() and simplify some code sligh...
details: https://anonhg.NetBSD.org/src/rev/a5ce42be0e77
branches: trunk
changeset: 757818:a5ce42be0e77
user: rmind <rmind%NetBSD.org@localhost>
date: Sat Sep 25 00:25:31 2010 +0000
description:
Add nbuf_advfetch() and simplify some code slightly.
diffstat:
sys/net/npf/npf.h | 3 +-
sys/net/npf/npf_alg_icmp.c | 28 +++++++----------------
sys/net/npf/npf_inet.c | 54 ++++++++++++++++-----------------------------
sys/net/npf/npf_instr.c | 9 ++-----
sys/net/npf/npf_mbuf.c | 19 ++++++++++++++-
sys/net/npf/npf_sendpkt.c | 16 ++++---------
6 files changed, 55 insertions(+), 74 deletions(-)
diffs (truncated from 344 to 300 lines):
diff -r 6f9c716d8d3a -r a5ce42be0e77 sys/net/npf/npf.h
--- a/sys/net/npf/npf.h Fri Sep 24 22:51:50 2010 +0000
+++ b/sys/net/npf/npf.h Sat Sep 25 00:25:31 2010 +0000
@@ -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 *);
diff -r 6f9c716d8d3a -r a5ce42be0e77 sys/net/npf/npf_alg_icmp.c
--- a/sys/net/npf/npf_alg_icmp.c Fri Sep 24 22:51:50 2010 +0000
+++ b/sys/net/npf/npf_alg_icmp.c Sat Sep 25 00:25:31 2010 +0000
@@ -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)) {
+ if (ttl > TR_MAX_TTL)
return false;
- }
- 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;
}
diff -r 6f9c716d8d3a -r a5ce42be0e77 sys/net/npf/npf_inet.c
--- a/sys/net/npf/npf_inet.c Fri Sep 24 22:51:50 2010 +0000
+++ b/sys/net/npf/npf_inet.c Sat Sep 25 00:25:31 2010 +0000
@@ -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)
+ if (nbuf_advfetch(&nbuf, &n_ptr, offby, sizeof(uint8_t), tcpfl)) {
return false;
- if (nbuf_fetch_datum(nbuf, n_ptr, sizeof(uint8_t), &npc->npc_tcp_flags))
- 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)
+ if (nbuf_advfetch(&nbuf, &n_ptr, toff, sizeof(uint16_t), &cksum)) {
return false;
- if (nbuf_fetch_datum(nbuf, n_ptr, 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);
diff -r 6f9c716d8d3a -r a5ce42be0e77 sys/net/npf/npf_instr.c
--- a/sys/net/npf/npf_instr.c Fri Sep 24 22:51:50 2010 +0000
+++ b/sys/net/npf/npf_instr.c Sat Sep 25 00:25:31 2010 +0000
@@ -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);
diff -r 6f9c716d8d3a -r a5ce42be0e77 sys/net/npf/npf_mbuf.c
--- a/sys/net/npf/npf_mbuf.c Fri Sep 24 22:51:50 2010 +0000
+++ b/sys/net/npf/npf_mbuf.c Sat Sep 25 00:25:31 2010 +0000
@@ -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.
diff -r 6f9c716d8d3a -r a5ce42be0e77 sys/net/npf/npf_sendpkt.c
Home |
Main Index |
Thread Index |
Old Index