예제 #1
0
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;
}
예제 #2
0
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];
}