mbed official / mbed-dev

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Jun 21 17:46:44 2017 +0100
Revision:
167:e84263d55307
Child:
186:707f6e361f3e
This updates the lib to the mbed lib v 145

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /******************************************************************************
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 *
AnnaBridge 167:e84263d55307 16 ******************************************************************************/
AnnaBridge 167:e84263d55307 17 #include "tcpip.h"
AnnaBridge 167:e84263d55307 18 #include "wifi/wifi_conf.h"
AnnaBridge 167:e84263d55307 19
AnnaBridge 167:e84263d55307 20 #ifndef CONFIG_WLAN
AnnaBridge 167:e84263d55307 21 #define CONFIG_WLAN 1
AnnaBridge 167:e84263d55307 22 #endif
AnnaBridge 167:e84263d55307 23
AnnaBridge 167:e84263d55307 24 #if CONFIG_WLAN
AnnaBridge 167:e84263d55307 25 #include <platform/platform_stdlib.h>
AnnaBridge 167:e84263d55307 26
AnnaBridge 167:e84263d55307 27 // Add extra interfaces to make release sdk able to determine promisc API linking
AnnaBridge 167:e84263d55307 28 void promisc_deinit(void *padapter)
AnnaBridge 167:e84263d55307 29 {
AnnaBridge 167:e84263d55307 30 #ifdef CONFIG_PROMISC
AnnaBridge 167:e84263d55307 31 _promisc_deinit(padapter);
AnnaBridge 167:e84263d55307 32 #endif
AnnaBridge 167:e84263d55307 33 }
AnnaBridge 167:e84263d55307 34
AnnaBridge 167:e84263d55307 35 int promisc_recv_func(void *padapter, void *rframe)
AnnaBridge 167:e84263d55307 36 {
AnnaBridge 167:e84263d55307 37 // Never reach here if not define CONFIG_PROMISC
AnnaBridge 167:e84263d55307 38 #ifdef CONFIG_PROMISC
AnnaBridge 167:e84263d55307 39 return _promisc_recv_func(padapter, rframe);
AnnaBridge 167:e84263d55307 40 #else
AnnaBridge 167:e84263d55307 41 return 0;
AnnaBridge 167:e84263d55307 42 #endif
AnnaBridge 167:e84263d55307 43 }
AnnaBridge 167:e84263d55307 44
AnnaBridge 167:e84263d55307 45 int promisc_set(rtw_rcr_level_t enabled, void (*callback)(unsigned char*, unsigned int, void*), unsigned char len_used)
AnnaBridge 167:e84263d55307 46 {
AnnaBridge 167:e84263d55307 47 #ifdef CONFIG_PROMISC
AnnaBridge 167:e84263d55307 48 return _promisc_set(enabled, callback, len_used);
AnnaBridge 167:e84263d55307 49 #else
AnnaBridge 167:e84263d55307 50 return -1;
AnnaBridge 167:e84263d55307 51 #endif
AnnaBridge 167:e84263d55307 52 }
AnnaBridge 167:e84263d55307 53
AnnaBridge 167:e84263d55307 54 unsigned char is_promisc_enabled(void)
AnnaBridge 167:e84263d55307 55 {
AnnaBridge 167:e84263d55307 56 #ifdef CONFIG_PROMISC
AnnaBridge 167:e84263d55307 57 return _is_promisc_enabled();
AnnaBridge 167:e84263d55307 58 #else
AnnaBridge 167:e84263d55307 59 return 0;
AnnaBridge 167:e84263d55307 60 #endif
AnnaBridge 167:e84263d55307 61 }
AnnaBridge 167:e84263d55307 62
AnnaBridge 167:e84263d55307 63 int promisc_get_fixed_channel(void *fixed_bssid, u8 *ssid, int *ssid_length)
AnnaBridge 167:e84263d55307 64 {
AnnaBridge 167:e84263d55307 65 #ifdef CONFIG_PROMISC
AnnaBridge 167:e84263d55307 66 return _promisc_get_fixed_channel(fixed_bssid, ssid, ssid_length);
AnnaBridge 167:e84263d55307 67 #else
AnnaBridge 167:e84263d55307 68 return 0;
AnnaBridge 167:e84263d55307 69 #endif
AnnaBridge 167:e84263d55307 70 }
AnnaBridge 167:e84263d55307 71 // End of Add extra interfaces
AnnaBridge 167:e84263d55307 72
AnnaBridge 167:e84263d55307 73 struct eth_frame {
AnnaBridge 167:e84263d55307 74 struct eth_frame *prev;
AnnaBridge 167:e84263d55307 75 struct eth_frame *next;
AnnaBridge 167:e84263d55307 76 unsigned char da[6];
AnnaBridge 167:e84263d55307 77 unsigned char sa[6];
AnnaBridge 167:e84263d55307 78 unsigned int len;
AnnaBridge 167:e84263d55307 79 unsigned char type;
AnnaBridge 167:e84263d55307 80 signed char rssi;
AnnaBridge 167:e84263d55307 81 };
AnnaBridge 167:e84263d55307 82
AnnaBridge 167:e84263d55307 83 #if CONFIG_INIC_CMD_RSP
AnnaBridge 167:e84263d55307 84 #if defined(__IAR_SYSTEMS_ICC__)
AnnaBridge 167:e84263d55307 85 #pragma pack(1)
AnnaBridge 167:e84263d55307 86 #endif
AnnaBridge 167:e84263d55307 87 struct inic_eth_frame {
AnnaBridge 167:e84263d55307 88 unsigned char da[6];
AnnaBridge 167:e84263d55307 89 unsigned char sa[6];
AnnaBridge 167:e84263d55307 90 unsigned int len;
AnnaBridge 167:e84263d55307 91 unsigned char type;
AnnaBridge 167:e84263d55307 92 };
AnnaBridge 167:e84263d55307 93 #if defined(__IAR_SYSTEMS_ICC__)
AnnaBridge 167:e84263d55307 94 #pragma pack()
AnnaBridge 167:e84263d55307 95 #endif
AnnaBridge 167:e84263d55307 96
AnnaBridge 167:e84263d55307 97 static struct inic_eth_frame *inic_frame, *inic_frame_tail = NULL;
AnnaBridge 167:e84263d55307 98 static int inic_frame_cnt = 0;
AnnaBridge 167:e84263d55307 99 #define MAX_INIC_FRAME_NUM 50 //maximum packets for each channel
AnnaBridge 167:e84263d55307 100 extern void inic_c2h_msg(const char *atcmd, char status, char *msg, u16 msg_len);
AnnaBridge 167:e84263d55307 101 #endif
AnnaBridge 167:e84263d55307 102
AnnaBridge 167:e84263d55307 103 struct eth_buffer {
AnnaBridge 167:e84263d55307 104 struct eth_frame *head;
AnnaBridge 167:e84263d55307 105 struct eth_frame *tail;
AnnaBridge 167:e84263d55307 106 };
AnnaBridge 167:e84263d55307 107
AnnaBridge 167:e84263d55307 108 static struct eth_buffer eth_buffer;
AnnaBridge 167:e84263d55307 109
AnnaBridge 167:e84263d55307 110 #ifdef CONFIG_PROMISC
AnnaBridge 167:e84263d55307 111 #define MAX_PACKET_FILTER_INFO 5
AnnaBridge 167:e84263d55307 112 #define FILTER_ID_INIT_VALUE 10
AnnaBridge 167:e84263d55307 113 rtw_packet_filter_info_t paff_array[MAX_PACKET_FILTER_INFO]={0, 0, 0, 0, 0};
AnnaBridge 167:e84263d55307 114 static u8 packet_filter_enable_num = 0;
AnnaBridge 167:e84263d55307 115
AnnaBridge 167:e84263d55307 116 void promisc_init_packet_filter()
AnnaBridge 167:e84263d55307 117 {
AnnaBridge 167:e84263d55307 118 int i = 0;
AnnaBridge 167:e84263d55307 119 for(i=0; i<MAX_PACKET_FILTER_INFO; i++){
AnnaBridge 167:e84263d55307 120 paff_array[i].filter_id = FILTER_ID_INIT_VALUE;
AnnaBridge 167:e84263d55307 121 paff_array[i].enable = 0;
AnnaBridge 167:e84263d55307 122 paff_array[i].patt.mask_size = 0;
AnnaBridge 167:e84263d55307 123 paff_array[i].rule = RTW_POSITIVE_MATCHING;
AnnaBridge 167:e84263d55307 124 paff_array[i].patt.mask = NULL;
AnnaBridge 167:e84263d55307 125 paff_array[i].patt.pattern = NULL;
AnnaBridge 167:e84263d55307 126 }
AnnaBridge 167:e84263d55307 127 packet_filter_enable_num = 0;
AnnaBridge 167:e84263d55307 128 }
AnnaBridge 167:e84263d55307 129
AnnaBridge 167:e84263d55307 130 int promisc_add_packet_filter(u8 filter_id, rtw_packet_filter_pattern_t *patt, rtw_packet_filter_rule_t rule)
AnnaBridge 167:e84263d55307 131 {
AnnaBridge 167:e84263d55307 132 int i = 0;
AnnaBridge 167:e84263d55307 133 while(i < MAX_PACKET_FILTER_INFO){
AnnaBridge 167:e84263d55307 134 if(paff_array[i].filter_id == FILTER_ID_INIT_VALUE){
AnnaBridge 167:e84263d55307 135 break;
AnnaBridge 167:e84263d55307 136 }
AnnaBridge 167:e84263d55307 137 i++;
AnnaBridge 167:e84263d55307 138 }
AnnaBridge 167:e84263d55307 139
AnnaBridge 167:e84263d55307 140 if(i == MAX_PACKET_FILTER_INFO)
AnnaBridge 167:e84263d55307 141 return -1;
AnnaBridge 167:e84263d55307 142
AnnaBridge 167:e84263d55307 143 paff_array[i].filter_id = filter_id;
AnnaBridge 167:e84263d55307 144
AnnaBridge 167:e84263d55307 145 paff_array[i].patt.offset= patt->offset;
AnnaBridge 167:e84263d55307 146 paff_array[i].patt.mask_size = patt->mask_size;
AnnaBridge 167:e84263d55307 147 paff_array[i].patt.mask = rtw_malloc(patt->mask_size);
AnnaBridge 167:e84263d55307 148 memcpy(paff_array[i].patt.mask, patt->mask, patt->mask_size);
AnnaBridge 167:e84263d55307 149 paff_array[i].patt.pattern= rtw_malloc(patt->mask_size);
AnnaBridge 167:e84263d55307 150 memcpy(paff_array[i].patt.pattern, patt->pattern, patt->mask_size);
AnnaBridge 167:e84263d55307 151
AnnaBridge 167:e84263d55307 152 paff_array[i].rule = rule;
AnnaBridge 167:e84263d55307 153 paff_array[i].enable = 0;
AnnaBridge 167:e84263d55307 154
AnnaBridge 167:e84263d55307 155 return 0;
AnnaBridge 167:e84263d55307 156 }
AnnaBridge 167:e84263d55307 157
AnnaBridge 167:e84263d55307 158 int promisc_enable_packet_filter(u8 filter_id)
AnnaBridge 167:e84263d55307 159 {
AnnaBridge 167:e84263d55307 160 int i = 0;
AnnaBridge 167:e84263d55307 161 while(i < MAX_PACKET_FILTER_INFO){
AnnaBridge 167:e84263d55307 162 if(paff_array[i].filter_id == filter_id)
AnnaBridge 167:e84263d55307 163 break;
AnnaBridge 167:e84263d55307 164 i++;
AnnaBridge 167:e84263d55307 165 }
AnnaBridge 167:e84263d55307 166
AnnaBridge 167:e84263d55307 167 if(i == MAX_PACKET_FILTER_INFO)
AnnaBridge 167:e84263d55307 168 return -1;
AnnaBridge 167:e84263d55307 169
AnnaBridge 167:e84263d55307 170 paff_array[i].enable = 1;
AnnaBridge 167:e84263d55307 171 packet_filter_enable_num++;
AnnaBridge 167:e84263d55307 172 return 0;
AnnaBridge 167:e84263d55307 173 }
AnnaBridge 167:e84263d55307 174
AnnaBridge 167:e84263d55307 175 int promisc_disable_packet_filter(u8 filter_id)
AnnaBridge 167:e84263d55307 176 {
AnnaBridge 167:e84263d55307 177 int i = 0;
AnnaBridge 167:e84263d55307 178 while(i < MAX_PACKET_FILTER_INFO){
AnnaBridge 167:e84263d55307 179 if(paff_array[i].filter_id == filter_id)
AnnaBridge 167:e84263d55307 180 break;
AnnaBridge 167:e84263d55307 181 i++;
AnnaBridge 167:e84263d55307 182 }
AnnaBridge 167:e84263d55307 183
AnnaBridge 167:e84263d55307 184 if(i == MAX_PACKET_FILTER_INFO)
AnnaBridge 167:e84263d55307 185 return -1;
AnnaBridge 167:e84263d55307 186
AnnaBridge 167:e84263d55307 187 paff_array[i].enable = 0;
AnnaBridge 167:e84263d55307 188 packet_filter_enable_num--;
AnnaBridge 167:e84263d55307 189 return 0;
AnnaBridge 167:e84263d55307 190 }
AnnaBridge 167:e84263d55307 191
AnnaBridge 167:e84263d55307 192 int promisc_remove_packet_filter(u8 filter_id)
AnnaBridge 167:e84263d55307 193 {
AnnaBridge 167:e84263d55307 194 int i = 0;
AnnaBridge 167:e84263d55307 195 while(i < MAX_PACKET_FILTER_INFO){
AnnaBridge 167:e84263d55307 196 if(paff_array[i].filter_id == filter_id)
AnnaBridge 167:e84263d55307 197 break;
AnnaBridge 167:e84263d55307 198 i++;
AnnaBridge 167:e84263d55307 199 }
AnnaBridge 167:e84263d55307 200
AnnaBridge 167:e84263d55307 201 if(i == MAX_PACKET_FILTER_INFO)
AnnaBridge 167:e84263d55307 202 return -1;
AnnaBridge 167:e84263d55307 203
AnnaBridge 167:e84263d55307 204 paff_array[i].filter_id = FILTER_ID_INIT_VALUE;
AnnaBridge 167:e84263d55307 205 paff_array[i].enable = 0;
AnnaBridge 167:e84263d55307 206 paff_array[i].rule = 0;
AnnaBridge 167:e84263d55307 207 if(paff_array[i].patt.mask){
AnnaBridge 167:e84263d55307 208 rtw_mfree((void *) paff_array[i].patt.mask, paff_array[i].patt.mask_size);
AnnaBridge 167:e84263d55307 209 paff_array[i].patt.mask = NULL;
AnnaBridge 167:e84263d55307 210 }
AnnaBridge 167:e84263d55307 211
AnnaBridge 167:e84263d55307 212 if(paff_array[i].patt.pattern){
AnnaBridge 167:e84263d55307 213 rtw_mfree((void *) paff_array[i].patt.pattern, paff_array[i].patt.mask_size);
AnnaBridge 167:e84263d55307 214 paff_array[i].patt.pattern = NULL;
AnnaBridge 167:e84263d55307 215 }
AnnaBridge 167:e84263d55307 216 paff_array[i].patt.mask_size = 0;
AnnaBridge 167:e84263d55307 217 return 0;
AnnaBridge 167:e84263d55307 218 }
AnnaBridge 167:e84263d55307 219 #endif
AnnaBridge 167:e84263d55307 220
AnnaBridge 167:e84263d55307 221 /* Make callback simple to prevent latency to wlan rx when promiscuous mode */
AnnaBridge 167:e84263d55307 222 static void promisc_callback(unsigned char *buf, unsigned int len, void* userdata)
AnnaBridge 167:e84263d55307 223 {
AnnaBridge 167:e84263d55307 224 struct eth_frame *frame = (struct eth_frame *) rtw_malloc(sizeof(struct eth_frame));
AnnaBridge 167:e84263d55307 225
AnnaBridge 167:e84263d55307 226 if(frame) {
AnnaBridge 167:e84263d55307 227 frame->prev = NULL;
AnnaBridge 167:e84263d55307 228 frame->next = NULL;
AnnaBridge 167:e84263d55307 229 memcpy(frame->da, buf, 6);
AnnaBridge 167:e84263d55307 230 memcpy(frame->sa, buf+6, 6);
AnnaBridge 167:e84263d55307 231 frame->len = len;
AnnaBridge 167:e84263d55307 232 frame->rssi = ((ieee80211_frame_info_t *)userdata)->rssi;
AnnaBridge 167:e84263d55307 233 _lock lock;
AnnaBridge 167:e84263d55307 234 _irqL irqL;
AnnaBridge 167:e84263d55307 235 rtw_enter_critical(&lock, &irqL);
AnnaBridge 167:e84263d55307 236
AnnaBridge 167:e84263d55307 237 if(eth_buffer.tail) {
AnnaBridge 167:e84263d55307 238 eth_buffer.tail->next = frame;
AnnaBridge 167:e84263d55307 239 frame->prev = eth_buffer.tail;
AnnaBridge 167:e84263d55307 240 eth_buffer.tail = frame;
AnnaBridge 167:e84263d55307 241 }
AnnaBridge 167:e84263d55307 242 else {
AnnaBridge 167:e84263d55307 243 eth_buffer.head = frame;
AnnaBridge 167:e84263d55307 244 eth_buffer.tail = frame;
AnnaBridge 167:e84263d55307 245 }
AnnaBridge 167:e84263d55307 246
AnnaBridge 167:e84263d55307 247 rtw_exit_critical(&lock, &irqL);
AnnaBridge 167:e84263d55307 248 }
AnnaBridge 167:e84263d55307 249 }
AnnaBridge 167:e84263d55307 250
AnnaBridge 167:e84263d55307 251 struct eth_frame* retrieve_frame(void)
AnnaBridge 167:e84263d55307 252 {
AnnaBridge 167:e84263d55307 253 struct eth_frame *frame = NULL;
AnnaBridge 167:e84263d55307 254
AnnaBridge 167:e84263d55307 255 _lock lock;
AnnaBridge 167:e84263d55307 256 _irqL irqL;
AnnaBridge 167:e84263d55307 257 rtw_enter_critical(&lock, &irqL);
AnnaBridge 167:e84263d55307 258
AnnaBridge 167:e84263d55307 259 if(eth_buffer.head) {
AnnaBridge 167:e84263d55307 260 frame = eth_buffer.head;
AnnaBridge 167:e84263d55307 261
AnnaBridge 167:e84263d55307 262 if(eth_buffer.head->next) {
AnnaBridge 167:e84263d55307 263 eth_buffer.head = eth_buffer.head->next;
AnnaBridge 167:e84263d55307 264 eth_buffer.head->prev = NULL;
AnnaBridge 167:e84263d55307 265 }
AnnaBridge 167:e84263d55307 266 else {
AnnaBridge 167:e84263d55307 267 eth_buffer.head = NULL;
AnnaBridge 167:e84263d55307 268 eth_buffer.tail = NULL;
AnnaBridge 167:e84263d55307 269 }
AnnaBridge 167:e84263d55307 270 }
AnnaBridge 167:e84263d55307 271
AnnaBridge 167:e84263d55307 272 rtw_exit_critical(&lock, &irqL);
AnnaBridge 167:e84263d55307 273
AnnaBridge 167:e84263d55307 274 return frame;
AnnaBridge 167:e84263d55307 275 }
AnnaBridge 167:e84263d55307 276
AnnaBridge 167:e84263d55307 277 static void promisc_test(int duration, unsigned char len_used)
AnnaBridge 167:e84263d55307 278 {
AnnaBridge 167:e84263d55307 279 int ch;
AnnaBridge 167:e84263d55307 280 unsigned int start_time;
AnnaBridge 167:e84263d55307 281 struct eth_frame *frame;
AnnaBridge 167:e84263d55307 282 eth_buffer.head = NULL;
AnnaBridge 167:e84263d55307 283 eth_buffer.tail = NULL;
AnnaBridge 167:e84263d55307 284
AnnaBridge 167:e84263d55307 285 wifi_enter_promisc_mode();
AnnaBridge 167:e84263d55307 286 wifi_set_promisc(RTW_PROMISC_ENABLE, promisc_callback, len_used);
AnnaBridge 167:e84263d55307 287
AnnaBridge 167:e84263d55307 288 for(ch = 1; ch <= 13; ch ++) {
AnnaBridge 167:e84263d55307 289 if(wifi_set_channel(ch) == 0)
AnnaBridge 167:e84263d55307 290 printf("\n\n\rSwitch to channel(%d)", ch);
AnnaBridge 167:e84263d55307 291
AnnaBridge 167:e84263d55307 292 start_time = rtw_get_current_time();
AnnaBridge 167:e84263d55307 293
AnnaBridge 167:e84263d55307 294 while(1) {
AnnaBridge 167:e84263d55307 295 unsigned int current_time = rtw_get_current_time();
AnnaBridge 167:e84263d55307 296
AnnaBridge 167:e84263d55307 297 if(rtw_systime_to_ms(current_time - start_time) < duration) {
AnnaBridge 167:e84263d55307 298 frame = retrieve_frame();
AnnaBridge 167:e84263d55307 299
AnnaBridge 167:e84263d55307 300 if(frame) {
AnnaBridge 167:e84263d55307 301 int i;
AnnaBridge 167:e84263d55307 302 printf("\n\rDA:");
AnnaBridge 167:e84263d55307 303 for(i = 0; i < 6; i ++)
AnnaBridge 167:e84263d55307 304 printf(" %02x", frame->da[i]);
AnnaBridge 167:e84263d55307 305 printf(", SA:");
AnnaBridge 167:e84263d55307 306 for(i = 0; i < 6; i ++)
AnnaBridge 167:e84263d55307 307 printf(" %02x", frame->sa[i]);
AnnaBridge 167:e84263d55307 308 printf(", len=%d", frame->len);
AnnaBridge 167:e84263d55307 309 printf(", RSSI=%d", frame->rssi);
AnnaBridge 167:e84263d55307 310 #if CONFIG_INIC_CMD_RSP
AnnaBridge 167:e84263d55307 311 if(inic_frame_tail){
AnnaBridge 167:e84263d55307 312 if(inic_frame_cnt < MAX_INIC_FRAME_NUM){
AnnaBridge 167:e84263d55307 313 memcpy(inic_frame_tail->da, frame->da, 6);
AnnaBridge 167:e84263d55307 314 memcpy(inic_frame_tail->sa, frame->sa, 6);
AnnaBridge 167:e84263d55307 315 inic_frame_tail->len = frame->len;
AnnaBridge 167:e84263d55307 316 inic_frame_tail++;
AnnaBridge 167:e84263d55307 317 inic_frame_cnt++;
AnnaBridge 167:e84263d55307 318 }
AnnaBridge 167:e84263d55307 319 }
AnnaBridge 167:e84263d55307 320 #endif
AnnaBridge 167:e84263d55307 321 rtw_mfree((void *) frame, sizeof(struct eth_frame));
AnnaBridge 167:e84263d55307 322 }
AnnaBridge 167:e84263d55307 323 else
AnnaBridge 167:e84263d55307 324 rtw_mdelay_os(1); //delay 1 tick
AnnaBridge 167:e84263d55307 325 }
AnnaBridge 167:e84263d55307 326 else
AnnaBridge 167:e84263d55307 327 break;
AnnaBridge 167:e84263d55307 328 }
AnnaBridge 167:e84263d55307 329 #if CONFIG_INIC_CMD_RSP
AnnaBridge 167:e84263d55307 330 if(inic_frame){
AnnaBridge 167:e84263d55307 331 inic_c2h_msg("ATWM", RTW_SUCCESS, (char *)inic_frame, sizeof(struct inic_eth_frame)*inic_frame_cnt);
AnnaBridge 167:e84263d55307 332 memset(inic_frame, '\0', sizeof(struct inic_eth_frame)*MAX_INIC_FRAME_NUM);
AnnaBridge 167:e84263d55307 333 inic_frame_tail = inic_frame;
AnnaBridge 167:e84263d55307 334 inic_frame_cnt = 0;
AnnaBridge 167:e84263d55307 335 rtw_msleep_os(10);
AnnaBridge 167:e84263d55307 336 }
AnnaBridge 167:e84263d55307 337 #endif
AnnaBridge 167:e84263d55307 338 }
AnnaBridge 167:e84263d55307 339
AnnaBridge 167:e84263d55307 340 wifi_set_promisc(RTW_PROMISC_DISABLE, NULL, 0);
AnnaBridge 167:e84263d55307 341
AnnaBridge 167:e84263d55307 342 while((frame = retrieve_frame()) != NULL)
AnnaBridge 167:e84263d55307 343 rtw_mfree((void *) frame, sizeof(struct eth_frame));
AnnaBridge 167:e84263d55307 344 }
AnnaBridge 167:e84263d55307 345
AnnaBridge 167:e84263d55307 346 static void promisc_callback_all(unsigned char *buf, unsigned int len, void* userdata)
AnnaBridge 167:e84263d55307 347 {
AnnaBridge 167:e84263d55307 348 struct eth_frame *frame = (struct eth_frame *) rtw_malloc(sizeof(struct eth_frame));
AnnaBridge 167:e84263d55307 349
AnnaBridge 167:e84263d55307 350 if(frame) {
AnnaBridge 167:e84263d55307 351 frame->prev = NULL;
AnnaBridge 167:e84263d55307 352 frame->next = NULL;
AnnaBridge 167:e84263d55307 353 memcpy(frame->da, buf+4, 6);
AnnaBridge 167:e84263d55307 354 memcpy(frame->sa, buf+10, 6);
AnnaBridge 167:e84263d55307 355 frame->len = len;
AnnaBridge 167:e84263d55307 356 /*
AnnaBridge 167:e84263d55307 357 * type is the first byte of Frame Control Field of 802.11 frame
AnnaBridge 167:e84263d55307 358 * If the from/to ds information is needed, type could be reused as follows:
AnnaBridge 167:e84263d55307 359 * frame->type = ((((ieee80211_frame_info_t *)userdata)->i_fc & 0x0100) == 0x0100) ? 2 : 1;
AnnaBridge 167:e84263d55307 360 * 1: from ds; 2: to ds
AnnaBridge 167:e84263d55307 361 */
AnnaBridge 167:e84263d55307 362 frame->type = *buf;
AnnaBridge 167:e84263d55307 363 frame->rssi = ((ieee80211_frame_info_t *)userdata)->rssi;
AnnaBridge 167:e84263d55307 364
AnnaBridge 167:e84263d55307 365 _lock lock;
AnnaBridge 167:e84263d55307 366 _irqL irqL;
AnnaBridge 167:e84263d55307 367 rtw_enter_critical(&lock, &irqL);
AnnaBridge 167:e84263d55307 368
AnnaBridge 167:e84263d55307 369
AnnaBridge 167:e84263d55307 370 if(eth_buffer.tail) {
AnnaBridge 167:e84263d55307 371 eth_buffer.tail->next = frame;
AnnaBridge 167:e84263d55307 372 frame->prev = eth_buffer.tail;
AnnaBridge 167:e84263d55307 373 eth_buffer.tail = frame;
AnnaBridge 167:e84263d55307 374 }
AnnaBridge 167:e84263d55307 375 else {
AnnaBridge 167:e84263d55307 376 eth_buffer.head = frame;
AnnaBridge 167:e84263d55307 377 eth_buffer.tail = frame;
AnnaBridge 167:e84263d55307 378 }
AnnaBridge 167:e84263d55307 379
AnnaBridge 167:e84263d55307 380 rtw_exit_critical(&lock, &irqL);
AnnaBridge 167:e84263d55307 381 }
AnnaBridge 167:e84263d55307 382 }
AnnaBridge 167:e84263d55307 383 static void promisc_test_all(int duration, unsigned char len_used)
AnnaBridge 167:e84263d55307 384 {
AnnaBridge 167:e84263d55307 385 int ch;
AnnaBridge 167:e84263d55307 386 unsigned int start_time;
AnnaBridge 167:e84263d55307 387 struct eth_frame *frame;
AnnaBridge 167:e84263d55307 388 eth_buffer.head = NULL;
AnnaBridge 167:e84263d55307 389 eth_buffer.tail = NULL;
AnnaBridge 167:e84263d55307 390
AnnaBridge 167:e84263d55307 391 wifi_enter_promisc_mode();
AnnaBridge 167:e84263d55307 392 wifi_set_promisc(RTW_PROMISC_ENABLE_2, promisc_callback_all, len_used);
AnnaBridge 167:e84263d55307 393
AnnaBridge 167:e84263d55307 394 for(ch = 1; ch <= 13; ch ++) {
AnnaBridge 167:e84263d55307 395 if(wifi_set_channel(ch) == 0)
AnnaBridge 167:e84263d55307 396 printf("\n\n\rSwitch to channel(%d)", ch);
AnnaBridge 167:e84263d55307 397
AnnaBridge 167:e84263d55307 398 start_time = rtw_get_current_time();
AnnaBridge 167:e84263d55307 399
AnnaBridge 167:e84263d55307 400 while(1) {
AnnaBridge 167:e84263d55307 401 unsigned int current_time = rtw_get_current_time();
AnnaBridge 167:e84263d55307 402
AnnaBridge 167:e84263d55307 403 if(rtw_systime_to_ms(current_time - start_time) < duration) {
AnnaBridge 167:e84263d55307 404 frame = retrieve_frame();
AnnaBridge 167:e84263d55307 405
AnnaBridge 167:e84263d55307 406 if(frame) {
AnnaBridge 167:e84263d55307 407 int i;
AnnaBridge 167:e84263d55307 408 printf("\n\rTYPE: 0x%x, ", frame->type);
AnnaBridge 167:e84263d55307 409 printf("DA:");
AnnaBridge 167:e84263d55307 410 for(i = 0; i < 6; i ++)
AnnaBridge 167:e84263d55307 411 printf(" %02x", frame->da[i]);
AnnaBridge 167:e84263d55307 412 printf(", SA:");
AnnaBridge 167:e84263d55307 413 for(i = 0; i < 6; i ++)
AnnaBridge 167:e84263d55307 414 printf(" %02x", frame->sa[i]);
AnnaBridge 167:e84263d55307 415 printf(", len=%d", frame->len);
AnnaBridge 167:e84263d55307 416 printf(", RSSI=%d", frame->rssi);
AnnaBridge 167:e84263d55307 417 #if CONFIG_INIC_CMD_RSP
AnnaBridge 167:e84263d55307 418 if(inic_frame_tail){
AnnaBridge 167:e84263d55307 419 if(inic_frame_cnt < MAX_INIC_FRAME_NUM){
AnnaBridge 167:e84263d55307 420 memcpy(inic_frame_tail->da, frame->da, 6);
AnnaBridge 167:e84263d55307 421 memcpy(inic_frame_tail->sa, frame->sa, 6);
AnnaBridge 167:e84263d55307 422 inic_frame_tail->len = frame->len;
AnnaBridge 167:e84263d55307 423 inic_frame_tail->type = frame->type;
AnnaBridge 167:e84263d55307 424 inic_frame_tail++;
AnnaBridge 167:e84263d55307 425 inic_frame_cnt++;
AnnaBridge 167:e84263d55307 426 }
AnnaBridge 167:e84263d55307 427 }
AnnaBridge 167:e84263d55307 428 #endif
AnnaBridge 167:e84263d55307 429 rtw_mfree((void *) frame, sizeof(struct eth_frame));
AnnaBridge 167:e84263d55307 430 }
AnnaBridge 167:e84263d55307 431 else
AnnaBridge 167:e84263d55307 432 rtw_mdelay_os(1); //delay 1 tick
AnnaBridge 167:e84263d55307 433 }
AnnaBridge 167:e84263d55307 434 else
AnnaBridge 167:e84263d55307 435 break;
AnnaBridge 167:e84263d55307 436 }
AnnaBridge 167:e84263d55307 437 #if CONFIG_INIC_CMD_RSP
AnnaBridge 167:e84263d55307 438 if(inic_frame){
AnnaBridge 167:e84263d55307 439 inic_c2h_msg("ATWM", RTW_SUCCESS, (char *)inic_frame, sizeof(struct inic_eth_frame)*inic_frame_cnt);
AnnaBridge 167:e84263d55307 440 memset(inic_frame, '\0', sizeof(struct inic_eth_frame)*MAX_INIC_FRAME_NUM);
AnnaBridge 167:e84263d55307 441 inic_frame_tail = inic_frame;
AnnaBridge 167:e84263d55307 442 inic_frame_cnt = 0;
AnnaBridge 167:e84263d55307 443 rtw_msleep_os(10);
AnnaBridge 167:e84263d55307 444 }
AnnaBridge 167:e84263d55307 445 #endif
AnnaBridge 167:e84263d55307 446 }
AnnaBridge 167:e84263d55307 447
AnnaBridge 167:e84263d55307 448 wifi_set_promisc(RTW_PROMISC_DISABLE, NULL, 0);
AnnaBridge 167:e84263d55307 449
AnnaBridge 167:e84263d55307 450 while((frame = retrieve_frame()) != NULL)
AnnaBridge 167:e84263d55307 451 rtw_mfree((void *) frame, sizeof(struct eth_frame));
AnnaBridge 167:e84263d55307 452 }
AnnaBridge 167:e84263d55307 453
AnnaBridge 167:e84263d55307 454 void cmd_promisc(int argc, char **argv)
AnnaBridge 167:e84263d55307 455 {
AnnaBridge 167:e84263d55307 456 int duration;
AnnaBridge 167:e84263d55307 457 #if CONFIG_INIC_CMD_RSP
AnnaBridge 167:e84263d55307 458 inic_frame_tail = inic_frame = rtw_malloc(sizeof(struct inic_eth_frame)*MAX_INIC_FRAME_NUM);
AnnaBridge 167:e84263d55307 459 if(inic_frame == NULL){
AnnaBridge 167:e84263d55307 460 inic_c2h_msg("ATWM", RTW_BUFFER_UNAVAILABLE_TEMPORARY, NULL, 0);
AnnaBridge 167:e84263d55307 461 return;
AnnaBridge 167:e84263d55307 462 }
AnnaBridge 167:e84263d55307 463 #endif
AnnaBridge 167:e84263d55307 464 #ifdef CONFIG_PROMISC
AnnaBridge 167:e84263d55307 465 wifi_init_packet_filter();
AnnaBridge 167:e84263d55307 466 #endif
AnnaBridge 167:e84263d55307 467 if((argc == 2) && ((duration = atoi(argv[1])) > 0))
AnnaBridge 167:e84263d55307 468 //promisc_test(duration, 0);
AnnaBridge 167:e84263d55307 469 promisc_test_all(duration, 0);
AnnaBridge 167:e84263d55307 470 else if((argc == 3) && ((duration = atoi(argv[1])) > 0) && (strcmp(argv[2], "with_len") == 0))
AnnaBridge 167:e84263d55307 471 promisc_test(duration, 1);
AnnaBridge 167:e84263d55307 472 else
AnnaBridge 167:e84263d55307 473 printf("\n\rUsage: %s DURATION_SECONDS [with_len]", argv[0]);
AnnaBridge 167:e84263d55307 474 #if CONFIG_INIC_CMD_RSP
AnnaBridge 167:e84263d55307 475 if(inic_frame)
AnnaBridge 167:e84263d55307 476 rtw_mfree(inic_frame, sizeof(struct inic_eth_frame)*MAX_INIC_FRAME_NUM);
AnnaBridge 167:e84263d55307 477 inic_frame_tail = NULL;
AnnaBridge 167:e84263d55307 478 inic_frame_cnt = 0;
AnnaBridge 167:e84263d55307 479 #endif
AnnaBridge 167:e84263d55307 480 }
AnnaBridge 167:e84263d55307 481 #endif //#if CONFIG_WLAN
AnnaBridge 167:e84263d55307 482