svn commit: r237226 - head/sys/netgraph/netflow
Alexander V. Chernikov
melifaro at FreeBSD.org
Mon Jun 18 13:50:42 UTC 2012
Author: melifaro
Date: Mon Jun 18 13:50:41 2012
New Revision: 237226
URL: http://svn.freebsd.org/changeset/base/237226
Log:
Simplify IP pointer recovery in case of mbuf reallocation.
Reviewed by: glebius (previous version)
Approved by: ae(mentor)
MFC after: 2 weeks
Modified:
head/sys/netgraph/netflow/ng_netflow.c
Modified: head/sys/netgraph/netflow/ng_netflow.c
==============================================================================
--- head/sys/netgraph/netflow/ng_netflow.c Mon Jun 18 12:45:35 2012 (r237225)
+++ head/sys/netgraph/netflow/ng_netflow.c Mon Jun 18 13:50:41 2012 (r237226)
@@ -560,8 +560,8 @@ ng_netflow_rcvdata (hook_p hook, item_p
struct ip6_hdr *ip6 = NULL;
struct m_tag *mtag;
int pullup_len = 0, off;
- uint8_t upper_proto = 0, is_frag = 0;
- int error = 0, bypass = 0, acct = 0;
+ uint8_t acct = 0, bypass = 0, is_frag = 0, upper_proto = 0;
+ int error = 0, l3_off = 0;
unsigned int src_if_index;
caddr_t upper_ptr = NULL;
fib_export_p fe;
@@ -666,6 +666,7 @@ ng_netflow_rcvdata (hook_p hook, item_p
M_CHECK(sizeof(struct ip));
eh = mtod(m, struct ether_header *);
ip = (struct ip *)(eh + 1);
+ l3_off = sizeof(struct ether_header);
break;
#ifdef INET6
case ETHERTYPE_IPV6:
@@ -676,6 +677,7 @@ ng_netflow_rcvdata (hook_p hook, item_p
M_CHECK(sizeof(struct ip6_hdr));
eh = mtod(m, struct ether_header *);
ip6 = (struct ip6_hdr *)(eh + 1);
+ l3_off = sizeof(struct ether_header);
break;
#endif
case ETHERTYPE_VLAN:
@@ -686,6 +688,7 @@ ng_netflow_rcvdata (hook_p hook, item_p
sizeof(struct ether_header));
evh = mtod(m, struct ether_vlan_header *);
etype = ntohs(evh->evl_proto);
+ l3_off = sizeof(struct ether_vlan_header);
if (etype == ETHERTYPE_IP) {
M_CHECK(sizeof(struct ip));
@@ -707,6 +710,7 @@ ng_netflow_rcvdata (hook_p hook, item_p
case DLT_RAW: /* IP packets */
M_CHECK(sizeof(struct ip));
ip = mtod(m, struct ip *);
+ /* l3_off is already zero */
#ifdef INET6
/* If INET6 is not defined IPv6 packets will be discarded in ng_netflow_flow_add() */
if (ip->ip_v == IP6VERSION) {
@@ -824,7 +828,10 @@ ng_netflow_rcvdata (hook_p hook, item_p
case IPPROTO_NONE:
goto loopend;
#endif
- /* Any unknow header (new extension or IPv6/IPv4 header for tunnels) */
+ /*
+ * Any unknow header (new extension or IPv6/IPv4
+ * header for tunnels) ends loop.
+ */
default:
goto loopend;
}
@@ -842,56 +849,11 @@ loopend:
/* Just in case of real reallocation in M_CHECK() / m_pullup() */
if (m != m_old) {
atomic_fetchadd_32(&priv->info.nfinfo_realloc_mbuf, 1);
- ip = NULL;
- ip6 = NULL;
- switch (iface->info.ifinfo_dlt) {
- case DLT_EN10MB: /* Ethernet */
- {
- struct ether_header *eh;
-
- eh = mtod(m, struct ether_header *);
- switch (ntohs(eh->ether_type)) {
- case ETHERTYPE_IP:
- ip = (struct ip *)(eh + 1);
- break;
-#ifdef INET6
- case ETHERTYPE_IPV6:
- ip6 = (struct ip6_hdr *)(eh + 1);
- break;
-#endif
- case ETHERTYPE_VLAN:
- {
- struct ether_vlan_header *evh;
-
- evh = mtod(m, struct ether_vlan_header *);
- if (ntohs(evh->evl_proto) == ETHERTYPE_IP) {
- ip = (struct ip *)(evh + 1);
- break;
-#ifdef INET6
- } else if (ntohs(evh->evl_proto) == ETHERTYPE_IPV6) {
- ip6 = (struct ip6_hdr *)(evh + 1);
- break;
-#endif
- }
- }
- default:
- panic("ng_netflow entered deadcode");
- }
- break;
- }
- case DLT_RAW: /* IP packets */
- ip = mtod(m, struct ip *);
-#ifdef INET6
- if (ip->ip_v == IP6VERSION) {
- /* IPv6 packet */
- ip = NULL;
- ip6 = mtod(m, struct ip6_hdr *);
- }
-#endif
- break;
- default:
- panic("ng_netflow entered deadcode");
- }
+ /* Restore ip/ipv6 pointer */
+ if (ip != NULL)
+ ip = (struct ip *)(mtod(m, caddr_t) + l3_off);
+ else if (ip6 != NULL)
+ ip6 = (struct ip6_hdr *)(mtod(m, caddr_t) + l3_off);
}
upper_ptr = (caddr_t)(mtod(m, caddr_t) + off);
More information about the svn-src-all
mailing list