/* 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 *packetforanyonewhocamebeforeus(e.g.tcpdumpviaAF_PACKET).
*/
skb = skb_share_check(skb, GFP_ATOMIC); if (unlikely(!skb)) return;
if (skb->dev->type == ARPHRD_ETHER)
skb_push_rcsum(skb, ETH_HLEN);
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 *underlyingnetdevderegistration;deletethelinkonly *ifit'snotalreadyshuttingdown.
*/ 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.