int brctl_main(int argc, char **argv) { if (argc == 1) { fprintf(stderr, "try to be professional!\n"); return -1; } br_init(); if (!strcmp(argv[1], "addif")) { if (ifexists(argv[3])) br_add_interface(argv[2], argv[3]); } if (!strcmp(argv[1], "delif")) { if (ifexists(argv[3])) br_del_interface(argv[2], argv[3]); } if (!strcmp(argv[1], "addbr")) { br_add_bridge(argv[2]); } if (!strcmp(argv[1], "stp")) { br_set_stp_state(argv[2], atoi(argv[3])); } if (!strcmp(argv[1], "delbr")) { if (!ifexists(argv[2])) return -1; br_del_bridge(argv[2]); } if (!strcmp(argv[1], "show")) { br_cmd_show(); } br_shutdown(); }
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_del_interface(const char *bridge, const char *dev) { if (!ifexists(dev)) return -1; dd_syslog(LOG_INFO, "interface deleted successfully\n"); struct ifreq ifr; int err; int ifindex = if_nametoindex(dev); if (ifindex == 0) return ENODEV; strncpy(ifr.ifr_name, bridge, IFNAMSIZ); #ifdef SIOCBRDELIF ifr.ifr_ifindex = ifindex; err = ioctl(br_socket_fd, SIOCBRDELIF, &ifr); if (err < 0) #endif { unsigned long args[4] = { BRCTL_DEL_IF, ifindex, 0, 0 }; ifr.ifr_data = (char *)args; err = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr); } return err < 0 ? errno : 0; }
int br_set_port_prio(const char *bridge, char *port, char *prio) { if (!ifexists(bridge)) return -1; return port_set(bridge, port, "priority", atoi(prio), BRCTL_SET_PORT_PRIORITY); }
void deconfigure_wimax(void) { char *dev = "ofdm"; if (ifexists(dev)) { br_del_interface("br0", dev); eval("ifconfig", dev, "down"); } eval("/sub/common/ssmodunload"); }
int br_set_bridge_forward_delay(const char *br, int sec) { if (!ifexists(br)) return -1; struct timeval tv; tv.tv_sec = sec; tv.tv_usec = 0; return br_set(br, "forward_delay", __tv_to_jiffies(&tv), BRCTL_SET_BRIDGE_FORWARD_DELAY); }
int br_del_interface(const char *br, const char *dev) { if (!ifexists(dev)) return -1; dd_syslog(LOG_INFO, "interface deleted successfully\n"); int ret = eval("brctl", "delif", br, dev); #ifdef HAVE_80211AC eval("emf", "del", "iface", br, dev); #endif return ret; }
int br_set_stp_state(const char *br, int stp_state) { if (!ifexists(br)) return -1; if (stp_state == 1) { // syslog (LOG_INFO, "stp is set to on\n"); return eval("brctl", "stp", br, "1"); } else { // syslog (LOG_INFO, "stp is set to off\n"); return eval("brctl", "stp", br, "0"); } }
int br_del_bridge(const char *brname) { if (!ifexists(brname)) return -1; dd_syslog(LOG_INFO, "bridge deleted successfully\n"); /* Stop the EMF for this LAN */ #ifdef HAVE_80211AC eval("emf", "stop", brname); /* Remove Bridge from igs */ eval("igs", "del", "bridge", brname); eval("emf", "del", "bridge", brname); #endif return eval("brctl", "delbr", brname); }
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 get_wl_instance(char *name) { int unit; int ret; if (!ifexists(name)) return -1; if (wl_probe(name)) return -1; ret = wl_ioctl(name, WLC_GET_INSTANCE, &unit, sizeof(unit)); // fprintf(stderr,"wl_instance = %d\n",unit); if (ret == 0) return unit; return ret; }
int br_del_bridge(const char *brname) { int ret; if (!ifexists(brname)) return -1; #ifdef SIOCBRDELBR ret = ioctl(br_socket_fd, SIOCBRDELBR, brname); if (ret < 0) #endif { char _br[IFNAMSIZ]; unsigned long arg[3] = { BRCTL_DEL_BRIDGE, (unsigned long)_br }; strncpy(_br, brname, IFNAMSIZ); ret = ioctl(br_socket_fd, SIOCSIFBR, arg); } dd_syslog(LOG_INFO, "bridge deleted successfully\n"); return ret < 0 ? errno : 0; }
int br_set_bridge_prio(const char *br, char *prio) { if (!ifexists(br)) return -1; return eval("brctl", "setbridgeprio", br, prio); }
int br_set_port_prio(const char *br, char *port, char *prio) { if (!ifexists(br)) return -1; return eval("brctl", "setportprio", br, port, prio); }
int br_set_bridge_prio(const char *br, char *prio) { if (!ifexists(br)) return -1; return eval("mstpctl", "settreeprio", br, "0", prio); }
int br_set_stp_state(const char *br, int stp_state) { if (!ifexists(br)) return -1; return br_set(br, "stp_state", stp_state, BRCTL_SET_BRIDGE_STP_STATE); }
int br_set_bridge_prio(const char *br, char *prio) { if (!ifexists(br)) return -1; return br_set(br, "priority", atoi(prio), BRCTL_SET_BRIDGE_PRIORITY); }
int br_set_port_prio(const char *br, char *port, char *prio) { if (!ifexists(br)) return -1; return eval("mstpctl", "settreeportprio", br, port, "0", prio); }
int ej_active_wireless_if_11n(webs_t wp, int argc, char_t ** argv, char *ifname, int cnt, int turbo, int macmask) { unsigned char *cp; int s, len; struct iwreq iwr; char nb[32]; sprintf(nb, "%s_bias", ifname); int bias = atoi(nvram_default_get(nb, "0")); if (!ifexists(ifname)) { printf("IOCTL_STA_INFO ifresolv %s failed!\n", ifname); return cnt; } int state = 0; state = get_radiostate(ifname); if (state == 0 || state == -1) { printf("IOCTL_STA_INFO radio %s not enabled!\n", ifname); return cnt; } s = getsocket(); if (s < 0) { fprintf(stderr, "socket(SOCK_DRAGM)\n"); return cnt; } (void)memset(&iwr, 0, sizeof(struct iwreq)); (void)strncpy(iwr.ifr_name, ifname, sizeof(iwr.ifr_name)); iwr.u.data.pointer = (void *)&madbuf[0]; iwr.u.data.length = 24 * 1024; if (ioctl(s, IEEE80211_IOCTL_STA_INFO, &iwr) < 0) { fprintf(stderr, "IOCTL_STA_INFO for %s failed!\n", ifname); closesocket(); return cnt; } len = iwr.u.data.length; if (len < sizeof(struct ieee80211req_sta_info)) { // fprintf(stderr,"IOCTL_STA_INFO len<struct %s failed!\n",ifname); closesocket(); return cnt; } cp = madbuf; int bufcount = 0; do { struct ieee80211req_sta_info *si; uint8_t *vp; si = (struct ieee80211req_sta_info *)cp; vp = (u_int8_t *)(si + 1); if (cnt) websWrite(wp, ","); cnt++; char mac[32]; strncpy(mac, ieee80211_ntoa(si->isi_macaddr), 31); if (nvram_match("maskmac", "1") && macmask) { mac[0] = 'x'; mac[1] = 'x'; mac[3] = 'x'; mac[4] = 'x'; mac[6] = 'x'; mac[7] = 'x'; mac[9] = 'x'; mac[10] = 'x'; } if (si->isi_noise == 0) { si->isi_noise = -95; } int qual = (si->isi_noise + si->isi_rssi) * 124 + 11600; qual /= 10; int rxrate = si->isi_rxrateKbps / 1000; int txrate = si->isi_txrateKbps / 1000; if (!rxrate) rxrate = si->isi_rates[si->isi_rxrate] & IEEE80211_RATE_VAL; if (!txrate) txrate = si->isi_rates[si->isi_txrate] & IEEE80211_RATE_VAL; char rx[32]; char tx[32]; if (rxrate) sprintf(rx, "%3dM", rxrate); else sprintf(rx, "N/A"); if (txrate) sprintf(tx, "%3dM", txrate); else sprintf(tx, "N/A"); websWrite(wp, "'%s','%s','%s','%s','%s','%d','%d','%d','%d'", mac, ifname, UPTIME(si->isi_uptime), tx, rx, si->isi_noise + si->isi_rssi + bias, si->isi_noise + bias, si->isi_rssi, qual); bufcount += si->isi_len; cp += si->isi_len; len -= si->isi_len; } while (len >= sizeof(struct ieee80211req_sta_info) && bufcount < (sizeof(madbuf) - sizeof(struct ieee80211req_sta_info))); closesocket(); return cnt; }
int ej_active_wireless_if(webs_t wp, int argc, char_t ** argv, char *iface, char *visible, int cnt) { int rssi = 0, noise = 0; FILE *fp2; char *mode; char mac[30]; char line[80]; int macmask; macmask = atoi(argv[0]); if (!ifexists(iface)) return cnt; unlink(RSSI_TMP); char wlmode[32]; sprintf(wlmode, "%s_mode", visible); mode = nvram_safe_get(wlmode); unsigned char buf[WLC_IOCTL_MAXLEN]; memset(buf, 0, WLC_IOCTL_MAXLEN); // get_wdev int r = getassoclist(iface, buf); if (r < 0) return cnt; struct maclist *maclist = (struct maclist *)buf; int i; for (i = 0; i < maclist->count; i++) { ether_etoa((uint8 *) & maclist->ea[i], mac); rssi = 0; noise = 0; // get rssi value if (strcmp(mode, "ap") && strcmp(mode, "apsta") && strcmp(mode, "apstawet")) sysprintf("wl -i %s rssi > %s", iface, RSSI_TMP); else sysprintf("wl -i %s rssi \"%s\" > %s", iface, mac, RSSI_TMP); // get noise value if not ap mode // if (strcmp (mode, "ap")) // snprintf (cmd, sizeof (cmd), "wl -i %s noise >> %s", iface, // RSSI_TMP); // system2 (cmd); // get RSSI value for mac fp2 = fopen(RSSI_TMP, "r"); if (fgets(line, sizeof(line), fp2) != NULL) { // get rssi if (sscanf(line, "%d", &rssi) != 1) continue; noise = getNoise(iface, NULL); /* * if (strcmp (mode, "ap") && fgets (line, sizeof (line), fp2) != * NULL && sscanf (line, "%d", &noise) != 1) continue; */ // get noise for client/wet mode fclose(fp2); } if (nvram_match("maskmac", "1") && macmask) { mac[0] = 'x'; mac[1] = 'x'; mac[3] = 'x'; mac[4] = 'x'; mac[6] = 'x'; mac[7] = 'x'; mac[9] = 'x'; mac[10] = 'x'; } if (cnt) websWrite(wp, ","); cnt++; int rxrate[32]; int txrate[32]; int time[32]; strcpy(rxrate, "N/A"); strcpy(txrate, "N/A"); strcpy(time, "N/A"); #ifndef WL_STA_SCBSTATS #define WL_STA_SCBSTATS 0x4000 /* Per STA debug stats */ #endif sta_info_compat_t *sta; sta_info_compat_old_t *staold; char *param; int buflen; char buf[WLC_IOCTL_MEDLEN]; strcpy(buf, "sta_info"); buflen = strlen(buf) + 1; param = (char *)(buf + buflen); memcpy(param, (char *)&maclist->ea[i], ETHER_ADDR_LEN); if (!wl_ioctl(iface, WLC_GET_VAR, &buf[0], WLC_IOCTL_MEDLEN)) { /* display the sta info */ sta = (sta_info_compat_t *) buf; if (sta->ver == 2) { staold = (sta_info_compat_old_t *) buf; if (staold->flags & WL_STA_SCBSTATS) { int tx = staold->tx_rate; int rx = staold->rx_rate; if (tx > 0) sprintf(txrate, "%dM", tx / 1000); if (rx > 0) sprintf(rxrate, "%dM", rx / 1000); strcpy(time, UPTIME(staold->in)); } } else { // sta->ver == 3 if (sta->flags & WL_STA_SCBSTATS) { int tx = sta->tx_rate; int rx = sta->rx_rate; if (tx > 0) sprintf(txrate, "%dM", tx / 1000); if (rx > 0) sprintf(rxrate, "%dM", rx / 1000); strcpy(time, UPTIME(sta->in)); } } } /* * if (!strcmp (mode, "ap")) { noise = getNoise(iface,NULL); // null * only for broadcom } */ int qual = rssi * 124 + 11600; qual /= 10; websWrite(wp, "'%s','%s','%s','%s','%s','%d','%d','%d','%d'", mac, iface, time, txrate, rxrate, rssi, noise, rssi - noise, qual); } unlink(RSSI_TMP); return cnt; }
int ifconfig(char *name, int flags, char *addr, char *netmask) { // char *down="down"; // if (flags == IFUP) // down = "up"; cprintf("ifconfig %s = %s/%s\n", name, addr, netmask); if (!ifexists(name)) { cprintf("interface %s does not exists, ignoring\n", name); return -1; } // if (addr==NULL) // addr="0.0.0.0"; // int ret; // if (netmask==NULL) // { // ret = eval("ifconfig",name,addr,down); // }else // { // ret = eval("ifconfig",name,addr,"netmask",netmask,down); // } int s; struct ifreq ifr; struct in_addr in_addr, in_netmask, in_broadaddr; cprintf("ifconfig(): name=[%s] flags=[%s] addr=[%s] netmask=[%s]\n", name, flags == IFUP ? "IFUP" : "0", addr, netmask); if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) goto err; cprintf("ifconfig(): socket opened\n"); strncpy(ifr.ifr_name, name, IFNAMSIZ); cprintf("ifconfig(): set interface name\n"); if (flags) { ifr.ifr_flags = flags; if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0) goto err; } cprintf("ifconfig(): interface flags configured\n"); if (addr) { inet_aton(addr, &in_addr); sin_addr(&ifr.ifr_addr).s_addr = in_addr.s_addr; ifr.ifr_addr.sa_family = AF_INET; if (ioctl(s, SIOCSIFADDR, &ifr) < 0) goto err; } cprintf("ifconfig() ip configured\n"); if (addr && netmask) { inet_aton(netmask, &in_netmask); sin_addr(&ifr.ifr_netmask).s_addr = in_netmask.s_addr; ifr.ifr_netmask.sa_family = AF_INET; if (ioctl(s, SIOCSIFNETMASK, &ifr) < 0) goto err; in_broadaddr.s_addr = (in_addr.s_addr & in_netmask.s_addr) | ~in_netmask.s_addr; sin_addr(&ifr.ifr_broadaddr).s_addr = in_broadaddr.s_addr; ifr.ifr_broadaddr.sa_family = AF_INET; if (ioctl(s, SIOCSIFBRDADDR, &ifr) < 0) goto err; } cprintf("ifconfig() mask configured\n"); close(s); cprintf("ifconfig() done()\n"); return 0; err: cprintf("ifconfig() done with error\n"); close(s); #ifndef HAVE_SILENCE perror(name); #endif return errno; // return ret; }