hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/net/geneve.c
....@@ -1,11 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * GENEVE: Generic Network Virtualization Encapsulation
34 *
45 * Copyright (c) 2015 Red Hat, Inc.
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License version 2 as
8
- * published by the Free Software Foundation.
96 */
107
118 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
....@@ -14,6 +11,7 @@
1411 #include <linux/module.h>
1512 #include <linux/etherdevice.h>
1613 #include <linux/hash.h>
14
+#include <net/ipv6_stubs.h>
1715 #include <net/dst_metadata.h>
1816 #include <net/gro_cells.h>
1917 #include <net/rtnetlink.h>
....@@ -21,8 +19,6 @@
2119 #include <net/protocol.h>
2220
2321 #define GENEVE_NETDEV_VER "0.6"
24
-
25
-#define GENEVE_UDP_PORT 6081
2622
2723 #define GENEVE_N_VID (1u << 24)
2824 #define GENEVE_VID_MASK (GENEVE_N_VID - 1)
....@@ -52,6 +48,14 @@
5248 struct geneve_dev *geneve;
5349 };
5450
51
+struct geneve_config {
52
+ struct ip_tunnel_info info;
53
+ bool collect_md;
54
+ bool use_udp6_rx_checksums;
55
+ bool ttl_inherit;
56
+ enum ifla_geneve_df df;
57
+};
58
+
5559 /* Pseudo network device */
5660 struct geneve_dev {
5761 struct geneve_dev_node hlist4; /* vni hash table for IPv4 socket */
....@@ -60,15 +64,13 @@
6064 #endif
6165 struct net *net; /* netns for packet i/o */
6266 struct net_device *dev; /* netdev for geneve tunnel */
63
- struct ip_tunnel_info info;
6467 struct geneve_sock __rcu *sock4; /* IPv4 socket used for geneve tunnel */
6568 #if IS_ENABLED(CONFIG_IPV6)
6669 struct geneve_sock __rcu *sock6; /* IPv6 socket used for geneve tunnel */
6770 #endif
6871 struct list_head next; /* geneve's per namespace list */
6972 struct gro_cells gro_cells;
70
- bool collect_md;
71
- bool use_udp6_rx_checksums;
73
+ struct geneve_config cfg;
7274 };
7375
7476 struct geneve_sock {
....@@ -134,8 +136,8 @@
134136 hash = geneve_net_vni_hash(vni);
135137 vni_list_head = &gs->vni_list[hash];
136138 hlist_for_each_entry_rcu(node, vni_list_head, hlist) {
137
- if (eq_tun_id_and_vni((u8 *)&node->geneve->info.key.tun_id, vni) &&
138
- addr == node->geneve->info.key.u.ipv4.dst)
139
+ if (eq_tun_id_and_vni((u8 *)&node->geneve->cfg.info.key.tun_id, vni) &&
140
+ addr == node->geneve->cfg.info.key.u.ipv4.dst)
139141 return node->geneve;
140142 }
141143 return NULL;
....@@ -153,8 +155,8 @@
153155 hash = geneve_net_vni_hash(vni);
154156 vni_list_head = &gs->vni_list[hash];
155157 hlist_for_each_entry_rcu(node, vni_list_head, hlist) {
156
- if (eq_tun_id_and_vni((u8 *)&node->geneve->info.key.tun_id, vni) &&
157
- ipv6_addr_equal(&addr6, &node->geneve->info.key.u.ipv6.dst))
158
+ if (eq_tun_id_and_vni((u8 *)&node->geneve->cfg.info.key.tun_id, vni) &&
159
+ ipv6_addr_equal(&addr6, &node->geneve->cfg.info.key.u.ipv6.dst))
158160 return node->geneve;
159161 }
160162 return NULL;
....@@ -215,7 +217,6 @@
215217 {
216218 struct genevehdr *gnvh = geneve_hdr(skb);
217219 struct metadata_dst *tun_dst = NULL;
218
- struct pcpu_sw_netstats *stats;
219220 unsigned int len;
220221 int err = 0;
221222 void *oiph;
....@@ -293,13 +294,9 @@
293294
294295 len = skb->len;
295296 err = gro_cells_receive(&geneve->gro_cells, skb);
296
- if (likely(err == NET_RX_SUCCESS)) {
297
- stats = this_cpu_ptr(geneve->dev->tstats);
298
- u64_stats_update_begin(&stats->syncp);
299
- stats->rx_packets++;
300
- stats->rx_bytes += len;
301
- u64_stats_update_end(&stats->syncp);
302
- }
297
+ if (likely(err == NET_RX_SUCCESS))
298
+ dev_sw_netstats_rx_add(geneve->dev, len);
299
+
303300 return;
304301 drop:
305302 /* Consume bad packet */
....@@ -322,7 +319,7 @@
322319 return err;
323320 }
324321
325
- err = dst_cache_init(&geneve->info.dst_cache, GFP_KERNEL);
322
+ err = dst_cache_init(&geneve->cfg.info.dst_cache, GFP_KERNEL);
326323 if (err) {
327324 free_percpu(dev->tstats);
328325 gro_cells_destroy(&geneve->gro_cells);
....@@ -335,7 +332,7 @@
335332 {
336333 struct geneve_dev *geneve = netdev_priv(dev);
337334
338
- dst_cache_destroy(&geneve->info.dst_cache);
335
+ dst_cache_destroy(&geneve->cfg.info.dst_cache);
339336 gro_cells_destroy(&geneve->gro_cells);
340337 free_percpu(dev->tstats);
341338 }
....@@ -383,6 +380,59 @@
383380 /* Consume bad packet */
384381 kfree_skb(skb);
385382 return 0;
383
+}
384
+
385
+/* Callback from net/ipv{4,6}/udp.c to check that we have a tunnel for errors */
386
+static int geneve_udp_encap_err_lookup(struct sock *sk, struct sk_buff *skb)
387
+{
388
+ struct genevehdr *geneveh;
389
+ struct geneve_sock *gs;
390
+ u8 zero_vni[3] = { 0 };
391
+ u8 *vni = zero_vni;
392
+
393
+ if (!pskb_may_pull(skb, skb_transport_offset(skb) + GENEVE_BASE_HLEN))
394
+ return -EINVAL;
395
+
396
+ geneveh = geneve_hdr(skb);
397
+ if (geneveh->ver != GENEVE_VER)
398
+ return -EINVAL;
399
+
400
+ if (geneveh->proto_type != htons(ETH_P_TEB))
401
+ return -EINVAL;
402
+
403
+ gs = rcu_dereference_sk_user_data(sk);
404
+ if (!gs)
405
+ return -ENOENT;
406
+
407
+ if (geneve_get_sk_family(gs) == AF_INET) {
408
+ struct iphdr *iph = ip_hdr(skb);
409
+ __be32 addr4 = 0;
410
+
411
+ if (!gs->collect_md) {
412
+ vni = geneve_hdr(skb)->vni;
413
+ addr4 = iph->daddr;
414
+ }
415
+
416
+ return geneve_lookup(gs, addr4, vni) ? 0 : -ENOENT;
417
+ }
418
+
419
+#if IS_ENABLED(CONFIG_IPV6)
420
+ if (geneve_get_sk_family(gs) == AF_INET6) {
421
+ struct ipv6hdr *ip6h = ipv6_hdr(skb);
422
+ struct in6_addr addr6;
423
+
424
+ memset(&addr6, 0, sizeof(struct in6_addr));
425
+
426
+ if (!gs->collect_md) {
427
+ vni = geneve_hdr(skb)->vni;
428
+ addr6 = ip6h->daddr;
429
+ }
430
+
431
+ return geneve6_lookup(gs, addr6, vni) ? 0 : -ENOENT;
432
+ }
433
+#endif
434
+
435
+ return -EPFNOSUPPORT;
386436 }
387437
388438 static struct socket *geneve_create_sock(struct net *net, bool ipv6,
....@@ -542,6 +592,7 @@
542592 tunnel_cfg.gro_receive = geneve_gro_receive;
543593 tunnel_cfg.gro_complete = geneve_gro_complete;
544594 tunnel_cfg.encap_rcv = geneve_udp_encap_recv;
595
+ tunnel_cfg.encap_err_lookup = geneve_udp_encap_err_lookup;
545596 tunnel_cfg.encap_destroy = NULL;
546597 setup_udp_tunnel_sock(net, sock, &tunnel_cfg);
547598 list_add(&gs->list, &gn->sock_list);
....@@ -601,19 +652,19 @@
601652 __u8 vni[3];
602653 __u32 hash;
603654
604
- gs = geneve_find_sock(gn, ipv6 ? AF_INET6 : AF_INET, geneve->info.key.tp_dst);
655
+ gs = geneve_find_sock(gn, ipv6 ? AF_INET6 : AF_INET, geneve->cfg.info.key.tp_dst);
605656 if (gs) {
606657 gs->refcnt++;
607658 goto out;
608659 }
609660
610
- gs = geneve_socket_create(net, geneve->info.key.tp_dst, ipv6,
611
- geneve->use_udp6_rx_checksums);
661
+ gs = geneve_socket_create(net, geneve->cfg.info.key.tp_dst, ipv6,
662
+ geneve->cfg.use_udp6_rx_checksums);
612663 if (IS_ERR(gs))
613664 return PTR_ERR(gs);
614665
615666 out:
616
- gs->collect_md = geneve->collect_md;
667
+ gs->collect_md = geneve->cfg.collect_md;
617668 #if IS_ENABLED(CONFIG_IPV6)
618669 if (ipv6) {
619670 rcu_assign_pointer(geneve->sock6, gs);
....@@ -626,7 +677,7 @@
626677 }
627678 node->geneve = geneve;
628679
629
- tunnel_id_to_vni(geneve->info.key.tun_id, vni);
680
+ tunnel_id_to_vni(geneve->cfg.info.key.tun_id, vni);
630681 hash = geneve_net_vni_hash(vni);
631682 hlist_add_head_rcu(&node->hlist, &gs->vni_list[hash]);
632683 return 0;
....@@ -635,11 +686,11 @@
635686 static int geneve_open(struct net_device *dev)
636687 {
637688 struct geneve_dev *geneve = netdev_priv(dev);
638
- bool metadata = geneve->collect_md;
689
+ bool metadata = geneve->cfg.collect_md;
639690 bool ipv4, ipv6;
640691 int ret = 0;
641692
642
- ipv6 = geneve->info.mode & IP_TUNNEL_INFO_IPV6 || metadata;
693
+ ipv6 = geneve->cfg.info.mode & IP_TUNNEL_INFO_IPV6 || metadata;
643694 ipv4 = !ipv6 || metadata;
644695 #if IS_ENABLED(CONFIG_IPV6)
645696 if (ipv6) {
....@@ -721,7 +772,8 @@
721772 struct geneve_sock *gs4,
722773 struct flowi4 *fl4,
723774 const struct ip_tunnel_info *info,
724
- __be16 dport, __be16 sport)
775
+ __be16 dport, __be16 sport,
776
+ __u8 *full_tos)
725777 {
726778 bool use_cache = ip_tunnel_dst_cache_usable(skb, info);
727779 struct geneve_dev *geneve = netdev_priv(dev);
....@@ -741,11 +793,13 @@
741793 fl4->fl4_sport = sport;
742794
743795 tos = info->key.tos;
744
- if ((tos == 1) && !geneve->collect_md) {
796
+ if ((tos == 1) && !geneve->cfg.collect_md) {
745797 tos = ip_tunnel_get_dsfield(ip_hdr(skb), skb);
746798 use_cache = false;
747799 }
748800 fl4->flowi4_tos = RT_TOS(tos);
801
+ if (full_tos)
802
+ *full_tos = tos;
749803
750804 dst_cache = (struct dst_cache *)&info->dst_cache;
751805 if (use_cache) {
....@@ -794,13 +848,12 @@
794848 fl6->fl6_sport = sport;
795849
796850 prio = info->key.tos;
797
- if ((prio == 1) && !geneve->collect_md) {
851
+ if ((prio == 1) && !geneve->cfg.collect_md) {
798852 prio = ip_tunnel_get_dsfield(ip_hdr(skb), skb);
799853 use_cache = false;
800854 }
801855
802
- fl6->flowlabel = ip6_make_flowinfo(RT_TOS(prio),
803
- info->key.label);
856
+ fl6->flowlabel = ip6_make_flowinfo(prio, info->key.label);
804857 dst_cache = (struct dst_cache *)&info->dst_cache;
805858 if (use_cache) {
806859 dst = dst_cache_get_ip6(dst_cache, &fl6->saddr);
....@@ -834,9 +887,10 @@
834887 const struct ip_tunnel_key *key = &info->key;
835888 struct rtable *rt;
836889 struct flowi4 fl4;
890
+ __u8 full_tos;
837891 __u8 tos, ttl;
892
+ __be16 df = 0;
838893 __be16 sport;
839
- __be16 df;
840894 int err;
841895
842896 if (!pskb_inet_may_pull(skb))
....@@ -844,28 +898,79 @@
844898
845899 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
846900 rt = geneve_get_v4_rt(skb, dev, gs4, &fl4, info,
847
- geneve->info.key.tp_dst, sport);
901
+ geneve->cfg.info.key.tp_dst, sport, &full_tos);
848902 if (IS_ERR(rt))
849903 return PTR_ERR(rt);
850904
851
- skb_tunnel_check_pmtu(skb, &rt->dst,
852
- GENEVE_IPV4_HLEN + info->options_len);
905
+ err = skb_tunnel_check_pmtu(skb, &rt->dst,
906
+ GENEVE_IPV4_HLEN + info->options_len,
907
+ netif_is_any_bridge_port(dev));
908
+ if (err < 0) {
909
+ dst_release(&rt->dst);
910
+ return err;
911
+ } else if (err) {
912
+ struct ip_tunnel_info *info;
853913
854
- if (geneve->collect_md) {
914
+ info = skb_tunnel_info(skb);
915
+ if (info) {
916
+ struct ip_tunnel_info *unclone;
917
+
918
+ unclone = skb_tunnel_info_unclone(skb);
919
+ if (unlikely(!unclone)) {
920
+ dst_release(&rt->dst);
921
+ return -ENOMEM;
922
+ }
923
+
924
+ unclone->key.u.ipv4.dst = fl4.saddr;
925
+ unclone->key.u.ipv4.src = fl4.daddr;
926
+ }
927
+
928
+ if (!pskb_may_pull(skb, ETH_HLEN)) {
929
+ dst_release(&rt->dst);
930
+ return -EINVAL;
931
+ }
932
+
933
+ skb->protocol = eth_type_trans(skb, geneve->dev);
934
+ netif_rx(skb);
935
+ dst_release(&rt->dst);
936
+ return -EMSGSIZE;
937
+ }
938
+
939
+ if (geneve->cfg.collect_md) {
855940 tos = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
856941 ttl = key->ttl;
942
+
943
+ df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
857944 } else {
858
- tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, ip_hdr(skb), skb);
859
- ttl = key->ttl ? : ip4_dst_hoplimit(&rt->dst);
945
+ tos = ip_tunnel_ecn_encap(full_tos, ip_hdr(skb), skb);
946
+ if (geneve->cfg.ttl_inherit)
947
+ ttl = ip_tunnel_get_ttl(ip_hdr(skb), skb);
948
+ else
949
+ ttl = key->ttl;
950
+ ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
951
+
952
+ if (geneve->cfg.df == GENEVE_DF_SET) {
953
+ df = htons(IP_DF);
954
+ } else if (geneve->cfg.df == GENEVE_DF_INHERIT) {
955
+ struct ethhdr *eth = eth_hdr(skb);
956
+
957
+ if (ntohs(eth->h_proto) == ETH_P_IPV6) {
958
+ df = htons(IP_DF);
959
+ } else if (ntohs(eth->h_proto) == ETH_P_IP) {
960
+ struct iphdr *iph = ip_hdr(skb);
961
+
962
+ if (iph->frag_off & htons(IP_DF))
963
+ df = htons(IP_DF);
964
+ }
965
+ }
860966 }
861
- df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
862967
863968 err = geneve_build_skb(&rt->dst, skb, info, xnet, sizeof(struct iphdr));
864969 if (unlikely(err))
865970 return err;
866971
867972 udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, fl4.saddr, fl4.daddr,
868
- tos, ttl, df, sport, geneve->info.key.tp_dst,
973
+ tos, ttl, df, sport, geneve->cfg.info.key.tp_dst,
869974 !net_eq(geneve->net, dev_net(geneve->dev)),
870975 !(info->key.tun_flags & TUNNEL_CSUM));
871976 return 0;
....@@ -890,19 +995,54 @@
890995
891996 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
892997 dst = geneve_get_v6_dst(skb, dev, gs6, &fl6, info,
893
- geneve->info.key.tp_dst, sport);
998
+ geneve->cfg.info.key.tp_dst, sport);
894999 if (IS_ERR(dst))
8951000 return PTR_ERR(dst);
8961001
897
- skb_tunnel_check_pmtu(skb, dst, GENEVE_IPV6_HLEN + info->options_len);
1002
+ err = skb_tunnel_check_pmtu(skb, dst,
1003
+ GENEVE_IPV6_HLEN + info->options_len,
1004
+ netif_is_any_bridge_port(dev));
1005
+ if (err < 0) {
1006
+ dst_release(dst);
1007
+ return err;
1008
+ } else if (err) {
1009
+ struct ip_tunnel_info *info = skb_tunnel_info(skb);
8981010
899
- if (geneve->collect_md) {
1011
+ if (info) {
1012
+ struct ip_tunnel_info *unclone;
1013
+
1014
+ unclone = skb_tunnel_info_unclone(skb);
1015
+ if (unlikely(!unclone)) {
1016
+ dst_release(dst);
1017
+ return -ENOMEM;
1018
+ }
1019
+
1020
+ unclone->key.u.ipv6.dst = fl6.saddr;
1021
+ unclone->key.u.ipv6.src = fl6.daddr;
1022
+ }
1023
+
1024
+ if (!pskb_may_pull(skb, ETH_HLEN)) {
1025
+ dst_release(dst);
1026
+ return -EINVAL;
1027
+ }
1028
+
1029
+ skb->protocol = eth_type_trans(skb, geneve->dev);
1030
+ netif_rx(skb);
1031
+ dst_release(dst);
1032
+ return -EMSGSIZE;
1033
+ }
1034
+
1035
+ if (geneve->cfg.collect_md) {
9001036 prio = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
9011037 ttl = key->ttl;
9021038 } else {
9031039 prio = ip_tunnel_ecn_encap(ip6_tclass(fl6.flowlabel),
9041040 ip_hdr(skb), skb);
905
- ttl = key->ttl ? : ip6_dst_hoplimit(dst);
1041
+ if (geneve->cfg.ttl_inherit)
1042
+ ttl = ip_tunnel_get_ttl(ip_hdr(skb), skb);
1043
+ else
1044
+ ttl = key->ttl;
1045
+ ttl = ttl ? : ip6_dst_hoplimit(dst);
9061046 }
9071047 err = geneve_build_skb(dst, skb, info, xnet, sizeof(struct ipv6hdr));
9081048 if (unlikely(err))
....@@ -910,7 +1050,7 @@
9101050
9111051 udp_tunnel6_xmit_skb(dst, gs6->sock->sk, skb, dev,
9121052 &fl6.saddr, &fl6.daddr, prio, ttl,
913
- info->key.label, sport, geneve->info.key.tp_dst,
1053
+ info->key.label, sport, geneve->cfg.info.key.tp_dst,
9141054 !(info->key.tun_flags & TUNNEL_CSUM));
9151055 return 0;
9161056 }
....@@ -922,7 +1062,7 @@
9221062 struct ip_tunnel_info *info = NULL;
9231063 int err;
9241064
925
- if (geneve->collect_md) {
1065
+ if (geneve->cfg.collect_md) {
9261066 info = skb_tunnel_info(skb);
9271067 if (unlikely(!info || !(info->mode & IP_TUNNEL_INFO_TX))) {
9281068 netdev_dbg(dev, "no tunnel metadata\n");
....@@ -931,7 +1071,7 @@
9311071 return NETDEV_TX_OK;
9321072 }
9331073 } else {
934
- info = &geneve->info;
1074
+ info = &geneve->cfg.info;
9351075 }
9361076
9371077 rcu_read_lock();
....@@ -946,7 +1086,8 @@
9461086 if (likely(!err))
9471087 return NETDEV_TX_OK;
9481088
949
- dev_kfree_skb(skb);
1089
+ if (err != -EMSGSIZE)
1090
+ dev_kfree_skb(skb);
9501091
9511092 if (err == -ELOOP)
9521093 dev->stats.collisions++;
....@@ -983,7 +1124,7 @@
9831124 1, USHRT_MAX, true);
9841125
9851126 rt = geneve_get_v4_rt(skb, dev, gs4, &fl4, info,
986
- geneve->info.key.tp_dst, sport);
1127
+ geneve->cfg.info.key.tp_dst, sport, NULL);
9871128 if (IS_ERR(rt))
9881129 return PTR_ERR(rt);
9891130
....@@ -999,7 +1140,7 @@
9991140 1, USHRT_MAX, true);
10001141
10011142 dst = geneve_get_v6_dst(skb, dev, gs6, &fl6, info,
1002
- geneve->info.key.tp_dst, sport);
1143
+ geneve->cfg.info.key.tp_dst, sport);
10031144 if (IS_ERR(dst))
10041145 return PTR_ERR(dst);
10051146
....@@ -1011,7 +1152,7 @@
10111152 }
10121153
10131154 info->key.tp_src = sport;
1014
- info->key.tp_dst = geneve->info.key.tp_dst;
1155
+ info->key.tp_dst = geneve->cfg.info.key.tp_dst;
10151156 return 0;
10161157 }
10171158
....@@ -1103,7 +1244,7 @@
11031244
11041245 static const struct nla_policy geneve_policy[IFLA_GENEVE_MAX + 1] = {
11051246 [IFLA_GENEVE_ID] = { .type = NLA_U32 },
1106
- [IFLA_GENEVE_REMOTE] = { .len = FIELD_SIZEOF(struct iphdr, daddr) },
1247
+ [IFLA_GENEVE_REMOTE] = { .len = sizeof_field(struct iphdr, daddr) },
11071248 [IFLA_GENEVE_REMOTE6] = { .len = sizeof(struct in6_addr) },
11081249 [IFLA_GENEVE_TTL] = { .type = NLA_U8 },
11091250 [IFLA_GENEVE_TOS] = { .type = NLA_U8 },
....@@ -1113,6 +1254,8 @@
11131254 [IFLA_GENEVE_UDP_CSUM] = { .type = NLA_U8 },
11141255 [IFLA_GENEVE_UDP_ZERO_CSUM6_TX] = { .type = NLA_U8 },
11151256 [IFLA_GENEVE_UDP_ZERO_CSUM6_RX] = { .type = NLA_U8 },
1257
+ [IFLA_GENEVE_TTL_INHERIT] = { .type = NLA_U8 },
1258
+ [IFLA_GENEVE_DF] = { .type = NLA_U8 },
11161259 };
11171260
11181261 static int geneve_validate(struct nlattr *tb[], struct nlattr *data[],
....@@ -1148,6 +1291,16 @@
11481291 }
11491292 }
11501293
1294
+ if (data[IFLA_GENEVE_DF]) {
1295
+ enum ifla_geneve_df df = nla_get_u8(data[IFLA_GENEVE_DF]);
1296
+
1297
+ if (df < 0 || df > GENEVE_DF_MAX) {
1298
+ NL_SET_ERR_MSG_ATTR(extack, data[IFLA_GENEVE_DF],
1299
+ "Invalid DF attribute");
1300
+ return -EINVAL;
1301
+ }
1302
+ }
1303
+
11511304 return 0;
11521305 }
11531306
....@@ -1161,13 +1314,13 @@
11611314 *tun_on_same_port = false;
11621315 *tun_collect_md = false;
11631316 list_for_each_entry(geneve, &gn->geneve_list, next) {
1164
- if (info->key.tp_dst == geneve->info.key.tp_dst) {
1165
- *tun_collect_md = geneve->collect_md;
1317
+ if (info->key.tp_dst == geneve->cfg.info.key.tp_dst) {
1318
+ *tun_collect_md = geneve->cfg.collect_md;
11661319 *tun_on_same_port = true;
11671320 }
1168
- if (info->key.tun_id == geneve->info.key.tun_id &&
1169
- info->key.tp_dst == geneve->info.key.tp_dst &&
1170
- !memcmp(&info->key.u, &geneve->info.key.u, sizeof(info->key.u)))
1321
+ if (info->key.tun_id == geneve->cfg.info.key.tun_id &&
1322
+ info->key.tp_dst == geneve->cfg.info.key.tp_dst &&
1323
+ !memcmp(&info->key.u, &geneve->cfg.info.key.u, sizeof(info->key.u)))
11711324 t = geneve;
11721325 }
11731326 return t;
....@@ -1191,15 +1344,15 @@
11911344
11921345 static int geneve_configure(struct net *net, struct net_device *dev,
11931346 struct netlink_ext_ack *extack,
1194
- const struct ip_tunnel_info *info,
1195
- bool metadata, bool ipv6_rx_csum)
1347
+ const struct geneve_config *cfg)
11961348 {
11971349 struct geneve_net *gn = net_generic(net, geneve_net_id);
11981350 struct geneve_dev *t, *geneve = netdev_priv(dev);
1351
+ const struct ip_tunnel_info *info = &cfg->info;
11991352 bool tun_collect_md, tun_on_same_port;
12001353 int err, encap_len;
12011354
1202
- if (metadata && !is_tnl_info_zero(info)) {
1355
+ if (cfg->collect_md && !is_tnl_info_zero(info)) {
12031356 NL_SET_ERR_MSG(extack,
12041357 "Device is externally controlled, so attributes (VNI, Port, and so on) must not be specified");
12051358 return -EINVAL;
....@@ -1214,7 +1367,7 @@
12141367
12151368 /* make enough headroom for basic scenario */
12161369 encap_len = GENEVE_BASE_HLEN + ETH_HLEN;
1217
- if (!metadata && ip_tunnel_info_af(info) == AF_INET) {
1370
+ if (!cfg->collect_md && ip_tunnel_info_af(info) == AF_INET) {
12181371 encap_len += sizeof(struct iphdr);
12191372 dev->max_mtu -= sizeof(struct iphdr);
12201373 } else {
....@@ -1223,7 +1376,7 @@
12231376 }
12241377 dev->needed_headroom = encap_len + ETH_HLEN;
12251378
1226
- if (metadata) {
1379
+ if (cfg->collect_md) {
12271380 if (tun_on_same_port) {
12281381 NL_SET_ERR_MSG(extack,
12291382 "There can be only one externally controlled device on a destination port");
....@@ -1237,10 +1390,8 @@
12371390 }
12381391 }
12391392
1240
- dst_cache_reset(&geneve->info.dst_cache);
1241
- geneve->info = *info;
1242
- geneve->collect_md = metadata;
1243
- geneve->use_udp6_rx_checksums = ipv6_rx_csum;
1393
+ dst_cache_reset(&geneve->cfg.info.dst_cache);
1394
+ memcpy(&geneve->cfg, cfg, sizeof(*cfg));
12441395
12451396 err = register_netdevice(dev);
12461397 if (err)
....@@ -1258,9 +1409,9 @@
12581409
12591410 static int geneve_nl2info(struct nlattr *tb[], struct nlattr *data[],
12601411 struct netlink_ext_ack *extack,
1261
- struct ip_tunnel_info *info, bool *metadata,
1262
- bool *use_udp6_rx_checksums, bool changelink)
1412
+ struct geneve_config *cfg, bool changelink)
12631413 {
1414
+ struct ip_tunnel_info *info = &cfg->info;
12641415 int attrtype;
12651416
12661417 if (data[IFLA_GENEVE_REMOTE] && data[IFLA_GENEVE_REMOTE6]) {
....@@ -1278,7 +1429,7 @@
12781429 info->key.u.ipv4.dst =
12791430 nla_get_in_addr(data[IFLA_GENEVE_REMOTE]);
12801431
1281
- if (IN_MULTICAST(ntohl(info->key.u.ipv4.dst))) {
1432
+ if (ipv4_is_multicast(info->key.u.ipv4.dst)) {
12821433 NL_SET_ERR_MSG_ATTR(extack, data[IFLA_GENEVE_REMOTE],
12831434 "Remote IPv4 address cannot be Multicast");
12841435 return -EINVAL;
....@@ -1308,7 +1459,7 @@
13081459 return -EINVAL;
13091460 }
13101461 info->key.tun_flags |= TUNNEL_CSUM;
1311
- *use_udp6_rx_checksums = true;
1462
+ cfg->use_udp6_rx_checksums = true;
13121463 #else
13131464 NL_SET_ERR_MSG_ATTR(extack, data[IFLA_GENEVE_REMOTE6],
13141465 "IPv6 support not enabled in the kernel");
....@@ -1334,11 +1485,21 @@
13341485 info->key.tun_id = tunid;
13351486 }
13361487
1337
- if (data[IFLA_GENEVE_TTL])
1488
+ if (data[IFLA_GENEVE_TTL_INHERIT]) {
1489
+ if (nla_get_u8(data[IFLA_GENEVE_TTL_INHERIT]))
1490
+ cfg->ttl_inherit = true;
1491
+ else
1492
+ cfg->ttl_inherit = false;
1493
+ } else if (data[IFLA_GENEVE_TTL]) {
13381494 info->key.ttl = nla_get_u8(data[IFLA_GENEVE_TTL]);
1495
+ cfg->ttl_inherit = false;
1496
+ }
13391497
13401498 if (data[IFLA_GENEVE_TOS])
13411499 info->key.tos = nla_get_u8(data[IFLA_GENEVE_TOS]);
1500
+
1501
+ if (data[IFLA_GENEVE_DF])
1502
+ cfg->df = nla_get_u8(data[IFLA_GENEVE_DF]);
13421503
13431504 if (data[IFLA_GENEVE_LABEL]) {
13441505 info->key.label = nla_get_be32(data[IFLA_GENEVE_LABEL]) &
....@@ -1363,7 +1524,7 @@
13631524 attrtype = IFLA_GENEVE_COLLECT_METADATA;
13641525 goto change_notsup;
13651526 }
1366
- *metadata = true;
1527
+ cfg->collect_md = true;
13671528 }
13681529
13691530 if (data[IFLA_GENEVE_UDP_CSUM]) {
....@@ -1397,7 +1558,7 @@
13971558 goto change_notsup;
13981559 }
13991560 if (nla_get_u8(data[IFLA_GENEVE_UDP_ZERO_CSUM6_RX]))
1400
- *use_udp6_rx_checksums = false;
1561
+ cfg->use_udp6_rx_checksums = false;
14011562 #else
14021563 NL_SET_ERR_MSG_ATTR(extack, data[IFLA_GENEVE_UDP_ZERO_CSUM6_RX],
14031564 "IPv6 support not enabled in the kernel");
....@@ -1462,23 +1623,24 @@
14621623 struct nlattr *tb[], struct nlattr *data[],
14631624 struct netlink_ext_ack *extack)
14641625 {
1465
- bool use_udp6_rx_checksums = false;
1466
- struct ip_tunnel_info info;
1467
- bool metadata = false;
1626
+ struct geneve_config cfg = {
1627
+ .df = GENEVE_DF_UNSET,
1628
+ .use_udp6_rx_checksums = false,
1629
+ .ttl_inherit = false,
1630
+ .collect_md = false,
1631
+ };
14681632 int err;
14691633
1470
- init_tnl_info(&info, GENEVE_UDP_PORT);
1471
- err = geneve_nl2info(tb, data, extack, &info, &metadata,
1472
- &use_udp6_rx_checksums, false);
1634
+ init_tnl_info(&cfg.info, GENEVE_UDP_PORT);
1635
+ err = geneve_nl2info(tb, data, extack, &cfg, false);
14731636 if (err)
14741637 return err;
14751638
1476
- err = geneve_configure(net, dev, extack, &info, metadata,
1477
- use_udp6_rx_checksums);
1639
+ err = geneve_configure(net, dev, extack, &cfg);
14781640 if (err)
14791641 return err;
14801642
1481
- geneve_link_config(dev, &info, tb);
1643
+ geneve_link_config(dev, &cfg.info, tb);
14821644
14831645 return 0;
14841646 }
....@@ -1534,35 +1696,28 @@
15341696 {
15351697 struct geneve_dev *geneve = netdev_priv(dev);
15361698 struct geneve_sock *gs4, *gs6;
1537
- struct ip_tunnel_info info;
1538
- bool metadata;
1539
- bool use_udp6_rx_checksums;
1699
+ struct geneve_config cfg;
15401700 int err;
15411701
15421702 /* If the geneve device is configured for metadata (or externally
15431703 * controlled, for example, OVS), then nothing can be changed.
15441704 */
1545
- if (geneve->collect_md)
1705
+ if (geneve->cfg.collect_md)
15461706 return -EOPNOTSUPP;
15471707
15481708 /* Start with the existing info. */
1549
- memcpy(&info, &geneve->info, sizeof(info));
1550
- metadata = geneve->collect_md;
1551
- use_udp6_rx_checksums = geneve->use_udp6_rx_checksums;
1552
- err = geneve_nl2info(tb, data, extack, &info, &metadata,
1553
- &use_udp6_rx_checksums, true);
1709
+ memcpy(&cfg, &geneve->cfg, sizeof(cfg));
1710
+ err = geneve_nl2info(tb, data, extack, &cfg, true);
15541711 if (err)
15551712 return err;
15561713
1557
- if (!geneve_dst_addr_equal(&geneve->info, &info)) {
1558
- dst_cache_reset(&info.dst_cache);
1559
- geneve_link_config(dev, &info, tb);
1714
+ if (!geneve_dst_addr_equal(&geneve->cfg.info, &cfg.info)) {
1715
+ dst_cache_reset(&cfg.info.dst_cache);
1716
+ geneve_link_config(dev, &cfg.info, tb);
15601717 }
15611718
15621719 geneve_quiesce(geneve, &gs4, &gs6);
1563
- geneve->info = info;
1564
- geneve->collect_md = metadata;
1565
- geneve->use_udp6_rx_checksums = use_udp6_rx_checksums;
1720
+ memcpy(&geneve->cfg, &cfg, sizeof(cfg));
15661721 geneve_unquiesce(geneve, gs4, gs6);
15671722
15681723 return 0;
....@@ -1582,20 +1737,23 @@
15821737 nla_total_size(sizeof(struct in6_addr)) + /* IFLA_GENEVE_REMOTE{6} */
15831738 nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_TTL */
15841739 nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_TOS */
1740
+ nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_DF */
15851741 nla_total_size(sizeof(__be32)) + /* IFLA_GENEVE_LABEL */
15861742 nla_total_size(sizeof(__be16)) + /* IFLA_GENEVE_PORT */
15871743 nla_total_size(0) + /* IFLA_GENEVE_COLLECT_METADATA */
15881744 nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_UDP_CSUM */
15891745 nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_UDP_ZERO_CSUM6_TX */
15901746 nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_UDP_ZERO_CSUM6_RX */
1747
+ nla_total_size(sizeof(__u8)) + /* IFLA_GENEVE_TTL_INHERIT */
15911748 0;
15921749 }
15931750
15941751 static int geneve_fill_info(struct sk_buff *skb, const struct net_device *dev)
15951752 {
15961753 struct geneve_dev *geneve = netdev_priv(dev);
1597
- struct ip_tunnel_info *info = &geneve->info;
1598
- bool metadata = geneve->collect_md;
1754
+ struct ip_tunnel_info *info = &geneve->cfg.info;
1755
+ bool ttl_inherit = geneve->cfg.ttl_inherit;
1756
+ bool metadata = geneve->cfg.collect_md;
15991757 __u8 tmp_vni[3];
16001758 __u32 vni;
16011759
....@@ -1628,6 +1786,9 @@
16281786 nla_put_be32(skb, IFLA_GENEVE_LABEL, info->key.label))
16291787 goto nla_put_failure;
16301788
1789
+ if (nla_put_u8(skb, IFLA_GENEVE_DF, geneve->cfg.df))
1790
+ goto nla_put_failure;
1791
+
16311792 if (nla_put_be16(skb, IFLA_GENEVE_PORT, info->key.tp_dst))
16321793 goto nla_put_failure;
16331794
....@@ -1636,9 +1797,12 @@
16361797
16371798 #if IS_ENABLED(CONFIG_IPV6)
16381799 if (nla_put_u8(skb, IFLA_GENEVE_UDP_ZERO_CSUM6_RX,
1639
- !geneve->use_udp6_rx_checksums))
1800
+ !geneve->cfg.use_udp6_rx_checksums))
16401801 goto nla_put_failure;
16411802 #endif
1803
+
1804
+ if (nla_put_u8(skb, IFLA_GENEVE_TTL_INHERIT, ttl_inherit))
1805
+ goto nla_put_failure;
16421806
16431807 return 0;
16441808
....@@ -1664,19 +1828,24 @@
16641828 u8 name_assign_type, u16 dst_port)
16651829 {
16661830 struct nlattr *tb[IFLA_MAX + 1];
1667
- struct ip_tunnel_info info;
16681831 struct net_device *dev;
16691832 LIST_HEAD(list_kill);
16701833 int err;
1834
+ struct geneve_config cfg = {
1835
+ .df = GENEVE_DF_UNSET,
1836
+ .use_udp6_rx_checksums = true,
1837
+ .ttl_inherit = false,
1838
+ .collect_md = true,
1839
+ };
16711840
16721841 memset(tb, 0, sizeof(tb));
16731842 dev = rtnl_create_link(net, name, name_assign_type,
1674
- &geneve_link_ops, tb);
1843
+ &geneve_link_ops, tb, NULL);
16751844 if (IS_ERR(dev))
16761845 return dev;
16771846
1678
- init_tnl_info(&info, dst_port);
1679
- err = geneve_configure(net, dev, NULL, &info, true, true);
1847
+ init_tnl_info(&cfg.info, dst_port);
1848
+ err = geneve_configure(net, dev, NULL, &cfg);
16801849 if (err) {
16811850 free_netdev(dev);
16821851 return ERR_PTR(err);
....@@ -1710,9 +1879,11 @@
17101879 event == NETDEV_UDP_TUNNEL_DROP_INFO) {
17111880 geneve_offload_rx_ports(dev, event == NETDEV_UDP_TUNNEL_PUSH_INFO);
17121881 } else if (event == NETDEV_UNREGISTER) {
1713
- geneve_offload_rx_ports(dev, false);
1882
+ if (!dev->udp_tunnel_nic_info)
1883
+ geneve_offload_rx_ports(dev, false);
17141884 } else if (event == NETDEV_REGISTER) {
1715
- geneve_offload_rx_ports(dev, true);
1885
+ if (!dev->udp_tunnel_nic_info)
1886
+ geneve_offload_rx_ports(dev, true);
17161887 }
17171888
17181889 return NOTIFY_DONE;