[ovs-dev] [PATCH 14/16] netdev: Allow get_ifindex and get_features to be null.

Jesse Gross jesse at nicira.com
Tue Apr 13 14:41:16 UTC 2010


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          |   23 +++++++++++++++++++----
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
index 466afdd..343cec3 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 7913fbd..fb34c45 100644
--- a/lib/netdev.c
+++ b/lib/netdev.c
@@ -628,23 +628,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;
 
@@ -661,8 +675,9 @@ 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;
     }
-- 
1.6.3.3





More information about the dev mailing list