Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/api/wifi/wifi_promisc.c@167:e84263d55307, 2017-06-21 (annotated)
- 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?
| User | Revision | Line number | New 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 |


