From 4c0f178060b740faac9a5aec915a24dc3b61770c Mon Sep 17 00:00:00 2001 From: Jesse Gross Date: Sun, 11 Apr 2010 09:37:19 -0400 Subject: [PATCH] netdev: Allow get_ifindex and get_features to be null. Allow netdev providers to set get_ifindex and get_features it null if they would always return EOPNOTSUPP. This is particuarly useful for virtual devices. --- lib/netdev-provider.h | 10 ++++++++-- lib/netdev.c | 24 ++++++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index 18ec1ab6..5ec14d73 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -252,7 +252,10 @@ struct netdev_class { * specified by POSIX for if_nametoindex() and by SNMP for ifIndex. An * ifindex value should be unique within a host and remain stable at least * until reboot. SNMP says an ifindex "ranges between 1 and the value of - * ifNumber" but many systems do not follow this rule anyhow. */ + * ifNumber" but many systems do not follow this rule anyhow. + * + * This function may be set to null if it would always return -EOPNOTSUPP. + */ int (*get_ifindex)(const struct netdev *netdev); /* Sets 'carrier' to true if carrier is active (link light is on) on @@ -268,7 +271,10 @@ struct netdev_class { /* Stores the features supported by 'netdev' into each of '*current', * '*advertised', '*supported', and '*peer'. Each value is a bitmap of - * "enum ofp_port_features" bits, in host byte order. */ + * "enum ofp_port_features" bits, in host byte order. + * + * This function may be set to null if it would always return EOPNOTSUPP. + */ int (*get_features)(struct netdev *netdev, uint32_t *current, uint32_t *advertised, uint32_t *supported, uint32_t *peer); diff --git a/lib/netdev.c b/lib/netdev.c index 3102e6e3..4741e24b 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -629,23 +629,37 @@ netdev_get_mtu(const struct netdev *netdev, int *mtup) * value should be unique within a host and remain stable at least until * reboot. SNMP says an ifindex "ranges between 1 and the value of ifNumber" * but many systems do not follow this rule anyhow. + * + * Some network devices may not implement support for this function. In such + * cases this function will always return -EOPNOTSUPP. */ int netdev_get_ifindex(const struct netdev *netdev) { - return netdev_get_dev(netdev)->netdev_class->get_ifindex(netdev); + int (*get_ifindex)(const struct netdev *); + + get_ifindex = netdev_get_dev(netdev)->netdev_class->get_ifindex; + + return get_ifindex ? get_ifindex(netdev) : -EOPNOTSUPP; } /* Stores the features supported by 'netdev' into each of '*current', * '*advertised', '*supported', and '*peer' that are non-null. Each value is a * bitmap of "enum ofp_port_features" bits, in host byte order. Returns 0 if * successful, otherwise a positive errno value. On failure, all of the - * passed-in values are set to 0. */ + * passed-in values are set to 0. + * + * Some network devices may not implement support for this function. In such + * cases this function will always return EOPNOTSUPP. + */ int netdev_get_features(struct netdev *netdev, uint32_t *current, uint32_t *advertised, uint32_t *supported, uint32_t *peer) { + int (*get_features)(struct netdev *netdev, + uint32_t *current, uint32_t *advertised, + uint32_t *supported, uint32_t *peer); uint32_t dummy[4]; int error; @@ -662,8 +676,10 @@ netdev_get_features(struct netdev *netdev, peer = &dummy[3]; } - error = netdev_get_dev(netdev)->netdev_class->get_features(netdev, current, - advertised, supported, peer); + get_features = netdev_get_dev(netdev)->netdev_class->get_features; + error = get_features + ? get_features(netdev, current, advertised, supported, peer) + : EOPNOTSUPP; if (error) { *current = *advertised = *supported = *peer = 0; } -- 2.30.2