/* Must be called with rcu_read_lock. */ staticvoid netdev_port_receive(struct sk_buff *skb)
{ struct vport *vport;
vport = ovs_netdev_get_vport(skb->dev); if (unlikely(!vport)) goto error;
if (unlikely(skb_warn_if_lro(skb))) goto error;
/* Make our own copy of the packet. Otherwise we will mangle the * packet for anyone who came before us (e.g. tcpdump via AF_PACKET).
*/
skb = skb_share_check(skb, GFP_ATOMIC); if (unlikely(!skb)) return;
if (skb->dev->type == ARPHRD_ETHER)
skb_push_rcsum(skb, ETH_HLEN);
local = ovs_vport_ovsl(dp, OVSP_LOCAL); return local->dev;
}
struct vport *ovs_netdev_link(struct vport *vport, constchar *name)
{ int err;
vport->dev = dev_get_by_name(ovs_dp_get_net(vport->dp), name); if (!vport->dev) {
err = -ENODEV; goto error_free_vport;
} /* Ensure that the device exists and that the provided * name is not one of its aliases.
*/ if (strcmp(name, ovs_vport_name(vport))) {
err = -ENODEV; goto error_put;
}
netdev_tracker_alloc(vport->dev, &vport->dev_tracker, GFP_KERNEL); if (vport->dev->flags & IFF_LOOPBACK ||
(vport->dev->type != ARPHRD_ETHER &&
vport->dev->type != ARPHRD_NONE) ||
ovs_is_internal_dev(vport->dev)) {
err = -EINVAL; goto error_put;
}
staticvoid netdev_destroy(struct vport *vport)
{
rtnl_lock(); if (netif_is_ovs_port(vport->dev))
ovs_netdev_detach_dev(vport);
rtnl_unlock();
call_rcu(&vport->rcu, vport_netdev_free);
}
void ovs_netdev_tunnel_destroy(struct vport *vport)
{
rtnl_lock(); if (netif_is_ovs_port(vport->dev))
ovs_netdev_detach_dev(vport);
/* We can be invoked by both explicit vport deletion and * underlying netdev deregistration; delete the link only * if it's not already shutting down.
*/ if (vport->dev->reg_state == NETREG_REGISTERED)
rtnl_delete_link(vport->dev, 0, NULL);
netdev_put(vport->dev, &vport->dev_tracker);
vport->dev = NULL;
rtnl_unlock();
/* Returns null if this device is not attached to a datapath. */ struct vport *ovs_netdev_get_vport(struct net_device *dev)
{ if (likely(netif_is_ovs_port(dev))) return (struct vport *)
rcu_dereference_rtnl(dev->rx_handler_data); else return NULL;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.