X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/316670eb35587141e969394ae8537d66b9211e80..a1c7dba18ef36983396c282fe85292db066e39db:/bsd/net/classq/classq_subr.c diff --git a/bsd/net/classq/classq_subr.c b/bsd/net/classq/classq_subr.c index 738c86e23..109cae586 100644 --- a/bsd/net/classq/classq_subr.c +++ b/bsd/net/classq/classq_subr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Apple Inc. All rights reserved. + * Copyright (c) 2011-2013 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -115,6 +115,14 @@ ifclassq_setup(struct ifnet *ifp, u_int32_t sflags, boolean_t reuse) maxlen = if_sndq_maxlen; IFCQ_SET_MAXLEN(ifq, maxlen); + if (IFCQ_MAXLEN(ifq) != if_sndq_maxlen && + IFCQ_TARGET_QDELAY(ifq) == 0) { + /* + * Choose static queues because the interface has + * maximum queue size set + */ + sflags &= ~PKTSCHEDF_QALG_DELAYBASED; + } ifq->ifcq_sflags = sflags; err = ifclassq_pktsched_setup(ifq); if (err == 0) @@ -238,10 +246,24 @@ ifclassq_get_maxlen(struct ifclassq *ifq) return (IFCQ_MAXLEN(ifq)); } -u_int32_t -ifclassq_get_len(struct ifclassq *ifq) +int +ifclassq_get_len(struct ifclassq *ifq, mbuf_svc_class_t sc, u_int32_t *packets, + u_int32_t *bytes) { - return (IFCQ_LEN(ifq)); + int err = 0; + + IFCQ_LOCK(ifq); + if (sc == MBUF_SC_UNSPEC) { + VERIFY(packets != NULL); + *packets = IFCQ_LEN(ifq); + } else { + VERIFY(MBUF_VALID_SC(sc)); + VERIFY(packets != NULL && bytes != NULL); + IFCQ_LEN_SC(ifq, sc, packets, bytes, err); + } + IFCQ_UNLOCK(ifq); + + return (err); } errno_t @@ -363,8 +385,10 @@ ifclassq_dequeue_common(struct ifclassq *ifq, mbuf_svc_class_t sc, l += (*head)->m_pkthdr.len; pktlen = (*head)->m_pkthdr.len; - (*head)->m_pkthdr.pf_mtag.pftag_pktseq = +#if MEASURE_BW + (*head)->m_pkthdr.pkt_bwseq = atomic_add_64_ov(&(ifp->if_bw.cur_seq), pktlen); +#endif /* MEASURE_BW */ head = &(*head)->m_nextpkt; i++; @@ -539,8 +563,12 @@ ifclassq_ev2str(cqev_t ev) const char *c; switch (ev) { - case CLASSQ_EV_LINK_SPEED: - c = "LINK_SPEED"; + case CLASSQ_EV_LINK_BANDWIDTH: + c = "LINK_BANDWIDTH"; + break; + + case CLASSQ_EV_LINK_LATENCY: + c = "LINK_LATENCY"; break; case CLASSQ_EV_LINK_MTU: @@ -704,7 +732,7 @@ ifclassq_tbr_set(struct ifclassq *ifq, struct tb_profile *profile, bzero(tbr, sizeof (*tbr)); ifnet_set_start_cycle(ifp, NULL); if (update) - ifclassq_update(ifq, CLASSQ_EV_LINK_SPEED); + ifclassq_update(ifq, CLASSQ_EV_LINK_BANDWIDTH); return (0); } @@ -788,7 +816,7 @@ ifclassq_tbr_set(struct ifclassq *ifq, struct tb_profile *profile, ifnet_set_start_cycle(ifp, NULL); } if (update && tbr->tbr_rate_raw != old_rate) - ifclassq_update(ifq, CLASSQ_EV_LINK_SPEED); + ifclassq_update(ifq, CLASSQ_EV_LINK_BANDWIDTH); return (0); }