svn commit: r345165 - in head/sys: netinet netpfil/ipfw

Gleb Smirnoff glebius at FreeBSD.org
Thu Mar 14 22:32:53 UTC 2019


Author: glebius
Date: Thu Mar 14 22:32:50 2019
New Revision: 345165
URL: https://svnweb.freebsd.org/changeset/base/345165

Log:
  Remove 'dir' argument from dummynet_io(). This makes it possible to make
  dn_dir flags private to dummynet. There is still some room for improvement.

Modified:
  head/sys/netinet/ip_var.h
  head/sys/netinet/raw_ip.c
  head/sys/netpfil/ipfw/ip_dn_io.c
  head/sys/netpfil/ipfw/ip_dn_private.h
  head/sys/netpfil/ipfw/ip_fw2.c
  head/sys/netpfil/ipfw/ip_fw_pfil.c
  head/sys/netpfil/ipfw/ip_fw_private.h

Modified: head/sys/netinet/ip_var.h
==============================================================================
--- head/sys/netinet/ip_var.h	Thu Mar 14 22:31:12 2019	(r345164)
+++ head/sys/netinet/ip_var.h	Thu Mar 14 22:32:50 2019	(r345165)
@@ -296,7 +296,7 @@ extern void	(*ip_divert_ptr)(struct mbuf *m, bool inco
 /* ng_ipfw hooks -- XXX make it the same as divert and dummynet */
 extern int	(*ng_ipfw_input_p)(struct mbuf **, struct ip_fw_args *, bool);
 extern int	(*ip_dn_ctl_ptr)(struct sockopt *);
-extern int	(*ip_dn_io_ptr)(struct mbuf **, int, struct ip_fw_args *);
+extern int	(*ip_dn_io_ptr)(struct mbuf **, struct ip_fw_args *);
 #endif /* _KERNEL */
 
 #endif /* !_NETINET_IP_VAR_H_ */

Modified: head/sys/netinet/raw_ip.c
==============================================================================
--- head/sys/netinet/raw_ip.c	Thu Mar 14 22:31:12 2019	(r345164)
+++ head/sys/netinet/raw_ip.c	Thu Mar 14 22:32:50 2019	(r345165)
@@ -100,7 +100,7 @@ VNET_DEFINE(ip_fw_chk_ptr_t, ip_fw_chk_ptr) = NULL;
 VNET_DEFINE(ip_fw_ctl_ptr_t, ip_fw_ctl_ptr) = NULL;
 
 int	(*ip_dn_ctl_ptr)(struct sockopt *);
-int	(*ip_dn_io_ptr)(struct mbuf **, int, struct ip_fw_args *);
+int	(*ip_dn_io_ptr)(struct mbuf **, struct ip_fw_args *);
 void	(*ip_divert_ptr)(struct mbuf *, bool);
 int	(*ng_ipfw_input_p)(struct mbuf **, struct ip_fw_args *, bool);
 

Modified: head/sys/netpfil/ipfw/ip_dn_io.c
==============================================================================
--- head/sys/netpfil/ipfw/ip_dn_io.c	Thu Mar 14 22:31:12 2019	(r345164)
+++ head/sys/netpfil/ipfw/ip_dn_io.c	Thu Mar 14 22:32:50 2019	(r345165)
@@ -854,22 +854,27 @@ tag_mbuf(struct mbuf *m, int dir, struct ip_fw_args *f
  * We use the argument to locate the flowset fs and the sched_set sch
  * associated to it. The we apply flow_mask and sched_mask to
  * determine the queue and scheduler instances.
- *
- * dir		where shall we send the packet after dummynet.
- * *m0		the mbuf with the packet
- * ifp		the 'ifp' parameter from the caller.
- *		NULL in ip_input, destination interface in ip_output,
  */
 int
-dummynet_io(struct mbuf **m0, int dir, struct ip_fw_args *fwa)
+dummynet_io(struct mbuf **m0, struct ip_fw_args *fwa)
 {
 	struct mbuf *m = *m0;
 	struct dn_fsk *fs = NULL;
 	struct dn_sch_inst *si;
 	struct dn_queue *q = NULL;	/* default */
+	int fs_id, dir;
 
-	int fs_id = (fwa->rule.info & IPFW_INFO_MASK) +
+	fs_id = (fwa->rule.info & IPFW_INFO_MASK) +
 		((fwa->rule.info & IPFW_IS_PIPE) ? 2*DN_MAX_ID : 0);
+	/* XXXGL: convert args to dir */
+	if (fwa->flags & IPFW_ARGS_IN)
+		dir = DIR_IN;
+	else
+		dir = DIR_OUT;
+	if (fwa->flags & IPFW_ARGS_ETHER)
+		dir |= PROTO_LAYER2;
+	else if (fwa->flags & IPFW_ARGS_IP6)
+		dir |= PROTO_IPV6;
 	DN_BH_WLOCK();
 	io_pkt++;
 	/* we could actually tag outside the lock, but who cares... */

Modified: head/sys/netpfil/ipfw/ip_dn_private.h
==============================================================================
--- head/sys/netpfil/ipfw/ip_dn_private.h	Thu Mar 14 22:31:12 2019	(r345164)
+++ head/sys/netpfil/ipfw/ip_dn_private.h	Thu Mar 14 22:32:50 2019	(r345165)
@@ -387,11 +387,26 @@ struct dn_pkt_tag {
 	uint16_t iphdr_off;	/* IP header offset for mtodo()	*/
 };
 
+/*
+ * Possible values for dn_dir. XXXGL: this needs to be reviewed
+ * and converted to same values ip_fw_args.flags use.
+ */
+enum {
+	DIR_OUT =	0,
+	DIR_IN =	1,
+	DIR_FWD =	2,
+	DIR_DROP =	3,
+	PROTO_LAYER2 =	0x4, /* set for layer 2 */
+	PROTO_IPV4 =	0x08,
+	PROTO_IPV6 =	0x10,
+	PROTO_IFB =	0x0c, /* layer2 + ifbridge */
+};
+
 extern struct dn_parms dn_cfg;
 //VNET_DECLARE(struct dn_parms, _base_dn_cfg);
 //#define dn_cfg	VNET(_base_dn_cfg)
 
-int dummynet_io(struct mbuf **, int , struct ip_fw_args *);
+int dummynet_io(struct mbuf **, struct ip_fw_args *);
 void dummynet_task(void *context, int pending);
 void dn_reschedule(void);
 struct dn_pkt_tag * dn_tag_get(struct mbuf *m);

Modified: head/sys/netpfil/ipfw/ip_fw2.c
==============================================================================
--- head/sys/netpfil/ipfw/ip_fw2.c	Thu Mar 14 22:31:12 2019	(r345164)
+++ head/sys/netpfil/ipfw/ip_fw2.c	Thu Mar 14 22:32:50 2019	(r345165)
@@ -1436,6 +1436,7 @@ do {								\
 		struct ip6_hdr *ip6 = (struct ip6_hdr *)ip;
 
 		is_ipv6 = 1;
+		args->flags |= IPFW_ARGS_IP6;
 		hlen = sizeof(struct ip6_hdr);
 		proto = ip6->ip6_nxt;
 		/* Search extension headers to find upper layer protocols */
@@ -1618,6 +1619,7 @@ do {								\
 	} else if (pktlen >= sizeof(struct ip) &&
 	    (etype == 0 || etype == ETHERTYPE_IP) && ip->ip_v == 4) {
 		is_ipv4 = 1;
+		args->flags |= IPFW_ARGS_IP4;
 		hlen = ip->ip_hl << 2;
 		/*
 		 * Collect parameters into local variables for faster

Modified: head/sys/netpfil/ipfw/ip_fw_pfil.c
==============================================================================
--- head/sys/netpfil/ipfw/ip_fw_pfil.c	Thu Mar 14 22:31:12 2019	(r345164)
+++ head/sys/netpfil/ipfw/ip_fw_pfil.c	Thu Mar 14 22:32:50 2019	(r345165)
@@ -124,10 +124,9 @@ ipfw_check_packet(struct mbuf **m0, struct ifnet *ifp,
 	struct ip_fw_args args;
 	struct m_tag *tag;
 	pfil_return_t ret;
-	int ipfw, dir;
+	int ipfw;
 
 	args.flags = (flags & PFIL_IN) ? IPFW_ARGS_IN : IPFW_ARGS_OUT;
-	dir = (flags & PFIL_IN) ? DIR_IN : DIR_OUT;
 again:
 	/*
 	 * extract and remove the tag if present. If we are left
@@ -254,10 +253,8 @@ again:
 			break;
 		}
 		MPASS(args.flags & IPFW_ARGS_REF);
-		if (mtod(*m0, struct ip *)->ip_v == 4)
-			(void )ip_dn_io_ptr(m0, dir, &args);
-		else if (mtod(*m0, struct ip *)->ip_v == 6)
-			(void )ip_dn_io_ptr(m0, dir | PROTO_IPV6, &args);
+		if (args.flags & (IPFW_ARGS_IP4 | IPFW_ARGS_IP6))
+			(void )ip_dn_io_ptr(m0, &args);
 		else {
 			ret = PFIL_DROPPED;
 			break;
@@ -331,7 +328,7 @@ again:
  * ipfw processing for ethernet packets (in and out).
  */
 static pfil_return_t
-ipfw_check_frame(struct mbuf **m0, struct ifnet *ifp, int dir,
+ipfw_check_frame(struct mbuf **m0, struct ifnet *ifp, int flags,
     void *ruleset __unused, struct inpcb *inp)
 {
 	struct ip_fw_args args;
@@ -343,7 +340,7 @@ ipfw_check_frame(struct mbuf **m0, struct ifnet *ifp, 
 	int i;
 
 	args.flags = IPFW_ARGS_ETHER;
-	args.flags |= (dir & PFIL_IN) ? IPFW_ARGS_IN : IPFW_ARGS_OUT;
+	args.flags |= (flags & PFIL_IN) ? IPFW_ARGS_IN : IPFW_ARGS_OUT;
 again:
 	/* fetch start point from rule, if any.  remove the tag if present. */
 	mtag = m_tag_locate(*m0, MTAG_IPFW_RULE, 0, NULL);
@@ -407,9 +404,8 @@ again:
 			break;
 		}
 		*m0 = NULL;
-		dir = (dir & PFIL_IN) ? DIR_IN : DIR_OUT;
 		MPASS(args.flags & IPFW_ARGS_REF);
-		ip_dn_io_ptr(&m, dir | PROTO_LAYER2, &args);
+		ip_dn_io_ptr(&m, &args);
 		return (PFIL_CONSUMED);
 
 	case IP_FW_NGTEE:

Modified: head/sys/netpfil/ipfw/ip_fw_private.h
==============================================================================
--- head/sys/netpfil/ipfw/ip_fw_private.h	Thu Mar 14 22:31:12 2019	(r345164)
+++ head/sys/netpfil/ipfw/ip_fw_private.h	Thu Mar 14 22:32:50 2019	(r345165)
@@ -136,28 +136,6 @@ struct ip_fw_args {
 
 MALLOC_DECLARE(M_IPFW);
 
-/*
- * Hooks sometime need to know the direction of the packet
- * (divert, dummynet, netgraph, ...)
- * We use a generic definition here, with bit0-1 indicating the
- * direction, bit 2 indicating layer2 or 3, bit 3-4 indicating the
- * specific protocol
- * indicating the protocol (if necessary)
- */
-enum {
-	DIR_MASK =	0x3,
-	DIR_OUT =	0,
-	DIR_IN =	1,
-	DIR_FWD =	2,
-	DIR_DROP =	3,
-	PROTO_LAYER2 =	0x4, /* set for layer 2 */
-	/* PROTO_DEFAULT = 0, */
-	PROTO_IPV4 =	0x08,
-	PROTO_IPV6 =	0x10,
-	PROTO_IFB =	0x0c, /* layer2 + ifbridge */
-   /*	PROTO_OLDBDG =	0x14, unused, old bridge */
-};
-
 /* wrapper for freeing a packet, in case we need to do more work */
 #ifndef FREE_PKT
 #if defined(__linux__) || defined(_WIN32)


More information about the svn-src-all mailing list