Lines Matching defs: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,
238 DEV_STATS_INC(geneve->dev, rx_dropped);
252 DEV_STATS_INC(geneve->dev, rx_frame_errors);
253 DEV_STATS_INC(geneve->dev, rx_errors);
263 skb->protocol = eth_type_trans(skb, geneve->dev);
268 geneve->dev->dev_addr)) {
269 DEV_STATS_INC(geneve->dev, rx_errors);
274 skb->dev = geneve->dev;
287 DEV_STATS_INC(geneve->dev, rx_length_errors);
288 DEV_STATS_INC(geneve->dev, rx_errors);
316 DEV_STATS_INC(geneve->dev, rx_frame_errors);
317 DEV_STATS_INC(geneve->dev, rx_errors);
323 err = gro_cells_receive(&geneve->gro_cells, skb);
325 dev_sw_netstats_rx_add(geneve->dev, len);
336 struct geneve_dev *geneve = netdev_priv(dev);
339 err = gro_cells_init(&geneve->gro_cells, dev);
343 err = dst_cache_init(&geneve->cfg.info.dst_cache, GFP_KERNEL);
345 gro_cells_destroy(&geneve->gro_cells);
354 struct geneve_dev *geneve = netdev_priv(dev);
356 dst_cache_destroy(&geneve->cfg.info.dst_cache);
357 gro_cells_destroy(&geneve->gro_cells);
364 struct geneve_dev *geneve;
382 geneve = geneve_lookup_skb(gs, skb);
383 if (!geneve)
388 if (unlikely((!geneve->cfg.inner_proto_inherit &&
390 DEV_STATS_INC(geneve->dev, rx_dropped);
396 !net_eq(geneve->net, dev_net(geneve->dev)))) {
397 DEV_STATS_INC(geneve->dev, rx_dropped);
401 geneve_rx(geneve, gs, skb);
608 /* Initialize the geneve udp offloads structure */
636 static void geneve_sock_release(struct geneve_dev *geneve)
638 struct geneve_sock *gs4 = rtnl_dereference(geneve->sock4);
640 struct geneve_sock *gs6 = rtnl_dereference(geneve->sock6);
642 rcu_assign_pointer(geneve->sock6, NULL);
645 rcu_assign_pointer(geneve->sock4, NULL);
669 static int geneve_sock_add(struct geneve_dev *geneve, bool ipv6)
671 struct net *net = geneve->net;
678 gs = geneve_find_sock(gn, ipv6 ? AF_INET6 : AF_INET, geneve->cfg.info.key.tp_dst);
684 gs = geneve_socket_create(net, geneve->cfg.info.key.tp_dst, ipv6,
685 geneve->cfg.use_udp6_rx_checksums);
690 gs->collect_md = geneve->cfg.collect_md;
693 rcu_assign_pointer(geneve->sock6, gs);
694 node = &geneve->hlist6;
698 rcu_assign_pointer(geneve->sock4, gs);
699 node = &geneve->hlist4;
701 node->geneve = geneve;
703 tunnel_id_to_vni(geneve->cfg.info.key.tun_id, vni);
711 struct geneve_dev *geneve = netdev_priv(dev);
712 bool metadata = geneve->cfg.collect_md;
716 ipv6 = geneve->cfg.info.mode & IP_TUNNEL_INFO_IPV6 || metadata;
720 ret = geneve_sock_add(geneve, true);
726 ret = geneve_sock_add(geneve, false);
728 geneve_sock_release(geneve);
735 struct geneve_dev *geneve = netdev_priv(dev);
737 hlist_del_init_rcu(&geneve->hlist4.hlist);
739 hlist_del_init_rcu(&geneve->hlist6.hlist);
741 geneve_sock_release(geneve);
802 struct geneve_dev *geneve = netdev_priv(dev);
806 if (dsfield == 1 && !geneve->cfg.collect_md) {
815 struct geneve_dev *geneve,
818 bool xnet = !net_eq(geneve->net, dev_net(geneve->dev));
819 struct geneve_sock *gs4 = rcu_dereference(geneve->sock4);
837 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
839 rt = udp_tunnel_dst_lookup(skb, dev, geneve->net, 0, &saddr,
841 sport, geneve->cfg.info.key.tp_dst, tos,
875 skb->protocol = eth_type_trans(skb, geneve->dev);
882 if (geneve->cfg.collect_md) {
888 if (geneve->cfg.ttl_inherit)
894 if (geneve->cfg.df == GENEVE_DF_SET) {
896 } else if (geneve->cfg.df == GENEVE_DF_INHERIT) {
911 geneve->cfg.inner_proto_inherit);
916 tos, ttl, df, sport, geneve->cfg.info.key.tp_dst,
917 !net_eq(geneve->net, dev_net(geneve->dev)),
925 struct geneve_dev *geneve,
928 bool xnet = !net_eq(geneve->net, dev_net(geneve->dev));
929 struct geneve_sock *gs6 = rcu_dereference(geneve->sock6);
946 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
948 dst = udp_tunnel6_dst_lookup(skb, dev, geneve->net, gs6->sock, 0,
950 geneve->cfg.info.key.tp_dst, prio,
983 skb->protocol = eth_type_trans(skb, geneve->dev);
990 if (geneve->cfg.collect_md) {
993 if (geneve->cfg.ttl_inherit)
1000 geneve->cfg.inner_proto_inherit);
1006 info->key.label, sport, geneve->cfg.info.key.tp_dst,
1015 struct geneve_dev *geneve = netdev_priv(dev);
1019 if (geneve->cfg.collect_md) {
1028 info = &geneve->cfg.info;
1034 err = geneve6_xmit_skb(skb, dev, geneve, info);
1037 err = geneve_xmit_skb(skb, dev, geneve, info);
1069 struct geneve_dev *geneve = netdev_priv(dev);
1074 struct geneve_sock *gs4 = rcu_dereference(geneve->sock4);
1084 sport = udp_flow_src_port(geneve->net, skb,
1087 rt = udp_tunnel_dst_lookup(skb, dev, geneve->net, 0, &saddr,
1089 sport, geneve->cfg.info.key.tp_dst,
1100 struct geneve_sock *gs6 = rcu_dereference(geneve->sock6);
1110 sport = udp_flow_src_port(geneve->net, skb,
1113 dst = udp_tunnel6_dst_lookup(skb, dev, geneve->net, gs6->sock, 0,
1115 geneve->cfg.info.key.tp_dst, prio,
1128 info->key.tp_dst = geneve->cfg.info.key.tp_dst;
1148 strscpy(drvinfo->driver, "geneve", sizeof(drvinfo->driver));
1158 .name = "geneve",
1288 struct geneve_dev *geneve, *t = NULL;
1292 list_for_each_entry(geneve, &gn->geneve_list, next) {
1293 if (info->key.tp_dst == geneve->cfg.info.key.tp_dst) {
1294 *tun_collect_md = geneve->cfg.collect_md;
1297 if (info->key.tun_id == geneve->cfg.info.key.tun_id &&
1298 info->key.tp_dst == geneve->cfg.info.key.tp_dst &&
1299 !memcmp(&info->key.u, &geneve->cfg.info.key.u, sizeof(info->key.u)))
1300 t = geneve;
1327 struct geneve_dev *t, *geneve = netdev_priv(dev);
1338 geneve->net = net;
1339 geneve->dev = dev;
1370 dst_cache_reset(&geneve->cfg.info.dst_cache);
1371 memcpy(&geneve->cfg, cfg, sizeof(*cfg));
1373 if (geneve->cfg.inner_proto_inherit) {
1385 list_add(&geneve->next, &gn->geneve_list);
1572 struct geneve_dev *geneve = netdev_priv(dev);
1583 struct rtable *rt = ip_route_output_key(geneve->net, &fl4);
1598 rt = rt6_lookup(geneve->net, &info->key.u.ipv6.dst, NULL, 0,
1641 /* Quiesces the geneve device data path for both TX and RX.
1643 * On transmit geneve checks for non-NULL geneve_sock before it proceeds.
1649 * On receive geneve dereference the geneve_sock stashed in the socket. So,
1653 static void geneve_quiesce(struct geneve_dev *geneve, struct geneve_sock **gs4,
1656 *gs4 = rtnl_dereference(geneve->sock4);
1657 rcu_assign_pointer(geneve->sock4, NULL);
1661 *gs6 = rtnl_dereference(geneve->sock6);
1662 rcu_assign_pointer(geneve->sock6, NULL);
1671 /* Resumes the geneve device data path for both TX and RX. */
1672 static void geneve_unquiesce(struct geneve_dev *geneve, struct geneve_sock *gs4,
1675 rcu_assign_pointer(geneve->sock4, gs4);
1679 rcu_assign_pointer(geneve->sock6, gs6);
1690 struct geneve_dev *geneve = netdev_priv(dev);
1695 /* If the geneve device is configured for metadata (or externally
1698 if (geneve->cfg.collect_md)
1702 memcpy(&cfg, &geneve->cfg, sizeof(cfg));
1707 if (!geneve_dst_addr_equal(&geneve->cfg.info, &cfg.info)) {
1712 geneve_quiesce(geneve, &gs4, &gs6);
1713 memcpy(&geneve->cfg, &cfg, sizeof(cfg));
1714 geneve_unquiesce(geneve, gs4, gs6);
1721 struct geneve_dev *geneve = netdev_priv(dev);
1723 list_del(&geneve->next);
1747 struct geneve_dev *geneve = netdev_priv(dev);
1748 struct ip_tunnel_info *info = &geneve->cfg.info;
1749 bool ttl_inherit = geneve->cfg.ttl_inherit;
1750 bool metadata = geneve->cfg.collect_md;
1785 if (nla_put_u8(skb, IFLA_GENEVE_DF, geneve->cfg.df))
1796 !geneve->cfg.use_udp6_rx_checksums))
1803 if (geneve->cfg.inner_proto_inherit &&
1814 .kind = "geneve",
1902 struct geneve_dev *geneve, *next;
1905 /* gather any geneve devices that were moved into this ns */
1910 /* now gather any other geneve devices that were created in this ns */
1911 list_for_each_entry_safe(geneve, next, &gn->geneve_list, next) {
1912 /* If geneve->dev is in the same netns, it was already added
1915 if (!net_eq(dev_net(geneve->dev), net))
1916 unregister_netdevice_queue(geneve->dev, head);
1982 MODULE_ALIAS_RTNL_LINK("geneve");