int GSwifi::httpd (int port) { int i; if (!isAssociated() || _state.status != STAT_READY) return -1; memset(&_httpd, 0, sizeof(_httpd)); for (i = 0; i < CFG_MAX_SOCKETS; i ++) { _httpd[i].mode = HTTPDMODE_REQUEST; _httpd[i].buf = _con[i].buf; } #ifdef CFG_ENABLE_RTOS #ifdef CFG_EXTENDED_MEMORY2 int n = CFG_EXTENDED_SIZE2 / CFG_MAX_SOCKETS; for (i = 0; i < CFG_MAX_SOCKETS; i ++) { _httpd[i].uri = (char*)(CFG_EXTENDED_MEMORY2 + (n * i)); #ifdef CFG_ENABLE_RTOS _httpd[i].websocket_key = (char*)malloc(30); #endif } #else // CFG_EXTENDED_MEMORY for (i = 0; i < CFG_MAX_SOCKETS; i ++) { _httpd[i].uri = (char*)malloc(CFG_CMD_SIZE); #ifdef CFG_ENABLE_RTOS _httpd[i].websocket_key = (char*)malloc(30); #endif } #endif // CFG_EXTENDED_MEMORY #endif _handler_count = 0; _httpd_cid = listen(PROTO_TCP, port); if (_httpd_cid < 0) return -1; _con[_httpd_cid].protocol = PROTO_HTTPD; return _httpd_cid; }
int getassoclist_11n(char *ifname, unsigned char *list) { unsigned char *buf; buf = safe_malloc(24 * 1024); memset(buf, 0, 1024 * 24); unsigned char *cp; int len; struct iwreq iwr; int s; char type[32]; char netmode[32]; unsigned int *count = (unsigned int *)list; sprintf(type, "%s_mode", ifname); sprintf(netmode, "%s_net_mode", ifname); if (nvram_match(netmode, "disabled")) { free(buf); return 0; } int mincount = 0; if (nvram_match(type, "wdssta") || nvram_match(type, "sta") || nvram_match(type, "wet")) { int assoc = isAssociated(ifname); if (!assoc) { free(buf); return 0; } char mac[6]; getAssocMAC(ifname, mac); memcpy(&list[4], mac, 6); count[0] = 1; mincount = 1; } s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { fprintf(stderr, "socket(SOCK_DRAGM)\n"); free(buf); mincount = 1; return mincount; } (void)memset(&iwr, 0, sizeof(iwr)); (void)strncpy(iwr.ifr_name, ifname, sizeof(iwr.ifr_name)); iwr.u.data.pointer = (void *)buf; iwr.u.data.length = 1024 * 24; if (ioctl(s, IEEE80211_IOCTL_STA_INFO, &iwr) < 0) { close(s); free(buf); return mincount; } len = iwr.u.data.length; if (len < sizeof(struct ieee80211req_sta_info)) { close(s); free(buf); return mincount; } cp = buf; unsigned char *l = (unsigned char *)list; count[0] = 0; l += 4; do { struct ieee80211req_sta_info *si; si = (struct ieee80211req_sta_info *)cp; memcpy(l, &si->isi_macaddr[0], 6); if (l[0] == 0 && l[1] == 0 && l[2] == 0 && l[3] == 0 && l[4] == 0 && l[5] == 0) break; l += 6; count[0]++; cp += si->isi_len; len -= si->isi_len; } while (len >= sizeof(struct ieee80211req_sta_info)); close(s); free(buf); return mincount > count[0] ? mincount : count[0]; }