net: Introduce IPV6_DSCP(), IPV6_ECN() and IPV6_TRAFFIC_CLASS() macros
Introduce convenience macros to retrieve the DSCP, ECN or traffic class bits from an IPv6 header. Use them where appropriate. Reviewed by: ae (previous version), rscheff, tuexen, rgrimes MFC after: 2 weeks Sponsored by: Rubicon Communications, LLC ("Netgate") Differential Revision: https://reviews.freebsd.org/D29056
This commit is contained in:
parent
f19323847c
commit
bb4a7d94b9
@ -1087,7 +1087,7 @@ altq_extractflow(m, af, flow, filt_bmask)
|
||||
fin6->fi6_family = AF_INET6;
|
||||
|
||||
fin6->fi6_proto = ip6->ip6_nxt;
|
||||
fin6->fi6_tclass = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
|
||||
fin6->fi6_tclass = IPV6_TRAFFIC_CLASS(ip6);
|
||||
|
||||
fin6->fi6_flowlabel = ip6->ip6_flow & htonl(0x000fffff);
|
||||
fin6->fi6_src = ip6->ip6_src;
|
||||
|
@ -455,7 +455,7 @@ stf_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst,
|
||||
}
|
||||
}
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
tos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
|
||||
tos = IPV6_TRAFFIC_CLASS(ip6);
|
||||
|
||||
/*
|
||||
* Pickup the right outer dst addr from the list of candidates.
|
||||
@ -665,7 +665,7 @@ in_stf_input(struct mbuf *m, int off, int proto, void *arg)
|
||||
return (IPPROTO_DONE);
|
||||
}
|
||||
|
||||
itos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
|
||||
itos = IPV6_TRAFFIC_CLASS(ip6);
|
||||
if ((ifp->if_flags & IFF_LINK1) != 0)
|
||||
ip_ecn_egress(ECN_ALLOWED, &otos, &itos);
|
||||
else
|
||||
|
@ -106,6 +106,10 @@ struct ip6_hdr {
|
||||
#endif
|
||||
#define IPV6_FLOWLABEL_LEN 20
|
||||
|
||||
#define IPV6_TRAFFIC_CLASS(ip6) ((ntohl((ip6)->ip6_flow) >> 20) & 0xff)
|
||||
#define IPV6_DSCP(ip6) ((ntohl((ip6)->ip6_flow) >> 20) & 0xfc)
|
||||
#define IPV6_ECN(ip6) ((ntohl((ip6)->ip6_flow) >> 20) & 0x03)
|
||||
|
||||
/*
|
||||
* Extension Headers
|
||||
*/
|
||||
|
@ -688,7 +688,7 @@ tcp_input(struct mbuf **mp, int *offp, int proto)
|
||||
/* XXX stat */
|
||||
goto drop;
|
||||
}
|
||||
iptos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
|
||||
iptos = IPV6_TRAFFIC_CLASS(ip6);
|
||||
}
|
||||
#endif
|
||||
#if defined(INET) && defined(INET6)
|
||||
|
@ -1546,7 +1546,7 @@ tcp_lro_rx2(struct lro_ctrl *lc, struct mbuf *m, uint32_t csum, int use_hash)
|
||||
return (error);
|
||||
tcp_data_len = ntohs(ip6->ip6_plen);
|
||||
#ifdef TCPHPTS
|
||||
iptos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
|
||||
iptos = IPV6_TRAFFIC_CLASS(ip6);
|
||||
#endif
|
||||
ip_len = sizeof(*ip6) + tcp_data_len;
|
||||
break;
|
||||
|
@ -334,7 +334,7 @@ ctf_process_inbound_raw(struct tcpcb *tp, struct socket *so, struct mbuf *m, int
|
||||
m_freem(m);
|
||||
goto skipped_pkt;
|
||||
}
|
||||
iptos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
|
||||
iptos = IPV6_TRAFFIC_CLASS(ip6);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
@ -554,8 +554,7 @@ frag6_input(struct mbuf **mp, int *offp, int proto)
|
||||
q6->ip6q_ttl = IPV6_FRAGTTL;
|
||||
q6->ip6q_src = ip6->ip6_src;
|
||||
q6->ip6q_dst = ip6->ip6_dst;
|
||||
q6->ip6q_ecn =
|
||||
(ntohl(ip6->ip6_flow) >> 20) & IPTOS_ECN_MASK;
|
||||
q6->ip6q_ecn = IPV6_ECN(ip6);
|
||||
q6->ip6q_unfrglen = -1; /* The 1st fragment has not arrived. */
|
||||
|
||||
/* Add the fragemented packet to the bucket. */
|
||||
@ -688,7 +687,7 @@ frag6_input(struct mbuf **mp, int *offp, int proto)
|
||||
* if CE is set, do not lose CE.
|
||||
* Drop if CE and not-ECT are mixed for the same packet.
|
||||
*/
|
||||
ecn = (ntohl(ip6->ip6_flow) >> 20) & IPTOS_ECN_MASK;
|
||||
ecn = IPV6_ECN(ip6);
|
||||
ecn0 = q6->ip6q_ecn;
|
||||
if (ecn == IPTOS_ECN_CE) {
|
||||
if (ecn0 == IPTOS_ECN_NOTECT) {
|
||||
|
@ -344,7 +344,7 @@ in6_gif_input(struct mbuf *m, int off, int proto, void *arg)
|
||||
gifp = GIF2IFP(sc);
|
||||
if ((gifp->if_flags & IFF_UP) != 0) {
|
||||
ip6 = mtod(m, struct ip6_hdr *);
|
||||
ecn = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
|
||||
ecn = IPV6_TRAFFIC_CLASS(ip6);
|
||||
m_adj(m, off);
|
||||
gif_input(m, gifp, proto, ecn);
|
||||
} else {
|
||||
|
@ -656,9 +656,9 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt,
|
||||
if (opt && opt->ip6po_tclass >= 0) {
|
||||
int mask = 0;
|
||||
|
||||
if ((ip6->ip6_flow & htonl(0xfc << 20)) == 0)
|
||||
if (IPV6_DSCP(ip6) == 0)
|
||||
mask |= 0xfc;
|
||||
if ((ip6->ip6_flow & htonl(0x03 << 20)) == 0)
|
||||
if (IPV6_ECN(ip6) == 0)
|
||||
mask |= 0x03;
|
||||
if (mask != 0)
|
||||
ip6->ip6_flow |= htonl((opt->ip6po_tclass & mask) << 20);
|
||||
|
@ -141,7 +141,7 @@ sctp6_input_with_port(struct mbuf **i_pak, int *offp, uint16_t port)
|
||||
if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
|
||||
goto out;
|
||||
}
|
||||
ecn_bits = ((ntohl(ip6->ip6_flow) >> 20) & 0x000000ff);
|
||||
ecn_bits = IPV6_TRAFFIC_CLASS(ip6);
|
||||
if (m->m_pkthdr.csum_flags & CSUM_SCTP_VALID) {
|
||||
SCTP_STAT_INCR(sctps_recvhwcrc);
|
||||
compute_crc = 0;
|
||||
|
@ -6384,7 +6384,7 @@ pf_test6(int dir, int pflags, struct ifnet *ifp, struct mbuf **m0, struct inpcb
|
||||
pd.sidx = (dir == PF_IN) ? 0 : 1;
|
||||
pd.didx = (dir == PF_IN) ? 1 : 0;
|
||||
pd.af = AF_INET6;
|
||||
pd.tos = (ntohl(h->ip6_flow) >> 20) & 0xfc;
|
||||
pd.tos = IPV6_DSCP(h);
|
||||
pd.tot_len = ntohs(h->ip6_plen) + sizeof(struct ip6_hdr);
|
||||
|
||||
off = ((caddr_t)h - m->m_data) + sizeof(struct ip6_hdr);
|
||||
|
Loading…
Reference in New Issue
Block a user