/*=========================================================================== *===========================================================================*/ void xml_station_item(struct mg_connection *c, const struct mg_request_info *ri, void *user_data) { struct SQDB *sqdb = (struct SQDB*)user_data; unsigned char mac_address[6]; char mac_address_str[16] = ""; struct TMP_STATIONS *stations=NULL; unsigned station_count = 0; pixie_enter_critical_section(sqdb->cs); if (memcmp(ri->uri, "/station/", 9) != 0) { mg_printf(c, "404 Not Found\r\nConnection: closed\r\n\r\n"); goto _return; } /* * Lookup this BSSID entry */ parse_mac_address(mac_address, sizeof(mac_address), ri->uri+strlen("/station/")); stations = sqdb_find_station(sqdb, mac_address, &station_count); if (stations == NULL || station_count == 0) { mg_printf(c, "404 Not Found\r\nConnection: closed\r\n\r\n"); goto _return; } sprintf_s(mac_address_str, sizeof(mac_address_str), "%02x%02x%02x%02x%02x%02x", mac_address[0],mac_address[1],mac_address[2], mac_address[3],mac_address[4],mac_address[5] ); mg_headers_ok(c, "text/xml"); X(c, "Connection: close\r\n"); X(c, "\r\n"); X(c, "<?xml version=\"1.0\" ?>\n"); X(c, "<update timestamp=\"%u\">\n", time(0)); X(c, " <station id=\"%02x%02x%02x%02x%02x%02x\">\n", mac_address[0],mac_address[1],mac_address[2], mac_address[3],mac_address[4],mac_address[5] ); X(c, " <mac>[%02x:%02x:%02x:%02x:%02x:%02x]</mac>\n", mac_address[0],mac_address[1],mac_address[2], mac_address[3],mac_address[4],mac_address[5] ); X(c, " </station>\n"); X(c, "</update>\n"); _return: pixie_leave_critical_section(sqdb->cs); if (stations) free(stations); }
/******************************************************************************* * translate_option() ******************************************************************************* * * DESCRIPTION: * * This function takes a line read in from the config file and parses out * the key/value pairs. It then determines which key has been parsed and sets * the card's configuration based on the value given. * * PARAMETERS: * * buffer - a buffer containing a line to translate * config - a pointer to the device's private adapter structure * * RETURNS: * * N/A * ******************************************************************************/ void translate_option(char *buffer, struct wl_private *lp) { unsigned int value_convert = 0; int string_length = 0; char *key = NULL; char *value = NULL; u_char mac_value[ETH_ALEN]; /*------------------------------------------------------------------------*/ DBG_FUNC("translate_option"); if (buffer == NULL || lp == NULL) { DBG_ERROR(DbgInfo, "Config file buffer and/or wavelan buffer ptr NULL\n"); return; } ParseConfigLine(buffer, &key, &value); if (key == NULL || value == NULL) return; /* Determine which key it is and perform the appropriate action */ /* Configuration parameters used in all scenarios */ #if DBG /* handle DebugFlag as early as possible so it starts its influence as early * as possible */ if (strcmp(key, PARM_NAME_DEBUG_FLAG) == 0) { if (DebugFlag == ~0) { /* if DebugFlag is not specified on the command line */ if (DbgInfo->DebugFlag == 0) { /* if pc_debug did not set DebugFlag (i.e.pc_debug is * not specified or specified outside the 4-8 range */ DbgInfo->DebugFlag |= DBG_DEFAULTS; } } else { DbgInfo->DebugFlag = simple_strtoul(value, NULL, 0); /* ;?DebugFlag; */ } DbgInfo->DebugFlag = simple_strtoul(value, NULL, 0); /* ;?Delete ASAP */ } #endif /* DBG */ if (strcmp(key, PARM_NAME_AUTH_KEY_MGMT_SUITE) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_AUTH_KEY_MGMT_SUITE, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_AUTH_KEY_MGMT_SUITE) || (value_convert <= PARM_MAX_AUTH_KEY_MGMT_SUITE)) lp->AuthKeyMgmtSuite = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_AUTH_KEY_MGMT_SUITE); } else if (strcmp(key, PARM_NAME_BRSC_2GHZ) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_BRSC_2GHZ, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_BRSC) || (value_convert <= PARM_MAX_BRSC)) lp->brsc[0] = value_convert; else DBG_WARNING(DbgInfo, "%s invaid; will be ignored\n", PARM_NAME_BRSC_2GHZ); } else if (strcmp(key, PARM_NAME_BRSC_5GHZ) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_BRSC_5GHZ, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_BRSC) || (value_convert <= PARM_MAX_BRSC)) lp->brsc[1] = value_convert; else DBG_WARNING(DbgInfo, "%s invaid; will be ignored\n", PARM_NAME_BRSC_5GHZ); } else if ((strcmp(key, PARM_NAME_DESIRED_SSID) == 0) || (strcmp(key, PARM_NAME_OWN_SSID) == 0)) { DBG_TRACE(DbgInfo, "SSID, value: %s\n", value); memset(lp->NetworkName, 0, (PARM_MAX_NAME_LEN + 1)); /* Make sure the value isn't too long */ string_length = strlen(value); if (string_length > PARM_MAX_NAME_LEN) { DBG_WARNING(DbgInfo, "SSID too long; will be truncated\n"); string_length = PARM_MAX_NAME_LEN; } memcpy(lp->NetworkName, value, string_length); } #if 0 else if (strcmp(key, PARM_NAME_DOWNLOAD_FIRMWARE) == 0) { DBG_TRACE(DbgInfo, "DOWNLOAD_FIRMWARE, value: %s\n", value); memset(lp->fw_image_filename, 0, (MAX_LINE_SIZE + 1)); /* Make sure the value isn't too long */ string_length = strlen(value); if (string_length > MAX_LINE_SIZE) DBG_WARNING(DbgInfo, "F/W image file name too long; will be ignored\n"); else memcpy(lp->fw_image_filename, value, string_length); } #endif else if (strcmp(key, PARM_NAME_ENABLE_ENCRYPTION) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_ENABLE_ENCRYPTION, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_ENABLE_ENCRYPTION) && (value_convert <= PARM_MAX_ENABLE_ENCRYPTION)) lp->EnableEncryption = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_ENABLE_ENCRYPTION); } else if (strcmp(key, PARM_NAME_ENCRYPTION) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_ENCRYPTION, value); memset(lp->szEncryption, 0, sizeof(lp->szEncryption)); /* Make sure the value isn't too long */ string_length = strlen(value); if (string_length > sizeof(lp->szEncryption)) { DBG_WARNING(DbgInfo, "%s too long; will be truncated\n", PARM_NAME_ENCRYPTION); string_length = sizeof(lp->szEncryption); } memcpy(lp->szEncryption, value, string_length); } else if (strcmp(key, PARM_NAME_KEY1) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_KEY1, value); if (is_valid_key_string(value)) { memset(lp->DefaultKeys.key[0].key, 0, MAX_KEY_SIZE); key_string2key(value, &lp->DefaultKeys.key[0]); } else { DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_KEY1); } } else if (strcmp(key, PARM_NAME_KEY2) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_KEY2, value); if (is_valid_key_string(value)) { memset(lp->DefaultKeys.key[1].key, 0, MAX_KEY_SIZE); key_string2key(value, &lp->DefaultKeys.key[1]); } else { DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_KEY2); } } else if (strcmp(key, PARM_NAME_KEY3) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_KEY3, value); if (is_valid_key_string(value)) { memset(lp->DefaultKeys.key[2].key, 0, MAX_KEY_SIZE); key_string2key(value, &lp->DefaultKeys.key[2]); } else { DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_KEY3); } } else if (strcmp(key, PARM_NAME_KEY4) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_KEY4, value); if (is_valid_key_string(value)) { memset(lp->DefaultKeys.key[3].key, 0, MAX_KEY_SIZE); key_string2key(value, &lp->DefaultKeys.key[3]); } else { DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_KEY4); } } /* New Parameters for WARP */ else if (strcmp(key, PARM_NAME_LOAD_BALANCING) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_LOAD_BALANCING, value); lp->loadBalancing = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_MEDIUM_DISTRIBUTION) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MEDIUM_DISTRIBUTION, value); lp->mediumDistribution = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_MICROWAVE_ROBUSTNESS) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MICROWAVE_ROBUSTNESS, value); lp->MicrowaveRobustness = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_MULTICAST_RATE) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MULTICAST_RATE, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_MULTICAST_RATE) && (value_convert <= PARM_MAX_MULTICAST_RATE)) lp->MulticastRate[0] = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_MULTICAST_RATE); } else if (strcmp(key, PARM_NAME_OWN_CHANNEL) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_CHANNEL, value); value_convert = simple_strtoul(value, NULL, 0); if (wl_is_a_valid_chan(value_convert)) { if (value_convert > 14) value_convert = value_convert | 0x100; lp->Channel = value_convert; } else { DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_OWN_CHANNEL); } } else if (strcmp(key, PARM_NAME_OWN_NAME) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_NAME, value); memset(lp->StationName, 0, (PARM_MAX_NAME_LEN + 1)); /* Make sure the value isn't too long */ string_length = strlen(value); if (string_length > PARM_MAX_NAME_LEN) { DBG_WARNING(DbgInfo, "%s too long; will be truncated\n", PARM_NAME_OWN_NAME); string_length = PARM_MAX_NAME_LEN; } memcpy(lp->StationName, value, string_length); } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) lp->RTSThreshold = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD); } else if (strcmp(key, PARM_NAME_SRSC_2GHZ) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_SRSC_2GHZ, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_SRSC) || (value_convert <= PARM_MAX_SRSC)) lp->srsc[0] = value_convert; else DBG_WARNING(DbgInfo, "%s invaid; will be ignored\n", PARM_NAME_SRSC_2GHZ); } else if (strcmp(key, PARM_NAME_SRSC_5GHZ) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_SRSC_5GHZ, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_SRSC) || (value_convert <= PARM_MAX_SRSC)) lp->srsc[1] = value_convert; else DBG_WARNING(DbgInfo, "%s invaid; will be ignored\n", PARM_NAME_SRSC_5GHZ); } else if (strcmp(key, PARM_NAME_SYSTEM_SCALE) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_SYSTEM_SCALE, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_SYSTEM_SCALE) && (value_convert <= PARM_MAX_SYSTEM_SCALE)) lp->DistanceBetweenAPs = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_SYSTEM_SCALE); } else if (strcmp(key, PARM_NAME_TX_KEY) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_KEY, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_TX_KEY) && (value_convert <= PARM_MAX_TX_KEY)) lp->TransmitKeyID = simple_strtoul(value, NULL, 0); else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_KEY); } else if (strcmp(key, PARM_NAME_TX_RATE) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) lp->TxRateControl[0] = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE); } else if (strcmp(key, PARM_NAME_TX_POW_LEVEL) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_POW_LEVEL, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_TX_POW_LEVEL) || (value_convert <= PARM_MAX_TX_POW_LEVEL)) lp->txPowLevel = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_POW_LEVEL); } /* Need to add? : Country code, Short/Long retry */ /* Configuration parameters specific to STA mode */ #if 1 /* ;? (HCF_TYPE) & HCF_TYPE_STA */ /* ;?seems reasonable that even an AP-only driver could afford this small additional footprint */ if (CNV_INT_TO_LITTLE(lp->hcfCtx.IFB_FWIdentity.comp_id) == COMP_ID_FW_STA) { /* ;?should we return an error status in AP mode */ if (strcmp(key, PARM_NAME_PORT_TYPE) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_PORT_TYPE, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert == PARM_MIN_PORT_TYPE) || (value_convert == PARM_MAX_PORT_TYPE)) lp->PortType = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_PORT_TYPE); } else if (strcmp(key, PARM_NAME_PM_ENABLED) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_PM_ENABLED, value); value_convert = simple_strtoul(value, NULL, 0); /* ;? how about wl_main.c containing * VALID_PARAM(PARM_PM_ENABLED <= WVLAN_PM_STATE_STANDARD || * (PARM_PM_ENABLED & 0x7FFF) <= WVLAN_PM_STATE_STANDARD); */ if ((value_convert & 0x7FFF) <= PARM_MAX_PM_ENABLED) { lp->PMEnabled = value_convert; } else { DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_PM_ENABLED); /* ;?this is a data entry error, hence not a DBG_WARNING */ } } else if (strcmp(key, PARM_NAME_CREATE_IBSS) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_CREATE_IBSS, value); lp->CreateIBSS = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_MULTICAST_RX) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MULTICAST_RX, value); lp->MulticastReceive = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_MAX_SLEEP) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MAX_SLEEP, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= 0) && (value_convert <= 65535)) lp->MaxSleepDuration = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_MAX_SLEEP); } else if (strcmp(key, PARM_NAME_NETWORK_ADDR) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_NETWORK_ADDR, value); if (parse_mac_address(value, mac_value) == ETH_ALEN) memcpy(lp->MACAddress, mac_value, ETH_ALEN); else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_NETWORK_ADDR); } else if (strcmp(key, PARM_NAME_AUTHENTICATION) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_AUTHENTICATION, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_AUTHENTICATION) && (value_convert <= PARM_MAX_AUTHENTICATION)) lp->authentication = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_AUTHENTICATION); } else if (strcmp(key, PARM_NAME_OWN_ATIM_WINDOW) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_ATIM_WINDOW, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_OWN_ATIM_WINDOW) && (value_convert <= PARM_MAX_OWN_ATIM_WINDOW)) lp->atimWindow = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_OWN_ATIM_WINDOW); } else if (strcmp(key, PARM_NAME_PM_HOLDOVER_DURATION) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_PM_HOLDOVER_DURATION, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_PM_HOLDOVER_DURATION) && (value_convert <= PARM_MAX_PM_HOLDOVER_DURATION)) lp->holdoverDuration = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_PM_HOLDOVER_DURATION); } else if (strcmp(key, PARM_NAME_PROMISCUOUS_MODE) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_PROMISCUOUS_MODE, value); lp->promiscuousMode = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_CONNECTION_CONTROL) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_CONNECTION_CONTROL, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_CONNECTION_CONTROL) && (value_convert <= PARM_MAX_CONNECTION_CONTROL)) lp->connectionControl = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_CONNECTION_CONTROL); } /* Need to add? : Probe Data Rate */ } #endif /* (HCF_TYPE) & HCF_TYPE_STA */ /* Configuration parameters specific to AP mode */ #if 1 /* ;? (HCF_TYPE) & HCF_TYPE_AP */ /* ;?should we restore this to allow smaller memory footprint */ if (CNV_INT_TO_LITTLE(lp->hcfCtx.IFB_FWIdentity.comp_id) == COMP_ID_FW_AP) { if (strcmp(key, PARM_NAME_OWN_DTIM_PERIOD) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_DTIM_PERIOD, value); value_convert = simple_strtoul(value, NULL, 0); if (value_convert >= PARM_MIN_OWN_DTIM_PERIOD) lp->DTIMPeriod = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_OWN_DTIM_PERIOD); } else if (strcmp(key, PARM_NAME_REJECT_ANY) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_REJECT_ANY, value); lp->RejectAny = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_EXCLUDE_UNENCRYPTED) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_EXCLUDE_UNENCRYPTED, value); lp->ExcludeUnencrypted = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_MULTICAST_PM_BUFFERING) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_MULTICAST_PM_BUFFERING, value); lp->ExcludeUnencrypted = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_INTRA_BSS_RELAY) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_INTRA_BSS_RELAY, value); lp->ExcludeUnencrypted = parse_yes_no(value); } else if (strcmp(key, PARM_NAME_OWN_BEACON_INTERVAL) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_OWN_BEACON_INTERVAL, value); value_convert = simple_strtoul(value, NULL, 0); if (value_convert >= PARM_MIN_OWN_BEACON_INTERVAL) lp->ownBeaconInterval = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_OWN_BEACON_INTERVAL); } else if (strcmp(key, PARM_NAME_COEXISTENCE) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_COEXISTENCE, value); value_convert = simple_strtoul(value, NULL, 0); if (value_convert >= PARM_MIN_COEXISTENCE) lp->coexistence = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_COEXISTENCE); } #ifdef USE_WDS else if (strcmp(key, PARM_NAME_RTS_THRESHOLD1) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD1, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) lp->wds_port[0].rtsThreshold = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD1); } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD2) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD2, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) lp->wds_port[1].rtsThreshold = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD2); } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD3) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD3, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) lp->wds_port[2].rtsThreshold = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD3); } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD4) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD4, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) lp->wds_port[3].rtsThreshold = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD4); } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD5) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD5, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) lp->wds_port[4].rtsThreshold = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD5); } else if (strcmp(key, PARM_NAME_RTS_THRESHOLD6) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_RTS_THRESHOLD6, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_RTS_THRESHOLD) && (value_convert <= PARM_MAX_RTS_THRESHOLD)) lp->wds_port[5].rtsThreshold = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_RTS_THRESHOLD6); } else if (strcmp(key, PARM_NAME_TX_RATE1) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE1, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) lp->wds_port[0].txRateCntl = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE1); } else if (strcmp(key, PARM_NAME_TX_RATE2) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE2, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) lp->wds_port[1].txRateCntl = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE2); } else if (strcmp(key, PARM_NAME_TX_RATE3) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE3, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) lp->wds_port[2].txRateCntl = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE3); } else if (strcmp(key, PARM_NAME_TX_RATE4) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE4, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) lp->wds_port[3].txRateCntl = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE4); } else if (strcmp(key, PARM_NAME_TX_RATE5) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE5, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) lp->wds_port[4].txRateCntl = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE5); } else if (strcmp(key, PARM_NAME_TX_RATE6) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_TX_RATE6, value); value_convert = simple_strtoul(value, NULL, 0); if ((value_convert >= PARM_MIN_TX_RATE) && (value_convert <= PARM_MAX_TX_RATE)) lp->wds_port[5].txRateCntl = value_convert; else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_TX_RATE6); } else if (strcmp(key, PARM_NAME_WDS_ADDRESS1) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS1, value); if (parse_mac_address(value, mac_value) == ETH_ALEN) memcpy(lp->wds_port[0].wdsAddress, mac_value, ETH_ALEN); else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS1); } else if (strcmp(key, PARM_NAME_WDS_ADDRESS2) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS2, value); if (parse_mac_address(value, mac_value) == ETH_ALEN) memcpy(lp->wds_port[1].wdsAddress, mac_value, ETH_ALEN); else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS2); } else if (strcmp(key, PARM_NAME_WDS_ADDRESS3) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS3, value); if (parse_mac_address(value, mac_value) == ETH_ALEN) memcpy(lp->wds_port[2].wdsAddress, mac_value, ETH_ALEN); else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS3); } else if (strcmp(key, PARM_NAME_WDS_ADDRESS4) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS4, value); if (parse_mac_address(value, mac_value) == ETH_ALEN) memcpy(lp->wds_port[3].wdsAddress, mac_value, ETH_ALEN); else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS4); } else if (strcmp(key, PARM_NAME_WDS_ADDRESS5) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS5, value); if (parse_mac_address(value, mac_value) == ETH_ALEN) memcpy(lp->wds_port[4].wdsAddress, mac_value, ETH_ALEN); else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS5); } else if (strcmp(key, PARM_NAME_WDS_ADDRESS6) == 0) { DBG_TRACE(DbgInfo, "%s, value: %s\n", PARM_NAME_WDS_ADDRESS6, value); if (parse_mac_address(value, mac_value) == ETH_ALEN) memcpy(lp->wds_port[5].wdsAddress, mac_value, ETH_ALEN); else DBG_WARNING(DbgInfo, "%s invalid; will be ignored\n", PARM_NAME_WDS_ADDRESS6); } #endif /* USE_WDS */ } #endif /* (HCF_TYPE) & HCF_TYPE_AP */ return; } /* translate_option */
/*=========================================================================== *===========================================================================*/ void display_station_item(struct mg_connection *c, const struct mg_request_info *ri, void *user_data) { struct SQDB *sqdb = (struct SQDB*)user_data; unsigned char mac_address[6]; char mac_address_str[16]; char buf[64]; struct TMP_STATIONS *stations = NULL; unsigned station_count = 0; unsigned i; if (strstr(ri->uri, ".xml")) { xml_station_item(c, ri, user_data); return; } pixie_enter_critical_section(sqdb->cs); if (memcmp(ri->uri, "/station/", 9) != 0) { mg_printf(c, "404 Not Found\r\nConnection: closed\r\n\r\n"); goto _return; } /* * Lookup this BSSID entry */ parse_mac_address(mac_address, sizeof(mac_address), ri->uri+strlen("/station/")); stations = sqdb_find_station(sqdb, mac_address, &station_count); if (stations == 0 || station_count == 0) { mg_printf(c, "404 Not Found\r\nConnection: closed\r\n\r\n"); goto _return; } sprintf_s(mac_address_str, sizeof(mac_address_str), "%02x%02x%02x%02x%02x%02x", mac_address[0],mac_address[1],mac_address[2], mac_address[3],mac_address[4],mac_address[5] ); mg_headers_ok(c, "text/html"); X(c, "Connection: close\r\n"); X(c, "\r\n"); //X(c, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\r\n"); X(c,"<html>\n"); X(c,"<head>\n"); X(c," <title>Squirrel WiFi monitor</title>\n"); X(c," <link rel=\"stylesheet\" type=\"text/css\" href=\"../squirrel.css\" />\n"); X(c," <link rel=\"Shortcut Icon\" href=\"../favicon.ico\" type=\"image/x-icon\">\n"); X(c," <script type=\"text/javascript\" src=\"../squirrel.js\"></script>\n"); X(c, "<script type=\"text/javascript\">var bssid_item_address = '%s';</script>\n", mac_address_str); X(c,"</head>\n"); X(c,"<body onLoad=\"setInterval(refresh_station_item,1000)\">\n"); display_topmenu(c, ri, user_data, 1); for (i=0; i<station_count; i++) { struct TMP_STATIONS *tmp = &stations[i]; /* * ASSOCIATED station */ if (tmp->type == 2) { struct SQDB_SubStation *sta = tmp->sta.associated; struct SQDB_AccessPoint *ap = tmp->sta.accesspoint; X(c, "<table id=\"station\" class=\"station\">\n"); X(c, " <tr id=\"0\"><th colspan=\"6\" class=\"title\">ASSOCIATED STATION</th></tr>\n"); X(c, " <tr id=\"1\">\n"); X(c, " <th>MAC:</th><td id=\"mac\" class=\"mac\">[%02x:%02x:%02x:%02x:%02x:%02x]</td>\n", mac_address[0],mac_address[1],mac_address[2], mac_address[3],mac_address[4],mac_address[5], mac_address[0],mac_address[1],mac_address[2], mac_address[3],mac_address[4],mac_address[5] ); X(c, " <th>Data Sent:</th><td id=\"dataout\" class=\"sent\">%s</td>\n", format_unsigned(sta->data_sent,buf,sizeof(buf))); X(c, " <th>Data Recv:</th><td id=\"datain\" class=\"sent\">%s</td>\n", format_unsigned(sta->data_received,buf,sizeof(buf))); X(c, " </tr>\n"); X(c, " <tr id=\"2\">\n"); X(c, " <th>SSID:</th><td id=\"essid\" class=\"essid\"><a href=\"/bssid/%02x%02x%02x%02x%02x%02x.html\">%.*s</a></td>\n", ap->bssid[0], ap->bssid[1], ap->bssid[2], ap->bssid[3], ap->bssid[4], ap->bssid[5], ap->ssid.length, ap->ssid.value); X(c, " <th>Ctrl Sent:</th><td id=\"ctrlout\" class=\"sent\">%s</td>\n", format_unsigned(sta->ctrl_sent,buf,sizeof(buf))); X(c, " <th>Ctrl Recv:</th><td id=\"ctrlin\" class=\"sent\">%s</td>\n", format_unsigned(sta->ctrl_received,buf,sizeof(buf))); X(c, " </tr>\n"); X(c, " <tr id=\"4\">\n"); X(c, " <th>BSSID:</th><td id=\"bssid\" class=\"bssid\"><a href=\"/bssid/%02x%02x%02x%02x%02x%02x.html\">%02x:%02x:%02x:%02x:%02x:%02x</a></td>\n", ap->bssid[0], ap->bssid[1], ap->bssid[2], ap->bssid[3], ap->bssid[4], ap->bssid[5], ap->bssid[0], ap->bssid[1], ap->bssid[2], ap->bssid[3], ap->bssid[4], ap->bssid[5] ); X(c, " <th>Power:</th><td id=\"power\" class=\"power\">%s</td>\n", format_signed(sta->dbm,buf,sizeof(buf))); X(c, " <th>Channels:</th><td id=\"channels\" class=\"channels\">"); { unsigned j; for (j=0; j<ap->channel_count; j++) { X(c, "%u%c", ap->channels[j], (j+1<ap->channel_count?',':' ')); } } X(c, "</td>\n"); X(c, " </tr>\n"); X(c, " <tr id=\"6\">\n"); X(c, " <th>MANUF:</th><td id=\"manuf\" class=\"manuf\">%s</td>\n", manuf_from_mac(mac_address)); X(c, " <th>Desc:</th><td id=\"manuf2\" class=\"manuf2\" colspan=\"3\">%s</td>\n", manuf2_from_mac(mac_address)); X(c, " </tr>\n"); X(c, " <tr id=\"7\">\n"); X(c, " <th>Info:</th><td id=\"manuf\" class=\"manuf\" colspan=\"5\">\n"); { struct NVPair *nv = sta->data; while (nv) { X(c, " %s = %s<br/>\n", nv->name, nv->value); nv = nv->next; } } X(c, " </th>\n"); X(c, " </tr>\n"); X(c, "</table><br/>\n"); } if (tmp->type == 1) { struct SQDB_Station *sta = tmp->sta.unassociated; X(c, "<table id=\"station\" class=\"station\">\n"); X(c, " <tr id=\"0\"><th colspan=\"6\" class=\"title\">UNASSOCIATED PROBER</th></tr>\n"); X(c, " <tr id=\"1\">\n"); X(c, " <th>MAC:</th><td id=\"mac\" class=\"mac\">[%02x:%02x:%02x:%02x:%02x:%02x]</td>\n", mac_address[0],mac_address[1],mac_address[2], mac_address[3],mac_address[4],mac_address[5], mac_address[0],mac_address[1],mac_address[2], mac_address[3],mac_address[4],mac_address[5] ); X(c, " <th>Probes:</th><td id=\"dataout\" class=\"sent\">%s</td>\n", format_unsigned(sta->probe_count,buf,sizeof(buf))); X(c, " <th>Responses:</th><td id=\"datain\" class=\"sent\">%s</td>\n", format_unsigned(0,buf,sizeof(buf))); X(c, " </tr>\n"); X(c, " <tr id=\"7\">\n"); X(c, " <th>SSIDs:</th><td id=\"essid\" class=\"essid\" colspan=\"5\">\n"); { struct EntrySSID *s; for (s=&sta->ssid; s; s = s->next) { char defanged[1024]; defang_ssid(defanged, sizeof(defanged), (const char*)s->ssid.value, s->ssid.length); X(c, "%s<br/>", defanged); } } X(c, " </th>\n"); X(c, " </tr>\n"); X(c, "</table><br/>\n"); } } X(c, "</body>\n" "</html>\n" ); _return: pixie_leave_critical_section(sqdb->cs); if (stations) free(stations); }