2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-25 15:07:05 +00:00

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.
This commit is contained in:
Jesse Gross
2010-04-11 09:37:19 -04:00
parent 658797c83a
commit 4c0f178060
2 changed files with 28 additions and 6 deletions

View File

@@ -252,7 +252,10 @@ struct netdev_class {
* specified by POSIX for if_nametoindex() and by SNMP for ifIndex. An * 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 * 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 * 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); int (*get_ifindex)(const struct netdev *netdev);
/* Sets 'carrier' to true if carrier is active (link light is on) on /* 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', /* Stores the features supported by 'netdev' into each of '*current',
* '*advertised', '*supported', and '*peer'. Each value is a bitmap of * '*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, int (*get_features)(struct netdev *netdev,
uint32_t *current, uint32_t *advertised, uint32_t *current, uint32_t *advertised,
uint32_t *supported, uint32_t *peer); uint32_t *supported, uint32_t *peer);

View File

@@ -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 * 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" * reboot. SNMP says an ifindex "ranges between 1 and the value of ifNumber"
* but many systems do not follow this rule anyhow. * 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 int
netdev_get_ifindex(const struct netdev *netdev) 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', /* Stores the features supported by 'netdev' into each of '*current',
* '*advertised', '*supported', and '*peer' that are non-null. Each value is a * '*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 * 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 * 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 int
netdev_get_features(struct netdev *netdev, netdev_get_features(struct netdev *netdev,
uint32_t *current, uint32_t *advertised, uint32_t *current, uint32_t *advertised,
uint32_t *supported, uint32_t *peer) 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]; uint32_t dummy[4];
int error; int error;
@@ -662,8 +676,10 @@ netdev_get_features(struct netdev *netdev,
peer = &dummy[3]; peer = &dummy[3];
} }
error = netdev_get_dev(netdev)->netdev_class->get_features(netdev, current, get_features = netdev_get_dev(netdev)->netdev_class->get_features;
advertised, supported, peer); error = get_features
? get_features(netdev, current, advertised, supported, peer)
: EOPNOTSUPP;
if (error) { if (error) {
*current = *advertised = *supported = *peer = 0; *current = *advertised = *supported = *peer = 0;
} }