From 9ab3d9a3c24ee7132d85f5874f35ea5cb98b1588 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 23 Nov 2009 12:25:08 -0800 Subject: [PATCH] netdev: New function netdev_get_ifindex(). sFlow needs the ifindex of an interface, so this commit adds a function to retrieve it. --- lib/netdev-linux.c | 13 +++++++++++++ lib/netdev-provider.h | 10 ++++++++++ lib/netdev.c | 15 +++++++++++++++ lib/netdev.h | 1 + 4 files changed, 39 insertions(+) diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 3ccd6be9..b8e8015d 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 3bc7fd44..e013e202 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 965bdbf6..222342fd 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 4a29cf37..b87d5b99 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 *); -- 2.30.2