X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fvport-netdev.c;h=d492d19b7d6497f95f804f0d7afa0c6d0034d12c;hb=e05924baf0c757b579eef2b3743130ade4b1a93c;hp=2325959f6e7c15aa6b6b273da56f05d46ac191cf;hpb=7237e4f4b6155eb4854cebc0a45fe845f0950b40;p=openvswitch diff --git a/datapath/vport-netdev.c b/datapath/vport-netdev.c index 2325959f..d492d19b 100644 --- a/datapath/vport-netdev.c +++ b/datapath/vport-netdev.c @@ -16,6 +16,7 @@ #include +#include "checksum.h" #include "datapath.h" #include "vport-internal_dev.h" #include "vport-netdev.h" @@ -272,17 +273,17 @@ static int netdev_send(struct vport *vport, struct sk_buff *skb) /* Returns null if this device is not attached to a datapath. */ struct vport *netdev_get_vport(struct net_device *dev) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36) - /* XXX: The bridge code may have registered the data. - * So check that the handler pointer is the datapath's. - * Once the merge is done and IFF_OVS_DATAPATH stops - * being the same value as IFF_BRIDGE_PORT the check can - * simply be netdev_vport->dev->priv_flags & IFF_OVS_DATAPATH. */ - if (rcu_dereference(dev->rx_handler) != netdev_frame_hook) +#ifdef IFF_BRIDGE_PORT +#if IFF_BRIDGE_PORT != IFF_OVS_DATAPATH + if (likely(dev->priv_flags & IFF_OVS_DATAPATH)) +#else + if (likely(rcu_access_pointer(dev->rx_handler) == netdev_frame_hook)) +#endif + return (struct vport *)rcu_dereference_rtnl(dev->rx_handler_data); + else return NULL; - return (struct vport *)rcu_dereference(dev->rx_handler_data); #else - return (struct vport *)rcu_dereference(dev->br_port); + return (struct vport *)rcu_dereference_rtnl(dev->br_port); #endif }