Signed-off-by: Pravin B Shelar <pshe...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev