aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshemminger <shemminger>2004-05-28 18:00:28 +0000
committershemminger <shemminger>2004-05-28 18:00:28 +0000
commitf8eed52bc9ca6b3fc9281b16877abd5178a246bf (patch)
tree1a97873dac01f35975959b0f8e09357acb1c7efe
parent9cbb894faa55ec0c6e98215151004d350270812e (diff)
downloadbridge-utils-f8eed52bc9ca6b3fc9281b16877abd5178a246bf.tar.gz
Fix problems relating to ifindex vs. index in the
get port info arguments.
-rw-r--r--brctl/brctl_disp.c11
-rw-r--r--libbridge/libbridge.h2
-rw-r--r--libbridge/libbridge_devif.c28
-rw-r--r--libbridge/libbridge_init.c14
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;
}