static int port_set(const char *bridge, const char *ifname, const char *name, unsigned long value, unsigned long oldcode) { int ret; char path[SYSFS_PATH_MAX]; FILE *f; snprintf(path, SYSFS_PATH_MAX, SYSFS_CLASS_NET "%s/brport/%s", ifname, name); f = fopen(path, "w"); if (f) { ret = fprintf(f, "%ld\n", value); fclose(f); } else { int index = get_portno(bridge, ifname); if (index < 0) ret = index; else { struct ifreq ifr; unsigned long args[4] = { oldcode, index, value, 0 }; strncpy(ifr.ifr_name, bridge, IFNAMSIZ); ifr.ifr_data = (char *) &args; ret = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr); } } return ret < 0 ? errno : 0; }
static int old_get_port_info(const char *brname, const char *port, struct port_info *info) { struct __port_info i; int index; memset(info, 0, sizeof(*info)); index = get_portno(brname, port); if (index < 0) return errno; else { struct ifreq ifr; unsigned long args[4] = { BRCTL_GET_PORT_INFO, (unsigned long) &i, index, 0 }; strncpy(ifr.ifr_name, brname, IFNAMSIZ); ifr.ifr_data = (char *) &args; if (ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr) < 0) { dprintf("old can't get port %s(%d) info %s\n", brname, index, strerror(errno)); return errno; } } info->port_no = index; memcpy(&info->designated_root, &i.designated_root, 8); memcpy(&info->designated_bridge, &i.designated_bridge, 8); info->port_id = i.port_id; info->designated_port = i.designated_port; info->path_cost = i.path_cost; info->designated_cost = i.designated_cost; info->state = i.state; info->top_change_ack = i.top_change_ack; info->config_pending = i.config_pending; __jiffies_to_tv(&info->message_age_timer_value, i.message_age_timer_value); __jiffies_to_tv(&info->forward_delay_timer_value, i.forward_delay_timer_value); __jiffies_to_tv(&info->hold_timer_value, i.hold_timer_value); #ifdef TCSUPPORT_IGMP_SNOOPING info->is_router = i.is_router; #endif return 0; }
static int port_set(const char *bridge, const char *ifname, const char *name, unsigned long value, unsigned long oldcode) { int ret = -1; #ifdef HAVE_LIBSYSFS struct sysfs_class_device *dev; dev = sysfs_get_class_device(br_class_net, ifname); if (dev) { struct sysfs_attribute *attr; char path[SYSFS_PATH_MAX]; char buf[32]; sprintf(buf, "%ld", value); snprintf(path, SYSFS_PATH_MAX, "%s/brport/%s", dev->path, name); attr = sysfs_open_attribute(path); if (attr) { ret = sysfs_write_attribute(attr, buf, strlen(buf)); sysfs_close_attribute(attr); } sysfs_close_class_device(dev); } else #endif { int index = get_portno(bridge, ifname); if (index < 0) ret = index; else { struct ifreq ifr; unsigned long args[4] = { oldcode, index, value, 0 }; strncpy(ifr.ifr_name, bridge, IFNAMSIZ); ifr.ifr_data = (char *)&args; ret = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr); } } return ret < 0 ? errno : 0; }
static int port_set(const char *bridge, const char *ifname, const char *name, unsigned long value, unsigned long oldcode) { int ret, index; #ifdef HAVE_LIBSYSFS struct sysfs_directory *sdir; sdir = bridge_sysfs_directory(ifname, SYSFS_BRIDGE_PORT_ATTR); if (sdir) { struct sysfs_attribute *attr; char buf[32]; sprintf(buf, "%ld", value); attr = sysfs_get_directory_attribute(sdir, (char *) name); if (attr) ret = sysfs_write_attribute(attr, buf, strlen(buf)); else { ret = -1; errno = EINVAL; } sysfs_close_directory(sdir); } else #endif if ( (index = get_portno(bridge, ifname)) < 0) ret = index; else { struct ifreq ifr; unsigned long args[4] = { oldcode, index, value, 0 }; strncpy(ifr.ifr_name, bridge, IFNAMSIZ); ifr.ifr_data = (char *) &args; ret = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr); } return ret < 0 ? errno : 0; }