Lines Matching refs:geneve
19 #include <net/geneve.h>
50 struct geneve_dev *geneve;
69 struct net_device *dev; /* netdev for geneve tunnel */
70 struct geneve_sock __rcu *sock4; /* IPv4 socket used for geneve tunnel */
72 struct geneve_sock __rcu *sock6; /* IPv6 socket used for geneve tunnel */
74 struct list_head next; /* geneve's per namespace list */
142 if (eq_tun_id_and_vni((u8 *)&node->geneve->cfg.info.key.tun_id, vni) &&
143 addr == node->geneve->cfg.info.key.u.ipv4.dst)
144 return node->geneve;
161 if (eq_tun_id_and_vni((u8 *)&node->geneve->cfg.info.key.tun_id, vni) &&
162 ipv6_addr_equal(&addr6, &node->geneve->cfg.info.key.u.ipv6.dst))
163 return node->geneve;
217 /* geneve receive/decap routine */
218 static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
237 geneve->dev->stats.rx_dropped++;
249 geneve->dev->stats.rx_frame_errors++;
250 geneve->dev->stats.rx_errors++;
260 skb->protocol = eth_type_trans(skb, geneve->dev);
265 geneve->dev->dev_addr)) {
266 geneve->dev->stats.rx_errors++;
271 skb->dev = geneve->dev;
284 DEV_STATS_INC(geneve->dev, rx_length_errors);
285 DEV_STATS_INC(geneve->dev, rx_errors);
313 ++geneve->dev->stats.rx_frame_errors;
314 ++geneve->dev->stats.rx_errors;
320 err = gro_cells_receive(&geneve->gro_cells, skb);
322 dev_sw_netstats_rx_add(geneve->dev, len);
333 struct geneve_dev *geneve = netdev_priv(dev);
340 err = gro_cells_init(&geneve->gro_cells, dev);
346 err = dst_cache_init(&geneve->cfg.info.dst_cache, GFP_KERNEL);
349 gro_cells_destroy(&geneve->gro_cells);
357 struct geneve_dev *geneve = netdev_priv(dev);
359 dst_cache_destroy(&geneve->cfg.info.dst_cache);
360 gro_cells_destroy(&geneve->gro_cells);
368 struct geneve_dev *geneve;
386 geneve = geneve_lookup_skb(gs, skb);
387 if (!geneve)
392 if (unlikely((!geneve->cfg.inner_proto_inherit &&
394 geneve->dev->stats.rx_dropped++;
400 !net_eq(geneve->net, dev_net(geneve->dev)))) {
401 geneve->dev->stats.rx_dropped++;
405 geneve_rx(geneve, gs, skb);
612 /* Initialize the geneve udp offloads structure */
640 static void geneve_sock_release(struct geneve_dev *geneve)
642 struct geneve_sock *gs4 = rtnl_dereference(geneve->sock4);
644 struct geneve_sock *gs6 = rtnl_dereference(geneve->sock6);
646 rcu_assign_pointer(geneve->sock6, NULL);
649 rcu_assign_pointer(geneve->sock4, NULL);
673 static int geneve_sock_add(struct geneve_dev *geneve, bool ipv6)
675 struct net *net = geneve->net;
682 gs = geneve_find_sock(gn, ipv6 ? AF_INET6 : AF_INET, geneve->cfg.info.key.tp_dst);
688 gs = geneve_socket_create(net, geneve->cfg.info.key.tp_dst, ipv6,
689 geneve->cfg.use_udp6_rx_checksums);
694 gs->collect_md = geneve->cfg.collect_md;
697 rcu_assign_pointer(geneve->sock6, gs);
698 node = &geneve->hlist6;
702 rcu_assign_pointer(geneve->sock4, gs);
703 node = &geneve->hlist4;
705 node->geneve = geneve;
707 tunnel_id_to_vni(geneve->cfg.info.key.tun_id, vni);
715 struct geneve_dev *geneve = netdev_priv(dev);
716 bool metadata = geneve->cfg.collect_md;
720 ipv6 = geneve->cfg.info.mode & IP_TUNNEL_INFO_IPV6 || metadata;
724 ret = geneve_sock_add(geneve, true);
730 ret = geneve_sock_add(geneve, false);
732 geneve_sock_release(geneve);
739 struct geneve_dev *geneve = netdev_priv(dev);
741 hlist_del_init_rcu(&geneve->hlist4.hlist);
743 hlist_del_init_rcu(&geneve->hlist6.hlist);
745 geneve_sock_release(geneve);
810 struct geneve_dev *geneve = netdev_priv(dev);
828 if ((tos == 1) && !geneve->cfg.collect_md) {
842 rt = ip_route_output_key(geneve->net, fl4);
866 struct geneve_dev *geneve = netdev_priv(dev);
883 if ((prio == 1) && !geneve->cfg.collect_md) {
895 dst = ipv6_stub->ipv6_dst_lookup_flow(geneve->net, gs6->sock->sk, fl6,
914 struct geneve_dev *geneve,
917 bool xnet = !net_eq(geneve->net, dev_net(geneve->dev));
918 struct geneve_sock *gs4 = rcu_dereference(geneve->sock4);
931 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
933 geneve->cfg.info.key.tp_dst, sport, &full_tos);
965 skb->protocol = eth_type_trans(skb, geneve->dev);
971 if (geneve->cfg.collect_md) {
978 if (geneve->cfg.ttl_inherit)
984 if (geneve->cfg.df == GENEVE_DF_SET) {
986 } else if (geneve->cfg.df == GENEVE_DF_INHERIT) {
1001 geneve->cfg.inner_proto_inherit);
1006 tos, ttl, df, sport, geneve->cfg.info.key.tp_dst,
1007 !net_eq(geneve->net, dev_net(geneve->dev)),
1014 struct geneve_dev *geneve,
1017 bool xnet = !net_eq(geneve->net, dev_net(geneve->dev));
1018 struct geneve_sock *gs6 = rcu_dereference(geneve->sock6);
1029 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
1031 geneve->cfg.info.key.tp_dst, sport);
1062 skb->protocol = eth_type_trans(skb, geneve->dev);
1068 if (geneve->cfg.collect_md) {
1074 if (geneve->cfg.ttl_inherit)
1081 geneve->cfg.inner_proto_inherit);
1087 info->key.label, sport, geneve->cfg.info.key.tp_dst,
1095 struct geneve_dev *geneve = netdev_priv(dev);
1099 if (geneve->cfg.collect_md) {
1108 info = &geneve->cfg.info;
1114 err = geneve6_xmit_skb(skb, dev, geneve, info);
1117 err = geneve_xmit_skb(skb, dev, geneve, info);
1149 struct geneve_dev *geneve = netdev_priv(dev);
1156 struct geneve_sock *gs4 = rcu_dereference(geneve->sock4);
1157 sport = udp_flow_src_port(geneve->net, skb,
1161 geneve->cfg.info.key.tp_dst, sport, NULL);
1172 struct geneve_sock *gs6 = rcu_dereference(geneve->sock6);
1173 sport = udp_flow_src_port(geneve->net, skb,
1177 geneve->cfg.info.key.tp_dst, sport);
1189 info->key.tp_dst = geneve->cfg.info.key.tp_dst;
1210 strscpy(drvinfo->driver, "geneve", sizeof(drvinfo->driver));
1220 .name = "geneve",
1349 struct geneve_dev *geneve, *t = NULL;
1353 list_for_each_entry(geneve, &gn->geneve_list, next) {
1354 if (info->key.tp_dst == geneve->cfg.info.key.tp_dst) {
1355 *tun_collect_md = geneve->cfg.collect_md;
1358 if (info->key.tun_id == geneve->cfg.info.key.tun_id &&
1359 info->key.tp_dst == geneve->cfg.info.key.tp_dst &&
1360 !memcmp(&info->key.u, &geneve->cfg.info.key.u, sizeof(info->key.u)))
1361 t = geneve;
1387 struct geneve_dev *t, *geneve = netdev_priv(dev);
1398 geneve->net = net;
1399 geneve->dev = dev;
1430 dst_cache_reset(&geneve->cfg.info.dst_cache);
1431 memcpy(&geneve->cfg, cfg, sizeof(*cfg));
1433 if (geneve->cfg.inner_proto_inherit) {
1445 list_add(&geneve->next, &gn->geneve_list);
1632 struct geneve_dev *geneve = netdev_priv(dev);
1643 struct rtable *rt = ip_route_output_key(geneve->net, &fl4);
1658 rt = rt6_lookup(geneve->net, &info->key.u.ipv6.dst, NULL, 0,
1701 /* Quiesces the geneve device data path for both TX and RX.
1703 * On transmit geneve checks for non-NULL geneve_sock before it proceeds.
1709 * On receive geneve dereference the geneve_sock stashed in the socket. So,
1713 static void geneve_quiesce(struct geneve_dev *geneve, struct geneve_sock **gs4,
1716 *gs4 = rtnl_dereference(geneve->sock4);
1717 rcu_assign_pointer(geneve->sock4, NULL);
1721 *gs6 = rtnl_dereference(geneve->sock6);
1722 rcu_assign_pointer(geneve->sock6, NULL);
1731 /* Resumes the geneve device data path for both TX and RX. */
1732 static void geneve_unquiesce(struct geneve_dev *geneve, struct geneve_sock *gs4,
1735 rcu_assign_pointer(geneve->sock4, gs4);
1739 rcu_assign_pointer(geneve->sock6, gs6);
1750 struct geneve_dev *geneve = netdev_priv(dev);
1755 /* If the geneve device is configured for metadata (or externally
1758 if (geneve->cfg.collect_md)
1762 memcpy(&cfg, &geneve->cfg, sizeof(cfg));
1767 if (!geneve_dst_addr_equal(&geneve->cfg.info, &cfg.info)) {
1772 geneve_quiesce(geneve, &gs4, &gs6);
1773 memcpy(&geneve->cfg, &cfg, sizeof(cfg));
1774 geneve_unquiesce(geneve, gs4, gs6);
1781 struct geneve_dev *geneve = netdev_priv(dev);
1783 list_del(&geneve->next);
1807 struct geneve_dev *geneve = netdev_priv(dev);
1808 struct ip_tunnel_info *info = &geneve->cfg.info;
1809 bool ttl_inherit = geneve->cfg.ttl_inherit;
1810 bool metadata = geneve->cfg.collect_md;
1843 if (nla_put_u8(skb, IFLA_GENEVE_DF, geneve->cfg.df))
1854 !geneve->cfg.use_udp6_rx_checksums))
1861 if (geneve->cfg.inner_proto_inherit &&
1872 .kind = "geneve",
1960 struct geneve_dev *geneve, *next;
1963 /* gather any geneve devices that were moved into this ns */
1968 /* now gather any other geneve devices that were created in this ns */
1969 list_for_each_entry_safe(geneve, next, &gn->geneve_list, next) {
1970 /* If geneve->dev is in the same netns, it was already added
1973 if (!net_eq(dev_net(geneve->dev), net))
1974 unregister_netdevice_queue(geneve->dev, head);
2043 MODULE_ALIAS_RTNL_LINK("geneve");