Skip to content

Commit

Permalink
netdev-linux: Make netdev_linux_get_in6() conform to API definition.
Browse files Browse the repository at this point in the history
The get_in6() API defined in netdev-provider.h requires the return
of error values when the 'netdev' has no assigned IPv6 address or
the 'netdev' does not support IPv6.  However, the netdev_linux_get_in6()
implementation does not follow this (always return 0).  And this
causes the a bug in deleting vlan interfaces created for vlan
splinter.

This commit makes netdev_linux_get_in6() conform to the API definition
and returns the specified error value when failing to get IPv6 address.

VMware-BZ: #1485521
Reported-by: Ronald Lee <[email protected]>
Signed-off-by: Alex Wang <[email protected]>
Acked-by: Ben Pfaff <[email protected]>
  • Loading branch information
yew011 committed Jul 28, 2015
1 parent d6384a3 commit 7df6932
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions lib/netdev-linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,7 @@ struct netdev_linux {
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. */
int in6_error; /* Cached error code from reading in6 addr. */

enum netdev_features current; /* Cached from ETHTOOL_GSET. */
enum netdev_features advertised; /* Cached from ETHTOOL_GSET. */
Expand Down Expand Up @@ -2481,19 +2482,22 @@ parse_if_inet6_line(const char *line,
ifname);
}

/* If 'netdev' has an assigned IPv6 address, sets '*in6' to that address (if
* 'in6' is non-null) and returns true. Otherwise, returns false. */
/* If 'netdev' has an assigned IPv6 address, sets '*in6' to that address.
* Otherwise, sets '*in6' to 'in6addr_any' and returns the corresponding
* error. */
static int
netdev_linux_get_in6(const struct netdev *netdev_, struct in6_addr *in6)
{
struct netdev_linux *netdev = netdev_linux_cast(netdev_);
int error;

ovs_mutex_lock(&netdev->mutex);
if (!(netdev->cache_valid & VALID_IN6)) {
FILE *file;
char line[128];

netdev->in6 = in6addr_any;
netdev->in6_error = EADDRNOTAVAIL;

file = fopen("/proc/net/if_inet6", "r");
if (file != NULL) {
Expand All @@ -2505,17 +2509,21 @@ netdev_linux_get_in6(const struct netdev *netdev_, struct in6_addr *in6)
&& !strcmp(name, ifname))
{
netdev->in6 = in6_tmp;
netdev->in6_error = 0;
break;
}
}
fclose(file);
} else {
netdev->in6_error = EOPNOTSUPP;
}
netdev->cache_valid |= VALID_IN6;
}
*in6 = netdev->in6;
error = netdev->in6_error;
ovs_mutex_unlock(&netdev->mutex);

return 0;
return error;
}

static void
Expand Down

0 comments on commit 7df6932

Please sign in to comment.