cregit-Linux how code gets into the kernel

Release 4.14 include/net/inet_ecn.h

Directory: include/net
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _INET_ECN_H_

#define _INET_ECN_H_

#include <linux/ip.h>
#include <linux/skbuff.h>

#include <net/inet_sock.h>
#include <net/dsfield.h>

enum {
	
INET_ECN_NOT_ECT = 0,
	
INET_ECN_ECT_1 = 1,
	
INET_ECN_ECT_0 = 2,
	
INET_ECN_CE = 3,
	
INET_ECN_MASK = 3,
};

extern int sysctl_tunnel_ecn_log;


static inline int INET_ECN_is_ce(__u8 dsfield) { return (dsfield & INET_ECN_MASK) == INET_ECN_CE; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)1789.47%150.00%
Herbert Xu210.53%150.00%
Total19100.00%2100.00%


static inline int INET_ECN_is_not_ect(__u8 dsfield) { return (dsfield & INET_ECN_MASK) == INET_ECN_NOT_ECT; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)1684.21%133.33%
Herbert Xu315.79%266.67%
Total19100.00%3100.00%


static inline int INET_ECN_is_capable(__u8 dsfield) { return dsfield & INET_ECN_ECT_0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)1493.33%150.00%
Herbert Xu16.67%150.00%
Total15100.00%2100.00%

/* * RFC 3168 9.1.1 * The full-functionality option for ECN encapsulation is to copy the * ECN codepoint of the inside header to the outside header on * encapsulation if the inside header is not-ECT or ECT, and to set the * ECN codepoint of the outside header to ECT(0) if the ECN codepoint of * the inside header is CE. */
static inline __u8 INET_ECN_encapsulate(__u8 outer, __u8 inner) { outer &= ~INET_ECN_MASK; outer |= !INET_ECN_is_ce(inner) ? (inner & INET_ECN_MASK) : INET_ECN_ECT_0; return outer; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2772.97%125.00%
Hideaki Yoshifuji / 吉藤英明616.22%125.00%
Herbert Xu410.81%250.00%
Total37100.00%4100.00%


static inline void INET_ECN_xmit(struct sock *sk) { inet_sk(sk)->tos |= INET_ECN_ECT_0; if (inet6_sk(sk) != NULL) inet6_sk(sk)->tclass |= INET_ECN_ECT_0; }

Contributors

PersonTokensPropCommitsCommitProp
Steinar H. Gunderson3589.74%150.00%
Linus Torvalds (pre-git)410.26%150.00%
Total39100.00%2100.00%


static inline void INET_ECN_dontxmit(struct sock *sk) { inet_sk(sk)->tos &= ~INET_ECN_MASK; if (inet6_sk(sk) != NULL) inet6_sk(sk)->tclass &= ~INET_ECN_MASK; }

Contributors

PersonTokensPropCommitsCommitProp
Steinar H. Gunderson3790.24%150.00%
Linus Torvalds (pre-git)49.76%150.00%
Total41100.00%2100.00%

#define IP6_ECN_flow_init(label) do { \ (label) &= ~htonl(INET_ECN_MASK << 20); \ } while (0) #define IP6_ECN_flow_xmit(sk, label) do { \ if (INET_ECN_is_capable(inet6_sk(sk)->tclass)) \ (label) |= htonl(INET_ECN_ECT_0 << 20); \ } while (0)
static inline int IP_ECN_set_ce(struct iphdr *iph) { u32 check = (__force u32)iph->check; u32 ecn = (iph->tos + 1) & INET_ECN_MASK; /* * After the last operation we have (in binary): * INET_ECN_NOT_ECT => 01 * INET_ECN_ECT_1 => 10 * INET_ECN_ECT_0 => 11 * INET_ECN_CE => 00 */ if (!(ecn & 2)) return !ecn; /* * The following gives us: * INET_ECN_ECT_1 => check += htons(0xFFFD) * INET_ECN_ECT_0 => check += htons(0xFFFE) */ check += (__force u16)htons(0xFFFB) + (__force u16)htons(ecn); iph->check = (__force __sum16)(check + (check>=0xFFFF)); iph->tos |= INET_ECN_CE; return 1; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3838.78%116.67%
Herbert Xu3434.69%350.00%
Al Viro1818.37%116.67%
Thomas Graf88.16%116.67%
Total98100.00%6100.00%


static inline void IP_ECN_clear(struct iphdr *iph) { iph->tos &= ~INET_ECN_MASK; }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu19100.00%2100.00%
Total19100.00%2100.00%


static inline void ipv4_copy_dscp(unsigned int dscp, struct iphdr *inner) { dscp &= ~INET_ECN_MASK; ipv4_change_dsfield(inner, INET_ECN_MASK, dscp); }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu30100.00%2100.00%
Total30100.00%2100.00%

struct ipv6hdr; /* Note: * IP_ECN_set_ce() has to tweak IPV4 checksum when setting CE, * meaning both changes have no effect on skb->csum if/when CHECKSUM_COMPLETE * In IPv6 case, no checksum compensates the change in IPv6 header, * so we have to update skb->csum. */
static inline int IP6_ECN_set_ce(struct sk_buff *skb, struct ipv6hdr *iph) { __be32 from, to; if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph))) return 0; from = *(__be32 *)iph; to = from | htonl(INET_ECN_CE << 20); *(__be32 *)iph = to; if (skb->ip_summed == CHECKSUM_COMPLETE) skb->csum = csum_add(csum_sub(skb->csum, (__force __wsum)from), (__force __wsum)to); return 1; }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet5251.49%112.50%
Linus Torvalds (pre-git)2221.78%112.50%
Herbert Xu1110.89%337.50%
Johannes Berg87.92%112.50%
Thomas Graf76.93%112.50%
Al Viro10.99%112.50%
Total101100.00%8100.00%


static inline void IP6_ECN_clear(struct ipv6hdr *iph) { *(__be32*)iph &= ~htonl(INET_ECN_MASK << 20); }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu2696.30%266.67%
Al Viro13.70%133.33%
Total27100.00%3100.00%


static inline void ipv6_copy_dscp(unsigned int dscp, struct ipv6hdr *inner) { dscp &= ~INET_ECN_MASK; ipv6_change_dsfield(inner, INET_ECN_MASK, dscp); }

Contributors

PersonTokensPropCommitsCommitProp
Herbert Xu30100.00%2100.00%
Total30100.00%2100.00%


static inline int INET_ECN_set_ce(struct sk_buff *skb) { switch (skb->protocol) { case cpu_to_be16(ETH_P_IP): if (skb_network_header(skb) + sizeof(struct iphdr) <= skb_tail_pointer(skb)) return IP_ECN_set_ce(ip_hdr(skb)); break; case cpu_to_be16(ETH_P_IPV6): if (skb_network_header(skb) + sizeof(struct ipv6hdr) <= skb_tail_pointer(skb)) return IP6_ECN_set_ce(skb, ipv6_hdr(skb)); break; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Thomas Graf7176.34%116.67%
Simon Horman1212.90%116.67%
Arnaldo Carvalho de Melo66.45%233.33%
Eric Dumazet22.15%116.67%
Harvey Harrison22.15%116.67%
Total93100.00%6100.00%

/* * RFC 6040 4.2 * To decapsulate the inner header at the tunnel egress, a compliant * tunnel egress MUST set the outgoing ECN field to the codepoint at the * intersection of the appropriate arriving inner header (row) and outer * header (column) in Figure 4 * * +---------+------------------------------------------------+ * |Arriving | Arriving Outer Header | * | Inner +---------+------------+------------+------------+ * | Header | Not-ECT | ECT(0) | ECT(1) | CE | * +---------+---------+------------+------------+------------+ * | Not-ECT | Not-ECT |Not-ECT(!!!)|Not-ECT(!!!)| <drop>(!!!)| * | ECT(0) | ECT(0) | ECT(0) | ECT(1) | CE | * | ECT(1) | ECT(1) | ECT(1) (!) | ECT(1) | CE | * | CE | CE | CE | CE(!!!)| CE | * +---------+---------+------------+------------+------------+ * * Figure 4: New IP in IP Decapsulation Behaviour * * returns 0 on success * 1 if something is broken and should be logged (!!! above) * 2 if packet should be dropped */
static inline int INET_ECN_decapsulate(struct sk_buff *skb, __u8 outer, __u8 inner) { if (INET_ECN_is_not_ect(inner)) { switch (outer & INET_ECN_MASK) { case INET_ECN_NOT_ECT: return 0; case INET_ECN_ECT_0: case INET_ECN_ECT_1: return 1; case INET_ECN_CE: return 2; } } if (INET_ECN_is_ce(outer)) INET_ECN_set_ce(skb); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Stephen Hemminger71100.00%1100.00%
Total71100.00%1100.00%


static inline int IP_ECN_decapsulate(const struct iphdr *oiph, struct sk_buff *skb) { __u8 inner; if (skb->protocol == htons(ETH_P_IP)) inner = ip_hdr(skb)->tos; else if (skb->protocol == htons(ETH_P_IPV6)) inner = ipv6_get_dsfield(ipv6_hdr(skb)); else return 0; return INET_ECN_decapsulate(skb, oiph->tos, inner); }

Contributors

PersonTokensPropCommitsCommitProp
Stephen Hemminger79100.00%1100.00%
Total79100.00%1100.00%


static inline int IP6_ECN_decapsulate(const struct ipv6hdr *oipv6h, struct sk_buff *skb) { __u8 inner; if (skb->protocol == htons(ETH_P_IP)) inner = ip_hdr(skb)->tos; else if (skb->protocol == htons(ETH_P_IPV6)) inner = ipv6_get_dsfield(ipv6_hdr(skb)); else return 0; return INET_ECN_decapsulate(skb, ipv6_get_dsfield(oipv6h), inner); }

Contributors

PersonTokensPropCommitsCommitProp
Stephen Hemminger80100.00%1100.00%
Total80100.00%1100.00%

#endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Stephen Hemminger23426.96%13.85%
Herbert Xu19021.89%830.77%
Linus Torvalds (pre-git)16719.24%13.85%
Thomas Graf8910.25%13.85%
Steinar H. Gunderson728.29%13.85%
Eric Dumazet566.45%27.69%
Al Viro202.30%27.69%
Simon Horman121.38%13.85%
Arnaldo Carvalho de Melo91.04%311.54%
Johannes Berg80.92%13.85%
Hideaki Yoshifuji / 吉藤英明70.81%27.69%
Harvey Harrison20.23%13.85%
Greg Kroah-Hartman10.12%13.85%
Neal Cardwell10.12%13.85%
Total868100.00%26100.00%
Directory: include/net
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.