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

net: ipv4: Add a flags argument to iptunnel_xmit(), udp_tunnel_xmit_skb()

iptunnel_xmit() erases the contents of the SKB control block. In order to
be able to set particular IPCB flags on the SKB, add a corresponding
parameter, and propagate it to udp_tunnel_xmit_skb() as well.

In one of the following patches, VXLAN driver will use this facility to
mark packets as subject to IP multicast routing.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Acked-by: Antonio Quartulli <antonio@openvpn.net>
Link: https://patch.msgid.link/89c9daf9f2dc088b6b92ccebcc929f51742de91f.1750113335.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Petr Machata and committed by
Jakub Kicinski
e3411e32 ccde4081

+33 -24
+6 -3
drivers/net/amt.c
··· 1046 1046 amt->gw_port, 1047 1047 amt->relay_port, 1048 1048 false, 1049 - false); 1049 + false, 1050 + 0); 1050 1051 amt_update_gw_status(amt, AMT_STATUS_SENT_UPDATE, true); 1051 1052 return false; 1052 1053 } ··· 1104 1103 amt->relay_port, 1105 1104 tunnel->source_port, 1106 1105 false, 1107 - false); 1106 + false, 1107 + 0); 1108 1108 } 1109 1109 1110 1110 static bool amt_send_membership_query(struct amt_dev *amt, ··· 1163 1161 amt->relay_port, 1164 1162 tunnel->source_port, 1165 1163 false, 1166 - false); 1164 + false, 1165 + 0); 1167 1166 amt_update_relay_status(tunnel, AMT_STATUS_SENT_QUERY, true); 1168 1167 return false; 1169 1168 }
+2 -2
drivers/net/bareudp.c
··· 362 362 udp_tunnel_xmit_skb(rt, sock->sk, skb, saddr, info->key.u.ipv4.dst, 363 363 tos, ttl, df, sport, bareudp->port, 364 364 !net_eq(bareudp->net, dev_net(bareudp->dev)), 365 - !test_bit(IP_TUNNEL_CSUM_BIT, 366 - info->key.tun_flags)); 365 + !test_bit(IP_TUNNEL_CSUM_BIT, info->key.tun_flags), 366 + 0); 367 367 return 0; 368 368 369 369 free_dst:
+2 -2
drivers/net/geneve.c
··· 921 921 udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, saddr, info->key.u.ipv4.dst, 922 922 tos, ttl, df, sport, geneve->cfg.info.key.tp_dst, 923 923 !net_eq(geneve->net, dev_net(geneve->dev)), 924 - !test_bit(IP_TUNNEL_CSUM_BIT, 925 - info->key.tun_flags)); 924 + !test_bit(IP_TUNNEL_CSUM_BIT, info->key.tun_flags), 925 + 0); 926 926 return 0; 927 927 } 928 928
+6 -4
drivers/net/gtp.c
··· 446 446 htons(GTP0_PORT), htons(GTP0_PORT), 447 447 !net_eq(sock_net(gtp->sk1u), 448 448 dev_net(gtp->dev)), 449 - false); 449 + false, 450 + 0); 450 451 451 452 return 0; 452 453 } ··· 705 704 htons(GTP1U_PORT), htons(GTP1U_PORT), 706 705 !net_eq(sock_net(gtp->sk1u), 707 706 dev_net(gtp->dev)), 708 - false); 707 + false, 708 + 0); 709 709 return 0; 710 710 } 711 711 ··· 1306 1304 pktinfo.gtph_port, pktinfo.gtph_port, 1307 1305 !net_eq(sock_net(pktinfo.pctx->sk), 1308 1306 dev_net(dev)), 1309 - false); 1307 + false, 0); 1310 1308 break; 1311 1309 case AF_INET6: 1312 1310 #if IS_ENABLED(CONFIG_IPV6) ··· 2407 2405 port, port, 2408 2406 !net_eq(sock_net(sk), 2409 2407 dev_net(gtp->dev)), 2410 - false); 2408 + false, 0); 2411 2409 return 0; 2412 2410 } 2413 2411
+1 -1
drivers/net/ovpn/udp.c
··· 199 199 transmit: 200 200 udp_tunnel_xmit_skb(rt, sk, skb, fl.saddr, fl.daddr, 0, 201 201 ip4_dst_hoplimit(&rt->dst), 0, fl.fl4_sport, 202 - fl.fl4_dport, false, sk->sk_no_check_tx); 202 + fl.fl4_dport, false, sk->sk_no_check_tx, 0); 203 203 ret = 0; 204 204 err: 205 205 local_bh_enable();
+1 -1
drivers/net/vxlan/vxlan_core.c
··· 2522 2522 2523 2523 udp_tunnel_xmit_skb(rt, sock4->sock->sk, skb, saddr, 2524 2524 pkey->u.ipv4.dst, tos, ttl, df, 2525 - src_port, dst_port, xnet, !udp_sum); 2525 + src_port, dst_port, xnet, !udp_sum, 0); 2526 2526 #if IS_ENABLED(CONFIG_IPV6) 2527 2527 } else { 2528 2528 struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);
+1 -1
drivers/net/wireguard/socket.c
··· 84 84 skb->ignore_df = 1; 85 85 udp_tunnel_xmit_skb(rt, sock, skb, fl.saddr, fl.daddr, ds, 86 86 ip4_dst_hoplimit(&rt->dst), 0, fl.fl4_sport, 87 - fl.fl4_dport, false, false); 87 + fl.fl4_dport, false, false, 0); 88 88 goto out; 89 89 90 90 err:
+1 -1
include/net/ip_tunnels.h
··· 603 603 604 604 void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, 605 605 __be32 src, __be32 dst, u8 proto, 606 - u8 tos, u8 ttl, __be16 df, bool xnet); 606 + u8 tos, u8 ttl, __be16 df, bool xnet, u16 ipcb_flags); 607 607 struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, 608 608 gfp_t flags); 609 609 int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst,
+1 -1
include/net/udp_tunnel.h
··· 150 150 void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb, 151 151 __be32 src, __be32 dst, __u8 tos, __u8 ttl, 152 152 __be16 df, __be16 src_port, __be16 dst_port, 153 - bool xnet, bool nocheck); 153 + bool xnet, bool nocheck, u16 ipcb_flags); 154 154 155 155 int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, 156 156 struct sk_buff *skb,
+2 -2
net/ipv4/ip_tunnel.c
··· 668 668 ip_tunnel_adj_headroom(dev, headroom); 669 669 670 670 iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, proto, tos, ttl, 671 - df, !net_eq(tunnel->net, dev_net(dev))); 671 + df, !net_eq(tunnel->net, dev_net(dev)), 0); 672 672 return; 673 673 tx_error: 674 674 DEV_STATS_INC(dev, tx_errors); ··· 857 857 ip_tunnel_adj_headroom(dev, max_headroom); 858 858 859 859 iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, protocol, tos, ttl, 860 - df, !net_eq(tunnel->net, dev_net(dev))); 860 + df, !net_eq(tunnel->net, dev_net(dev)), 0); 861 861 return; 862 862 863 863 #if IS_ENABLED(CONFIG_IPV6)
+3 -1
net/ipv4/ip_tunnel_core.c
··· 49 49 50 50 void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, 51 51 __be32 src, __be32 dst, __u8 proto, 52 - __u8 tos, __u8 ttl, __be16 df, bool xnet) 52 + __u8 tos, __u8 ttl, __be16 df, bool xnet, 53 + u16 ipcb_flags) 53 54 { 54 55 int pkt_len = skb->len - skb_inner_network_offset(skb); 55 56 struct net *net = dev_net(rt->dst.dev); ··· 63 62 skb_clear_hash_if_not_l4(skb); 64 63 skb_dst_set(skb, &rt->dst); 65 64 memset(IPCB(skb), 0, sizeof(*IPCB(skb))); 65 + IPCB(skb)->flags = ipcb_flags; 66 66 67 67 /* Push down and install the IP header. */ 68 68 skb_push(skb, sizeof(struct iphdr));
+3 -2
net/ipv4/udp_tunnel_core.c
··· 169 169 void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb, 170 170 __be32 src, __be32 dst, __u8 tos, __u8 ttl, 171 171 __be16 df, __be16 src_port, __be16 dst_port, 172 - bool xnet, bool nocheck) 172 + bool xnet, bool nocheck, u16 ipcb_flags) 173 173 { 174 174 struct udphdr *uh; 175 175 ··· 185 185 186 186 udp_set_csum(nocheck, skb, src, dst, skb->len); 187 187 188 - iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, xnet); 188 + iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, xnet, 189 + ipcb_flags); 189 190 } 190 191 EXPORT_SYMBOL_GPL(udp_tunnel_xmit_skb); 191 192
+1 -1
net/ipv6/sit.c
··· 1035 1035 skb_set_inner_ipproto(skb, IPPROTO_IPV6); 1036 1036 1037 1037 iptunnel_xmit(NULL, rt, skb, fl4.saddr, fl4.daddr, protocol, tos, ttl, 1038 - df, !net_eq(tunnel->net, dev_net(dev))); 1038 + df, !net_eq(tunnel->net, dev_net(dev)), 0); 1039 1039 return NETDEV_TX_OK; 1040 1040 1041 1041 tx_error_icmp:
+2 -1
net/sctp/protocol.c
··· 1103 1103 skb_set_inner_ipproto(skb, IPPROTO_SCTP); 1104 1104 udp_tunnel_xmit_skb(dst_rtable(dst), sk, skb, fl4->saddr, 1105 1105 fl4->daddr, dscp, ip4_dst_hoplimit(dst), df, 1106 - sctp_sk(sk)->udp_port, t->encap_port, false, false); 1106 + sctp_sk(sk)->udp_port, t->encap_port, false, false, 1107 + 0); 1107 1108 return 0; 1108 1109 } 1109 1110
+1 -1
net/tipc/udp_media.c
··· 197 197 ttl = ip4_dst_hoplimit(&rt->dst); 198 198 udp_tunnel_xmit_skb(rt, ub->ubsock->sk, skb, src->ipv4.s_addr, 199 199 dst->ipv4.s_addr, 0, ttl, 0, src->port, 200 - dst->port, false, true); 200 + dst->port, false, true, 0); 201 201 #if IS_ENABLED(CONFIG_IPV6) 202 202 } else { 203 203 if (!ndst) {