diff options
-rw-r--r-- | etc/mtree/BSD.include.dist | 2 | ||||
-rw-r--r-- | include/Makefile | 8 | ||||
-rw-r--r-- | sys/conf/NOTES | 14 | ||||
-rw-r--r-- | sys/conf/files | 8 | ||||
-rw-r--r-- | sys/conf/kern.pre.mk | 3 | ||||
-rw-r--r-- | sys/conf/kmod.mk | 4 | ||||
-rw-r--r-- | sys/conf/options | 9 | ||||
-rw-r--r-- | sys/dev/awi/awi.c | 2 | ||||
-rw-r--r-- | sys/dev/pdq/pdq_freebsd.h | 2 | ||||
-rw-r--r-- | sys/dev/wi/if_wi.c | 2 | ||||
-rw-r--r-- | sys/i4b/driver/i4b_ipr.c | 2 | ||||
-rw-r--r-- | sys/net/if.c | 21 | ||||
-rw-r--r-- | sys/net/if_ppp.c | 6 | ||||
-rw-r--r-- | sys/net/if_sl.c | 2 | ||||
-rw-r--r-- | sys/net/if_spppsubr.c | 4 | ||||
-rw-r--r-- | sys/net/if_var.h | 207 | ||||
-rw-r--r-- | sys/net80211/ieee80211_input.c | 5 | ||||
-rw-r--r-- | sys/netinet/ip_input.c | 6 | ||||
-rw-r--r-- | sys/netinet/ip_output.c | 7 | ||||
-rw-r--r-- | sys/netinet6/ip6_input.c | 6 |
20 files changed, 302 insertions, 18 deletions
diff --git a/etc/mtree/BSD.include.dist b/etc/mtree/BSD.include.dist index ea9db74..590696f 100644 --- a/etc/mtree/BSD.include.dist +++ b/etc/mtree/BSD.include.dist @@ -5,6 +5,8 @@ /set type=dir uname=root gname=wheel mode=0755 . + altq + .. arpa .. bsnmp diff --git a/include/Makefile b/include/Makefile index 0dbef4e..f4d78dff 100644 --- a/include/Makefile +++ b/include/Makefile @@ -111,6 +111,9 @@ copies: cd ${.CURDIR}/../sys/dev/bktr; \ ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 ioctl_*.h \ ${DESTDIR}${INCLUDEDIR}/dev/bktr + cd ${.CURDIR}/../sys/contrib/altq/altq; \ + ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 *.h \ + ${DESTDIR}${INCLUDEDIR}/altq cd ${.CURDIR}/../sys/contrib/ipfilter/netinet; \ ${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 *.h \ ${DESTDIR}${INCLUDEDIR}/netinet @@ -149,6 +152,11 @@ symlinks: ln -fs ../../../../../sys/$i/$$h ${DESTDIR}${INCLUDEDIR}/$i; \ done .endfor + cd ${.CURDIR}/../sys/contrib/altq/altq; \ + for h in *.h; do \ + ln -fs ../../../sys/contrib/altq/altq/$$h \ + ${DESTDIR}${INCLUDEDIR}/altq; \ + done cd ${.CURDIR}/../sys/contrib/ipfilter/netinet; \ for h in *.h; do \ ln -fs ../../../sys/contrib/ipfilter/netinet/$$h \ diff --git a/sys/conf/NOTES b/sys/conf/NOTES index ba02f00..ecb447d 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -399,6 +399,20 @@ options NETSMBCRYPTO #encrypted password support for SMB # mchain library. It can be either loaded as KLD or compiled into kernel options LIBMCHAIN +# altq(9). Enable the base part of the hooks with the ALTQ option. +# Individual disciplines must be built into the base system and can not be +# loaded as modules at this point. In order to build a SMP kernel you must +# also have the ALTQ_NOPCC option. +options ALTQ +options ALTQ_CBQ # Class Bases Queueing +options ALTQ_RED # Random Early Drop +options ALTQ_RIO # RED In/Out +options ALTQ_HFSC # Hierarchical Packet Scheduler +options ALTQ_CDNR # Traffic conditioner +options ALTQ_PRIQ # Prioirity Queueing +options ALTQ_NOPCC # Required for SMP build +options ALTQ_DEBUG + # netgraph(4). Enable the base netgraph code with the NETGRAPH option. # Individual node types can be enabled with the corresponding option # listed below; however, this is not strictly necessary as netgraph diff --git a/sys/conf/files b/sys/conf/files index 72afd93..4bf1291 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -85,6 +85,14 @@ coda/coda_venus.c optional vcoda coda/coda_vfsops.c optional vcoda coda/coda_vnops.c optional vcoda compat/linprocfs/linprocfs.c optional linprocfs +contrib/altq/altq/altq_cbq.c optional altq +contrib/altq/altq/altq_cdnr.c optional altq +contrib/altq/altq/altq_hfsc.c optional altq +contrib/altq/altq/altq_priq.c optional altq +contrib/altq/altq/altq_red.c optional altq +contrib/altq/altq/altq_rio.c optional altq +contrib/altq/altq/altq_rmclass.c optional altq +contrib/altq/altq/altq_subr.c optional altq contrib/dev/acpica/dbcmds.c optional acpi acpi_debug contrib/dev/acpica/dbdisply.c optional acpi acpi_debug contrib/dev/acpica/dbexec.c optional acpi acpi_debug diff --git a/sys/conf/kern.pre.mk b/sys/conf/kern.pre.mk index 83afd1e..0dc3b01 100644 --- a/sys/conf/kern.pre.mk +++ b/sys/conf/kern.pre.mk @@ -51,6 +51,9 @@ INCLUDES= ${NOSTDINC} -I- ${INCLMAGIC} -I. -I$S # include path into 100+ source files. INCLUDES+= -I$S/contrib/dev/acpica +# ... and the same for altq +INCLUDES+= -I$S/contrib/altq + # ... and the same for ipfilter INCLUDES+= -I$S/contrib/ipfilter diff --git a/sys/conf/kmod.mk b/sys/conf/kmod.mk index de4461b..90c839e 100644 --- a/sys/conf/kmod.mk +++ b/sys/conf/kmod.mk @@ -96,6 +96,10 @@ CFLAGS+= -include ${KERNBUILDDIR}/opt_global.h # set because there are no standard paths for non-headers. CFLAGS+= -I. -I@ +# Add -I path for altq headers as they are included via net/if_var.h +# for example. +CFLAGS+= -I@/contrib/altq + # Add a -I path to standard headers like <stddef.h>. Use a relative # path to src/include if possible. If the @ symlink hasn't been built # yet, then we can't tell if the relative path exists. Add both the diff --git a/sys/conf/options b/sys/conf/options index 03fc6c6..62913a1 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -294,6 +294,15 @@ DEV_ATARAID opt_ata.h # Net stuff. ACCEPT_FILTER_DATA ACCEPT_FILTER_HTTP +ALTQ opt_global.h +ALTQ_CBQ opt_altq.h +ALTQ_RED opt_altq.h +ALTQ_RIO opt_altq.h +ALTQ_HFSC opt_altq.h +ALTQ_CDNR opt_altq.h +ALTQ_PRIQ opt_altq.h +ALTQ_NOPCC opt_altq.h +ALTQ_DEBUG opt_altq.h BOOTP opt_bootp.h BOOTP_COMPAT opt_bootp.h BOOTP_NFSROOT opt_bootp.h diff --git a/sys/dev/awi/awi.c b/sys/dev/awi/awi.c index db72716..11c6081 100644 --- a/sys/dev/awi/awi.c +++ b/sys/dev/awi/awi.c @@ -235,10 +235,12 @@ ether_sprintf(u_int8_t *enaddr) } #endif +#if 0 /* ALTQ */ #define IFQ_PURGE(ifq) IF_DRAIN(ifq) #define IF_POLL(ifq, m) ((m) = (ifq)->ifq_head) #define IFQ_POLL(ifq, m) IF_POLL((ifq), (m)) #define IFQ_DEQUEUE(ifq, m) IF_DEQUEUE((ifq), (m)) +#endif #endif diff --git a/sys/dev/pdq/pdq_freebsd.h b/sys/dev/pdq/pdq_freebsd.h index c86b14b..ba2a993 100644 --- a/sys/dev/pdq/pdq_freebsd.h +++ b/sys/dev/pdq/pdq_freebsd.h @@ -97,8 +97,10 @@ enum _pdq_type_t { #define sc_ifmedia ifmedia #define sc_if arpcom.ac_if #define sc_bpf sc_if.if_bpf +#if 0 /* ALTQ */ #define IFQ_DEQUEUE IF_DEQUEUE #define IFQ_IS_EMPTY(q) ((q)->ifq_len == 0) +#endif typedef struct _pdq_os_ctx_t { struct arpcom arpcom; diff --git a/sys/dev/wi/if_wi.c b/sys/dev/wi/if_wi.c index dc2e75e..70cff59 100644 --- a/sys/dev/wi/if_wi.c +++ b/sys/dev/wi/if_wi.c @@ -114,9 +114,11 @@ __FBSDID("$FreeBSD$"); #include <dev/wi/if_wireg.h> #include <dev/wi/if_wivar.h> +#if 0 /* ALTQ */ #define IF_POLL(ifq, m) ((m) = (ifq)->ifq_head) #define IFQ_POLL(ifq, m) IF_POLL((ifq), (m)) #define IFQ_DEQUEUE(ifq, m) IF_DEQUEUE((ifq), (m)) +#endif static void wi_start(struct ifnet *); static int wi_reset(struct wi_softc *); diff --git a/sys/i4b/driver/i4b_ipr.c b/sys/i4b/driver/i4b_ipr.c index 6a30908..f0d9e8d 100644 --- a/sys/i4b/driver/i4b_ipr.c +++ b/sys/i4b/driver/i4b_ipr.c @@ -382,7 +382,7 @@ i4biproutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, if(ip->ip_tos & IPTOS_LOWDELAY) ifq = &sc->sc_fastq; else - ifq = &sc->sc_if.if_snd; + ifq = (struct ifqueue *)&sc->sc_if.if_snd; /* check for space in choosen send queue */ diff --git a/sys/net/if.c b/sys/net/if.c index 3830c18..c1d874a 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -82,7 +82,7 @@ static void if_grow(void); static void if_init(void *); static void if_check(void *); static int if_findindex(struct ifnet *); -static void if_qflush(struct ifqueue *); +static void if_qflush(struct ifaltq *); static void if_route(struct ifnet *, int flag, int fam); static void if_slowtimo(void *); static void if_unroute(struct ifnet *, int flag, int fam); @@ -441,6 +441,13 @@ if_attach(struct ifnet *ifp) ifa->ifa_refcnt = 1; TAILQ_INSERT_HEAD(&ifp->if_addrhead, ifa, ifa_link); ifp->if_broadcastaddr = 0; /* reliably crash if used uninitialized */ +#ifdef ALTQ + ifp->if_snd.altq_type = 0; + ifp->if_snd.altq_disc = NULL; + ifp->if_snd.altq_flags &= ALTQF_CANTCHANGE; + ifp->if_snd.altq_tbr = NULL; + ifp->if_snd.altq_ifp = ifp; +#endif if (domains) if_attachdomain1(ifp); @@ -519,6 +526,12 @@ if_detach(struct ifnet *ifp) */ s = splnet(); if_down(ifp); +#ifdef ALTQ + if (ALTQ_IS_ENABLED(&ifp->if_snd)) + altq_disable(&ifp->if_snd); + if (ALTQ_IS_ATTACHED(&ifp->if_snd)) + altq_detach(&ifp->if_snd); +#endif for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa; ifa = next) { next = TAILQ_NEXT(ifa, ifa_link); @@ -1189,10 +1202,14 @@ if_up(struct ifnet *ifp) * Flush an interface queue. */ static void -if_qflush(struct ifqueue *ifq) +if_qflush(struct ifaltq *ifq) { struct mbuf *m, *n; +#ifdef ALTQ + if (ALTQ_IS_ENABLED(ifq)) + ALTQ_PURGE(ifq); +#endif n = ifq->ifq_head; while ((m = n) != 0) { n = m->m_act; diff --git a/sys/net/if_ppp.c b/sys/net/if_ppp.c index d7e007e..d0db17e 100644 --- a/sys/net/if_ppp.c +++ b/sys/net/if_ppp.c @@ -933,7 +933,8 @@ pppoutput(ifp, m0, dst, rtp) sc->sc_npqtail = &m0->m_nextpkt; } else { /* fastq and if_snd are emptied at spl[soft]net now */ - ifq = (m0->m_flags & M_HIGHPRI)? &sc->sc_fastq: &ifp->if_snd; + ifq = (m0->m_flags & M_HIGHPRI)? &sc->sc_fastq: + (struct ifqueue *)&ifp->if_snd; IF_LOCK(ifq); if (_IF_QFULL(ifq) && dst->sa_family != AF_UNSPEC) { _IF_DROP(ifq); @@ -988,7 +989,8 @@ ppp_requeue(sc) */ *mpp = m->m_nextpkt; m->m_nextpkt = NULL; - ifq = (m->m_flags & M_HIGHPRI)? &sc->sc_fastq: &sc->sc_if.if_snd; + ifq = (m->m_flags & M_HIGHPRI)? &sc->sc_fastq: + (struct ifqueue *)&sc->sc_if.if_snd; if (! IF_HANDOFF(ifq, m, NULL)) { sc->sc_if.if_oerrors++; sc->sc_stats.ppp_oerrors++; diff --git a/sys/net/if_sl.c b/sys/net/if_sl.c index 0d39973..bc35341 100644 --- a/sys/net/if_sl.c +++ b/sys/net/if_sl.c @@ -571,7 +571,7 @@ sloutput(ifp, m, dst, rtp) m_freem(m); return (EHOSTUNREACH); } - ifq = &sc->sc_if.if_snd; + ifq = (struct ifqueue *)&sc->sc_if.if_snd; ip = mtod(m, struct ip *); if (sc->sc_if.if_flags & SC_NOICMP && ip->ip_p == IPPROTO_ICMP) { m_freem(m); diff --git a/sys/net/if_spppsubr.c b/sys/net/if_spppsubr.c index 83fb1fc..66b6412 100644 --- a/sys/net/if_spppsubr.c +++ b/sys/net/if_spppsubr.c @@ -781,7 +781,7 @@ sppp_output(struct ifnet *ifp, struct mbuf *m, s = splimp(); } - ifq = &ifp->if_snd; + ifq = (struct ifqueue *)&ifp->if_snd; #ifdef INET if (dst->sa_family == AF_INET) { /* XXX Check mbuf length here? */ @@ -1038,7 +1038,7 @@ sppp_flush(struct ifnet *ifp) { struct sppp *sp = (struct sppp*) ifp; - sppp_qflush (&sp->pp_if.if_snd); + sppp_qflush ((struct ifqueue *)&sp->pp_if.if_snd); sppp_qflush (&sp->pp_fastq); sppp_qflush (&sp->pp_cpq); } diff --git a/sys/net/if_var.h b/sys/net/if_var.h index 541f214..02bcf1f 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -82,6 +82,10 @@ struct ether_header; #define IF_DUNIT_NONE -1 +#if 1 /* ALTQ */ +#include <altq/if_altq.h> +#endif + TAILQ_HEAD(ifnethead, ifnet); /* we use TAILQs so that the order of */ TAILQ_HEAD(ifaddrhead, ifaddr); /* instantiation is preserved in the list */ TAILQ_HEAD(ifprefixhead, ifprefix); @@ -171,7 +175,11 @@ struct ifnet { (void *); int (*if_resolvemulti) /* validate/resolve multicast */ (struct ifnet *, struct sockaddr **, struct sockaddr *); +#if 1 /* ALTQ */ + struct ifaltq if_snd; /* output queue (includes altq) */ +#else struct ifqueue if_snd; /* output queue */ +#endif const u_int8_t *if_broadcastaddr; /* linklevel broadcast bytestring */ struct lltable *lltables; /* list of L3-L2 resolution tables */ @@ -228,6 +236,7 @@ typedef void if_init_f_t(void *); */ #define IF_LOCK(ifq) mtx_lock(&(ifq)->ifq_mtx) #define IF_UNLOCK(ifq) mtx_unlock(&(ifq)->ifq_mtx) +#define IF_LOCK_ASSERT(ifq) mtx_assert(&(ifq)->ifq_mtx, MA_OWNED) #define _IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen) #define _IF_DROP(ifq) ((ifq)->ifq_drops++) #define _IF_QLEN(ifq) ((ifq)->ifq_len) @@ -278,18 +287,25 @@ typedef void if_init_f_t(void *); IF_UNLOCK(ifq); \ } while (0) -#define IF_DRAIN(ifq) do { \ +#define _IF_POLL(ifq, m) ((m) = (ifq)->ifq_head) +#define IF_POLL(ifq, m) _IF_POLL(ifq, m) + +#define _IF_DRAIN(ifq) do { \ struct mbuf *m; \ - IF_LOCK(ifq); \ for (;;) { \ _IF_DEQUEUE(ifq, m); \ if (m == NULL) \ break; \ m_freem(m); \ } \ - IF_UNLOCK(ifq); \ } while (0) +#define IF_DRAIN(ifq) do { \ + IF_LOCK(ifq); \ + _IF_DRAIN(ifq); \ + IF_UNLOCK(ifq); \ +} while(0) + #ifdef _KERNEL /* interface address change event */ typedef void (*ifaddr_event_handler_t)(void *, struct ifnet *); @@ -311,8 +327,10 @@ EVENTHANDLER_DECLARE(if_clone_event, if_clone_event_handler_t); #define IF_AFDATA_UNLOCK(ifp) mtx_unlock(&(ifp)->if_afdata_mtx) #define IF_AFDATA_DESTROY(ifp) mtx_destroy(&(ifp)->if_afdata_mtx) -#define IF_HANDOFF(ifq, m, ifp) if_handoff(ifq, m, ifp, 0) -#define IF_HANDOFF_ADJ(ifq, m, ifp, adj) if_handoff(ifq, m, ifp, adj) +#define IF_HANDOFF(ifq, m, ifp) \ + if_handoff((struct ifqueue *)ifq, m, ifp, 0) +#define IF_HANDOFF_ADJ(ifq, m, ifp, adj) \ + if_handoff((struct ifqueue *)ifq, m, ifp, adj) static __inline int if_handoff(struct ifqueue *ifq, struct mbuf *m, struct ifnet *ifp, int adjust) @@ -338,6 +356,185 @@ if_handoff(struct ifqueue *ifq, struct mbuf *m, struct ifnet *ifp, int adjust) (*ifp->if_start)(ifp); return (1); } +#if 1 /* ALTQ */ +#define IFQ_ENQUEUE(ifq, m, err) \ +do { \ + IF_LOCK(ifq); \ + if (ALTQ_IS_ENABLED(ifq)) \ + ALTQ_ENQUEUE(ifq, m, NULL, err); \ + else { \ + if (_IF_QFULL(ifq)) { \ + m_freem(m); \ + (err) = ENOBUFS; \ + } else { \ + _IF_ENQUEUE(ifq, m); \ + (err) = 0; \ + } \ + } \ + if (err) \ + (ifq)->ifq_drops++; \ + IF_UNLOCK(ifq); \ +} while (0) + +#define IFQ_DEQUEUE_NOLOCK(ifq, m) \ +do { \ + if (TBR_IS_ENABLED(ifq)) \ + (m) = tbr_dequeue(ifq, ALTDQ_REMOVE); \ + else if (ALTQ_IS_ENABLED(ifq)) \ + ALTQ_DEQUEUE(ifq, m); \ + else \ + _IF_DEQUEUE(ifq, m); \ +} while (0) + +#define IFQ_DEQUEUE(ifq, m) \ +do { \ + IF_LOCK(ifq); \ + IFQ_DEQUEUE_NOLOCK(ifq, m); \ + IF_UNLOCK(ifq); \ +} while (0) + +#define IFQ_POLL_NOLOCK(ifq, m) \ +do { \ + if (TBR_IS_ENABLED(ifq)) \ + (m) = tbr_dequeue(ifq, ALTDQ_POLL); \ + else if (ALTQ_IS_ENABLED(ifq)) \ + ALTQ_POLL(ifq, m); \ + else \ + _IF_POLL(ifq, m); \ +} while (0) + +#define IFQ_POLL(ifq, m) \ +do { \ + IF_LOCK(ifq); \ + IFQ_POLL_NOLOCK(ifq, m); \ + IF_UNLOCK(ifq); \ +} while (0) + +#define IFQ_PURGE_NOLOCK(ifq) \ +do { \ + if (ALTQ_IS_ENABLED(ifq)) { \ + ALTQ_PURGE(ifq); \ + } else \ + _IF_DRAIN(ifq); \ +} while (0) + +#define IFQ_PURGE(ifq) \ +do { \ + IF_LOCK(ifq); \ + IFQ_PURGE_NOLOCK(ifq); \ + IF_UNLOCK(ifq); \ +} while (0) + +#define IFQ_SET_READY(ifq) \ + do { ((ifq)->altq_flags |= ALTQF_READY); } while (0) + +#else /* !ALTQ */ +#define IFQ_ENQUEUE(ifq, m, err) \ +do { \ + IF_LOCK(ifq); \ + if (_IF_QFULL(ifq)) { \ + m_freem(m); \ + (err) = ENOBUFS; \ + } else { \ + _IF_ENQUEUE(ifq, m); \ + (err) = 0; \ + } \ + if (err) \ + (ifq)->ifq_drops++; \ + IF_UNLOCK(ifq); \ +} while (0) + +#define IFQ_DEQUEUE_NOLOCK(ifq, m) _IF_DEQUEUE(ifq, m) +#define IFQ_DEQUEUE(ifq, m) IF_DEQUEUE(ifq, m) +#define IFQ_POLL_NOLOCK(ifq, m) _IF_POLL(ifq, m) +#define IFQ_POLL(ifq, m) IF_POLL(ifq, m) +#define IFQ_PURGE_NOLOCK(ifq) _IF_DRAIN(ifq) +#define IFQ_PURGE(ifq) IF_DRAIN(ifq) + +#define IFQ_SET_READY(ifq) /* nothing */ + +#endif /* !ALTQ */ + +#define IFQ_LOCK(ifq) IF_LOCK(ifq) +#define IFQ_UNLOCK(ifq) IF_UNLOCK(ifq) +#define IFQ_LOCK_ASSERT(ifq) IF_LOCK_ASSERT(ifq) +#define IFQ_IS_EMPTY(ifq) ((ifq)->ifq_len == 0) +#define IFQ_INC_LEN(ifq) ((ifq)->ifq_len++) +#define IFQ_DEC_LEN(ifq) (--(ifq)->ifq_len) +#define IFQ_INC_DROPS(ifq) ((ifq)->ifq_drops++) +#define IFQ_SET_MAXLEN(ifq, len) ((ifq)->ifq_maxlen = (len)) + +#define IFQ_HANDOFF_ADJ(ifp, m, adj, err) \ +do { \ + int len; \ + short mflags; \ + \ + len = (m)->m_pkthdr.len; \ + mflags = (m)->m_flags; \ + IFQ_ENQUEUE(&(ifp)->if_snd, m, err); \ + if ((err) == 0) { \ + (ifp)->if_obytes += len + (adj); \ + if (mflags & M_MCAST) \ + (ifp)->if_omcasts++; \ + if (((ifp)->if_flags & IFF_OACTIVE) == 0) \ + (*(ifp)->if_start)(ifp); \ + } \ +} while (0) + +#define IFQ_HANDOFF(ifp, m, err) \ + IFQ_HANDOFF_ADJ(ifq, m, 0, err) + +#define IFQ_DRV_DEQUEUE(ifq, m) \ +do { \ + (m) = (ifq)->ifq_drv_head; \ + if (m) { \ + if (((ifq)->ifq_drv_head = (m)->m_nextpkt) == NULL) \ + (ifq)->ifq_drv_tail = NULL; \ + (m)->m_nextpkt = NULL; \ + (ifq)->ifq_drv_len--; \ + } else { \ + IFQ_LOCK(ifq); \ + IFQ_DEQUEUE_NOLOCK(ifq, m); \ + while ((ifq)->ifq_drv_len < (ifq)->ifq_drv_maxlen) { \ + struct mbuf *m0; \ + IFQ_DEQUEUE_NOLOCK(ifq, m0); \ + if (m0 == NULL) \ + break; \ + m0->m_nextpkt = NULL; \ + if ((ifq)->ifq_drv_tail == NULL) \ + (ifq)->ifq_drv_head = m0; \ + else \ + (ifq)->ifq_drv_tail->m_nextpkt = m0; \ + (ifq)->ifq_drv_tail = m0; \ + (ifq)->ifq_drv_len++; \ + } \ + IFQ_UNLOCK(ifq); \ + } \ +} while (0) + +#define IFQ_DRV_PREPEND(ifq, m) \ +do { \ + (m)->m_nextpkt = (ifq)->ifq_drv_head; \ + if ((ifq)->ifq_tail == NULL) \ + (ifq)->ifq_tail = (m); \ + (ifq)->ifq_drv_head = (m); \ + (ifq)->ifq_drv_len++; \ +} while (0) + +#define IFQ_DRV_IS_EMPTY(ifq) \ + (((ifq)->ifq_drv_len == 0) && ((ifq)->ifq_len == 0)) + +#define IFQ_DRV_PURGE(ifq) \ +do { \ + struct mbuf *m = (ifq)->ifq_drv_head; \ + while(m != NULL) { \ + m = m->m_nextpkt; \ + m_freem(m); \ + } \ + (ifq)->ifq_drv_head = (ifq)->ifq_drv_tail = NULL; \ + (ifq)->ifq_drv_len = 0; \ + IFQ_PURGE(ifq); \ +} while (0) /* * 72 was chosen below because it is the size of a TCP/IP diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c index 153a650..74aa1c4 100644 --- a/sys/net80211/ieee80211_input.c +++ b/sys/net80211/ieee80211_input.c @@ -288,11 +288,6 @@ ieee80211_input(struct ifnet *ifp, struct mbuf *m, struct ieee80211_node *ni, } } if (m1 != NULL) { -#ifdef ALTQ - if (ALTQ_IS_ENABLED(&ifp->if_snd)) - altq_etherclassify(&ifp->if_snd, m1, - &pktattr); -#endif len = m1->m_pkthdr.len; IF_ENQUEUE(&ifp->if_snd, m1); if (m != NULL) diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c index 586d1b1..25501aa 100644 --- a/sys/netinet/ip_input.c +++ b/sys/netinet/ip_input.c @@ -390,6 +390,12 @@ ip_input(struct mbuf *m) goto bad; } +#ifdef ALTQ + if (altq_input != NULL && (*altq_input)(m, AF_INET) == 0) + /* packet is dropped by traffic conditioner */ + return; +#endif + /* * Convert fields to host representation. */ diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c index 98da087..520de05 100644 --- a/sys/netinet/ip_output.c +++ b/sys/netinet/ip_output.c @@ -404,6 +404,12 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, } } #endif /* notdef */ +#ifdef ALTQ + /* + * disable packet drop hack. + * packetdrop should be done by queueing. + */ +#else /* !ALTQ */ /* * Verify that we have any chance at all of being able to queue * the packet or packet fragments @@ -414,6 +420,7 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, ipstat.ips_odropped++; goto bad; } +#endif /* !ALTQ */ /* * Look for broadcast address and diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index 4eb6042..a22eb12 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -366,6 +366,12 @@ ip6_input(m) goto bad; } +#ifdef ALTQ + if (altq_input != NULL && (*altq_input)(m, AF_INET6) == 0) { + /* packet is dropped by traffic conditioner */ + return; + } +#endif /* * The following check is not documented in specs. A malicious * party may be able to use IPv4 mapped addr to confuse tcp/udp stack |