aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshemminger <shemminger>2004-05-27 18:15:12 +0000
committershemminger <shemminger>2004-05-27 18:15:12 +0000
commit9cbb894faa55ec0c6e98215151004d350270812e (patch)
tree18db194527da57cbe3c2635a6357fb955ec64821
parent9c6f7c3bed7fa9e42ec2ae4b00d3f6a6ba22d072 (diff)
downloadbridge-utils-9cbb894faa55ec0c6e98215151004d350270812e.tar.gz
1.0.2 - fix get_port_info, confusion about bridge name vs port name.v1.0.2
-rw-r--r--brctl/brctl_disp.c4
-rw-r--r--configure.in2
-rw-r--r--libbridge/libbridge.h5
-rw-r--r--libbridge/libbridge_devif.c46
4 files changed, 39 insertions, 18 deletions
diff --git a/brctl/brctl_disp.c b/brctl/brctl_disp.c
index 6eb72ca..6c03099 100644
--- a/brctl/brctl_disp.c
+++ b/brctl/brctl_disp.c
@@ -60,8 +60,8 @@ static int dump_port_info(const char *br, const char *p, int ifindex,
{
struct port_info pinfo;
- printf("%s (%i)\n", p, if_nametoindex(p));
- if (br_get_port_info(p, ifindex, &pinfo)) {
+ printf("%s (%i)\n", p, ifindex);
+ if (br_get_port_info(br, ifindex, &pinfo)) {
printf(" can't get port info\n");
return 1;
}
diff --git a/configure.in b/configure.in
index d630569..67a9981 100644
--- a/configure.in
+++ b/configure.in
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT(brctl/brctl.c)
AC_CONFIG_HEADER(libbridge/config.h)
-AM_INIT_AUTOMAKE(bridge-utils,1.0.1)
+AM_INIT_AUTOMAKE(bridge-utils,1.0.2)
AC_ARG_WITH( linux-headers, [ --with-linux-headers Location of the linux headers to use],
KERNEL_HEADERS=$withval, KERNEL_HEADERS="/usr/src/linux/include")
diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h
index b1e1fb5..4fae0f2 100644
--- a/libbridge/libbridge.h
+++ b/libbridge/libbridge.h
@@ -88,8 +88,9 @@ extern int br_foreach_port(const char *brname,
void *arg);
extern const char *br_get_state_name(int state);
-extern int br_get_bridge_info(const char *br, struct bridge_info *);
-extern int br_get_port_info(const char *port, int ifindex, struct port_info *);
+extern int br_get_bridge_info(const char *br, struct bridge_info *info);
+extern int br_get_port_info(const char *brname, int ifindex,
+ struct port_info *info);
extern int br_add_bridge(const char *brname);
extern int br_del_bridge(const char *brname);
extern int br_add_interface(const char *br, int ifindex);
diff --git a/libbridge/libbridge_devif.c b/libbridge/libbridge_devif.c
index 665fbec..cac9421 100644
--- a/libbridge/libbridge_devif.c
+++ b/libbridge/libbridge_devif.c
@@ -44,6 +44,9 @@ static struct sysfs_directory *bridge_sysfs_directory(const char *devname,
struct sysfs_class_device *dev;
char path[SYSFS_PATH_MAX];
+ if (!devname)
+ return NULL;
+
if (!br_class_net) {
dprintf("can't find class_net\n");
return NULL;
@@ -62,13 +65,13 @@ static struct sysfs_directory *bridge_sysfs_directory(const char *devname,
return sdir;
}
-static void fetch_id(struct sysfs_directory *sdir, char *name,
+static void fetch_id(struct sysfs_directory *sdir, const char *name,
struct bridge_id *id)
{
struct sysfs_attribute *attr;
memset(id, 0, sizeof(id));
- attr = sysfs_get_directory_attribute(sdir, name);
+ attr = sysfs_get_directory_attribute(sdir, (char *) name);
dprintf("fetch_id %s/%s = %s\n", sdir->path, name,
attr ? attr->value : "<null>\n");
@@ -92,11 +95,12 @@ static void fetch_id(struct sysfs_directory *sdir, char *name,
}
}
-static void fetch_tv(struct sysfs_directory *sdir, char *name,
+/* Get a time value out of sysfs */
+static void fetch_tv(struct sysfs_directory *sdir, const char *name,
struct timeval *tv)
{
struct sysfs_attribute *attr
- = sysfs_get_directory_attribute(sdir, name);
+ = sysfs_get_directory_attribute(sdir, (char *) name);
if (!attr) {
fprintf(stderr, "Can't find attribute %s/%s\n", sdir->path, name);
@@ -107,10 +111,11 @@ static void fetch_tv(struct sysfs_directory *sdir, char *name,
__jiffies_to_tv(tv, strtoul(attr->value, NULL, 0));
}
-static int fetch_int(struct sysfs_directory *sdir, char *name)
+/* Fetch an integer attribute out of sysfs. */
+static int fetch_int(struct sysfs_directory *sdir, const char *name)
{
struct sysfs_attribute *attr
- = sysfs_get_directory_attribute(sdir, name);
+ = sysfs_get_directory_attribute(sdir, (char *) name);
int val = 0;
if (!attr)
@@ -162,6 +167,10 @@ static int old_get_bridge_info(const char *bridge, struct bridge_info *info)
return 0;
}
+/*
+ * Get bridge parameters using either sysfs or old
+ * ioctl.
+ */
int br_get_bridge_info(const char *bridge, struct bridge_info *info)
{
#ifndef HAVE_LIBSYSFS
@@ -200,7 +209,8 @@ int br_get_bridge_info(const char *bridge, struct bridge_info *info)
#endif
}
-static int old_get_port_info(const char *port, int ifindex, struct port_info *info)
+static int old_get_port_info(const char *brname, int ifindex,
+ struct port_info *info)
{
struct __port_info i;
struct ifreq ifr;
@@ -208,15 +218,14 @@ static int old_get_port_info(const char *port, int ifindex, struct port_info *in
(unsigned long) &i, ifindex, 0 };
memset(info, 0, sizeof(*info));
- strncpy(ifr.ifr_name, port, IFNAMSIZ);
+ strncpy(ifr.ifr_name, brname, IFNAMSIZ);
ifr.ifr_data = (char *) &args;
if (ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr) < 0) {
- fprintf(stderr, "can't get port %s(%d) info %s\n",
- port, ifindex, strerror(errno));
+ dprintf("can't get port %s(%d) info %s\n",
+ brname, ifindex, strerror(errno));
return errno;
}
-
memcpy(&info->designated_root, &i.designated_root, 8);
memcpy(&info->designated_bridge, &i.designated_bridge, 8);
@@ -235,12 +244,23 @@ static int old_get_port_info(const char *port, int ifindex, struct port_info *in
return 0;
}
-int br_get_port_info(const char *port, int ifindex, struct port_info *info)
+/*
+ * Get information about port on bridge.
+ * Note: that when using old interface we need bridge name and ifindex,
+ * but new interface only really needs port name.
+ */
+int br_get_port_info(const char *brname, int ifindex, struct port_info *info)
{
#ifndef HAVE_LIBSYSFS
- return old_get_port_info(port, ifindex, info);
+ return old_get_port_info(brname, ifindex, info);
#else
struct sysfs_directory *sdir;
+ char port[IFNAMSIZ];
+
+ if (!if_indextoname(ifindex, port)) {
+ dprintf("can't find name for port index %d\n", ifindex);
+ return -errno;
+ }
sdir = bridge_sysfs_directory(port, SYSFS_BRIDGE_PORT_ATTR);
if (!sdir)