diff options
author | shemminger <shemminger> | 2004-05-27 18:15:12 +0000 |
---|---|---|
committer | shemminger <shemminger> | 2004-05-27 18:15:12 +0000 |
commit | 9cbb894faa55ec0c6e98215151004d350270812e (patch) | |
tree | 18db194527da57cbe3c2635a6357fb955ec64821 | |
parent | 9c6f7c3bed7fa9e42ec2ae4b00d3f6a6ba22d072 (diff) | |
download | bridge-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.c | 4 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | libbridge/libbridge.h | 5 | ||||
-rw-r--r-- | libbridge/libbridge_devif.c | 46 |
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) |