root/net/openvswitch/vport-netdev.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. netdev_port_receive
  2. netdev_frame_hook
  3. get_dpdev
  4. ovs_netdev_link
  5. netdev_create
  6. vport_netdev_free
  7. ovs_netdev_detach_dev
  8. netdev_destroy
  9. ovs_netdev_tunnel_destroy
  10. ovs_netdev_get_vport
  11. ovs_netdev_init
  12. ovs_netdev_exit

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Copyright (c) 2007-2012 Nicira, Inc.
   4  */
   5 
   6 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   7 
   8 #include <linux/if_arp.h>
   9 #include <linux/if_bridge.h>
  10 #include <linux/if_vlan.h>
  11 #include <linux/kernel.h>
  12 #include <linux/llc.h>
  13 #include <linux/rtnetlink.h>
  14 #include <linux/skbuff.h>
  15 #include <linux/openvswitch.h>
  16 #include <linux/export.h>
  17 
  18 #include <net/ip_tunnels.h>
  19 #include <net/rtnetlink.h>
  20 
  21 #include "datapath.h"
  22 #include "vport.h"
  23 #include "vport-internal_dev.h"
  24 #include "vport-netdev.h"
  25 
  26 static struct vport_ops ovs_netdev_vport_ops;
  27 
  28 /* Must be called with rcu_read_lock. */
  29 static void netdev_port_receive(struct sk_buff *skb)
  30 {
  31         struct vport *vport;
  32 
  33         vport = ovs_netdev_get_vport(skb->dev);
  34         if (unlikely(!vport))
  35                 goto error;
  36 
  37         if (unlikely(skb_warn_if_lro(skb)))
  38                 goto error;
  39 
  40         /* Make our own copy of the packet.  Otherwise we will mangle the
  41          * packet for anyone who came before us (e.g. tcpdump via AF_PACKET).
  42          */
  43         skb = skb_share_check(skb, GFP_ATOMIC);
  44         if (unlikely(!skb))
  45                 return;
  46 
  47         if (skb->dev->type == ARPHRD_ETHER) {
  48                 skb_push(skb, ETH_HLEN);
  49                 skb_postpush_rcsum(skb, skb->data, ETH_HLEN);
  50         }
  51         ovs_vport_receive(vport, skb, skb_tunnel_info(skb));
  52         return;
  53 error:
  54         kfree_skb(skb);
  55 }
  56 
  57 /* Called with rcu_read_lock and bottom-halves disabled. */
  58 static rx_handler_result_t netdev_frame_hook(struct sk_buff **pskb)
  59 {
  60         struct sk_buff *skb = *pskb;
  61 
  62         if (unlikely(skb->pkt_type == PACKET_LOOPBACK))
  63                 return RX_HANDLER_PASS;
  64 
  65         netdev_port_receive(skb);
  66         return RX_HANDLER_CONSUMED;
  67 }
  68 
  69 static struct net_device *get_dpdev(const struct datapath *dp)
  70 {
  71         struct vport *local;
  72 
  73         local = ovs_vport_ovsl(dp, OVSP_LOCAL);
  74         return local->dev;
  75 }
  76 
  77 struct vport *ovs_netdev_link(struct vport *vport, const char *name)
  78 {
  79         int err;
  80 
  81         vport->dev = dev_get_by_name(ovs_dp_get_net(vport->dp), name);
  82         if (!vport->dev) {
  83                 err = -ENODEV;
  84                 goto error_free_vport;
  85         }
  86 
  87         if (vport->dev->flags & IFF_LOOPBACK ||
  88             (vport->dev->type != ARPHRD_ETHER &&
  89              vport->dev->type != ARPHRD_NONE) ||
  90             ovs_is_internal_dev(vport->dev)) {
  91                 err = -EINVAL;
  92                 goto error_put;
  93         }
  94 
  95         rtnl_lock();
  96         err = netdev_master_upper_dev_link(vport->dev,
  97                                            get_dpdev(vport->dp),
  98                                            NULL, NULL, NULL);
  99         if (err)
 100                 goto error_unlock;
 101 
 102         err = netdev_rx_handler_register(vport->dev, netdev_frame_hook,
 103                                          vport);
 104         if (err)
 105                 goto error_master_upper_dev_unlink;
 106 
 107         dev_disable_lro(vport->dev);
 108         dev_set_promiscuity(vport->dev, 1);
 109         vport->dev->priv_flags |= IFF_OVS_DATAPATH;
 110         rtnl_unlock();
 111 
 112         return vport;
 113 
 114 error_master_upper_dev_unlink:
 115         netdev_upper_dev_unlink(vport->dev, get_dpdev(vport->dp));
 116 error_unlock:
 117         rtnl_unlock();
 118 error_put:
 119         dev_put(vport->dev);
 120 error_free_vport:
 121         ovs_vport_free(vport);
 122         return ERR_PTR(err);
 123 }
 124 EXPORT_SYMBOL_GPL(ovs_netdev_link);
 125 
 126 static struct vport *netdev_create(const struct vport_parms *parms)
 127 {
 128         struct vport *vport;
 129 
 130         vport = ovs_vport_alloc(0, &ovs_netdev_vport_ops, parms);
 131         if (IS_ERR(vport))
 132                 return vport;
 133 
 134         return ovs_netdev_link(vport, parms->name);
 135 }
 136 
 137 static void vport_netdev_free(struct rcu_head *rcu)
 138 {
 139         struct vport *vport = container_of(rcu, struct vport, rcu);
 140 
 141         if (vport->dev)
 142                 dev_put(vport->dev);
 143         ovs_vport_free(vport);
 144 }
 145 
 146 void ovs_netdev_detach_dev(struct vport *vport)
 147 {
 148         ASSERT_RTNL();
 149         vport->dev->priv_flags &= ~IFF_OVS_DATAPATH;
 150         netdev_rx_handler_unregister(vport->dev);
 151         netdev_upper_dev_unlink(vport->dev,
 152                                 netdev_master_upper_dev_get(vport->dev));
 153         dev_set_promiscuity(vport->dev, -1);
 154 }
 155 
 156 static void netdev_destroy(struct vport *vport)
 157 {
 158         rtnl_lock();
 159         if (netif_is_ovs_port(vport->dev))
 160                 ovs_netdev_detach_dev(vport);
 161         rtnl_unlock();
 162 
 163         call_rcu(&vport->rcu, vport_netdev_free);
 164 }
 165 
 166 void ovs_netdev_tunnel_destroy(struct vport *vport)
 167 {
 168         rtnl_lock();
 169         if (netif_is_ovs_port(vport->dev))
 170                 ovs_netdev_detach_dev(vport);
 171 
 172         /* We can be invoked by both explicit vport deletion and
 173          * underlying netdev deregistration; delete the link only
 174          * if it's not already shutting down.
 175          */
 176         if (vport->dev->reg_state == NETREG_REGISTERED)
 177                 rtnl_delete_link(vport->dev);
 178         dev_put(vport->dev);
 179         vport->dev = NULL;
 180         rtnl_unlock();
 181 
 182         call_rcu(&vport->rcu, vport_netdev_free);
 183 }
 184 EXPORT_SYMBOL_GPL(ovs_netdev_tunnel_destroy);
 185 
 186 /* Returns null if this device is not attached to a datapath. */
 187 struct vport *ovs_netdev_get_vport(struct net_device *dev)
 188 {
 189         if (likely(netif_is_ovs_port(dev)))
 190                 return (struct vport *)
 191                         rcu_dereference_rtnl(dev->rx_handler_data);
 192         else
 193                 return NULL;
 194 }
 195 
 196 static struct vport_ops ovs_netdev_vport_ops = {
 197         .type           = OVS_VPORT_TYPE_NETDEV,
 198         .create         = netdev_create,
 199         .destroy        = netdev_destroy,
 200         .send           = dev_queue_xmit,
 201 };
 202 
 203 int __init ovs_netdev_init(void)
 204 {
 205         return ovs_vport_ops_register(&ovs_netdev_vport_ops);
 206 }
 207 
 208 void ovs_netdev_exit(void)
 209 {
 210         ovs_vport_ops_unregister(&ovs_netdev_vport_ops);
 211 }

/* [<][>][^][v][top][bottom][index][help] */