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 [email protected] and [email protected], 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 *, ...)