int br_add_bridge(const char *brname) { int ret; dd_syslog(LOG_INFO, "bridge added successfully\n"); char ipaddr[32]; sprintf(ipaddr, "%s_ipaddr", brname); char netmask[32]; sprintf(netmask, "%s_netmask", brname); #ifdef SIOCBRADDBR ret = ioctl(br_socket_fd, SIOCBRADDBR, brname); if (ret < 0) #endif { char _br[IFNAMSIZ]; unsigned long arg[3] = { BRCTL_ADD_BRIDGE, (unsigned long)_br }; strncpy(_br, brname, IFNAMSIZ); ret = ioctl(br_socket_fd, SIOCSIFBR, arg); } if (nvram_get(ipaddr) && nvram_get(netmask) && !nvram_match(ipaddr, "0.0.0.0") && !nvram_match(netmask, "0.0.0.0")) { eval("ifconfig", brname, nvram_safe_get(ipaddr), "netmask", nvram_safe_get(netmask), "mtu", getBridgeMTU(brname), "up"); } else eval("ifconfig", brname, "mtu", getBridgeMTU(brname)); return ret < 0 ? errno : 0; }
int br_add_interface(const char *bridge, const char *dev) { if (!ifexists(dev)) return -1; char ipaddr[32]; sprintf(ipaddr, "%s_ipaddr", dev); char netmask[32]; sprintf(netmask, "%s_netmask", dev); if (strncmp(dev, "ath", 3) != 0) { // this is not an ethernet driver eval("ifconfig", dev, "down"); //fixup for some ethernet drivers } if (nvram_get(ipaddr) && nvram_get(netmask) && !nvram_match(ipaddr, "0.0.0.0") && !nvram_match(netmask, "0.0.0.0")) { eval("ifconfig", dev, nvram_safe_get(ipaddr), "netmask", nvram_safe_get(netmask), "mtu", getBridgeMTU(bridge)); } else eval("ifconfig", dev, "mtu", getBridgeMTU(bridge)); if (strncmp(dev, "ath", 3) != 0) { // this is not an ethernet driver eval("ifconfig", dev, "up"); } dd_syslog(LOG_INFO, "interface added successfully\n"); struct ifreq ifr; int err; int ifindex = if_nametoindex(dev); if (ifindex == 0) return ENODEV; strncpy(ifr.ifr_name, bridge, IFNAMSIZ); #ifdef SIOCBRADDIF ifr.ifr_ifindex = ifindex; err = ioctl(br_socket_fd, SIOCBRADDIF, &ifr); if (err < 0) #endif { unsigned long args[4] = { BRCTL_ADD_IF, ifindex, 0, 0 }; ifr.ifr_data = (char *)args; err = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr); } return err < 0 ? errno : 0; }
int br_add_interface(const char *br, const char *dev) { if (!ifexists(dev)) return -1; char ipaddr[32]; sprintf(ipaddr, "%s_ipaddr", dev); char netmask[32]; sprintf(netmask, "%s_netmask", dev); eval("ifconfig", dev, "0.0.0.0"); if (strncmp(dev, "ath", 3) != 0) { // this is not an ethernet driver eval("ifconfig", dev, "down"); //fixup for some ethernet drivers } eval("ifconfig", dev, "mtu", getBridgeMTU(br)); if (strncmp(dev, "ath", 3) != 0) { // this is not an ethernet driver eval("ifconfig", dev, "up"); } dd_syslog(LOG_INFO, "interface added successfully\n"); int ret = eval("brctl", "addif", br, dev); #ifdef HAVE_80211AC eval("emf", "add", "iface", br, dev); #endif return ret; }
int br_add_bridge(const char *brname) { dd_syslog(LOG_INFO, "bridge added successfully\n"); char ipaddr[32]; char brmcast[32]; sprintf(brmcast, "%s_mcast", brname); sprintf(ipaddr, "%s_ipaddr", brname); char netmask[32]; sprintf(netmask, "%s_netmask", brname); int ret = eval("brctl", "addbr", brname); #ifdef HAVE_80211AC eval("emf", "add", "bridge", brname); eval("igs", "add", "bridge", brname); #endif if (nvram_get(ipaddr) && nvram_get(netmask) && !nvram_match(ipaddr, "0.0.0.0") && !nvram_match(netmask, "0.0.0.0")) { eval("ifconfig", brname, nvram_safe_get(ipaddr), "netmask", nvram_safe_get(netmask), "mtu", getBridgeMTU(brname), "up"); } else eval("ifconfig", brname, "mtu", getBridgeMTU(brname)); char *mcast = nvram_default_get(brmcast, "0"); sysprintf("echo %s > /sys/devices/virtual/net/%s/bridge/multicast_snooping", mcast, brname); return ret; }