diff options
author | shemminger <shemminger> | 2004-05-28 18:00:28 +0000 |
---|---|---|
committer | shemminger <shemminger> | 2004-05-28 18:00:28 +0000 |
commit | f8eed52bc9ca6b3fc9281b16877abd5178a246bf (patch) | |
tree | 1a97873dac01f35975959b0f8e09357acb1c7efe | |
parent | 9cbb894faa55ec0c6e98215151004d350270812e (diff) | |
download | bridge-utils-f8eed52bc9ca6b3fc9281b16877abd5178a246bf.tar.gz |
Fix problems relating to ifindex vs. index in the
get port info arguments.
-rw-r--r-- | brctl/brctl_disp.c | 11 | ||||
-rw-r--r-- | libbridge/libbridge.h | 2 | ||||
-rw-r--r-- | libbridge/libbridge_devif.c | 28 | ||||
-rw-r--r-- | libbridge/libbridge_init.c | 14 |
4 files changed, 19 insertions, 36 deletions
diff --git a/brctl/brctl_disp.c b/brctl/brctl_disp.c index 6c03099..36c2b8a 100644 --- a/brctl/brctl_disp.c +++ b/brctl/brctl_disp.c @@ -55,18 +55,17 @@ void br_dump_interface_list(const char *br) printf("\n"); } -static int dump_port_info(const char *br, const char *p, int ifindex, - void *arg) +static int dump_port_info(const char *br, const char *p, int count, void *arg) { struct port_info pinfo; - printf("%s (%i)\n", p, ifindex); - if (br_get_port_info(br, ifindex, &pinfo)) { - printf(" can't get port info\n"); + printf("%s (%i)", p, count); + if (br_get_port_info(br, p, count, &pinfo)) { + printf("\tcan't get port info\n"); return 1; } - printf(" port id\t\t%.4x\t\t\t", pinfo.port_id); + printf("\n port id\t\t%.4x\t\t\t", pinfo.port_id); printf("state\t\t%15s\n", br_get_state_name(pinfo.state)); printf(" designated root\t"); br_dump_bridge_id((unsigned char *)&pinfo.designated_root); diff --git a/libbridge/libbridge.h b/libbridge/libbridge.h index 4fae0f2..1be50b0 100644 --- a/libbridge/libbridge.h +++ b/libbridge/libbridge.h @@ -89,7 +89,7 @@ extern int br_foreach_port(const char *brname, extern const char *br_get_state_name(int state); extern int br_get_bridge_info(const char *br, struct bridge_info *info); -extern int br_get_port_info(const char *brname, int ifindex, +extern int br_get_port_info(const char *brname, const char *port, int count, struct port_info *info); extern int br_add_bridge(const char *brname); extern int br_del_bridge(const char *brname); diff --git a/libbridge/libbridge_devif.c b/libbridge/libbridge_devif.c index cac9421..78a3b28 100644 --- a/libbridge/libbridge_devif.c +++ b/libbridge/libbridge_devif.c @@ -209,21 +209,21 @@ int br_get_bridge_info(const char *bridge, struct bridge_info *info) #endif } -static int old_get_port_info(const char *brname, int ifindex, +static int old_get_port_info(const char *brname, int index, struct port_info *info) { struct __port_info i; struct ifreq ifr; unsigned long args[4] = { BRCTL_GET_PORT_INFO, - (unsigned long) &i, ifindex, 0 }; + (unsigned long) &i, index, 0 }; memset(info, 0, sizeof(*info)); strncpy(ifr.ifr_name, brname, IFNAMSIZ); ifr.ifr_data = (char *) &args; if (ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr) < 0) { - dprintf("can't get port %s(%d) info %s\n", - brname, ifindex, strerror(errno)); + dprintf("old can't get port %s(%d) info %s\n", + brname, index, strerror(errno)); return errno; } @@ -246,25 +246,17 @@ static int old_get_port_info(const char *brname, int ifindex, /* * 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) +int br_get_port_info(const char *brname, const char *port, int index, + struct port_info *info) { #ifndef HAVE_LIBSYSFS - return old_get_port_info(brname, ifindex, info); + return old_get_port_info(brname, index, 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); + struct sysfs_directory *sdir + = bridge_sysfs_directory(port, SYSFS_BRIDGE_PORT_ATTR); if (!sdir) - return old_get_port_info(port, ifindex, info); + return old_get_port_info(brname, index, info); memset(info, 0, sizeof(*info)); fetch_id(sdir, "designated_root", &info->designated_root); diff --git a/libbridge/libbridge_init.c b/libbridge/libbridge_init.c index 2704f32..1c4aad5 100644 --- a/libbridge/libbridge_init.c +++ b/libbridge/libbridge_init.c @@ -186,12 +186,10 @@ static int old_foreach_port(const char *brname, for (i = 0; i < MAX_PORTS; i++) { if (!ifindices[i]) continue; - if (!if_indextoname(ifindices[i], ifname)) continue; - ++count; - if (iterator(brname, ifname, ifindices[i], arg)) + if (iterator(brname, ifname, i, arg)) break; } @@ -225,6 +223,7 @@ int br_foreach_port(const char *brname, snprintf(path, sizeof(path), "%s/%s", dev->path, SYSFS_BRIDGE_PORT_SUBDIR); + dprintf("path=%s\n", path); dir = sysfs_open_directory(path); if (!dir) { /* no /sys/class/net/ethX/brif subdirectory @@ -242,15 +241,8 @@ int br_foreach_port(const char *brname, err = 0; dlist_for_each_data(links, plink, struct sysfs_link) { - int ifindex = if_nametoindex(plink->name); - - if (!ifindex) { - dprintf("can't find ifindex for %s\n", plink->name); - continue; - } - ++err; - if (iterator(brname, plink->name, ifindex, arg)) + if (iterator(brname, plink->name, err, arg)) break; } |