From: Ben Pfaff Date: Mon, 23 Nov 2009 20:25:08 +0000 (-0800) Subject: netdev: New function netdev_get_ifindex(). X-Git-Tag: v0.99.0~21 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=9ab3d9a3c24ee7132d85f5874f35ea5cb98b1588;p=sliver-openvswitch.git netdev: New function netdev_get_ifindex(). sFlow needs the ifindex of an interface, so this commit adds a function to retrieve it. --- diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 3ccd6be93..b8e8015d4 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -548,6 +548,17 @@ netdev_linux_get_mtu(const struct netdev *netdev_, int *mtup) return 0; } +/* Returns the ifindex of 'netdev', if successful, as a positive number. + * On failure, returns a negative errno value. */ +static int +netdev_linux_get_ifindex(const struct netdev *netdev) +{ + int ifindex, error; + + error = get_ifindex(netdev, &ifindex); + return error ? -error : ifindex; +} + static int netdev_linux_get_carrier(const struct netdev *netdev_, bool *carrier) { @@ -1388,6 +1399,7 @@ const struct netdev_class netdev_linux_class = { netdev_linux_set_etheraddr, netdev_linux_get_etheraddr, netdev_linux_get_mtu, + netdev_linux_get_ifindex, netdev_linux_get_carrier, netdev_linux_get_stats, @@ -1432,6 +1444,7 @@ const struct netdev_class netdev_tap_class = { netdev_linux_set_etheraddr, netdev_linux_get_etheraddr, netdev_linux_get_mtu, + netdev_linux_get_ifindex, netdev_linux_get_carrier, netdev_linux_get_stats, diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index 3bc7fd444..e013e2026 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -164,6 +164,16 @@ struct netdev_class { * bytes for Ethernet devices.*/ int (*get_mtu)(const struct netdev *, int *mtup); + /* Returns the ifindex of 'netdev', if successful, as a positive number. + * On failure, returns a negative errno value. + * + * The desired semantics of the ifindex value are a combination of those + * 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. */ + int (*get_ifindex)(const struct netdev *); + /* Sets 'carrier' to true if carrier is active (link light is on) on * 'netdev'. */ int (*get_carrier)(const struct netdev *netdev, bool *carrier); diff --git a/lib/netdev.c b/lib/netdev.c index 965bdbf6c..222342fd2 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -366,6 +366,21 @@ netdev_get_mtu(const struct netdev *netdev, int *mtup) return error; } +/* Returns the ifindex of 'netdev', if successful, as a positive number. On + * failure, returns a negative errno value. + * + * The desired semantics of the ifindex value are a combination of those + * 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. + */ +int +netdev_get_ifindex(const struct netdev *netdev) +{ + return netdev->class->get_ifindex(netdev); +} + /* 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 diff --git a/lib/netdev.h b/lib/netdev.h index 4a29cf374..b87d5b999 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -90,6 +90,7 @@ int netdev_enumerate(struct svec *); const char *netdev_get_name(const struct netdev *); int netdev_get_mtu(const struct netdev *, int *mtup); +int netdev_get_ifindex(const struct netdev *); int netdev_recv(struct netdev *, struct ofpbuf *); void netdev_recv_wait(struct netdev *);