Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv4: Convert ->flowi4_tos to dscp_t.

Convert the ->flowic_tos field of struct flowi_common from __u8 to
dscp_t, rename it ->flowic_dscp and propagate these changes to struct
flowi and struct flowi4.

We've had several bugs in the past where ECN bits could interfere with
IPv4 routing, because these bits were not properly cleared when setting
->flowi4_tos. These bugs should be fixed now and the dscp_t type has
been introduced to ensure that variables carrying DSCP values don't
accidentally have any ECN bits set. Several variables and structure
fields have been converted to dscp_t already, but the main IPv4 routing
structure, struct flowi4, is still using a __u8. To avoid any future
regression, this patch converts it to dscp_t.

There are many users to convert at once. Fortunately, around half of
->flowi4_tos users already have a dscp_t value at hand, which they
currently convert to __u8 using inet_dscp_to_dsfield(). For all of
these users, we just need to drop that conversion.

But, although we try to do the __u8 <-> dscp_t conversions at the
boundaries of the network or of user space, some places still store
TOS/DSCP variables as __u8 in core networking code. Those can hardly be
converted either because the data structure is part of UAPI or because
the same variable or field is also used for handling ECN in other parts
of the code. In all of these cases where we don't have a dscp_t
variable at hand, we need to use inet_dsfield_to_dscp() when
interacting with ->flowi4_dscp.

Changes since v1:
* Fix space alignment in __bpf_redirect_neigh_v4() (Ido).

Signed-off-by: Guillaume Nault <gnault@redhat.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/29acecb45e911d17446b9a3dbdb1ab7b821ea371.1756128932.git.gnault@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Guillaume Nault and committed by
Jakub Kicinski
1bec9d0c dded9942

+81 -58
+4 -2
drivers/net/amt.c
··· 11 11 #include <linux/net.h> 12 12 #include <linux/igmp.h> 13 13 #include <linux/workqueue.h> 14 + #include <net/flow.h> 14 15 #include <net/pkt_sched.h> 15 16 #include <net/net_namespace.h> 16 17 #include <net/ip.h> ··· 29 28 #include <net/addrconf.h> 30 29 #include <net/ip6_route.h> 31 30 #include <net/inet_common.h> 31 + #include <net/inet_dscp.h> 32 32 #include <net/ip6_checksum.h> 33 33 34 34 static struct workqueue_struct *amt_wq; ··· 1020 1018 fl4.flowi4_oif = amt->stream_dev->ifindex; 1021 1019 fl4.daddr = amt->remote_ip; 1022 1020 fl4.saddr = amt->local_ip; 1023 - fl4.flowi4_tos = AMT_TOS; 1021 + fl4.flowi4_dscp = inet_dsfield_to_dscp(AMT_TOS); 1024 1022 fl4.flowi4_proto = IPPROTO_UDP; 1025 1023 rt = ip_route_output_key(amt->net, &fl4); 1026 1024 if (IS_ERR(rt)) { ··· 1135 1133 fl4.flowi4_oif = amt->stream_dev->ifindex; 1136 1134 fl4.daddr = tunnel->ip4; 1137 1135 fl4.saddr = amt->local_ip; 1138 - fl4.flowi4_tos = AMT_TOS; 1136 + fl4.flowi4_dscp = inet_dsfield_to_dscp(AMT_TOS); 1139 1137 fl4.flowi4_proto = IPPROTO_UDP; 1140 1138 rt = ip_route_output_key(amt->net, &fl4); 1141 1139 if (IS_ERR(rt)) {
+4 -3
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2 2 /* Copyright (c) 2018 Mellanox Technologies. */ 3 3 4 - #include <net/inet_ecn.h> 4 + #include <net/flow.h> 5 + #include <net/inet_dscp.h> 5 6 #include <net/vxlan.h> 6 7 #include <net/gre.h> 7 8 #include <net/geneve.h> ··· 234 233 int err; 235 234 236 235 /* add the IP fields */ 237 - attr.fl.fl4.flowi4_tos = tun_key->tos & ~INET_ECN_MASK; 236 + attr.fl.fl4.flowi4_dscp = inet_dsfield_to_dscp(tun_key->tos); 238 237 attr.fl.fl4.daddr = tun_key->u.ipv4.dst; 239 238 attr.fl.fl4.saddr = tun_key->u.ipv4.src; 240 239 attr.ttl = tun_key->ttl; ··· 350 349 int err; 351 350 352 351 /* add the IP fields */ 353 - attr.fl.fl4.flowi4_tos = tun_key->tos & ~INET_ECN_MASK; 352 + attr.fl.fl4.flowi4_dscp = inet_dsfield_to_dscp(tun_key->tos); 354 353 attr.fl.fl4.daddr = tun_key->u.ipv4.dst; 355 354 attr.fl.fl4.saddr = tun_key->u.ipv4.src; 356 355 attr.ttl = tun_key->ttl;
+3 -1
drivers/net/ethernet/sfc/tc_encap_actions.c
··· 11 11 #include "tc_encap_actions.h" 12 12 #include "tc.h" 13 13 #include "mae.h" 14 + #include <net/flow.h> 15 + #include <net/inet_dscp.h> 14 16 #include <net/vxlan.h> 15 17 #include <net/geneve.h> 16 18 #include <net/netevent.h> ··· 101 99 case EFX_ENCAP_TYPE_GENEVE: 102 100 flow4.flowi4_proto = IPPROTO_UDP; 103 101 flow4.fl4_dport = encap->key.tp_dst; 104 - flow4.flowi4_tos = encap->key.tos; 102 + flow4.flowi4_dscp = inet_dsfield_to_dscp(encap->key.tos); 105 103 flow4.daddr = encap->key.u.ipv4.dst; 106 104 flow4.saddr = encap->key.u.ipv4.src; 107 105 break;
+4 -3
drivers/net/gtp.c
··· 21 21 #include <linux/file.h> 22 22 #include <linux/gtp.h> 23 23 24 + #include <net/flow.h> 25 + #include <net/inet_dscp.h> 24 26 #include <net/net_namespace.h> 25 27 #include <net/protocol.h> 26 - #include <net/inet_dscp.h> 27 28 #include <net/inet_sock.h> 28 29 #include <net/ip.h> 29 30 #include <net/ipv6.h> ··· 353 352 fl4->flowi4_oif = sk->sk_bound_dev_if; 354 353 fl4->daddr = daddr; 355 354 fl4->saddr = saddr; 356 - fl4->flowi4_tos = inet_dscp_to_dsfield(inet_sk_dscp(inet_sk(sk))); 355 + fl4->flowi4_dscp = inet_sk_dscp(inet_sk(sk)); 357 356 fl4->flowi4_scope = ip_sock_rt_scope(sk); 358 357 fl4->flowi4_proto = sk->sk_protocol; 359 358 ··· 2402 2401 2403 2402 udp_tunnel_xmit_skb(rt, sk, skb_to_send, 2404 2403 fl4.saddr, fl4.daddr, 2405 - fl4.flowi4_tos, 2404 + inet_dscp_to_dsfield(fl4.flowi4_dscp), 2406 2405 ip4_dst_hoplimit(&rt->dst), 2407 2406 0, 2408 2407 port, port,
+2 -2
drivers/net/ipvlan/ipvlan_core.c
··· 2 2 /* Copyright (c) 2014 Mahesh Bandewar <maheshb@google.com> 3 3 */ 4 4 5 - #include <net/inet_dscp.h> 5 + #include <net/flow.h> 6 6 #include <net/ip.h> 7 7 8 8 #include "ipvlan.h" ··· 433 433 ip4h = ip_hdr(skb); 434 434 fl4.daddr = ip4h->daddr; 435 435 fl4.saddr = ip4h->saddr; 436 - fl4.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(ip4h)); 436 + fl4.flowi4_dscp = ip4h_dscp(ip4h); 437 437 438 438 rt = ip_route_output_flow(net, &fl4, NULL); 439 439 if (IS_ERR(rt))
+2 -2
drivers/net/vrf.c
··· 26 26 27 27 #include <linux/inetdevice.h> 28 28 #include <net/arp.h> 29 + #include <net/flow.h> 29 30 #include <net/ip.h> 30 31 #include <net/ip_fib.h> 31 32 #include <net/ip6_fib.h> ··· 39 38 #include <net/sch_generic.h> 40 39 #include <net/netns/generic.h> 41 40 #include <net/netfilter/nf_conntrack.h> 42 - #include <net/inet_dscp.h> 43 41 44 42 #define DRV_NAME "vrf" 45 43 #define DRV_VERSION "1.1" ··· 505 505 /* needed to match OIF rule */ 506 506 fl4.flowi4_l3mdev = vrf_dev->ifindex; 507 507 fl4.flowi4_iif = LOOPBACK_IFINDEX; 508 - fl4.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(ip4h)); 508 + fl4.flowi4_dscp = ip4h_dscp(ip4h); 509 509 fl4.flowi4_flags = FLOWI_FLAG_ANYSRC; 510 510 fl4.flowi4_proto = ip4h->protocol; 511 511 fl4.daddr = ip4h->daddr;
+6 -5
include/net/flow.h
··· 12 12 #include <linux/atomic.h> 13 13 #include <linux/container_of.h> 14 14 #include <linux/uidgid.h> 15 + #include <net/inet_dscp.h> 15 16 16 17 struct flow_keys; 17 18 ··· 33 32 int flowic_iif; 34 33 int flowic_l3mdev; 35 34 __u32 flowic_mark; 36 - __u8 flowic_tos; 35 + dscp_t flowic_dscp; 37 36 __u8 flowic_scope; 38 37 __u8 flowic_proto; 39 38 __u8 flowic_flags; ··· 71 70 #define flowi4_iif __fl_common.flowic_iif 72 71 #define flowi4_l3mdev __fl_common.flowic_l3mdev 73 72 #define flowi4_mark __fl_common.flowic_mark 74 - #define flowi4_tos __fl_common.flowic_tos 73 + #define flowi4_dscp __fl_common.flowic_dscp 75 74 #define flowi4_scope __fl_common.flowic_scope 76 75 #define flowi4_proto __fl_common.flowic_proto 77 76 #define flowi4_flags __fl_common.flowic_flags ··· 104 103 fl4->flowi4_iif = LOOPBACK_IFINDEX; 105 104 fl4->flowi4_l3mdev = 0; 106 105 fl4->flowi4_mark = mark; 107 - fl4->flowi4_tos = tos; 106 + fl4->flowi4_dscp = inet_dsfield_to_dscp(tos); 108 107 fl4->flowi4_scope = scope; 109 108 fl4->flowi4_proto = proto; 110 109 fl4->flowi4_flags = flags; ··· 142 141 #define flowi6_uid __fl_common.flowic_uid 143 142 struct in6_addr daddr; 144 143 struct in6_addr saddr; 145 - /* Note: flowi6_tos is encoded in flowlabel, too. */ 144 + /* Note: flowi6_dscp is encoded in flowlabel, too. */ 146 145 __be32 flowlabel; 147 146 union flowi_uli uli; 148 147 #define fl6_sport uli.ports.sport ··· 164 163 #define flowi_iif u.__fl_common.flowic_iif 165 164 #define flowi_l3mdev u.__fl_common.flowic_l3mdev 166 165 #define flowi_mark u.__fl_common.flowic_mark 167 - #define flowi_tos u.__fl_common.flowic_tos 166 + #define flowi_dscp u.__fl_common.flowic_dscp 168 167 #define flowi_scope u.__fl_common.flowic_scope 169 168 #define flowi_proto u.__fl_common.flowic_proto 170 169 #define flowi_flags u.__fl_common.flowic_flags
+6
include/net/inet_dscp.h
··· 39 39 40 40 #define INET_DSCP_MASK 0xfc 41 41 42 + /* A few places in the IPv4 code need to ignore the three high order bits of 43 + * DSCP because of backward compatibility (as these bits used to represent the 44 + * IPv4 Precedence in RFC 791's TOS field and were ignored). 45 + */ 46 + #define INET_DSCP_LEGACY_TOS_MASK ((__force dscp_t)0x1c) 47 + 42 48 static inline dscp_t inet_dsfield_to_dscp(__u8 dsfield) 43 49 { 44 50 return (__force dscp_t)(dsfield & INET_DSCP_MASK);
+1 -1
include/net/ip_fib.h
··· 440 440 441 441 static inline bool fib_dscp_masked_match(dscp_t dscp, const struct flowi4 *fl4) 442 442 { 443 - return dscp == inet_dsfield_to_dscp(RT_TOS(fl4->flowi4_tos)); 443 + return dscp == (fl4->flowi4_dscp & INET_DSCP_LEGACY_TOS_MASK); 444 444 } 445 445 446 446 /* Exported by fib_frontend.c */
+3 -1
include/net/ip_tunnels.h
··· 11 11 #include <linux/bitops.h> 12 12 13 13 #include <net/dsfield.h> 14 + #include <net/flow.h> 14 15 #include <net/gro_cells.h> 16 + #include <net/inet_dscp.h> 15 17 #include <net/inet_ecn.h> 16 18 #include <net/netns/generic.h> 17 19 #include <net/rtnetlink.h> ··· 364 362 365 363 fl4->daddr = daddr; 366 364 fl4->saddr = saddr; 367 - fl4->flowi4_tos = tos; 365 + fl4->flowi4_dscp = inet_dsfield_to_dscp(tos); 368 366 fl4->flowi4_proto = proto; 369 367 fl4->fl4_gre_key = key; 370 368 fl4->flowi4_mark = mark;
+1 -1
include/net/route.h
··· 189 189 { 190 190 struct flowi4 fl4 = { 191 191 .flowi4_oif = oif, 192 - .flowi4_tos = inet_dscp_to_dsfield(dscp), 192 + .flowi4_dscp = dscp, 193 193 .flowi4_scope = scope, 194 194 .daddr = daddr, 195 195 .saddr = saddr,
+3 -1
include/trace/events/fib.h
··· 7 7 8 8 #include <linux/skbuff.h> 9 9 #include <linux/netdevice.h> 10 + #include <net/flow.h> 11 + #include <net/inet_dscp.h> 10 12 #include <net/ip_fib.h> 11 13 #include <linux/tracepoint.h> 12 14 ··· 46 44 __entry->err = err; 47 45 __entry->oif = flp->flowi4_oif; 48 46 __entry->iif = flp->flowi4_iif; 49 - __entry->tos = flp->flowi4_tos; 47 + __entry->tos = inet_dscp_to_dsfield(flp->flowi4_dscp); 50 48 __entry->scope = flp->flowi4_scope; 51 49 __entry->flags = flp->flowi4_flags; 52 50
+2 -2
net/core/filter.c
··· 2373 2373 struct flowi4 fl4 = { 2374 2374 .flowi4_flags = FLOWI_FLAG_ANYSRC, 2375 2375 .flowi4_mark = skb->mark, 2376 - .flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(ip4h)), 2376 + .flowi4_dscp = ip4h_dscp(ip4h), 2377 2377 .flowi4_oif = dev->ifindex, 2378 2378 .flowi4_proto = ip4h->protocol, 2379 2379 .daddr = ip4h->daddr, ··· 6020 6020 fl4.flowi4_iif = params->ifindex; 6021 6021 fl4.flowi4_oif = 0; 6022 6022 } 6023 - fl4.flowi4_tos = params->tos & INET_DSCP_MASK; 6023 + fl4.flowi4_dscp = inet_dsfield_to_dscp(params->tos); 6024 6024 fl4.flowi4_scope = RT_SCOPE_UNIVERSE; 6025 6025 fl4.flowi4_flags = 0; 6026 6026
+2 -2
net/core/lwt_bpf.c
··· 8 8 #include <linux/skbuff.h> 9 9 #include <linux/types.h> 10 10 #include <linux/bpf.h> 11 + #include <net/flow.h> 11 12 #include <net/lwtunnel.h> 12 13 #include <net/gre.h> 13 14 #include <net/ip.h> 14 15 #include <net/ip6_route.h> 15 16 #include <net/ipv6_stubs.h> 16 - #include <net/inet_dscp.h> 17 17 18 18 struct bpf_lwt_prog { 19 19 struct bpf_prog *prog; ··· 209 209 fl4.flowi4_oif = oif; 210 210 fl4.flowi4_mark = skb->mark; 211 211 fl4.flowi4_uid = sock_net_uid(net, sk); 212 - fl4.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(iph)); 212 + fl4.flowi4_dscp = ip4h_dscp(iph); 213 213 fl4.flowi4_flags = FLOWI_FLAG_ANYSRC; 214 214 fl4.flowi4_proto = iph->protocol; 215 215 fl4.daddr = iph->daddr;
+4 -3
net/ipv4/fib_frontend.c
··· 32 32 #include <linux/list.h> 33 33 #include <linux/slab.h> 34 34 35 + #include <net/flow.h> 35 36 #include <net/inet_dscp.h> 36 37 #include <net/ip.h> 37 38 #include <net/protocol.h> ··· 294 293 .flowi4_iif = LOOPBACK_IFINDEX, 295 294 .flowi4_l3mdev = l3mdev_master_ifindex_rcu(dev), 296 295 .daddr = ip_hdr(skb)->saddr, 297 - .flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(ip_hdr(skb))), 296 + .flowi4_dscp = ip4h_dscp(ip_hdr(skb)), 298 297 .flowi4_scope = scope, 299 298 .flowi4_mark = vmark ? skb->mark : 0, 300 299 }; ··· 359 358 fl4.flowi4_iif = oif ? : LOOPBACK_IFINDEX; 360 359 fl4.daddr = src; 361 360 fl4.saddr = dst; 362 - fl4.flowi4_tos = inet_dscp_to_dsfield(dscp); 361 + fl4.flowi4_dscp = dscp; 363 362 fl4.flowi4_scope = RT_SCOPE_UNIVERSE; 364 363 fl4.flowi4_tun_key.tun_id = 0; 365 364 fl4.flowi4_flags = 0; ··· 1373 1372 struct flowi4 fl4 = { 1374 1373 .flowi4_mark = frn->fl_mark, 1375 1374 .daddr = frn->fl_addr, 1376 - .flowi4_tos = frn->fl_tos & INET_DSCP_MASK, 1375 + .flowi4_dscp = inet_dsfield_to_dscp(frn->fl_tos), 1377 1376 .flowi4_scope = frn->fl_scope, 1378 1377 }; 1379 1378 struct fib_table *tb;
+2 -2
net/ipv4/fib_rules.c
··· 23 23 #include <linux/list.h> 24 24 #include <linux/rcupdate.h> 25 25 #include <linux/export.h> 26 + #include <net/flow.h> 26 27 #include <net/inet_dscp.h> 27 28 #include <net/ip.h> 28 29 #include <net/route.h> ··· 194 193 * to mask the upper three DSCP bits prior to matching to maintain 195 194 * legacy behavior. 196 195 */ 197 - if (r->dscp_full && 198 - (r->dscp ^ inet_dsfield_to_dscp(fl4->flowi4_tos)) & r->dscp_mask) 196 + if (r->dscp_full && (r->dscp ^ fl4->flowi4_dscp) & r->dscp_mask) 199 197 return 0; 200 198 else if (!r->dscp_full && r->dscp && 201 199 !fib_dscp_masked_match(r->dscp, fl4))
+3 -2
net/ipv4/icmp.c
··· 72 72 #include <linux/string.h> 73 73 #include <linux/netfilter_ipv4.h> 74 74 #include <linux/slab.h> 75 + #include <net/flow.h> 75 76 #include <net/snmp.h> 76 77 #include <net/ip.h> 77 78 #include <net/route.h> ··· 445 444 fl4.saddr = saddr; 446 445 fl4.flowi4_mark = mark; 447 446 fl4.flowi4_uid = sock_net_uid(net, NULL); 448 - fl4.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(ip_hdr(skb))); 447 + fl4.flowi4_dscp = ip4h_dscp(ip_hdr(skb)); 449 448 fl4.flowi4_proto = IPPROTO_ICMP; 450 449 fl4.flowi4_oif = l3mdev_master_ifindex(skb->dev); 451 450 security_skb_classify_flow(skb, flowi4_to_flowi_common(&fl4)); ··· 496 495 fl4->saddr = saddr; 497 496 fl4->flowi4_mark = mark; 498 497 fl4->flowi4_uid = sock_net_uid(net, NULL); 499 - fl4->flowi4_tos = inet_dscp_to_dsfield(dscp); 498 + fl4->flowi4_dscp = dscp; 500 499 fl4->flowi4_proto = IPPROTO_ICMP; 501 500 fl4->fl4_icmp_type = type; 502 501 fl4->fl4_icmp_code = code;
+2 -2
net/ipv4/ip_gre.c
··· 28 28 #include <linux/etherdevice.h> 29 29 #include <linux/if_ether.h> 30 30 31 + #include <net/flow.h> 31 32 #include <net/sock.h> 32 33 #include <net/ip.h> 33 34 #include <net/icmp.h> ··· 45 44 #include <net/gre.h> 46 45 #include <net/dst_metadata.h> 47 46 #include <net/erspan.h> 48 - #include <net/inet_dscp.h> 49 47 50 48 /* 51 49 Problems & solutions ··· 930 930 if (ipv4_is_multicast(t->parms.iph.daddr)) { 931 931 struct flowi4 fl4 = { 932 932 .flowi4_oif = t->parms.link, 933 - .flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(&t->parms.iph)), 933 + .flowi4_dscp = ip4h_dscp(&t->parms.iph), 934 934 .flowi4_scope = RT_SCOPE_UNIVERSE, 935 935 .flowi4_proto = IPPROTO_GRE, 936 936 .saddr = t->parms.iph.saddr,
+2 -1
net/ipv4/ip_output.c
··· 63 63 #include <linux/stat.h> 64 64 #include <linux/init.h> 65 65 66 + #include <net/flow.h> 66 67 #include <net/snmp.h> 67 68 #include <net/ip.h> 68 69 #include <net/protocol.h> ··· 486 485 inet_sk_init_flowi4(inet, fl4); 487 486 488 487 /* sctp_v4_xmit() uses its own DSCP value */ 489 - fl4->flowi4_tos = tos & INET_DSCP_MASK; 488 + fl4->flowi4_dscp = inet_dsfield_to_dscp(tos); 490 489 491 490 /* If this fails, retransmit mechanism of transport layer will 492 491 * keep trying until route appears or the connection times
+2 -1
net/ipv4/ipmr.c
··· 42 42 #include <linux/init.h> 43 43 #include <linux/if_ether.h> 44 44 #include <linux/slab.h> 45 + #include <net/flow.h> 45 46 #include <net/net_namespace.h> 46 47 #include <net/ip.h> 47 48 #include <net/protocol.h> ··· 2121 2120 struct flowi4 fl4 = { 2122 2121 .daddr = iph->daddr, 2123 2122 .saddr = iph->saddr, 2124 - .flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(iph)), 2123 + .flowi4_dscp = ip4h_dscp(iph), 2125 2124 .flowi4_oif = (rt_is_output_route(rt) ? 2126 2125 skb->dev->ifindex : 0), 2127 2126 .flowi4_iif = (rt_is_output_route(rt) ?
+2 -2
net/ipv4/netfilter.c
··· 11 11 #include <linux/skbuff.h> 12 12 #include <linux/gfp.h> 13 13 #include <linux/export.h> 14 + #include <net/flow.h> 14 15 #include <net/route.h> 15 16 #include <net/xfrm.h> 16 17 #include <net/ip.h> 17 - #include <net/inet_dscp.h> 18 18 #include <net/netfilter/nf_queue.h> 19 19 20 20 /* route_me_harder function, used by iptable_nat, iptable_mangle + ip_queue */ ··· 44 44 */ 45 45 fl4.daddr = iph->daddr; 46 46 fl4.saddr = saddr; 47 - fl4.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(iph)); 47 + fl4.flowi4_dscp = ip4h_dscp(iph); 48 48 fl4.flowi4_oif = sk ? sk->sk_bound_dev_if : 0; 49 49 fl4.flowi4_l3mdev = l3mdev_master_ifindex(dev); 50 50 fl4.flowi4_mark = skb->mark;
+2 -2
net/ipv4/netfilter/ipt_rpfilter.c
··· 8 8 #include <linux/module.h> 9 9 #include <linux/skbuff.h> 10 10 #include <linux/netdevice.h> 11 - #include <net/inet_dscp.h> 12 11 #include <linux/ip.h> 12 + #include <net/flow.h> 13 13 #include <net/ip.h> 14 14 #include <net/ip_fib.h> 15 15 #include <net/route.h> ··· 76 76 flow.daddr = iph->saddr; 77 77 flow.saddr = rpfilter_get_saddr(iph->daddr); 78 78 flow.flowi4_mark = info->flags & XT_RPFILTER_VALID_MARK ? skb->mark : 0; 79 - flow.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(iph)); 79 + flow.flowi4_dscp = ip4h_dscp(iph); 80 80 flow.flowi4_scope = RT_SCOPE_UNIVERSE; 81 81 flow.flowi4_l3mdev = l3mdev_master_ifindex_rcu(xt_in(par)); 82 82 flow.flowi4_uid = sock_net_uid(xt_net(par), NULL);
+2 -2
net/ipv4/netfilter/nf_dup_ipv4.c
··· 12 12 #include <linux/skbuff.h> 13 13 #include <linux/netfilter.h> 14 14 #include <net/checksum.h> 15 + #include <net/flow.h> 15 16 #include <net/icmp.h> 16 17 #include <net/ip.h> 17 18 #include <net/route.h> 18 - #include <net/inet_dscp.h> 19 19 #include <net/netfilter/ipv4/nf_dup_ipv4.h> 20 20 #if IS_ENABLED(CONFIG_NF_CONNTRACK) 21 21 #include <net/netfilter/nf_conntrack.h> ··· 33 33 fl4.flowi4_oif = oif; 34 34 35 35 fl4.daddr = gw->s_addr; 36 - fl4.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(iph)); 36 + fl4.flowi4_dscp = ip4h_dscp(iph); 37 37 fl4.flowi4_scope = RT_SCOPE_UNIVERSE; 38 38 fl4.flowi4_flags = FLOWI_FLAG_KNOWN_NH; 39 39 rt = ip_route_output_key(net, &fl4);
+2 -2
net/ipv4/netfilter/nft_fib_ipv4.c
··· 10 10 #include <net/netfilter/nf_tables.h> 11 11 #include <net/netfilter/nft_fib.h> 12 12 13 - #include <net/inet_dscp.h> 13 + #include <net/flow.h> 14 14 #include <net/ip.h> 15 15 #include <net/ip_fib.h> 16 16 #include <net/route.h> ··· 114 114 if (priv->flags & NFTA_FIB_F_MARK) 115 115 fl4.flowi4_mark = pkt->skb->mark; 116 116 117 - fl4.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(iph)); 117 + fl4.flowi4_dscp = ip4h_dscp(iph); 118 118 119 119 if (priv->flags & NFTA_FIB_F_DADDR) { 120 120 fl4.daddr = iph->daddr;
+4 -4
net/ipv4/route.c
··· 84 84 #include <linux/jhash.h> 85 85 #include <net/dst.h> 86 86 #include <net/dst_metadata.h> 87 + #include <net/flow.h> 87 88 #include <net/inet_dscp.h> 88 89 #include <net/net_namespace.h> 89 90 #include <net/ip.h> ··· 1292 1291 struct flowi4 fl4 = { 1293 1292 .daddr = iph->daddr, 1294 1293 .saddr = iph->saddr, 1295 - .flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(iph)), 1294 + .flowi4_dscp = ip4h_dscp(iph), 1296 1295 .flowi4_oif = rt->dst.dev->ifindex, 1297 1296 .flowi4_iif = skb->dev->ifindex, 1298 1297 .flowi4_mark = skb->mark, ··· 2332 2331 fl4.flowi4_oif = 0; 2333 2332 fl4.flowi4_iif = dev->ifindex; 2334 2333 fl4.flowi4_mark = skb->mark; 2335 - fl4.flowi4_tos = inet_dscp_to_dsfield(dscp); 2334 + fl4.flowi4_dscp = dscp; 2336 2335 fl4.flowi4_scope = RT_SCOPE_UNIVERSE; 2337 2336 fl4.flowi4_flags = 0; 2338 2337 fl4.daddr = daddr; ··· 2691 2690 struct rtable *rth; 2692 2691 2693 2692 fl4->flowi4_iif = LOOPBACK_IFINDEX; 2694 - fl4->flowi4_tos &= INET_DSCP_MASK; 2695 2693 2696 2694 rcu_read_lock(); 2697 2695 rth = ip_route_output_key_hash_rcu(net, fl4, &res, skb); ··· 3333 3333 3334 3334 fl4.daddr = dst; 3335 3335 fl4.saddr = src; 3336 - fl4.flowi4_tos = inet_dscp_to_dsfield(dscp); 3336 + fl4.flowi4_dscp = dscp; 3337 3337 fl4.flowi4_oif = nla_get_u32_default(tb[RTA_OIF], 0); 3338 3338 fl4.flowi4_mark = mark; 3339 3339 fl4.flowi4_uid = uid;
+2 -1
net/ipv4/udp_tunnel_core.c
··· 4 4 #include <linux/socket.h> 5 5 #include <linux/kernel.h> 6 6 #include <net/dst_metadata.h> 7 + #include <net/flow.h> 7 8 #include <net/udp.h> 8 9 #include <net/udp_tunnel.h> 9 10 #include <net/inet_dscp.h> ··· 254 253 fl4.saddr = key->u.ipv4.src; 255 254 fl4.fl4_dport = dport; 256 255 fl4.fl4_sport = sport; 257 - fl4.flowi4_tos = tos & INET_DSCP_MASK; 256 + fl4.flowi4_dscp = inet_dsfield_to_dscp(tos); 258 257 fl4.flowi4_flags = key->flow_flags; 259 258 260 259 rt = ip_route_output_key(net, &fl4);
+2 -2
net/ipv4/xfrm4_policy.c
··· 14 14 #include <linux/inetdevice.h> 15 15 #include <net/dst.h> 16 16 #include <net/xfrm.h> 17 - #include <net/inet_dscp.h> 17 + #include <net/flow.h> 18 18 #include <net/ip.h> 19 19 #include <net/l3mdev.h> 20 20 ··· 25 25 26 26 memset(fl4, 0, sizeof(*fl4)); 27 27 fl4->daddr = params->daddr->a4; 28 - fl4->flowi4_tos = inet_dscp_to_dsfield(params->dscp); 28 + fl4->flowi4_dscp = params->dscp; 29 29 fl4->flowi4_l3mdev = l3mdev_master_ifindex_by_index(params->net, 30 30 params->oif); 31 31 fl4->flowi4_mark = params->mark;
+2 -2
net/netfilter/nft_flow_offload.c
··· 9 9 #include <linux/netfilter/nf_conntrack_common.h> 10 10 #include <linux/netfilter/nf_tables.h> 11 11 #include <net/ip.h> 12 - #include <net/inet_dscp.h> 12 + #include <net/flow.h> 13 13 #include <net/netfilter/nf_tables.h> 14 14 #include <net/netfilter/nf_tables_core.h> 15 15 #include <net/netfilter/nf_conntrack_core.h> ··· 236 236 fl.u.ip4.saddr = ct->tuplehash[!dir].tuple.src.u3.ip; 237 237 fl.u.ip4.flowi4_oif = nft_in(pkt)->ifindex; 238 238 fl.u.ip4.flowi4_iif = this_dst->dev->ifindex; 239 - fl.u.ip4.flowi4_tos = inet_dscp_to_dsfield(ip4h_dscp(ip_hdr(pkt->skb))); 239 + fl.u.ip4.flowi4_dscp = ip4h_dscp(ip_hdr(pkt->skb)); 240 240 fl.u.ip4.flowi4_mark = pkt->skb->mark; 241 241 fl.u.ip4.flowi4_flags = FLOWI_FLAG_ANYSRC; 242 242 break;
+2 -1
net/sctp/protocol.c
··· 34 34 #include <linux/memblock.h> 35 35 #include <linux/highmem.h> 36 36 #include <linux/slab.h> 37 + #include <net/flow.h> 37 38 #include <net/net_namespace.h> 38 39 #include <net/protocol.h> 39 40 #include <net/ip.h> ··· 438 437 fl4->fl4_dport = daddr->v4.sin_port; 439 438 fl4->flowi4_proto = IPPROTO_SCTP; 440 439 if (asoc) { 441 - fl4->flowi4_tos = inet_dscp_to_dsfield(dscp); 440 + fl4->flowi4_dscp = dscp; 442 441 fl4->flowi4_scope = ip_sock_rt_scope(asoc->base.sk); 443 442 fl4->flowi4_oif = asoc->base.sk->sk_bound_dev_if; 444 443 fl4->fl4_sport = htons(asoc->base.bind_addr.port);
+3 -3
net/xfrm/xfrm_policy.c
··· 2594 2594 static dscp_t xfrm_get_dscp(const struct flowi *fl, int family) 2595 2595 { 2596 2596 if (family == AF_INET) 2597 - return inet_dsfield_to_dscp(fl->u.ip4.flowi4_tos); 2597 + return fl->u.ip4.flowi4_dscp; 2598 2598 2599 2599 return 0; 2600 2600 } ··· 3462 3462 } 3463 3463 3464 3464 fl4->flowi4_proto = flkeys->basic.ip_proto; 3465 - fl4->flowi4_tos = flkeys->ip.tos & ~INET_ECN_MASK; 3465 + fl4->flowi4_dscp = inet_dsfield_to_dscp(flkeys->ip.tos); 3466 3466 } 3467 3467 3468 3468 #if IS_ENABLED(CONFIG_IPV6) ··· 3594 3594 3595 3595 fl1->flowi_oif = fl->flowi_oif; 3596 3596 fl1->flowi_mark = fl->flowi_mark; 3597 - fl1->flowi_tos = fl->flowi_tos; 3597 + fl1->flowi_dscp = fl->flowi_dscp; 3598 3598 nf_nat_decode_session(newskb, fl1, family); 3599 3599 ret = false; 3600 3600