[ovs-dev] [PATCH 6/6] netdev-linux: Cache error code from do_get_ifindex().

Pravin B Shelar pshelar at nicira.com
Thu Mar 8 15:26:49 UTC 2012


Signed-off-by: Pravin B Shelar <pshelar at nicira.com>
---
 lib/netdev-linux.c |   21 +++++++++++++++------
 1 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index bbd2805..0301b7f 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -381,6 +381,7 @@ struct netdev_dev_linux {
     int ether_addr_error;       /* Cached error code from set/get etheraddr. */
     int netdev_policing_error;  /* Cached error code from set policing. */
     int get_features_error;     /* Cached error code from ETHTOOL_GSET. */
+    int get_ifindex_error;      /* Cached error code from SIOCGIFINDEX. */
 
     uint32_t current;           /* Cached from ETHTOOL_GSET. */
     uint32_t advertised;        /* Cached from ETHTOOL_GSET. */
@@ -531,8 +532,8 @@ netdev_dev_linux_changed(struct netdev_dev_linux *dev,
     }
     dev->ifi_flags = ifi_flags;
 
-    /* Always cache driver-info. */
-    dev->cache_valid &= VALID_DRVINFO;
+    /* Always cache driver-info and ifindex. */
+    dev->cache_valid &= (VALID_DRVINFO | VALID_IFINDEX);
 }
 
 static void
@@ -554,6 +555,9 @@ netdev_dev_linux_update(struct netdev_dev_linux *dev,
             memcpy(dev->etheraddr, change->addr, ETH_ADDR_LEN);
             dev->cache_valid |= VALID_ETHERADDR;
         }
+    } else if (change->nlmsg_type == RTM_DELLINK) {
+        /* Discard cached ifindex if device is getting unregistered. */
+        dev->cache_valid &= ~VALID_IFINDEX;
     }
 }
 
@@ -4398,17 +4402,22 @@ get_ifindex(const struct netdev *netdev_, int *ifindexp)
 {
     struct netdev_dev_linux *netdev_dev =
                                 netdev_dev_linux_cast(netdev_get_dev(netdev_));
-    *ifindexp = 0;
+
     if (!(netdev_dev->cache_valid & VALID_IFINDEX)) {
         int ifindex = do_get_ifindex(netdev_get_name(netdev_));
+
         if (ifindex < 0) {
-            return -ifindex;
+            netdev_dev->get_ifindex_error = -ifindex;
+            netdev_dev->ifindex = 0;
+        } else {
+            netdev_dev->get_ifindex_error = 0;
+            netdev_dev->ifindex = ifindex;
         }
         netdev_dev->cache_valid |= VALID_IFINDEX;
-        netdev_dev->ifindex = ifindex;
     }
+
     *ifindexp = netdev_dev->ifindex;
-    return 0;
+    return netdev_dev->get_ifindex_error;
 }
 
 static void
-- 
1.7.1




More information about the dev mailing list