cregit-Linux how code gets into the kernel

Release 4.7 include/net/inet_ecn.h

Directory: include/net
#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
pre-gitpre-git1789.47%150.00%
herbert xuherbert 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
pre-gitpre-git1684.21%133.33%
herbert xuherbert 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
pre-gitpre-git1493.33%150.00%
herbert xuherbert 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
pre-gitpre-git2772.97%125.00%
hideaki yoshifujihideaki yoshifuji616.22%125.00%
herbert xuherbert 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. gundersonsteinar h. gunderson3589.74%150.00%
pre-gitpre-git410.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. gundersonsteinar h. gunderson3790.24%150.00%
pre-gitpre-git49.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
pre-gitpre-git3838.78%116.67%
herbert xuherbert xu3434.69%350.00%
al viroal viro1818.37%116.67%
thomas grafthomas 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 xuherbert 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 xuherbert 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, from), to); return 1; }

Contributors

PersonTokensPropCommitsCommitProp
eric dumazeteric dumazet5255.91%114.29%
pre-gitpre-git2223.66%114.29%
herbert xuherbert xu1111.83%342.86%
thomas grafthomas graf77.53%114.29%
al viroal viro11.08%114.29%
Total93100.00%7100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
herbert xuherbert xu2696.30%266.67%
al viroal 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 xuherbert 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 grafthomas graf7176.34%116.67%
simon hormansimon horman1212.90%116.67%
arnaldo carvalho de meloarnaldo carvalho de melo66.45%233.33%
eric dumazeteric dumazet22.15%116.67%
harvey harrisonharvey 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 hemmingerstephen 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 hemmingerstephen 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 hemmingerstephen hemminger80100.00%1100.00%
Total80100.00%1100.00%

#endif

Overall Contributors

PersonTokensPropCommitsCommitProp
stephen hemmingerstephen hemminger23427.24%14.17%
herbert xuherbert xu19022.12%833.33%
pre-gitpre-git16719.44%14.17%
thomas grafthomas graf8910.36%14.17%
steinar h. gundersonsteinar h. gunderson728.38%14.17%
eric dumazeteric dumazet566.52%28.33%
al viroal viro202.33%28.33%
simon hormansimon horman121.40%14.17%
arnaldo carvalho de meloarnaldo carvalho de melo91.05%312.50%
hideaki yoshifujihideaki yoshifuji70.81%28.33%
harvey harrisonharvey harrison20.23%14.17%
neal cardwellneal cardwell10.12%14.17%
Total859100.00%24100.00%
Directory: include/net
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}