Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Jan 2004 18:01:40 -0800 (PST)
From:      Scott Long <scottl@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 45573 for review
Message-ID:  <200401190201.i0J21eJB048154@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=45573

Change 45573 by scottl@scottl_netperf_socket on 2004/01/18 18:00:45

	 Fix some mis-merges.

Affected files ...

.. //depot/projects/netperf_socket/sys/net/if_ethersubr.c#2 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_fastfwd.c#3 integrate

Differences ...

==== //depot/projects/netperf_socket/sys/net/if_ethersubr.c#2 (text+ko) ====

@@ -96,9 +96,6 @@
 #endif /* NETATALK */
 
 /* netgraph node hooks for ng_ether(4) */
-void	(*ng_ether_input_p)(struct ifnet *ifp, struct mbuf **mp);
-void	(*ng_ether_input_orphan_p)(struct ifnet *ifp, struct mbuf *m);
-int	(*ng_ether_output_p)(struct ifnet *ifp, struct mbuf **mp);
 void	(*ng_ether_attach_p)(struct ifnet *ifp);
 void	(*ng_ether_detach_p)(struct ifnet *ifp);
 
@@ -111,6 +108,10 @@
 bdgtakeifaces_t *bdgtakeifaces_ptr;
 struct bdg_softc *ifp2sc;
 
+#ifdef PFIL_HOOKS
+struct	pfil_head ether_pfil_hook;
+#endif
+
 static u_char etherbroadcastaddr[ETHER_ADDR_LEN] =
 			{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 
@@ -297,20 +298,20 @@
 			return (0);	/* XXX */
 		}
 	}
-
-	/* Handle ng_ether(4) processing, if any */
-	if (ng_ether_output_p != NULL) {
-		if ((error = (*ng_ether_output_p)(ifp, &m)) != 0) {
-bad:			if (m != NULL)
-				m_freem(m);
-			return (error);
-		}
-		if (m == NULL)
-			return (0);
-	}
-
+#ifdef PFIL_HOOKS
+	/*
+	 * Run through list of hooks for output packets.
+	 */
+	error = pfil_run_hooks(&ether_pfil_hook, &m, ifp, PFIL_OUT);
+	if (error != 0 || m == NULL)
+		goto bad;
+#endif
 	/* Continue with link-layer output */
 	return ether_output_frame(ifp, m);
+bad:
+	if (m != NULL)
+		m_freem(m);
+	return (error);
 }
 
 /*
@@ -322,12 +323,7 @@
 int
 ether_output_frame(struct ifnet *ifp, struct mbuf *m)
 {
-	struct ip_fw *rule = NULL;
-
-	/* Extract info from dummynet tag, ignore others */
-	for (; m->m_type == MT_TAG; m = m->m_next)
-		if (m->m_flags == PACKET_TAG_DUMMYNET)
-			rule = ((struct dn_pkt *)m)->rule;
+	struct ip_fw *rule = ip_dn_find_rule(m);
 
 	if (rule == NULL && BDG_ACTIVE(ifp)) {
 		/*
@@ -397,7 +393,6 @@
 
 	args.m = m;		/* the packet we are looking at		*/
 	args.oif = dst;		/* destination, if any			*/
-	args.divert_rule = 0;	/* we do not support divert yet		*/
 	args.rule = *rule;	/* matching rule to restart		*/
 	args.next_hop = NULL;	/* we do not support forward yet	*/
 	args.eh = &save_eh;	/* MAC header for bridged/MAC packets	*/
@@ -536,14 +531,15 @@
 	}
 
 	ifp->if_ibytes += m->m_pkthdr.len;
-
-	/* Handle ng_ether(4) processing, if any */
-	if (ng_ether_input_p != NULL) {
-		(*ng_ether_input_p)(ifp, &m);
-		if (m == NULL)
-			return;
-	}
-
+#ifdef PFIL_HOOKS
+	/*
+	 * Run through list of hooks for input packets.
+	 */
+	if (pfil_run_hooks(&inet_pfil_hook, &m, ifp, PFIL_IN) != 0)
+		return;
+	if (m == NULL)			/* consumed by filter */
+		return;
+#endif
 	/* Check for bridging mode */
 	if (BDG_ACTIVE(ifp) ) {
 		struct ifnet *bif;
@@ -611,14 +607,7 @@
 #if defined(NETATALK)
 	struct llc *l;
 #endif
-	struct ip_fw *rule = NULL;
-
-	/* Extract info from dummynet tag, ignore others */
-	for (;m->m_type == MT_TAG; m = m->m_next)
-		if (m->m_flags == PACKET_TAG_DUMMYNET) {
-			rule = ((struct dn_pkt *)m)->rule;
-			ifp = m->m_next->m_pkthdr.rcvif;
-		}
+	struct ip_fw *rule = ip_dn_find_rule(m);
 
 	KASSERT(ifp != NULL, ("ether_demux: NULL interface pointer"));
 
@@ -783,20 +772,20 @@
 
 discard:
 	/*
-	 * Packet is to be discarded.  If netgraph is present,
-	 * hand the packet to it for last chance processing;
-	 * otherwise dispose of it.
+	 * Packet is to be discarded.  If let hooks have a
+	 * last go at it before we reclaim storage.
+	 */
+#ifdef PFIL_HOOKS
+	/*
+	 * Put back the ethernet header so hooks have a
+	 * consistent view of inbound packets.
 	 */
-	if (ng_ether_input_orphan_p != NULL) {
-		/*
-		 * Put back the ethernet header so netgraph has a
-		 * consistent view of inbound packets.
-		 */
-		M_PREPEND(m, ETHER_HDR_LEN, M_DONTWAIT);
-		(*ng_ether_input_orphan_p)(ifp, m);
-		return;
-	}
-	m_freem(m);
+	M_PREPEND(m, ETHER_HDR_LEN, M_DONTWAIT);
+	if (pfil_run_hooks(&ether_pfil_hook, &m, ifp, PFIL_IN_DISCARD) != 0)
+		m = NULL;		/* hook consumed packet, don't free */
+#endif
+	if (m != NULL)
+		m_freem(m);
 }
 
 /*
@@ -1029,11 +1018,53 @@
 	}
 }
 
+static int
+ether_modinit(void)
+{
+#ifdef PFIL_HOOKS
+	int error;
+
+	ether_pfil_hook.ph_type = PFIL_TYPE_AF;
+	ether_pfil_hook.ph_af = AF_LINK;		/* XXX */
+	error = pfil_head_register(&ether_pfil_hook);
+	if (error != 0)
+		printf("%s: Unable to register hook, error %d\n",
+			__func__, error);
+	return error;
+#else
+	return 0;
+#endif
+}
+
+static int
+ether_moddestroy(void)
+{
+#ifdef PFIL_HOOKS
+	(void) pfil_head_unregister(&ether_pfil_hook);
+#endif
+	return 0;
+}
+
+/*
+ * Module glue.
+ */
+static int
+ether_modevent(module_t mod, int type, void *unused)
+{
+	switch (type) {
+	case MOD_LOAD:
+		return ether_modinit();
+	case MOD_UNLOAD:
+		return ether_moddestroy();
+	}
+	return EINVAL;
+}
+
 static moduledata_t ether_mod = {
-	"ether",
-	NULL,
-	0
+        "ether",
+        ether_modevent,
+        0
 };
-
-DECLARE_MODULE(ether, ether_mod, SI_SUB_PSEUDO, SI_ORDER_ANY);
+                
+DECLARE_MODULE(ether, ether_mod, SI_SUB_PSEUDO, SI_ORDER_FIRST);
 MODULE_VERSION(ether, 1);

==== //depot/projects/netperf_socket/sys/netinet/ip_fastfwd.c#3 (text+ko) ====

@@ -110,6 +110,7 @@
 #include <machine/in_cksum.h>
 
 #include <netinet/ip_fw.h>
+#include <netinet/ip_divert.h>
 #include <netinet/ip_dummynet.h>
 
 static int ipfastforward_active = 0;
@@ -132,7 +133,7 @@
 	struct ip *tip;
 	struct mbuf *teem = NULL;
 #endif
-	struct mbuf *tag = NULL;
+	struct m_tag *mtag;
 	struct route ro;
 	struct sockaddr_in *dst = NULL;
 	struct in_ifaddr *ia = NULL;
@@ -150,16 +151,6 @@
 	if (!ipfastforward_active || !ipforwarding)
 		return 0;
 
-	/*
-	 * If there is any MT_TAG we fall back to ip_input because we can't
-	 * handle TAGs here. Should never happen as we get directly called
-	 * from the if_output routines.
-	 */
-	if (m->m_type == MT_TAG) {
-		KASSERT(0, ("%s: packet with MT_TAG not expected", __func__));
-		return 0;
-	}
-
 	M_ASSERTVALID(m);
 	M_ASSERTPKTHDR(m);
 
@@ -373,25 +364,13 @@
 			/*
 			 * See if this is a fragment
 			 */
-			if (ip->ip_off & (IP_MF | IP_OFFMASK)) {
-				MGETHDR(tag, M_DONTWAIT, MT_TAG);
-				if (tag == NULL)
-					goto drop;
-				tag->m_flags = PACKET_TAG_DIVERT;
-				tag->m_data = (caddr_t)(intptr_t)args.divert_rule;
-				tag->m_next = m;
-				/* XXX: really bloody hack, see ip_input */
-				tag->m_nextpkt = (struct mbuf *)1;
-				m = tag;
-				tag = NULL;
-
+			if (ip->ip_off & (IP_MF | IP_OFFMASK))
 				goto droptoours;
-			}
 			/*
 			 * Tee packet
 			 */
 			if ((ipfw & IP_FW_PORT_TEE_FLAG) != 0)
-				teem = m_dup(m, M_DONTWAIT);
+				teem = divert_clone(m);
 			else
 				teem = m;
 			if (teem == NULL)
@@ -413,7 +392,7 @@
 			/*
 			 * Deliver packet to divert input routine
 			 */
-			divert_packet(teem, 0, ipfw & 0xffff, args.divert_rule);
+			divert_packet(teem, 0);
 			/*
 			 * If this was not tee, we are done
 			 */
@@ -560,27 +539,13 @@
 			/*
 			 * See if this is a fragment
 			 */
-			if (ip->ip_off & (IP_MF | IP_OFFMASK)) {
-				MGETHDR(tag, M_DONTWAIT, MT_TAG);
-				if (tag == NULL) {
-					RTFREE(ro.ro_rt);
-					goto drop;
-				}
-				tag->m_flags = PACKET_TAG_DIVERT;
-				tag->m_data = (caddr_t)(intptr_t)args.divert_rule;
-				tag->m_next = m;
-				/* XXX: really bloody hack, see ip_input */
-				tag->m_nextpkt = (struct mbuf *)1;
-				m = tag;
-				tag = NULL;
-
+			if (ip->ip_off & (IP_MF | IP_OFFMASK))
 				goto droptoours;
-			}
 			/*
 			 * Tee packet
 			 */
 			if ((ipfw & IP_FW_PORT_TEE_FLAG) != 0)
-				teem = m_dup(m, M_DONTWAIT);
+				teem = divert_clone(m);
 			else
 				teem = m;
 			if (teem == NULL)
@@ -602,7 +567,7 @@
 			/*
 			 * Deliver packet to divert input routine
 			 */
-			divert_packet(teem, 0, ipfw & 0xffff, args.divert_rule);
+			divert_packet(teem, 0);
 			/*
 			 * If this was not tee, we are done
 			 */
@@ -638,38 +603,24 @@
 			if (IA_SIN(ia)->sin_addr.s_addr == ip->ip_dst.s_addr) {
 forwardlocal:
 				if (args.next_hop) {
-					/* XXX leak */
-					MGETHDR(tag, M_DONTWAIT, MT_TAG);
-					if (tag == NULL) {
+					mtag = m_tag_get(PACKET_TAG_IPFORWARD,
+						   sizeof(struct sockaddr_in *),
+						   M_NOWAIT);
+					if (mtag == NULL) {
+						/* XXX statistic */
 						if (ro.ro_rt)
 							RTFREE(ro.ro_rt);
 						goto drop;
 					}
-					tag->m_flags = PACKET_TAG_IPFORWARD;
-					tag->m_data = (caddr_t)args.next_hop;
-					tag->m_next = m;
-					/* XXX: really bloody hack,
-					 * see ip_input */
-					tag->m_nextpkt = (struct mbuf *)1;
-					m = tag;
-					tag = NULL;
+					*(struct sockaddr_in **)(mtag+1) =
+						args.next_hop;
+					m_tag_prepend(m, mtag);
 				}
 #ifdef IPDIVERT
 droptoours:	/* Used for DIVERT */
 #endif
-				MGETHDR(tag, M_DONTWAIT, MT_TAG);
-				if (tag == NULL) {
-					if (ro.ro_rt)
-						RTFREE(ro.ro_rt);
-					goto drop;
-				}
-				tag->m_flags = PACKET_TAG_IPFASTFWD_OURS;
-				tag->m_data = NULL;
-				tag->m_next = m;
-				/* XXX: really bloody hack, see ip_input */
-				tag->m_nextpkt = (struct mbuf *)1;
-				m = tag;
-				tag = NULL;
+				/* NB: ip_input understands this */
+				m->m_flags |= M_FASTFWD_OURS;
 
 				/* ip still points to the real packet */
 				ip->ip_len = htons(ip->ip_len);



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