From 1a2b872afda89d4d613fb47eab91763473947ff2 Mon Sep 17 00:00:00 2001 From: k-nakahara Date: Mon, 11 Apr 2016 18:15:08 +0900 Subject: [PATCH 5/5] reviewed by joerg@n.o - don't include if_altq.h in mbuf.h - open-code struct altq_pktattr in struct pkthdr --- sys/altq/altq_blue.c | 8 ++++++-- sys/altq/altq_cbq.c | 16 ++++++++++------ sys/altq/altq_hfsc.c | 16 ++++++++++------ sys/altq/altq_jobs.c | 3 +-- sys/altq/altq_priq.c | 16 ++++++++++------ sys/altq/altq_red.c | 8 ++++++-- sys/altq/altq_rio.c | 8 ++++++-- sys/altq/altq_var.h | 2 +- sys/altq/altq_wfq.c | 3 +-- sys/altq/if_altq.h | 4 ++-- sys/kern/uipc_mbuf.c | 6 +++--- sys/net/if.h | 7 +++---- sys/net/if_ethersubr.c | 13 ++++++------- sys/sys/mbuf.h | 9 +++++++-- 14 files changed, 72 insertions(+), 47 deletions(-) diff --git a/sys/altq/altq_blue.c b/sys/altq/altq_blue.c index 11f57db..6725d30 100644 --- a/sys/altq/altq_blue.c +++ b/sys/altq/altq_blue.c @@ -393,11 +393,15 @@ blue_init(blue_t *rp, int flags, int pkttime, int blue_max_pmark, static int blue_enqueue(struct ifaltq *ifq, struct mbuf *m) { + struct altq_pktattr pktattr; blue_queue_t *rqp = (blue_queue_t *)ifq->altq_disc; - struct altq_pktattr *pktattr = &m->m_pkthdr.pattr; int error = 0; - if (blue_addq(rqp->rq_blue, rqp->rq_q, m, pktattr) == 0) + pktattr.pattr_class = m->m_pkthdr.pattr_class; + pktattr.pattr_af = m->m_pkthdr.pattr_af; + pktattr.pattr_hdr = m->m_pkthdr.pattr_hdr; + + if (blue_addq(rqp->rq_blue, rqp->rq_q, m, &pktattr) == 0) ifq->ifq_len++; else error = ENOBUFS; diff --git a/sys/altq/altq_cbq.c b/sys/altq/altq_cbq.c index 9d9f384..3ee9fb5 100644 --- a/sys/altq/altq_cbq.c +++ b/sys/altq/altq_cbq.c @@ -498,10 +498,10 @@ cbq_getqstats(struct pf_altq *a, void *ubuf, int *nbytes) static int cbq_enqueue(struct ifaltq *ifq, struct mbuf *m) { + struct altq_pktattr pktattr; cbq_state_t *cbqp = (cbq_state_t *)ifq->altq_disc; struct rm_class *cl; struct m_tag *t; - struct altq_pktattr *pktattr = &m->m_pkthdr.pattr; int len; /* grab class set by classifier */ @@ -516,8 +516,8 @@ cbq_enqueue(struct ifaltq *ifq, struct mbuf *m) if ((t = m_tag_find(m, PACKET_TAG_ALTQ_QID, NULL)) != NULL) cl = clh_to_clp(cbqp, ((struct altq_tag *)(t+1))->qid); #ifdef ALTQ3_COMPAT - else if ((ifq->altq_flags & ALTQF_CLASSIFY) && pktattr != NULL) - cl = pktattr->pattr_class; + else if (ifq->altq_flags & ALTQF_CLASSIFY) + cl = m->m_pkthdr.pattr_class; #endif if (cl == NULL) { cl = cbqp->ifnp.default_; @@ -527,9 +527,13 @@ cbq_enqueue(struct ifaltq *ifq, struct mbuf *m) } } #ifdef ALTQ3_COMPAT - if (pktattr != NULL) - cl->pktattr_ = pktattr; /* save proto hdr used by ECN */ - else + if (m->m_pkthdr.pattr_af != AF_UNSPEC) { + pktattr.pattr_class = m->m_pkthdr.pattr_class; + pktattr.pattr_af = m->m_pkthdr.pattr_af; + pktattr.pattr_hdr = m->m_pkthdr.pattr_hdr; + + cl->pktattr_ = &pktattr; /* save proto hdr used by ECN */ + } else #endif cl->pktattr_ = NULL; len = m_pktlen(m); diff --git a/sys/altq/altq_hfsc.c b/sys/altq/altq_hfsc.c index 73a54da..5890f34 100644 --- a/sys/altq/altq_hfsc.c +++ b/sys/altq/altq_hfsc.c @@ -667,10 +667,10 @@ hfsc_nextclass(struct hfsc_class *cl) static int hfsc_enqueue(struct ifaltq *ifq, struct mbuf *m) { + struct altq_pktattr pktattr; struct hfsc_if *hif = (struct hfsc_if *)ifq->altq_disc; struct hfsc_class *cl; struct m_tag *t; - struct altq_pktattr *pktattr = &m->m_pkthdr.pattr; int len; /* grab class set by classifier */ @@ -685,8 +685,8 @@ hfsc_enqueue(struct ifaltq *ifq, struct mbuf *m) if ((t = m_tag_find(m, PACKET_TAG_ALTQ_QID, NULL)) != NULL) cl = clh_to_clp(hif, ((struct altq_tag *)(t+1))->qid); #ifdef ALTQ3_COMPAT - else if ((ifq->altq_flags & ALTQF_CLASSIFY) && pktattr != NULL) - cl = pktattr->pattr_class; + else if ((ifq->altq_flags & ALTQF_CLASSIFY)) + cl = m->m_pkthdr.pattr_class; #endif if (cl == NULL || is_a_parent_class(cl)) { cl = hif->hif_defaultclass; @@ -696,9 +696,13 @@ hfsc_enqueue(struct ifaltq *ifq, struct mbuf *m) } } #ifdef ALTQ3_COMPAT - if (pktattr != NULL) - cl->cl_pktattr = pktattr; /* save proto hdr used by ECN */ - else + if (m->m_pkthdr.pattr_af != AF_UNSPEC) { + pktattr.pattr_class = m->m_pkthdr.pattr_class; + pktattr.pattr_af = m->m_pkthdr.pattr_af; + pktattr.pattr_hdr = m->m_pkthdr.pattr_hdr; + + cl->cl_pktattr = &pktattr; /* save proto hdr used by ECN */ + } else #endif cl->cl_pktattr = NULL; len = m_pktlen(m); diff --git a/sys/altq/altq_jobs.c b/sys/altq/altq_jobs.c index 3324d03..7d55109 100644 --- a/sys/altq/altq_jobs.c +++ b/sys/altq/altq_jobs.c @@ -494,7 +494,6 @@ jobs_enqueue(struct ifaltq *ifq, struct mbuf *m) { struct jobs_if *jif = (struct jobs_if *)ifq->altq_disc; struct jobs_class *cl, *scan; - struct altq_pktattr *pktattr = &m->m_pkthdr.pattr; int len; int return_flag; int pri; @@ -534,7 +533,7 @@ jobs_enqueue(struct ifaltq *ifq, struct mbuf *m) } /* grab class set by classifier */ - if (pktattr == NULL || (cl = pktattr->pattr_class) == NULL) + if ((cl = m->m_pkthdr.pattr_class) == NULL) cl = jif->jif_default; len = m_pktlen(m); diff --git a/sys/altq/altq_priq.c b/sys/altq/altq_priq.c index c1df067..36bff72 100644 --- a/sys/altq/altq_priq.c +++ b/sys/altq/altq_priq.c @@ -440,10 +440,10 @@ priq_class_destroy(struct priq_class *cl) static int priq_enqueue(struct ifaltq *ifq, struct mbuf *m) { + struct altq_pktattr pktattr; struct priq_if *pif = (struct priq_if *)ifq->altq_disc; struct priq_class *cl; struct m_tag *t; - struct altq_pktattr *pktattr = &m->m_pkthdr.pattr; int len; /* grab class set by classifier */ @@ -458,8 +458,8 @@ priq_enqueue(struct ifaltq *ifq, struct mbuf *m) if ((t = m_tag_find(m, PACKET_TAG_ALTQ_QID, NULL)) != NULL) cl = clh_to_clp(pif, ((struct altq_tag *)(t+1))->qid); #ifdef ALTQ3_COMPAT - else if ((ifq->altq_flags & ALTQF_CLASSIFY) && pktattr != NULL) - cl = pktattr->pattr_class; + else if (ifq->altq_flags & ALTQF_CLASSIFY) + cl = m->m_pkthdr.pattr_class; #endif if (cl == NULL) { cl = pif->pif_default; @@ -469,9 +469,13 @@ priq_enqueue(struct ifaltq *ifq, struct mbuf *m) } } #ifdef ALTQ3_COMPAT - if (pktattr != NULL) - cl->cl_pktattr = pktattr; /* save proto hdr used by ECN */ - else + if (m->m_pkthdr.pattr_af != AF_UNSPEC) { + pktattr.pattr_class = m->m_pkthdr.pattr_class; + pktattr.pattr_af = m->m_pkthdr.pattr_af; + pktattr.pattr_hdr = m->m_pkthdr.pattr_hdr; + + cl->cl_pktattr = &pktattr; /* save proto hdr used by ECN */ + } else #endif cl->cl_pktattr = NULL; len = m_pktlen(m); diff --git a/sys/altq/altq_red.c b/sys/altq/altq_red.c index 38f84fa..ecdfd0f 100644 --- a/sys/altq/altq_red.c +++ b/sys/altq/altq_red.c @@ -1013,10 +1013,14 @@ red_detach(red_queue_t *rqp) static int red_enqueue(struct ifaltq *ifq, struct mbuf *m) { + struct altq_pktattr pktattr; red_queue_t *rqp = (red_queue_t *)ifq->altq_disc; - struct altq_pktattr *pktattr = &m->m_pkthdr.pattr; - if (red_addq(rqp->rq_red, rqp->rq_q, m, pktattr) < 0) + pktattr.pattr_class = m->m_pkthdr.pattr_class; + pktattr.pattr_af = m->m_pkthdr.pattr_af; + pktattr.pattr_hdr = m->m_pkthdr.pattr_hdr; + + if (red_addq(rqp->rq_red, rqp->rq_q, m, &pktattr) < 0) return ENOBUFS; ifq->ifq_len++; return 0; diff --git a/sys/altq/altq_rio.c b/sys/altq/altq_rio.c index 019dae8..6f08cee 100644 --- a/sys/altq/altq_rio.c +++ b/sys/altq/altq_rio.c @@ -765,11 +765,15 @@ rio_request(struct ifaltq *ifq, int req, void *arg) static int rio_enqueue(struct ifaltq *ifq, struct mbuf *m) { + struct altq_pktattr pktattr; rio_queue_t *rqp = (rio_queue_t *)ifq->altq_disc; - struct altq_pktattr *pktattr = &m->m_pkthdr.pattr; int error = 0; - if (rio_addq(rqp->rq_rio, rqp->rq_q, m, pktattr) == 0) + pktattr.pattr_class = m->m_pkthdr.pattr_class; + pktattr.pattr_af = m->m_pkthdr.pattr_af; + pktattr.pattr_hdr = m->m_pkthdr.pattr_hdr; + + if (rio_addq(rqp->rq_rio, rqp->rq_q, m, &pktattr) == 0) ifq->ifq_len++; else error = ENOBUFS; diff --git a/sys/altq/altq_var.h b/sys/altq/altq_var.h index d8c70aa..890ed4d 100644 --- a/sys/altq/altq_var.h +++ b/sys/altq/altq_var.h @@ -206,7 +206,7 @@ typedef void (timeout_t)(void *); #define m_pktlen(m) ((m)->m_pkthdr.len) -struct ifnet; struct mbuf; +struct ifnet; struct mbuf; struct altq_pktattr; struct pf_altq; #ifdef ALTQ3_CLFIER_COMPAT struct flowinfo; diff --git a/sys/altq/altq_wfq.c b/sys/altq/altq_wfq.c index b0a8752..aa3fc34 100644 --- a/sys/altq/altq_wfq.c +++ b/sys/altq/altq_wfq.c @@ -252,14 +252,13 @@ wfq_ifenqueue(struct ifaltq *ifq, struct mbuf *mp) { wfq_state_t *wfqp; wfq *queue; - struct altq_pktattr *pktattr = &mp->m_pkthdr.pattr; int byte, error = 0; wfqp = (wfq_state_t *)ifq->altq_disc; mp->m_nextpkt = NULL; /* grab a queue selected by classifier */ - if (pktattr == NULL || (queue = pktattr->pattr_class) == NULL) + if ((queue = mp->m_pkthdr.pattr_class) == NULL) queue = &wfqp->queue[0]; if (queue->tail == NULL) diff --git a/sys/altq/if_altq.h b/sys/altq/if_altq.h index 887f7a1..4ff2b4d 100644 --- a/sys/altq/if_altq.h +++ b/sys/altq/if_altq.h @@ -33,7 +33,7 @@ #include "opt_altq_enabled.h" #endif -struct altq_pktattr; struct tb_regulator; struct top_cdnr; +struct tb_regulator; struct top_cdnr; /* * Structure defining a queue for a network interface. @@ -85,7 +85,7 @@ struct ifaltq { struct altq_pktattr { void *pattr_class; /* sched class set by classifier */ int pattr_af; /* address family */ - void * pattr_hdr; /* saved header position in mbuf */ + void *pattr_hdr; /* saved header position in mbuf */ }; /* diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index 7845d9a..9cf2fd3 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -612,9 +612,9 @@ m_gethdr(int nowait, int type) m->m_pkthdr.csum_data = 0; SLIST_INIT(&m->m_pkthdr.tags); - m->m_pkthdr.pattr.pattr_class = NULL; - m->m_pkthdr.pattr.pattr_af = AF_UNSPEC; - m->m_pkthdr.pattr.pattr_hdr = NULL; + m->m_pkthdr.pattr_class = NULL; + m->m_pkthdr.pattr_af = AF_UNSPEC; + m->m_pkthdr.pattr_hdr = NULL; return m; } diff --git a/sys/net/if.h b/sys/net/if.h index 95d0439..dc7b0d1 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -816,12 +816,11 @@ do { \ do { \ IFQ_LOCK((ifq)); \ if (ALTQ_IS_ENABLED((ifq))) { \ - struct altq_pktattr *pattr = &(m)->m_pkthdr.pattr; \ 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) diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 04ae6ba..ec320e4 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -437,7 +437,6 @@ void altq_etherclassify(struct ifaltq *ifq, struct mbuf *m) { struct ether_header *eh; - struct altq_pktattr *pktattr = &m->m_pkthdr.pattr; uint16_t ether_type; int hlen, af, hdrsize; void *hdr; @@ -503,10 +502,10 @@ altq_etherclassify(struct ifaltq *ifq, struct mbuf *m) 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; @@ -514,9 +513,9 @@ altq_etherclassify(struct ifaltq *ifq, struct mbuf *m) 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 */ diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h index 113778c..9c7485d 100644 --- a/sys/sys/mbuf.h +++ b/sys/sys/mbuf.h @@ -73,7 +73,6 @@ #endif #include #include -#include #if defined(_KERNEL) #include #endif /* defined(_KERNEL) */ @@ -182,7 +181,13 @@ struct pkthdr { uint32_t csum_data; /* checksum data */ u_int segsz; /* segment size */ - struct altq_pktattr pattr; /* ALTQ packet attribute */ + /* + * 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 */ }; /* -- 2.1.0