/usr/src/kernels/4.18.0-553.157.1.el8_10.x86_64/include/net
NameSizeModeActions
9p/-0755rm
bluetooth/-0755rm
caif/-0755rm
iucv/-0755rm
mana/-0755rm
netfilter/-0755rm
netns/-0755rm
nfc/-0755rm
phonet/-0755rm
sctp/-0755rm
tc_act/-0755rm
6lowpan.h102710644editdlrm
act_api.h95590644editdlrm
addrconf.h138260644editdlrm
af_ieee802154.h15910644editdlrm
af_rxrpc.h29760644editdlrm
af_unix.h22720644editdlrm
af_vsock.h72950644editdlrm
ah.h3820644editdlrm
arp.h20520644editdlrm
atmclip.h15150644editdlrm
ax25.h149990644editdlrm
ax88796.h14880644editdlrm
bareudp.h3330644editdlrm
bonding.h202250644editdlrm
bond_3ad.h96290644editdlrm
bond_alb.h62510644editdlrm
bond_options.h39160644editdlrm
bpf_sk_storage.h18020644editdlrm
busy_poll.h49730644editdlrm
calipso.h21990644editdlrm
cfg80211-wext.h19000644editdlrm
cfg80211.h3258440644editdlrm
cfg802154.h111750644editdlrm
checksum.h48500644editdlrm
cipso_ipv4.h83990644editdlrm
cls_cgroup.h23010644editdlrm
codel.h60000644editdlrm
codel_impl.h85000644editdlrm
codel_qdisc.h30010644editdlrm
compat.h17110644editdlrm
datalink.h6190644editdlrm
dcbevent.h12930644editdlrm
dcbnl.h52670644editdlrm
devlink.h647110644editdlrm
dn.h70460644editdlrm
dn_dev.h54880644editdlrm
dn_fib.h40770644editdlrm
dn_neigh.h9680644editdlrm
dn_nsp.h59660644editdlrm
dn_route.h45000644editdlrm
dropreason-core.h120630644editdlrm
drop_monitor.h9010644editdlrm
dsa.h166050644editdlrm
dsfield.h11390644editdlrm
dst.h148700644editdlrm
dst_cache.h25960644editdlrm
dst_metadata.h55210644editdlrm
dst_ops.h25640644editdlrm
erspan.h85270644editdlrm
esp.h11900644editdlrm
espintcp.h9660644editdlrm
ethoc.h5370644editdlrm
failover.h11780644editdlrm
fib_notifier.h14760644editdlrm
fib_rules.h57280644editdlrm
firewire.h6360644editdlrm
flow.h63530644editdlrm
flow_dissector.h112840644editdlrm
flow_offload.h177970644editdlrm
fou.h5490644editdlrm
fq.h24970644editdlrm
fq_impl.h81440644editdlrm
garp.h26780644editdlrm
genetlink.h146470644editdlrm
geneve.h18980644editdlrm
gen_stats.h30340644editdlrm
gre.h33770644editdlrm
gro_cells.h4430644editdlrm
gtp.h6330644editdlrm
gue.h33110644editdlrm
hwbm.h9370644editdlrm
icmp.h17650644editdlrm
ieee80211_radiotap.h230170644editdlrm
ieee802154_netdev.h93580644editdlrm
ife.h10570644editdlrm
if_inet6.h65910644editdlrm
ila.h4980644editdlrm
inet6_connection_sock.h9760644editdlrm
inet6_hashtables.h37460644editdlrm
inetpeer.h33720644editdlrm
inet_common.h26140644editdlrm
inet_connection_sock.h120700644editdlrm
inet_ecn.h80710644editdlrm
inet_frag.h48160644editdlrm
inet_hashtables.h138470644editdlrm
inet_sock.h98280644editdlrm
inet_timewait_sock.h39260644editdlrm
ip.h213540644editdlrm
ip6_checksum.h29810644editdlrm
ip6_fib.h137660644editdlrm
ip6_route.h92280644editdlrm
ip6_tunnel.h50960644editdlrm
ipcomp.h6590644editdlrm
ipconfig.h8110644editdlrm
ipv6.h327410644editdlrm
ipv6_frag.h33210644editdlrm
ipv6_stubs.h26710644editdlrm
ipx.h43860644editdlrm
ip_fib.h142900644editdlrm
ip_tunnels.h146970644editdlrm
ip_vs.h494070644editdlrm
iw_handler.h214130644editdlrm
kcm.h50830644editdlrm
l3mdev.h67430644editdlrm
lag.h4090644editdlrm
lapb.h48690644editdlrm
lib80211.h40170644editdlrm
llc.h44640644editdlrm
llc_conn.h41550644editdlrm
llc_c_ac.h95370644editdlrm
llc_c_ev.h109400644editdlrm
llc_c_st.h17620644editdlrm
llc_if.h22100644editdlrm
llc_pdu.h147830644editdlrm
llc_sap.h11080644editdlrm
llc_s_ac.h15910644editdlrm
llc_s_ev.h22550644editdlrm
llc_s_st.h9470644editdlrm
lwtunnel.h65630644editdlrm
mac80211.h2944370644editdlrm
mac802154.h156330644editdlrm
mip6.h16170644editdlrm
mld.h28700644editdlrm
mpls.h13400644editdlrm
mpls_iptunnel.h8270644editdlrm
mptcp.h62420644editdlrm
mrp.h31030644editdlrm
ncsi.h19640644editdlrm
ndisc.h150950644editdlrm
neighbour.h162890644editdlrm
netdev_queues.h56090644editdlrm
netevent.h10440644editdlrm
netlabel.h212360644editdlrm
netlink.h632530644editdlrm
netprio_cgroup.h12600644editdlrm
netrom.h78960644editdlrm
net_failover.h10230644editdlrm
net_namespace.h141770644editdlrm
net_ratelimit.h2200644editdlrm
nexthop.h8650644editdlrm
nl802154.h123850644editdlrm
nsh.h126020644editdlrm
p8022.h4470644editdlrm
page_pool.h69850644editdlrm
pie.h36840644editdlrm
ping.h31970644editdlrm
pkt_cls.h261780644editdlrm
pkt_sched.h65430644editdlrm
pptp.h5570644editdlrm
protocol.h43200644editdlrm
psample.h10830644editdlrm
psnap.h3510644editdlrm
raw.h21610644editdlrm
rawv6.h8560644editdlrm
red.h116000644editdlrm
regulatory.h109610644editdlrm
request_sock.h68710644editdlrm
rose.h78020644editdlrm
route.h113900644editdlrm
rsi_91x.h17100644editdlrm
rtnetlink.h73170644editdlrm
sch_generic.h338410644editdlrm
scm.h36710644editdlrm
secure_seq.h8550644editdlrm
seg6.h18740644editdlrm
seg6_hmac.h16990644editdlrm
seg6_local.h8700644editdlrm
slhc_vj.h68310644editdlrm
smc.h21550644editdlrm
snmp.h54820644editdlrm
sock.h791820644editdlrm
sock_reuseport.h15650644editdlrm
Space.h10940644editdlrm
stp.h3830644editdlrm
strparser.h43400644editdlrm
switchdev.h178120644editdlrm
tcp.h732060644editdlrm
tcp_states.h15400644editdlrm
tc_wrapper.h70330644editdlrm
timewait_sock.h11360644editdlrm
tipc.h24050644editdlrm
tls.h213630644editdlrm
tls_toe.h30060644editdlrm
transp_v6.h19960644editdlrm
tso.h5150644editdlrm
tun_proto.h9880644editdlrm
udp.h164810644editdlrm
udplite.h37620644editdlrm
udp_tunnel.h133760644editdlrm
vsock_addr.h6620644editdlrm
vxlan.h135410644editdlrm
wext.h15100644editdlrm
wimax.h204450644editdlrm
x25.h96580644editdlrm
x25device.h3870644editdlrm
xdp.h94360644editdlrm
xdp_priv.h4460644editdlrm
xdp_sock.h20940644editdlrm
xdp_sock_drv.h64230644editdlrm
xfrm.h596280644editdlrm
xsk_buff_pool.h65500644editdlrm
Edit: /usr/src/kernels/4.18.0-553.157.1.el8_10.x86_64/include/net/inet_ecn.h (8071B)
/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _INET_ECN_H_ #define _INET_ECN_H_ #include #include #include #include #include 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; } static inline int INET_ECN_is_not_ect(__u8 dsfield) { return (dsfield & INET_ECN_MASK) == INET_ECN_NOT_ECT; } static inline int INET_ECN_is_capable(__u8 dsfield) { return dsfield & INET_ECN_ECT_0; } /* * 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; } 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; } 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; } #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; } static inline int IP_ECN_set_ect1(struct iphdr *iph) { u32 check = (__force u32)iph->check; if ((iph->tos & INET_ECN_MASK) != INET_ECN_ECT_0) return 0; check += (__force u16)htons(0x1); iph->check = (__force __sum16)(check + (check>=0xFFFF)); iph->tos ^= INET_ECN_MASK; return 1; } static inline void IP_ECN_clear(struct iphdr *iph) { iph->tos &= ~INET_ECN_MASK; } static inline void ipv4_copy_dscp(unsigned int dscp, struct iphdr *inner) { dscp &= ~INET_ECN_MASK; ipv4_change_dsfield(inner, INET_ECN_MASK, dscp); } 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; } static inline int IP6_ECN_set_ect1(struct sk_buff *skb, struct ipv6hdr *iph) { __be32 from, to; if ((ipv6_get_dsfield(iph) & INET_ECN_MASK) != INET_ECN_ECT_0) return 0; from = *(__be32 *)iph; to = from ^ htonl(INET_ECN_MASK << 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; } static inline void ipv6_copy_dscp(unsigned int dscp, struct ipv6hdr *inner) { dscp &= ~INET_ECN_MASK; ipv6_change_dsfield(inner, INET_ECN_MASK, dscp); } static inline int INET_ECN_set_ce(struct sk_buff *skb) { switch (skb_protocol(skb, true)) { 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; } 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)) { case cpu_to_be16(ETH_P_IP): if (skb_network_header(skb) + sizeof(struct iphdr) <= skb_tail_pointer(skb)) return IP_ECN_set_ect1(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_ect1(skb, ipv6_hdr(skb)); break; } return 0; } /* * 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(!!!)| (!!!)| * | 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(__u8 outer, __u8 inner, bool *set_ce) { 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; } } *set_ce = INET_ECN_is_ce(outer); return 0; } static inline int INET_ECN_decapsulate(struct sk_buff *skb, __u8 outer, __u8 inner) { bool set_ce = false; int rc; rc = __INET_ECN_decapsulate(outer, inner, &set_ce); if (!rc) { if (set_ce) INET_ECN_set_ce(skb); else if ((outer & INET_ECN_MASK) == INET_ECN_ECT_1) INET_ECN_set_ect1(skb); } return rc; } static inline int IP_ECN_decapsulate(const struct iphdr *oiph, struct sk_buff *skb) { __u8 inner; switch (skb_protocol(skb, true)) { case htons(ETH_P_IP): inner = ip_hdr(skb)->tos; break; case htons(ETH_P_IPV6): inner = ipv6_get_dsfield(ipv6_hdr(skb)); break; default: return 0; } return INET_ECN_decapsulate(skb, oiph->tos, inner); } static inline int IP6_ECN_decapsulate(const struct ipv6hdr *oipv6h, struct sk_buff *skb) { __u8 inner; switch (skb_protocol(skb, true)) { case htons(ETH_P_IP): inner = ip_hdr(skb)->tos; break; case htons(ETH_P_IPV6): inner = ipv6_get_dsfield(ipv6_hdr(skb)); break; default: return 0; } return INET_ECN_decapsulate(skb, ipv6_get_dsfield(oipv6h), inner); } #endif