Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Jun 2012 13:50:41 +0000 (UTC)
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r237226 - head/sys/netgraph/netflow
Message-ID:  <201206181350.q5IDoflP082367@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206181350.q5IDoflP082367>