diff options
author | Ermal Luçi <eri@FreeBSD.org> | 2015-06-24 19:16:41 +0000 |
---|---|---|
committer | Ermal Luçi <eri@FreeBSD.org> | 2015-06-24 19:16:41 +0000 |
commit | a5b789f65a306f8abd91a8b2eea77df2e77f90f6 (patch) | |
tree | 6c12b529ee86ec1dfc65e74eeb0c70085c50a35a /sys/netpfil/pf | |
parent | cbc120b22cb0732f0f528581329734d98b053c84 (diff) | |
download | src-a5b789f65a306f8abd91a8b2eea77df2e77f90f6.tar.gz src-a5b789f65a306f8abd91a8b2eea77df2e77f90f6.zip |
ALTQ FAIRQ discipline import from DragonFLY
Differential Revision: https://reviews.freebsd.org/D2847
Reviewed by: glebius, wblock(manpage)
Approved by: gnn(mentor)
Obtained from: pfSense
Sponsored by: Netgate
Notes
Notes:
svn path=/head/; revision=284777
Diffstat (limited to 'sys/netpfil/pf')
-rw-r--r-- | sys/netpfil/pf/pf.c | 18 | ||||
-rw-r--r-- | sys/netpfil/pf/pf_altq.h | 15 | ||||
-rw-r--r-- | sys/netpfil/pf/pf_mtag.h | 1 |
3 files changed, 34 insertions, 0 deletions
diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c index 5652365a0013..81d010fb17fd 100644 --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -439,6 +439,20 @@ pf_hashsrc(struct pf_addr *addr, sa_family_t af) return (h & pf_srchashmask); } +#ifdef ALTQ +static int +pf_state_hash(struct pf_state *s) +{ + u_int32_t hv = (intptr_t)s / sizeof(*s); + + hv ^= crc32(&s->src, sizeof(s->src)); + hv ^= crc32(&s->dst, sizeof(s->dst)); + if (hv == 0) + hv = 1; + return (hv); +} +#endif + #ifdef INET6 void pf_addrcpy(struct pf_addr *dst, struct pf_addr *src, sa_family_t af) @@ -5900,6 +5914,8 @@ done: action = PF_DROP; REASON_SET(&reason, PFRES_MEMORY); } else { + if (s != NULL) + pd.pf_mtag->qid_hash = pf_state_hash(s); if (pqid || (pd.tos & IPTOS_LOWDELAY)) pd.pf_mtag->qid = r->pqid; else @@ -6332,6 +6348,8 @@ done: action = PF_DROP; REASON_SET(&reason, PFRES_MEMORY); } else { + if (s != NULL) + pd.pf_mtag->qid_hash = pf_state_hash(s); if (pd.tos & IPTOS_LOWDELAY) pd.pf_mtag->qid = r->pqid; else diff --git a/sys/netpfil/pf/pf_altq.h b/sys/netpfil/pf/pf_altq.h index eda09651d643..db681fbb5d7c 100644 --- a/sys/netpfil/pf/pf_altq.h +++ b/sys/netpfil/pf/pf_altq.h @@ -65,6 +65,20 @@ struct hfsc_opts { int flags; }; +/* + * XXX this needs some work + */ +struct fairq_opts { + u_int nbuckets; + u_int hogs_m1; + int flags; + + /* link sharing service curve */ + u_int lssc_m1; + u_int lssc_d; + u_int lssc_m2; +}; + struct pf_altq { char ifname[IFNAMSIZ]; @@ -91,6 +105,7 @@ struct pf_altq { struct cbq_opts cbq_opts; struct priq_opts priq_opts; struct hfsc_opts hfsc_opts; + struct fairq_opts fairq_opts; } pq_u; uint32_t qid; /* return value */ diff --git a/sys/netpfil/pf/pf_mtag.h b/sys/netpfil/pf/pf_mtag.h index 3aacb2e18c4e..fd8554aebe98 100644 --- a/sys/netpfil/pf/pf_mtag.h +++ b/sys/netpfil/pf/pf_mtag.h @@ -44,6 +44,7 @@ struct pf_mtag { void *hdr; /* saved hdr pos in mbuf, for ECN */ u_int32_t qid; /* queue id */ + u_int32_t qid_hash; /* queue hashid used by WFQ like algos */ u_int16_t tag; /* tag id */ u_int8_t flags; u_int8_t routed; |