[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