diff --git a/src/core/agent.c b/src/core/agent.c index 345304165b19f58656ca7fdd50662e84f1667ad1..06c711b44222f5174769d93540e52d67f84444aa 100644 --- a/src/core/agent.c +++ b/src/core/agent.c @@ -2858,7 +2858,7 @@ static void parse_radio(struct ubus_request *req, int type, } if (tb[2]) - re->anpi = (int) blobmsg_get_u32(tb[2]); + re->anpi = (int) blobmsg_get_u32(tb[2]); // no get int? if (tb[3]) re->rx_streams = blobmsg_get_u8(tb[3]); @@ -2887,7 +2887,9 @@ static void parse_radio(struct ubus_request *req, int type, return; } // Iterate through all supp_channels (opclasses) in radio + // fprintf(stderr, "|%s:%d| DEBUG!\n", __func__, __LINE__); // DEBUG blobmsg_for_each_attr(cur, tb[5], rem) { + // fprintf(stderr, "|%s:%d| DEBUG!\n", __func__, __LINE__); // DEBUG struct blob_attr *data[4]; static const struct blobmsg_policy supp_attrs[4] = { [0] = { .name = "opclass", .type = BLOBMSG_TYPE_INT32 }, @@ -2910,9 +2912,10 @@ static void parse_radio(struct ubus_request *req, int type, if (data[2]) { struct blob_attr *attr; + j = 0; // reset iterator through channels for current opclass re->supp_opclass[i].num_supported_channels = blobmsg_check_array(data[2], BLOBMSG_TYPE_INT32); - re->scanlist->opclass_scanlist[i].num_channels_scanned = blobmsg_check_array(data[2], BLOBMSG_TYPE_INT32); + re->scanlist->opclass_scanlist[i].num_channels_scanned = blobmsg_check_array(data[2], BLOBMSG_TYPE_INT32); //lejla //fprintf(stdout,"\t debug num_of_ch: %d\n", re->scanlist->opclass_scanlist[i].num_channels_scanned); re->scanlist->opclass_scanlist[i].channel_scanlist = calloc(re->scanlist->opclass_scanlist[i].num_channels_scanned, sizeof(struct wifi_scanres_channel_element)); @@ -2920,6 +2923,7 @@ static void parse_radio(struct ubus_request *req, int type, dbg("|%s:%d| out of memory!\n", __func__, __LINE__); return; } + //fprintf(stdout, "\t debug %s %d\n", __func__, __LINE__); re->scanlist->opclass_scanlist[i].opclass = blobmsg_get_u32(data[0]); // Iterate through all channels of the opclass blobmsg_for_each_attr(attr, data[2], remm) { @@ -2928,6 +2932,7 @@ static void parse_radio(struct ubus_request *req, int type, re->scanlist->opclass_scanlist[i].channel_scanlist[j].channel = blobmsg_get_u32(attr); j++; } + //fprintf(stdout, "\t debug %s %d\n", __func__, __LINE__); } re->supp_opclass[i].supp_chanlist = calloc(re->supp_opclass[i].num_supported_channels, sizeof(struct supp_channel)); if (!re->supp_opclass[i].supp_chanlist) { @@ -3164,10 +3169,10 @@ static void _enumerate_wifi_objects(struct ubus_request *req, int type, ubus_call_object(a, r_wobj, "status", parse_radio, &a->radios[i]); // ubus call wifi.radio.wl0 scan - // ubus_call_object(a,r_wobj, "scan", NULL, &a->radios[i]); - // fprintf(stderr, "Scaning neighbors....."); - // sleep(5); // TODO : week 8 - // fprintf(stderr, "DONE\n"); + //ubus_call_object(a, r_wobj, "scan", NULL, &a->radios[i]); + //fprintf(stderr, "Scaning neighbors....."); + //sleep(5); // TODO : week 8 + //fprintf(stderr, "DONE\n"); // ubus call wifi.radio.wl0 scanresults ubus_call_object(a, r_wobj, "scanresults", parse_scanresults, &a->radios[i]); diff --git a/src/core/agent_map.c b/src/core/agent_map.c index 325d2315b111444d3519302b13ff70d23f8a5db4..18deca796fc6e313b5f7e8867a84536e314544a6 100644 --- a/src/core/agent_map.c +++ b/src/core/agent_map.c @@ -729,7 +729,7 @@ struct netif_fh *wifi_get_netif_by_bssid(struct agent *a, uint8_t *bssid) return NULL; } -int wifi_get_radio_index_by_mac(struct agent *a, +static struct wifi_radio_element *wifi_get_radio_index_by_mac(struct agent *a, uint8_t *hwaddr) { struct wifi_radio_element *radio; @@ -744,7 +744,7 @@ int wifi_get_radio_index_by_mac(struct agent *a, return i; } - return -1; + return NULL; } int wifi_teardown_iface(const char *ifname) @@ -3007,7 +3007,7 @@ int handle_channel_scan_request(void *agent, struct cmdu_cstruct *cmdu) trace("%s: --->\n", __func__); struct agent *a = (struct agent *) agent; uint16_t tlv_index = 0; - uint32_t i, j, k, m; + uint32_t i, j, k; int radio_index; int opclass_index; @@ -3035,10 +3035,8 @@ int handle_channel_scan_request(void *agent, struct cmdu_cstruct *cmdu) cmdu_data->message_id = cmdu->message_id; strcpy(cmdu_data->intf_name, cmdu->intf_name); memcpy(cmdu_data->origin, cmdu->origin, 6); - cmdu_data->num_tlvs = 1; // timestamp tlv - for (m = 0; m < query->nbr_radios; m++) { // for each radio - cmdu_data->num_tlvs += query->radio_data[m].op_class_data->nbr_ch; // ch scan res tlvs - } + cmdu_data->num_tlvs = 1 + query->radio_data->op_class_data->nbr_ch; + // Allocate the TLVs cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, sizeof(uint8_t *)); if (!cmdu_data->tlvs) { @@ -3059,40 +3057,31 @@ int handle_channel_scan_request(void *agent, struct cmdu_cstruct *cmdu) /* Channel scan result */ struct wifi_radio_element *radio = a->radios; - /* Multi radio */ - for (m = 0; m < query->nbr_radios; m++) { - //fprintf(stdout, "\tNumber of radios = %d", query->nbr_radios); - //fprintf(stdout, "\tradio_id in %d(m) iteration: " MACFMT "\n", m, MAC2STR(query->radio_data[m].radio_id)); - radio_index = wifi_get_radio_index_by_mac(a, query->radio_data[m].radio_id); - //fprintf(stdout, "\n\t\tRADIO INDEX: %d for " MACFMT "\n\n", radio_index, MAC2STR(query->radio_data[m].radio_id)); - // Go through the channel list from the query - for (k = 0; k < query->radio_data[m].op_class_data->nbr_ch; k++) { - uint8_t query_channel = query->radio_data[m].op_class_data->ch[k]; - //fprintf(stdout,"query channel %d\n", query_channel); - - for (i = 0; i < radio[radio_index].scanlist->num_opclass_scanned; i++) { - //fprintf(stdout, "In the device list we are looking at radio " MACFMT " in %d(m) iteration\n", MAC2STR(radio[radio_index].macaddr), m); - for (j = 0; j < radio[radio_index].scanlist->opclass_scanlist[i].num_channels_scanned; j++) { - //fprintf(stdout,"current channel %d\n", radio[radio_index].scanlist->opclass_scanlist[i].channel_scanlist[j].channel); - if (radio[radio_index].scanlist->opclass_scanlist[i].channel_scanlist[j].channel == query_channel) { - //fprintf(stdout,"GO!\n"); - opclass_index = i; - channel_index = j; - struct tlv_ch_scan_res *p1 = (struct tlv_ch_scan_res *)calloc(1, sizeof(struct tlv_ch_scan_res)); - - if (p1) { - p1->tlv_type = MAP_TLV_CHANNEL_SCAN_RES; - scan_results(a, p1, radio_index, opclass_index, channel_index); - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; - trace("|%s:%d| Added %s for channel %d, tlv_index %d\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1]), query_channel, tlv_index-1); - goto found; - } + /* Assuming one radio */ + radio_index = wifi_get_radio_index_by_mac(a, query->radio_data->radio_id); + // Go through the channel list from the query + for (int k = 0; k < query->radio_data->op_class_data->nbr_ch; k++) { + uint8_t query_channel = query->radio_data->op_class_data->ch[k]; + + for (int i = 0; i < radio->scanlist->num_opclass_scanned; i++) { + for (int j = 0; j < radio->scanlist->opclass_scanlist[i].num_channels_scanned; j++) { + if (radio->scanlist->opclass_scanlist[i].channel_scanlist[j].channel == query_channel) { + opclass_index = i; + channel_index = j; + struct tlv_ch_scan_res *p1 = (struct tlv_ch_scan_res *)calloc(1, sizeof(struct tlv_ch_scan_res)); + + if (p1) { + p1->tlv_type = MAP_TLV_CHANNEL_SCAN_RES; + scan_results(a, p1, radio_index, opclass_index, channel_index); + cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; + trace("|%s:%d| Added %s for channel %d\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1]), query_channel); + goto found; } } } -found: - continue; } +found: + continue; } // Send cmdu ret = agent_send_cmdu(a, cmdu_data);