diff options
author | Eric Dumazet <edumazet@google.com> | 2021-10-14 10:59:17 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2021-10-15 11:33:08 +0100 |
commit | 70e939ddea7f014b94fe001db65c3efc986e4add (patch) | |
tree | b5a59855e80fa786405ff779cb840d246b6ce84e /include/net/inet_ecn.h | |
parent | 19757cebf0c5016a1f36f7fe9810a9f0b33c0832 (diff) | |
download | lwn-70e939ddea7f014b94fe001db65c3efc986e4add.tar.gz lwn-70e939ddea7f014b94fe001db65c3efc986e4add.zip |
net: add skb_get_dsfield() helper
skb_get_dsfield(skb) gets dsfield from skb, or -1
if an error was found.
This is basically a wrapper around ipv4_get_dsfield()
and ipv6_get_dsfield().
Used by following patch for fq_codel.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Cc: Ingemar Johansson S <ingemar.s.johansson@ericsson.com>
Cc: Tom Henderson <tomh@tomh.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/inet_ecn.h')
-rw-r--r-- | include/net/inet_ecn.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h index ba77f47ef61e..ea32393464a2 100644 --- a/include/net/inet_ecn.h +++ b/include/net/inet_ecn.h @@ -188,6 +188,23 @@ static inline int INET_ECN_set_ce(struct sk_buff *skb) return 0; } +static inline int skb_get_dsfield(struct sk_buff *skb) +{ + switch (skb_protocol(skb, true)) { + case cpu_to_be16(ETH_P_IP): + if (!pskb_network_may_pull(skb, sizeof(struct iphdr))) + break; + return ipv4_get_dsfield(ip_hdr(skb)); + + case cpu_to_be16(ETH_P_IPV6): + if (!pskb_network_may_pull(skb, sizeof(struct ipv6hdr))) + break; + return ipv6_get_dsfield(ipv6_hdr(skb)); + } + + return -1; +} + static inline int INET_ECN_set_ect1(struct sk_buff *skb) { switch (skb_protocol(skb, true)) { |