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:
@@ -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);
|
||||||
|
|||||||
24
lib/netdev.c
24
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
|
* 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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user