Module Name:    src
Committed By:   knakahara
Date:           Wed Apr 20 08:56:33 UTC 2016

Modified Files:
        src/sys/net: if.h if_ethersubr.c
        src/sys/sys: mbuf.h

Log Message:
IFQ_ENQUEUE refactor (1/3) : add altq_pktattr fields to m_pkthdr

Reviewed by joerg@n.o and tls@n.o, thanks.


To generate a diff of this commit:
cvs rdiff -u -r1.198 -r1.199 src/sys/net/if.h
cvs rdiff -u -r1.218 -r1.219 src/sys/net/if_ethersubr.c
cvs rdiff -u -r1.160 -r1.161 src/sys/sys/mbuf.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if.h
diff -u src/sys/net/if.h:1.198 src/sys/net/if.h:1.199
--- src/sys/net/if.h:1.198	Fri Feb 19 20:05:43 2016
+++ src/sys/net/if.h	Wed Apr 20 08:56:32 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.h,v 1.198 2016/02/19 20:05:43 roy Exp $	*/
+/*	$NetBSD: if.h,v 1.199 2016/04/20 08:56:32 knakahara Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -757,12 +757,17 @@ struct if_addrprefreq {
 #define	ALTQ_DECL(x)		x
 #define ALTQ_COMMA		,
 
-#define IFQ_ENQUEUE(ifq, m, pattr, err)					\
+#define IFQ_ENQUEUE(ifq, m, unused, err)				\
 do {									\
+	struct altq_pktattr *_unused __unused = unused;			\
 	IFQ_LOCK((ifq));						\
-	if (ALTQ_IS_ENABLED((ifq)))					\
-		ALTQ_ENQUEUE((ifq), (m), (pattr), (err));		\
-	else {								\
+	if (ALTQ_IS_ENABLED((ifq))) {					\
+		struct altq_pktattr pattr;				\
+		pattr.pattr_class = (m)->m_pkthdr.pattr_class;		\
+		pattr.pattr_af = (m)->m_pkthdr.pattr_af;		\
+		pattr.pattr_hdr = (m)->m_pkthdr.pattr_hdr;		\
+		ALTQ_ENQUEUE((ifq), (m), &pattr, (err));		\
+	} else {							\
 		if (IF_QFULL((ifq))) {					\
 			m_freem((m));					\
 			(err) = ENOBUFS;				\
@@ -815,15 +820,16 @@ do {									\
 	(ifq)->altq_flags |= ALTQF_READY;				\
 } while (/*CONSTCOND*/ 0)
 
-#define	IFQ_CLASSIFY(ifq, m, af, pattr)					\
+#define	IFQ_CLASSIFY(ifq, m, af, unused)				\
 do {									\
+	struct altq_pktattr *_unused __unused = unused;			\
 	IFQ_LOCK((ifq));						\
 	if (ALTQ_IS_ENABLED((ifq))) {					\
 		if (ALTQ_NEEDS_CLASSIFY((ifq)))				\
-			(pattr)->pattr_class = (*(ifq)->altq_classify)	\
+			m->m_pkthdr.pattr_class = (*(ifq)->altq_classify) \
 				((ifq)->altq_clfier, (m), (af));	\
-		(pattr)->pattr_af = (af);				\
-		(pattr)->pattr_hdr = mtod((m), void *);		\
+		m->m_pkthdr.pattr_af = (af);				\
+		m->m_pkthdr.pattr_hdr = mtod((m), void *);		\
 	}								\
 	IFQ_UNLOCK((ifq));						\
 } while (/*CONSTCOND*/ 0)

Index: src/sys/net/if_ethersubr.c
diff -u src/sys/net/if_ethersubr.c:1.218 src/sys/net/if_ethersubr.c:1.219
--- src/sys/net/if_ethersubr.c:1.218	Fri Apr 15 01:31:29 2016
+++ src/sys/net/if_ethersubr.c	Wed Apr 20 08:56:32 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ethersubr.c,v 1.218 2016/04/15 01:31:29 ozaki-r Exp $	*/
+/*	$NetBSD: if_ethersubr.c,v 1.219 2016/04/20 08:56:32 knakahara Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.218 2016/04/15 01:31:29 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.219 2016/04/20 08:56:32 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -418,7 +418,7 @@ ether_output(struct ifnet * const ifp0, 
 	 * address family/header pointer in the pktattr.
 	 */
 	if (ALTQ_IS_ENABLED(&ifp->if_snd))
-		altq_etherclassify(&ifp->if_snd, m, &pktattr);
+		altq_etherclassify(&ifp->if_snd, m, NULL);
 #endif
 	return ifq_enqueue(ifp, m ALTQ_COMMA ALTQ_DECL(&pktattr));
 
@@ -504,10 +504,10 @@ altq_etherclassify(struct ifaltq *ifq, s
 	hdr = mtod(m, void *);
 
 	if (ALTQ_NEEDS_CLASSIFY(ifq))
-		pktattr->pattr_class =
+		m->m_pkthdr.pattr_class =
 		    (*ifq->altq_classify)(ifq->altq_clfier, m, af);
-	pktattr->pattr_af = af;
-	pktattr->pattr_hdr = hdr;
+	m->m_pkthdr.pattr_af = af;
+	m->m_pkthdr.pattr_hdr = hdr;
 
 	m->m_data -= hlen;
 	m->m_len += hlen;
@@ -515,9 +515,9 @@ altq_etherclassify(struct ifaltq *ifq, s
 	return;
 
  bad:
-	pktattr->pattr_class = NULL;
-	pktattr->pattr_hdr = NULL;
-	pktattr->pattr_af = AF_UNSPEC;
+	m->m_pkthdr.pattr_class = NULL;
+	m->m_pkthdr.pattr_hdr = NULL;
+	m->m_pkthdr.pattr_af = AF_UNSPEC;
 }
 #endif /* ALTQ */
 

Index: src/sys/sys/mbuf.h
diff -u src/sys/sys/mbuf.h:1.160 src/sys/sys/mbuf.h:1.161
--- src/sys/sys/mbuf.h:1.160	Wed Apr 20 08:50:43 2016
+++ src/sys/sys/mbuf.h	Wed Apr 20 08:56:32 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: mbuf.h,v 1.160 2016/04/20 08:50:43 knakahara Exp $	*/
+/*	$NetBSD: mbuf.h,v 1.161 2016/04/20 08:56:32 knakahara Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1999, 2001, 2007 The NetBSD Foundation, Inc.
@@ -75,6 +75,7 @@
 #include <sys/queue.h>
 #if defined(_KERNEL)
 #include <sys/percpu_types.h>
+#include <sys/socket.h>	/* for AF_UNSPEC */
 #endif /* defined(_KERNEL) */
 
 /* For offsetof() */
@@ -169,6 +170,9 @@ struct m_hdr {
  * be bit-wise inverted (the final step in the calculation of an IP
  * checksum) -- this is so we can accumulate the checksum for fragmented
  * packets during reassembly.
+ *
+ * Size ILP32: 36
+ *       LP64: 56
  */
 struct	pkthdr {
 	struct ifnet	*rcvif;			/* rcv interface */
@@ -177,6 +181,14 @@ struct	pkthdr {
 	int		csum_flags;		/* checksum flags */
 	uint32_t	csum_data;		/* checksum data */
 	u_int		segsz;			/* segment size */
+
+	/*
+	 * Following three fields are open-coded struct altq_pktattr
+	 * to rearrange struct pkthdr fields flexibly.
+	 */
+	void	*pattr_class;		/* ALTQ: sched class set by classifier */
+	void	*pattr_hdr;		/* ALTQ: saved header position in mbuf */
+	int	pattr_af;		/* ALTQ: address family */
 };
 
 /*
@@ -964,6 +976,10 @@ m_pkthdr_init(struct mbuf *m)
 	m->m_pkthdr.csum_flags = 0;
 	m->m_pkthdr.csum_data = 0;
 	SLIST_INIT(&m->m_pkthdr.tags);
+
+	m->m_pkthdr.pattr_class = NULL;
+	m->m_pkthdr.pattr_af = AF_UNSPEC;
+	m->m_pkthdr.pattr_hdr = NULL;
 }
 
 void m_print(const struct mbuf *, const char *, void (*)(const char *, ...)

Reply via email to