datapath: Take advantage of IFF_OVS_DATAPATH.
authorJesse Gross <jesse@nicira.com>
Thu, 9 Dec 2010 03:28:32 +0000 (19:28 -0800)
committerJesse Gross <jesse@nicira.com>
Sat, 11 Dec 2010 23:19:47 +0000 (15:19 -0800)
Starting in 2.6.37 we have our own unique identifier to be able
to find ports attached to OVS.  Take advantage of it to avoid
ugly workarounds.

Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
datapath/vport-netdev.c

index dfeccac9ca825784ac82d8c50a1ed1f6d1f9bc3e..88274732e65f673b8c70be2f662196356c50e385 100644 (file)
@@ -273,15 +273,15 @@ 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(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);
 #endif