3 * @file coreconfigurator.c
6 * @sa coreconfigurator.h
12 /*****************************************************************************/
14 /*****************************************************************************/
15 #include "coreconfigurator.h"
16 /*****************************************************************************/
18 /*****************************************************************************/
19 #define INLINE static __inline
21 #define MAX_CFG_PKTLEN 1450
22 #define MSG_HEADER_LEN 4
23 #define QUERY_MSG_TYPE 'Q'
24 #define WRITE_MSG_TYPE 'W'
25 #define RESP_MSG_TYPE 'R'
26 #define WRITE_RESP_SUCCESS 1
28 #define MAC_ADDR_LEN 6
29 #define TAG_PARAM_OFFSET (MAC_HDR_LEN + TIME_STAMP_LEN + \
30 BEACON_INTERVAL_LEN + CAP_INFO_LEN)
32 /*****************************************************************************/
34 /*****************************************************************************/
37 /*****************************************************************************/
38 /* Type Definitions */
39 /*****************************************************************************/
41 /* Basic Frame Type Codes (2-bit) */
43 FRAME_TYPE_CONTROL = 0x04,
44 FRAME_TYPE_DATA = 0x08,
45 FRAME_TYPE_MANAGEMENT = 0x00,
46 FRAME_TYPE_RESERVED = 0x0C,
47 FRAME_TYPE_FORCE_32BIT = 0xFFFFFFFF
50 /* Frame Type and Subtype Codes (6-bit) */
81 QOS_DATA_POLL_ACK = 0xB8,
82 QOS_NULL_FRAME = 0xC8,
84 QOS_CFPOLL_ACK = 0xF8,
87 FRAME_SUBTYPE_FORCE_32BIT = 0xFFFFFFFF
90 /* Basic Frame Classes */
92 CLASS1_FRAME_TYPE = 0x00,
93 CLASS2_FRAME_TYPE = 0x01,
94 CLASS3_FRAME_TYPE = 0x02,
95 FRAME_CLASS_FORCE_32BIT = 0xFFFFFFFF
98 /* Element ID of various Information Elements */
100 ISSID = 0, /* Service Set Identifier */
101 ISUPRATES = 1, /* Supported Rates */
102 IFHPARMS = 2, /* FH parameter set */
103 IDSPARMS = 3, /* DS parameter set */
104 ICFPARMS = 4, /* CF parameter set */
105 ITIM = 5, /* Traffic Information Map */
106 IIBPARMS = 6, /* IBSS parameter set */
107 ICOUNTRY = 7, /* Country element */
108 IEDCAPARAMS = 12, /* EDCA parameter set */
109 ITSPEC = 13, /* Traffic Specification */
110 ITCLAS = 14, /* Traffic Classification */
111 ISCHED = 15, /* Schedule */
112 ICTEXT = 16, /* Challenge Text */
113 IPOWERCONSTRAINT = 32, /* Power Constraint */
114 IPOWERCAPABILITY = 33, /* Power Capability */
115 ITPCREQUEST = 34, /* TPC Request */
116 ITPCREPORT = 35, /* TPC Report */
117 ISUPCHANNEL = 36, /* Supported channel list */
118 ICHSWANNOUNC = 37, /* Channel Switch Announcement */
119 IMEASUREMENTREQUEST = 38, /* Measurement request */
120 IMEASUREMENTREPORT = 39, /* Measurement report */
121 IQUIET = 40, /* Quiet element Info */
122 IIBSSDFS = 41, /* IBSS DFS */
123 IERPINFO = 42, /* ERP Information */
124 ITSDELAY = 43, /* TS Delay */
125 ITCLASPROCESS = 44, /* TCLAS Processing */
126 IHTCAP = 45, /* HT Capabilities */
127 IQOSCAP = 46, /* QoS Capability */
128 IRSNELEMENT = 48, /* RSN Information Element */
129 IEXSUPRATES = 50, /* Extended Supported Rates */
130 IEXCHSWANNOUNC = 60, /* Extended Ch Switch Announcement*/
131 IHTOPERATION = 61, /* HT Information */
132 ISECCHOFF = 62, /* Secondary Channel Offeset */
133 I2040COEX = 72, /* 20/40 Coexistence IE */
134 I2040INTOLCHREPORT = 73, /* 20/40 Intolerant channel report*/
135 IOBSSSCAN = 74, /* OBSS Scan parameters */
136 IEXTCAP = 127, /* Extended capability */
137 IWMM = 221, /* WMM parameters */
138 IWPAELEMENT = 221, /* WPA Information Element */
139 INFOELEM_ID_FORCE_32BIT = 0xFFFFFFFF
145 s32 s32MaxRespBuffLen;
152 /*****************************************************************************/
153 /* Extern Variable Declarations */
154 /*****************************************************************************/
157 /*****************************************************************************/
158 /* Extern Function Declarations */
159 /*****************************************************************************/
160 extern s32 SendRawPacket(s8 *ps8Packet, s32 s32PacketLen);
161 extern void NetworkInfoReceived(u8 *pu8Buffer, u32 u32Length);
162 extern void GnrlAsyncInfoReceived(u8 *pu8Buffer, u32 u32Length);
163 extern void host_int_ScanCompleteReceived(u8 *pu8Buffer, u32 u32Length);
164 /*****************************************************************************/
165 /* Global Variables */
166 /*****************************************************************************/
167 static struct semaphore SemHandleSendPkt;
168 static struct semaphore SemHandlePktResp;
171 static tstrConfigPktInfo gstrConfigPktInfo;
175 static s16 g_wid_num = -1;
179 static u8 g_oper_mode = SET_CFG;
182 static tstrWID gastrWIDs[] = {
183 {WID_FIRMWARE_VERSION, WID_STR},
184 {WID_PHY_VERSION, WID_STR},
185 {WID_HARDWARE_VERSION, WID_STR},
186 {WID_BSS_TYPE, WID_CHAR},
187 {WID_QOS_ENABLE, WID_CHAR},
188 {WID_11I_MODE, WID_CHAR},
189 {WID_CURRENT_TX_RATE, WID_CHAR},
190 {WID_LINKSPEED, WID_CHAR},
191 {WID_RTS_THRESHOLD, WID_SHORT},
192 {WID_FRAG_THRESHOLD, WID_SHORT},
194 {WID_BSSID, WID_ADR},
195 {WID_BEACON_INTERVAL, WID_SHORT},
196 {WID_POWER_MANAGEMENT, WID_CHAR},
197 {WID_LISTEN_INTERVAL, WID_CHAR},
198 {WID_DTIM_PERIOD, WID_CHAR},
199 {WID_CURRENT_CHANNEL, WID_CHAR},
200 {WID_TX_POWER_LEVEL_11A, WID_CHAR},
201 {WID_TX_POWER_LEVEL_11B, WID_CHAR},
202 {WID_PREAMBLE, WID_CHAR},
203 {WID_11G_OPERATING_MODE, WID_CHAR},
204 {WID_MAC_ADDR, WID_ADR},
205 {WID_IP_ADDRESS, WID_ADR},
206 {WID_ACK_POLICY, WID_CHAR},
207 {WID_PHY_ACTIVE_REG, WID_CHAR},
208 {WID_AUTH_TYPE, WID_CHAR},
209 {WID_REKEY_POLICY, WID_CHAR},
210 {WID_REKEY_PERIOD, WID_INT},
211 {WID_REKEY_PACKET_COUNT, WID_INT},
212 {WID_11I_PSK, WID_STR},
213 {WID_1X_KEY, WID_STR},
214 {WID_1X_SERV_ADDR, WID_IP},
215 {WID_SUPP_USERNAME, WID_STR},
216 {WID_SUPP_PASSWORD, WID_STR},
217 {WID_USER_CONTROL_ON_TX_POWER, WID_CHAR},
218 {WID_MEMORY_ADDRESS, WID_INT},
219 {WID_MEMORY_ACCESS_32BIT, WID_INT},
220 {WID_MEMORY_ACCESS_16BIT, WID_SHORT},
221 {WID_MEMORY_ACCESS_8BIT, WID_CHAR},
222 {WID_SITE_SURVEY_RESULTS, WID_STR},
223 {WID_PMKID_INFO, WID_STR},
224 {WID_ASSOC_RES_INFO, WID_STR},
225 {WID_MANUFACTURER, WID_STR}, /* 4 Wids added for the CAPI tool*/
226 {WID_MODEL_NAME, WID_STR},
227 {WID_MODEL_NUM, WID_STR},
228 {WID_DEVICE_NAME, WID_STR},
229 {WID_SSID_PROBE_REQ, WID_STR},
232 {WID_11N_ENABLE, WID_CHAR},
233 {WID_11N_CURRENT_TX_MCS, WID_CHAR},
234 {WID_TX_POWER_LEVEL_11N, WID_CHAR},
235 {WID_11N_OPERATING_MODE, WID_CHAR},
236 {WID_11N_SMPS_MODE, WID_CHAR},
237 {WID_11N_PROT_MECH, WID_CHAR},
238 {WID_11N_ERP_PROT_TYPE, WID_CHAR},
239 {WID_11N_HT_PROT_TYPE, WID_CHAR},
240 {WID_11N_PHY_ACTIVE_REG_VAL, WID_INT},
241 {WID_11N_PRINT_STATS, WID_CHAR},
242 {WID_11N_AUTORATE_TABLE, WID_BIN_DATA},
243 {WID_HOST_CONFIG_IF_TYPE, WID_CHAR},
244 {WID_HOST_DATA_IF_TYPE, WID_CHAR},
245 {WID_11N_SIG_QUAL_VAL, WID_SHORT},
246 {WID_11N_IMMEDIATE_BA_ENABLED, WID_CHAR},
247 {WID_11N_TXOP_PROT_DISABLE, WID_CHAR},
248 {WID_11N_SHORT_GI_20MHZ_ENABLE, WID_CHAR},
249 {WID_SHORT_SLOT_ALLOWED, WID_CHAR},
250 {WID_11W_ENABLE, WID_CHAR},
251 {WID_11W_MGMT_PROT_REQ, WID_CHAR},
252 {WID_2040_ENABLE, WID_CHAR},
253 {WID_2040_COEXISTENCE, WID_CHAR},
254 {WID_USER_SEC_CHANNEL_OFFSET, WID_CHAR},
255 {WID_2040_CURR_CHANNEL_OFFSET, WID_CHAR},
256 {WID_2040_40MHZ_INTOLERANT, WID_CHAR},
257 {WID_HUT_RESTART, WID_CHAR},
258 {WID_HUT_NUM_TX_PKTS, WID_INT},
259 {WID_HUT_FRAME_LEN, WID_SHORT},
260 {WID_HUT_TX_FORMAT, WID_CHAR},
261 {WID_HUT_BANDWIDTH, WID_CHAR},
262 {WID_HUT_OP_BAND, WID_CHAR},
263 {WID_HUT_STBC, WID_CHAR},
264 {WID_HUT_ESS, WID_CHAR},
265 {WID_HUT_ANTSET, WID_CHAR},
266 {WID_HUT_HT_OP_MODE, WID_CHAR},
267 {WID_HUT_RIFS_MODE, WID_CHAR},
268 {WID_HUT_SMOOTHING_REC, WID_CHAR},
269 {WID_HUT_SOUNDING_PKT, WID_CHAR},
270 {WID_HUT_HT_CODING, WID_CHAR},
271 {WID_HUT_TEST_DIR, WID_CHAR},
272 {WID_HUT_TXOP_LIMIT, WID_SHORT},
273 {WID_HUT_DEST_ADDR, WID_ADR},
274 {WID_HUT_TX_PATTERN, WID_BIN_DATA},
275 {WID_HUT_TX_TIME_TAKEN, WID_INT},
276 {WID_HUT_PHY_TEST_MODE, WID_CHAR},
277 {WID_HUT_PHY_TEST_RATE_HI, WID_CHAR},
278 {WID_HUT_PHY_TEST_RATE_LO, WID_CHAR},
279 {WID_HUT_TX_TEST_TIME, WID_INT},
280 {WID_HUT_LOG_INTERVAL, WID_INT},
281 {WID_HUT_DISABLE_RXQ_REPLENISH, WID_CHAR},
282 {WID_HUT_TEST_ID, WID_STR},
283 {WID_HUT_KEY_ORIGIN, WID_CHAR},
284 {WID_HUT_BCST_PERCENT, WID_CHAR},
285 {WID_HUT_GROUP_CIPHER_TYPE, WID_CHAR},
286 {WID_HUT_STATS, WID_BIN_DATA},
287 {WID_HUT_TSF_TEST_MODE, WID_CHAR},
288 {WID_HUT_SIG_QUAL_AVG, WID_SHORT},
289 {WID_HUT_SIG_QUAL_AVG_CNT, WID_SHORT},
290 {WID_HUT_TSSI_VALUE, WID_CHAR},
291 {WID_HUT_MGMT_PERCENT, WID_CHAR},
292 {WID_HUT_MGMT_BCST_PERCENT, WID_CHAR},
293 {WID_HUT_MGMT_ALLOW_HT, WID_CHAR},
294 {WID_HUT_UC_MGMT_TYPE, WID_CHAR},
295 {WID_HUT_BC_MGMT_TYPE, WID_CHAR},
296 {WID_HUT_UC_MGMT_FRAME_LEN, WID_SHORT},
297 {WID_HUT_BC_MGMT_FRAME_LEN, WID_SHORT},
298 {WID_HUT_11W_MFP_REQUIRED_TX, WID_CHAR},
299 {WID_HUT_11W_MFP_PEER_CAPABLE, WID_CHAR},
300 {WID_HUT_11W_TX_IGTK_ID, WID_CHAR},
301 {WID_HUT_FC_TXOP_MOD, WID_CHAR},
302 {WID_HUT_FC_PROT_TYPE, WID_CHAR},
303 {WID_HUT_SEC_CCA_ASSERT, WID_CHAR},
304 #endif /* MAC_802_11N */
307 u16 g_num_total_switches = (sizeof(gastrWIDs) / sizeof(tstrWID));
308 /*****************************************************************************/
309 /* Static Function Declarations */
310 /*****************************************************************************/
314 /*****************************************************************************/
316 /*****************************************************************************/
317 INLINE u8 ascii_hex_to_dec(u8 num)
319 if ((num >= '0') && (num <= '9'))
321 else if ((num >= 'A') && (num <= 'F'))
322 return (10 + (num - 'A'));
323 else if ((num >= 'a') && (num <= 'f'))
324 return (10 + (num - 'a'));
329 INLINE u8 get_hex_char(u8 inp)
331 u8 *d2htab = "0123456789ABCDEF";
333 return d2htab[inp & 0xF];
336 /* This function extracts the MAC address held in a string in standard format */
337 /* into another buffer as integers. */
338 INLINE u16 extract_mac_addr(char *str, u8 *buff)
341 while (*str != '\0') {
342 if ((*str == ':') || (*str == '-'))
345 *buff = (*buff << 4) + ascii_hex_to_dec(*str);
353 /* This function creates MAC address in standard format from a buffer of */
355 INLINE void create_mac_addr(u8 *str, u8 *buff)
360 for (i = 0; i < MAC_ADDR_LEN; i++) {
361 str[j++] = get_hex_char((u8)((buff[i] >> 4) & 0x0F));
362 str[j++] = get_hex_char((u8)(buff[i] & 0x0F));
368 /* This function converts the IP address string in dotted decimal format to */
369 /* unsigned integer. This functionality is similar to the library function */
370 /* inet_addr() but is reimplemented here since I could not confirm that */
371 /* inet_addr is platform independent. */
372 /* ips=>IP Address String in dotted decimal format */
373 /* ipn=>Pointer to IP Address in integer format */
374 INLINE u8 conv_ip_to_int(u8 *ips, u32 *ipn)
379 /* Integer to string for each component */
380 while (ips[i] != '\0') {
382 *ipn = ((*ipn) << 8) | ipb;
385 ipb = ipb * 10 + ascii_hex_to_dec(ips[i]);
391 /* The last byte of the IP address is read in here */
392 *ipn = ((*ipn) << 8) | ipb;
397 /* This function converts the IP address from integer format to dotted */
398 /* decimal string format. Alternative to std library fn inet_ntoa(). */
399 /* ips=>Buffer to hold IP Address String dotted decimal format (Min 17B) */
400 /* ipn=>IP Address in integer format */
401 INLINE u8 conv_int_to_ip(u8 *ips, u32 ipn)
408 for (cnt = 4; cnt > 0; cnt--) {
409 ipb = (ipn >> (8 * (cnt - 1))) & 0xFF;
420 ips[i++] = get_hex_char(ipb / 100);
424 ips[i++] = get_hex_char(ipb / 10);
428 ips[i++] = get_hex_char(ipb);
440 INLINE tenuWIDtype get_wid_type(u32 wid_num)
442 /* Check for iconfig specific WID types first */
443 if ((wid_num == WID_BSSID) ||
444 (wid_num == WID_MAC_ADDR) ||
445 (wid_num == WID_IP_ADDRESS) ||
446 (wid_num == WID_HUT_DEST_ADDR)) {
450 if ((WID_1X_SERV_ADDR == wid_num) ||
451 (WID_STACK_IP_ADDR == wid_num) ||
452 (WID_STACK_NETMASK_ADDR == wid_num)) {
456 /* Next check for standard WID types */
457 if (wid_num < 0x1000)
459 else if (wid_num < 0x2000)
461 else if (wid_num < 0x3000)
463 else if (wid_num < 0x4000)
465 else if (wid_num < 0x5000)
472 /* This function extracts the beacon period field from the beacon or probe */
473 /* response frame. */
474 INLINE u16 get_beacon_period(u8 *data)
479 bcn_per |= (data[1] << 8);
484 INLINE u32 get_beacon_timestamp_lo(u8 *data)
487 u32 index = MAC_HDR_LEN;
489 time_stamp |= data[index++];
490 time_stamp |= (data[index++] << 8);
491 time_stamp |= (data[index++] << 16);
492 time_stamp |= (data[index] << 24);
497 INLINE u32 get_beacon_timestamp_hi(u8 *data)
500 u32 index = (MAC_HDR_LEN + 4);
502 time_stamp |= data[index++];
503 time_stamp |= (data[index++] << 8);
504 time_stamp |= (data[index++] << 16);
505 time_stamp |= (data[index] << 24);
510 /* This function extracts the 'frame type' bits from the MAC header of the */
512 /* Returns the value in the LSB of the returned value. */
513 INLINE tenuBasicFrmType get_type(u8 *header)
515 return ((tenuBasicFrmType)(header[0] & 0x0C));
518 /* This function extracts the 'frame type and sub type' bits from the MAC */
519 /* header of the input frame. */
520 /* Returns the value in the LSB of the returned value. */
521 INLINE tenuFrmSubtype get_sub_type(u8 *header)
523 return ((tenuFrmSubtype)(header[0] & 0xFC));
526 /* This function extracts the 'to ds' bit from the MAC header of the input */
528 /* Returns the value in the LSB of the returned value. */
529 INLINE u8 get_to_ds(u8 *header)
531 return (header[1] & 0x01);
534 /* This function extracts the 'from ds' bit from the MAC header of the input */
536 /* Returns the value in the LSB of the returned value. */
537 INLINE u8 get_from_ds(u8 *header)
539 return ((header[1] & 0x02) >> 1);
542 /* This function extracts the MAC Address in 'address1' field of the MAC */
543 /* header and updates the MAC Address in the allocated 'addr' variable. */
544 INLINE void get_address1(u8 *pu8msa, u8 *addr)
546 memcpy(addr, pu8msa + 4, 6);
549 /* This function extracts the MAC Address in 'address2' field of the MAC */
550 /* header and updates the MAC Address in the allocated 'addr' variable. */
551 INLINE void get_address2(u8 *pu8msa, u8 *addr)
553 memcpy(addr, pu8msa + 10, 6);
556 /* This function extracts the MAC Address in 'address3' field of the MAC */
557 /* header and updates the MAC Address in the allocated 'addr' variable. */
558 INLINE void get_address3(u8 *pu8msa, u8 *addr)
560 memcpy(addr, pu8msa + 16, 6);
563 /* This function extracts the BSSID from the incoming WLAN packet based on */
564 /* the 'from ds' bit, and updates the MAC Address in the allocated 'addr' */
566 INLINE void get_BSSID(u8 *data, u8 *bssid)
568 if (get_from_ds(data) == 1)
569 get_address2(data, bssid);
570 else if (get_to_ds(data) == 1)
571 get_address1(data, bssid);
573 get_address3(data, bssid);
576 /* This function extracts the SSID from a beacon/probe response frame */
577 INLINE void get_ssid(u8 *data, u8 *ssid, u8 *p_ssid_len)
583 len = data[MAC_HDR_LEN + TIME_STAMP_LEN + BEACON_INTERVAL_LEN +
585 j = MAC_HDR_LEN + TIME_STAMP_LEN + BEACON_INTERVAL_LEN +
588 /* If the SSID length field is set wrongly to a value greater than the */
589 /* allowed maximum SSID length limit, reset the length to 0 */
590 if (len >= MAX_SSID_LEN)
593 for (i = 0; i < len; i++, j++)
601 /* This function extracts the capability info field from the beacon or probe */
602 /* response frame. */
603 INLINE u16 get_cap_info(u8 *data)
606 u16 index = MAC_HDR_LEN;
609 st = get_sub_type(data);
611 /* Location of the Capability field is different for Beacon and */
612 /* Association frames. */
613 if ((st == BEACON) || (st == PROBE_RSP))
614 index += TIME_STAMP_LEN + BEACON_INTERVAL_LEN;
616 cap_info = data[index];
617 cap_info |= (data[index + 1] << 8);
622 /* This function extracts the capability info field from the Association */
623 /* response frame. */
624 INLINE u16 get_assoc_resp_cap_info(u8 *data)
629 cap_info |= (data[1] << 8);
634 /* This funcion extracts the association status code from the incoming */
635 /* association response frame and returns association status code */
636 INLINE u16 get_asoc_status(u8 *data)
640 asoc_status = data[3];
641 asoc_status = (asoc_status << 8) | data[2];
646 /* This function extracts association ID from the incoming association */
648 INLINE u16 get_asoc_id(u8 *data)
653 asoc_id |= (data[5] << 8);
659 * @brief initializes the Core Configurator
661 * @return Error code indicating success/failure
668 s32 CoreConfiguratorInit(void)
670 s32 s32Error = WILC_SUCCESS;
671 PRINT_D(CORECONFIG_DBG, "CoreConfiguratorInit()\n");
673 sema_init(&SemHandleSendPkt, 1);
674 sema_init(&SemHandlePktResp, 0);
677 memset((void *)(&gstrConfigPktInfo), 0, sizeof(tstrConfigPktInfo));
681 u8 *get_tim_elm(u8 *pu8msa, u16 u16RxLen, u16 u16TagParamOffset)
685 /*************************************************************************/
686 /* Beacon Frame - Frame Body */
687 /* --------------------------------------------------------------------- */
688 /* |Timestamp |BeaconInt |CapInfo |SSID |SupRates |DSParSet |TIM elm | */
689 /* --------------------------------------------------------------------- */
690 /* |8 |2 |2 |2-34 |3-10 |3 |4-256 | */
691 /* --------------------------------------------------------------------- */
693 /*************************************************************************/
695 u16index = u16TagParamOffset;
697 /* Search for the TIM Element Field and return if the element is found */
698 while (u16index < (u16RxLen - FCS_LEN)) {
699 if (pu8msa[u16index] == ITIM)
700 return &pu8msa[u16index];
702 u16index += (IE_HDR_LEN + pu8msa[u16index + 1]);
708 /* This function gets the current channel information from
709 * the 802.11n beacon/probe response frame */
710 u8 get_current_channel_802_11n(u8 *pu8msa, u16 u16RxLen)
714 index = TAG_PARAM_OFFSET;
715 while (index < (u16RxLen - FCS_LEN)) {
716 if (pu8msa[index] == IDSPARMS)
717 return pu8msa[index + 2];
719 /* Increment index by length information and header */
720 index += pu8msa[index + 1] + IE_HDR_LEN;
723 /* Return current channel information from the MIB, if beacon/probe */
724 /* response frame does not contain the DS parameter set IE */
725 /* return (mget_CurrentChannel() + 1); */
726 return 0; /* no MIB here */
729 u8 get_current_channel(u8 *pu8msa, u16 u16RxLen)
733 /* Get the current channel as its not set in */
734 /* 802.11a beacons/probe response */
735 return (get_rf_channel() + 1);
736 #else /* FIVE_GHZ_BAND */
737 /* Extract current channel information from */
738 /* the beacon/probe response frame */
739 return get_current_channel_802_11n(pu8msa, u16RxLen);
740 #endif /* FIVE_GHZ_BAND */
743 #endif /* PHY_802_11n */
747 * @brief parses the received 'N' message
749 * @param[in] pu8MsgBuffer The message to be parsed
750 * @param[out] ppstrNetworkInfo pointer to pointer to the structure containing the parsed Network Info
751 * @return Error code indicating success/failure
757 s32 ParseNetworkInfo(u8 *pu8MsgBuffer, tstrNetworkInfo **ppstrNetworkInfo)
759 s32 s32Error = WILC_SUCCESS;
760 tstrNetworkInfo *pstrNetworkInfo = NULL;
765 u16 u16WidID = (u16)WID_NIL;
769 u8MsgType = pu8MsgBuffer[0];
771 /* Check whether the received message type is 'N' */
772 if ('N' != u8MsgType) {
773 PRINT_ER("Received Message format incorrect.\n");
774 WILC_ERRORREPORT(s32Error, WILC_FAIL);
777 /* Extract message ID */
778 u8MsgID = pu8MsgBuffer[1];
780 /* Extract message Length */
781 u16MsgLen = MAKE_WORD16(pu8MsgBuffer[2], pu8MsgBuffer[3]);
784 u16WidID = MAKE_WORD16(pu8MsgBuffer[4], pu8MsgBuffer[5]);
786 /* Extract WID Length */
787 u16WidLen = MAKE_WORD16(pu8MsgBuffer[6], pu8MsgBuffer[7]);
789 /* Assign a pointer to the WID value */
790 pu8WidVal = &pu8MsgBuffer[8];
792 /* parse the WID value of the WID "WID_NEWORK_INFO" */
803 pstrNetworkInfo = kmalloc(sizeof(tstrNetworkInfo), GFP_KERNEL);
804 if (!pstrNetworkInfo)
807 memset((void *)(pstrNetworkInfo), 0, sizeof(tstrNetworkInfo));
809 pstrNetworkInfo->s8rssi = pu8WidVal[0];
811 /* Assign a pointer to msa "Mac Header Start Address" */
812 pu8msa = &pu8WidVal[1];
814 u16RxLen = u16WidLen - 1;
818 /* Get the cap_info */
819 pstrNetworkInfo->u16CapInfo = get_cap_info(pu8msa);
821 /* Get time-stamp [Low only 32 bit] */
822 pstrNetworkInfo->u32Tsf = get_beacon_timestamp_lo(pu8msa);
823 PRINT_D(CORECONFIG_DBG, "TSF :%x\n", pstrNetworkInfo->u32Tsf);
826 /* Get full time-stamp [Low and High 64 bit] */
827 u32Tsf_Lo = get_beacon_timestamp_lo(pu8msa);
828 u32Tsf_Hi = get_beacon_timestamp_hi(pu8msa);
830 pstrNetworkInfo->u64Tsf = u32Tsf_Lo | ((u64)u32Tsf_Hi << 32);
833 get_ssid(pu8msa, pstrNetworkInfo->au8ssid, &(pstrNetworkInfo->u8SsidLen));
836 get_BSSID(pu8msa, pstrNetworkInfo->au8bssid);
838 /* Get the current channel */
839 pstrNetworkInfo->u8channel = get_current_channel(pu8msa, (u16RxLen + FCS_LEN));
841 /* Get beacon period */
842 u8index = (MAC_HDR_LEN + TIME_STAMP_LEN);
844 pstrNetworkInfo->u16BeaconPeriod = get_beacon_period(pu8msa + u8index);
846 u8index += BEACON_INTERVAL_LEN + CAP_INFO_LEN;
848 /* Get DTIM Period */
849 pu8TimElm = get_tim_elm(pu8msa, (u16RxLen + FCS_LEN), u8index);
851 pstrNetworkInfo->u8DtimPeriod = pu8TimElm[3];
852 pu8IEs = &pu8msa[MAC_HDR_LEN + TIME_STAMP_LEN + BEACON_INTERVAL_LEN + CAP_INFO_LEN];
853 u16IEsLen = u16RxLen - (MAC_HDR_LEN + TIME_STAMP_LEN + BEACON_INTERVAL_LEN + CAP_INFO_LEN);
856 pstrNetworkInfo->pu8IEs = kmalloc(u16IEsLen, GFP_KERNEL);
857 if (!pstrNetworkInfo->pu8IEs)
860 memset((void *)(pstrNetworkInfo->pu8IEs), 0, u16IEsLen);
862 memcpy(pstrNetworkInfo->pu8IEs, pu8IEs, u16IEsLen);
864 pstrNetworkInfo->u16IEsLen = u16IEsLen;
868 *ppstrNetworkInfo = pstrNetworkInfo;
875 * @brief Deallocates the parsed Network Info
877 * @param[in] pstrNetworkInfo Network Info to be deallocated
878 * @return Error code indicating success/failure
884 s32 DeallocateNetworkInfo(tstrNetworkInfo *pstrNetworkInfo)
886 s32 s32Error = WILC_SUCCESS;
888 if (pstrNetworkInfo != NULL) {
889 if (pstrNetworkInfo->pu8IEs != NULL) {
890 kfree(pstrNetworkInfo->pu8IEs);
891 pstrNetworkInfo->pu8IEs = NULL;
893 s32Error = WILC_FAIL;
896 kfree(pstrNetworkInfo);
897 pstrNetworkInfo = NULL;
900 s32Error = WILC_FAIL;
907 * @brief parses the received Association Response frame
909 * @param[in] pu8Buffer The Association Response frame to be parsed
910 * @param[out] ppstrConnectRespInfo pointer to pointer to the structure containing the parsed Association Response Info
911 * @return Error code indicating success/failure
917 s32 ParseAssocRespInfo(u8 *pu8Buffer, u32 u32BufferLen,
918 tstrConnectRespInfo **ppstrConnectRespInfo)
920 s32 s32Error = WILC_SUCCESS;
921 tstrConnectRespInfo *pstrConnectRespInfo = NULL;
922 u16 u16AssocRespLen = 0;
926 pstrConnectRespInfo = kmalloc(sizeof(tstrConnectRespInfo), GFP_KERNEL);
927 if (!pstrConnectRespInfo)
930 memset((void *)(pstrConnectRespInfo), 0, sizeof(tstrConnectRespInfo));
932 /* u16AssocRespLen = pu8Buffer[0]; */
933 u16AssocRespLen = (u16)u32BufferLen;
935 /* get the status code */
936 pstrConnectRespInfo->u16ConnectStatus = get_asoc_status(pu8Buffer);
937 if (pstrConnectRespInfo->u16ConnectStatus == SUCCESSFUL_STATUSCODE) {
939 /* get the capability */
940 pstrConnectRespInfo->u16capability = get_assoc_resp_cap_info(pu8Buffer);
942 /* get the Association ID */
943 pstrConnectRespInfo->u16AssocID = get_asoc_id(pu8Buffer);
945 /* get the Information Elements */
946 pu8IEs = &pu8Buffer[CAP_INFO_LEN + STATUS_CODE_LEN + AID_LEN];
947 u16IEsLen = u16AssocRespLen - (CAP_INFO_LEN + STATUS_CODE_LEN + AID_LEN);
949 pstrConnectRespInfo->pu8RespIEs = kmalloc(u16IEsLen, GFP_KERNEL);
950 if (!pstrConnectRespInfo->pu8RespIEs)
953 memset((void *)(pstrConnectRespInfo->pu8RespIEs), 0, u16IEsLen);
955 memcpy(pstrConnectRespInfo->pu8RespIEs, pu8IEs, u16IEsLen);
956 pstrConnectRespInfo->u16RespIEsLen = u16IEsLen;
959 *ppstrConnectRespInfo = pstrConnectRespInfo;
966 * @brief Deallocates the parsed Association Response Info
968 * @param[in] pstrNetworkInfo Network Info to be deallocated
969 * @return Error code indicating success/failure
975 s32 DeallocateAssocRespInfo(tstrConnectRespInfo *pstrConnectRespInfo)
977 s32 s32Error = WILC_SUCCESS;
979 if (pstrConnectRespInfo != NULL) {
980 if (pstrConnectRespInfo->pu8RespIEs != NULL) {
981 kfree(pstrConnectRespInfo->pu8RespIEs);
982 pstrConnectRespInfo->pu8RespIEs = NULL;
984 s32Error = WILC_FAIL;
987 kfree(pstrConnectRespInfo);
988 pstrConnectRespInfo = NULL;
991 s32Error = WILC_FAIL;
997 #ifndef CONNECT_DIRECT
998 s32 ParseSurveyResults(u8 ppu8RcvdSiteSurveyResults[][MAX_SURVEY_RESULT_FRAG_SIZE],
999 wid_site_survey_reslts_s **ppstrSurveyResults,
1000 u32 *pu32SurveyResultsCount)
1002 s32 s32Error = WILC_SUCCESS;
1003 wid_site_survey_reslts_s *pstrSurveyResults = NULL;
1004 u32 u32SurveyResultsCount = 0;
1005 u32 u32SurveyBytesLength = 0;
1007 u32 u32RcvdSurveyResultsNum = 2;
1008 u8 u8ReadSurveyResFragNum;
1012 for (i = 0; i < u32RcvdSurveyResultsNum; i++) {
1013 u32SurveyBytesLength = ppu8RcvdSiteSurveyResults[i][0];
1016 for (j = 0; j < u32SurveyBytesLength; j += SURVEY_RESULT_LENGTH) {
1017 u32SurveyResultsCount++;
1021 pstrSurveyResults = kmalloc_array(u32SurveyResultsCount,
1022 sizeof(wid_site_survey_reslts_s), GFP_KERNEL);
1023 if (!pstrSurveyResults)
1026 memset((void *)(pstrSurveyResults), 0, u32SurveyResultsCount * sizeof(wid_site_survey_reslts_s));
1028 u32SurveyResultsCount = 0;
1030 for (i = 0; i < u32RcvdSurveyResultsNum; i++) {
1031 pu8BufferPtr = ppu8RcvdSiteSurveyResults[i];
1033 u32SurveyBytesLength = pu8BufferPtr[0];
1035 /* TODO: mostafa: pu8BufferPtr[1] contains the fragment num */
1036 u8ReadSurveyResFragNum = pu8BufferPtr[1];
1040 for (j = 0; j < u32SurveyBytesLength; j += SURVEY_RESULT_LENGTH) {
1041 memcpy(&pstrSurveyResults[u32SurveyResultsCount], pu8BufferPtr, SURVEY_RESULT_LENGTH);
1042 pu8BufferPtr += SURVEY_RESULT_LENGTH;
1043 u32SurveyResultsCount++;
1048 *ppstrSurveyResults = pstrSurveyResults;
1049 *pu32SurveyResultsCount = u32SurveyResultsCount;
1055 s32 DeallocateSurveyResults(wid_site_survey_reslts_s *pstrSurveyResults)
1057 s32 s32Error = WILC_SUCCESS;
1059 if (pstrSurveyResults != NULL) {
1060 kfree(pstrSurveyResults);
1067 /*****************************************************************************/
1069 /* Function Name : ProcessCharWid */
1071 /* Description : This function processes a WID of type WID_CHAR and */
1072 /* updates the cfg packet with the supplied value. */
1074 /* Inputs : 1) Pointer to WID cfg structure */
1075 /* 2) Value to set */
1081 /* Outputs : None */
1083 /* Returns : None */
1087 /* Revision History: */
1089 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1090 /* 08 01 2008 Ittiam Draft */
1092 /*****************************************************************************/
1094 void ProcessCharWid(char *pcPacket, s32 *ps32PktLen,
1095 tstrWID *pstrWID, s8 *ps8WidVal)
1097 u8 *pu8val = (u8 *)ps8WidVal;
1099 s32 s32PktLen = *ps32PktLen;
1100 if (pstrWID == NULL) {
1101 PRINT_WRN(CORECONFIG_DBG, "Can't set CHAR val 0x%x ,NULL structure\n", u8val);
1106 pcPacket[s32PktLen++] = (u8)(pstrWID->u16WIDid & 0xFF);
1107 pcPacket[s32PktLen++] = (u8)(pstrWID->u16WIDid >> 8) & 0xFF;
1108 if (g_oper_mode == SET_CFG) {
1112 pcPacket[s32PktLen++] = sizeof(u8);
1116 pcPacket[s32PktLen++] = u8val;
1118 *ps32PktLen = s32PktLen;
1121 /*****************************************************************************/
1123 /* Function Name : ProcessShortWid */
1125 /* Description : This function processes a WID of type WID_SHORT and */
1126 /* updates the cfg packet with the supplied value. */
1128 /* Inputs : 1) Pointer to WID cfg structure */
1129 /* 2) Value to set */
1135 /* Outputs : None */
1137 /* Returns : None */
1141 /* Revision History: */
1143 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1144 /* 08 01 2008 Ittiam Draft */
1146 /*****************************************************************************/
1148 void ProcessShortWid(char *pcPacket, s32 *ps32PktLen,
1149 tstrWID *pstrWID, s8 *ps8WidVal)
1151 u16 *pu16val = (u16 *)ps8WidVal;
1153 s32 s32PktLen = *ps32PktLen;
1154 if (pstrWID == NULL) {
1155 PRINT_WRN(CORECONFIG_DBG, "Can't set SHORT val 0x%x ,NULL structure\n", u16val);
1160 pcPacket[s32PktLen++] = (u8)(pstrWID->u16WIDid & 0xFF);
1161 pcPacket[s32PktLen++] = (u8)((pstrWID->u16WIDid >> 8) & 0xFF);
1163 if (g_oper_mode == SET_CFG) {
1167 pcPacket[s32PktLen++] = sizeof(u16);
1170 pcPacket[s32PktLen++] = (u8)(u16val & 0xFF);
1171 pcPacket[s32PktLen++] = (u8)((u16val >> 8) & 0xFF);
1173 *ps32PktLen = s32PktLen;
1176 /*****************************************************************************/
1178 /* Function Name : ProcessIntWid */
1180 /* Description : This function processes a WID of type WID_INT and */
1181 /* updates the cfg packet with the supplied value. */
1183 /* Inputs : 1) Pointer to WID cfg structure */
1184 /* 2) Value to set */
1190 /* Outputs : None */
1192 /* Returns : None */
1196 /* Revision History: */
1198 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1199 /* 08 01 2008 Ittiam Draft */
1201 /*****************************************************************************/
1203 void ProcessIntWid(char *pcPacket, s32 *ps32PktLen,
1204 tstrWID *pstrWID, s8 *ps8WidVal)
1206 u32 *pu32val = (u32 *)ps8WidVal;
1208 s32 s32PktLen = *ps32PktLen;
1209 if (pstrWID == NULL) {
1210 PRINT_WRN(CORECONFIG_DBG, "Can't set INT val 0x%x , NULL structure\n", u32val);
1215 pcPacket[s32PktLen++] = (u8)(pstrWID->u16WIDid & 0xFF);
1216 pcPacket[s32PktLen++] = (u8)((pstrWID->u16WIDid >> 8) & 0xFF);
1218 if (g_oper_mode == SET_CFG) {
1222 pcPacket[s32PktLen++] = sizeof(u32);
1225 pcPacket[s32PktLen++] = (u8)(u32val & 0xFF);
1226 pcPacket[s32PktLen++] = (u8)((u32val >> 8) & 0xFF);
1227 pcPacket[s32PktLen++] = (u8)((u32val >> 16) & 0xFF);
1228 pcPacket[s32PktLen++] = (u8)((u32val >> 24) & 0xFF);
1230 *ps32PktLen = s32PktLen;
1233 /*****************************************************************************/
1235 /* Function Name : ProcessIPwid */
1237 /* Description : This function processes a WID of type WID_IP and */
1238 /* updates the cfg packet with the supplied value. */
1240 /* Inputs : 1) Pointer to WID cfg structure */
1241 /* 2) Value to set */
1248 /* Outputs : None */
1250 /* Returns : None */
1254 /* Revision History: */
1256 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1257 /* 08 01 2008 Ittiam Draft */
1259 /*****************************************************************************/
1261 void ProcessIPwid(char *pcPacket, s32 *ps32PktLen,
1262 tstrWID *pstrWID, u8 *pu8ip)
1265 s32 s32PktLen = *ps32PktLen;
1267 if (pstrWID == NULL) {
1268 PRINT_WRN(CORECONFIG_DBG, "Can't set IP Addr , NULL structure\n");
1273 pcPacket[s32PktLen++] = (u8)(pstrWID->u16WIDid & 0xFF);
1274 pcPacket[s32PktLen++] = (u8)((pstrWID->u16WIDid >> 8) & 0xFF);
1276 if (g_oper_mode == SET_CFG) {
1278 pcPacket[s32PktLen++] = sizeof(u32);
1280 /* Convert the IP Address String to Integer */
1281 conv_ip_to_int(pu8ip, &u32val);
1284 pcPacket[s32PktLen++] = (u8)(u32val & 0xFF);
1285 pcPacket[s32PktLen++] = (u8)((u32val >> 8) & 0xFF);
1286 pcPacket[s32PktLen++] = (u8)((u32val >> 16) & 0xFF);
1287 pcPacket[s32PktLen++] = (u8)((u32val >> 24) & 0xFF);
1289 *ps32PktLen = s32PktLen;
1292 /*****************************************************************************/
1294 /* Function Name : ProcessStrWid */
1296 /* Description : This function processes a WID of type WID_STR and */
1297 /* updates the cfg packet with the supplied value. */
1299 /* Inputs : 1) Pointer to WID cfg structure */
1300 /* 2) Value to set */
1306 /* Outputs : None */
1308 /* Returns : None */
1312 /* Revision History: */
1314 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1315 /* 08 01 2008 Ittiam Draft */
1317 /*****************************************************************************/
1319 void ProcessStrWid(char *pcPacket, s32 *ps32PktLen,
1320 tstrWID *pstrWID, u8 *pu8val, s32 s32ValueSize)
1324 s32 s32PktLen = *ps32PktLen;
1325 if (pstrWID == NULL) {
1326 PRINT_WRN(CORECONFIG_DBG, "Can't set STR val, NULL structure\n");
1331 pcPacket[s32PktLen++] = (u8)(pstrWID->u16WIDid & 0xFF);
1332 pcPacket[s32PktLen++] = (u8)((pstrWID->u16WIDid >> 8) & 0xFF);
1334 if (g_oper_mode == SET_CFG) {
1335 /* Message Length */
1336 u16MsgLen = (u16)s32ValueSize;
1339 pcPacket[s32PktLen++] = (u8)u16MsgLen;
1342 for (idx = 0; idx < u16MsgLen; idx++)
1343 pcPacket[s32PktLen++] = pu8val[idx];
1345 *ps32PktLen = s32PktLen;
1348 /*****************************************************************************/
1350 /* Function Name : ProcessAdrWid */
1352 /* Description : This function processes a WID of type WID_ADR and */
1353 /* updates the cfg packet with the supplied value. */
1355 /* Inputs : 1) Pointer to WID cfg structure */
1356 /* 2) Value to set */
1362 /* Outputs : None */
1364 /* Returns : None */
1368 /* Revision History: */
1370 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1371 /* 08 01 2008 Ittiam Draft */
1373 /*****************************************************************************/
1375 void ProcessAdrWid(char *pcPacket, s32 *ps32PktLen,
1376 tstrWID *pstrWID, u8 *pu8val)
1379 s32 s32PktLen = *ps32PktLen;
1381 if (pstrWID == NULL) {
1382 PRINT_WRN(CORECONFIG_DBG, "Can't set Addr WID, NULL structure\n");
1387 pcPacket[s32PktLen++] = (u8)(pstrWID->u16WIDid & 0xFF);
1388 pcPacket[s32PktLen++] = (u8)((pstrWID->u16WIDid >> 8) & 0xFF);
1390 if (g_oper_mode == SET_CFG) {
1391 /* Message Length */
1392 u16MsgLen = MAC_ADDR_LEN;
1395 pcPacket[s32PktLen++] = (u8)u16MsgLen;
1398 extract_mac_addr(pu8val, pcPacket + s32PktLen);
1399 s32PktLen += u16MsgLen;
1401 *ps32PktLen = s32PktLen;
1404 /*****************************************************************************/
1406 /* Function Name : ProcessBinWid */
1408 /* Description : This function processes a WID of type WID_BIN_DATA and */
1409 /* updates the cfg packet with the supplied value. */
1411 /* Inputs : 1) Pointer to WID cfg structure */
1412 /* 2) Name of file containing the binary data in text mode */
1416 /* Processing : The binary data is expected to be supplied through a */
1417 /* file in text mode. This file is expected to be in the */
1418 /* finject format. It is parsed, converted to binary format */
1419 /* and copied into g_cfg_pkt for further processing. This */
1420 /* is obviously a round-about way of processing involving */
1421 /* multiple (re)conversions between bin & ascii formats. */
1422 /* But it is done nevertheless to retain uniformity and for */
1423 /* ease of debugging. */
1425 /* Outputs : None */
1427 /* Returns : None */
1432 /* Revision History: */
1434 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1435 /* 08 01 2008 Ittiam Draft */
1437 /*****************************************************************************/
1439 void ProcessBinWid(char *pcPacket, s32 *ps32PktLen,
1440 tstrWID *pstrWID, u8 *pu8val, s32 s32ValueSize)
1444 s32 s32PktLen = *ps32PktLen;
1447 if (pstrWID == NULL) {
1448 PRINT_WRN(CORECONFIG_DBG, "Can't set BIN val, NULL structure\n");
1453 pcPacket[s32PktLen++] = (u8)(pstrWID->u16WIDid & 0xFF);
1454 pcPacket[s32PktLen++] = (u8)((pstrWID->u16WIDid >> 8) & 0xFF);
1456 if (g_oper_mode == SET_CFG) {
1457 /* Message Length */
1458 u16MsgLen = (u16)s32ValueSize;
1461 /* pcPacket[s32PktLen++] = (u8)u16MsgLen; */
1462 pcPacket[s32PktLen++] = (u8)(u16MsgLen & 0xFF);
1463 pcPacket[s32PktLen++] = (u8)((u16MsgLen >> 8) & 0xFF);
1466 for (idx = 0; idx < u16MsgLen; idx++)
1467 pcPacket[s32PktLen++] = pu8val[idx];
1470 for (idx = 0; idx < u16MsgLen; idx++)
1471 u8checksum += pcPacket[MSG_HEADER_LEN + idx + 4];
1473 pcPacket[s32PktLen++] = u8checksum;
1475 *ps32PktLen = s32PktLen;
1479 /*****************************************************************************/
1481 /* Function Name : further_process_response */
1483 /* Description : This function parses the response frame got from the */
1486 /* Inputs : 1) The received response frame */
1489 /* 4) Output file handle */
1490 /* 5) Process Wid Number(i.e wid from --widn switch) */
1491 /* 6) Index the array in the Global Wid Structure. */
1493 /* Globals : g_wid_num, gastrWIDs */
1495 /* Processing : This function parses the response of the device depending*/
1496 /* WID type and writes it to the output file in Hex or */
1497 /* decimal notation depending on the --getx or --get switch.*/
1499 /* Outputs : None */
1501 /* Returns : 0 on Success & -2 on Failure */
1505 /* Revision History: */
1507 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1508 /* 08 01 2009 Ittiam Draft */
1510 /*****************************************************************************/
1512 s32 further_process_response(u8 *resp,
1515 bool process_wid_num,
1517 tstrWID *pstrWIDresult)
1524 u8 cfg_str[256] = {0};
1525 tenuWIDtype enuWIDtype = WID_UNDEF;
1527 if (process_wid_num)
1528 enuWIDtype = get_wid_type(g_wid_num);
1530 enuWIDtype = gastrWIDs[cnt].enuWIDtype;
1533 switch (enuWIDtype) {
1535 cfg_chr = resp[idx];
1536 /*Set local copy of WID*/
1537 *(pstrWIDresult->ps8WidVal) = cfg_chr;
1542 u16 *pu16val = (u16 *)(pstrWIDresult->ps8WidVal);
1543 cfg_sht = MAKE_WORD16(resp[idx], resp[idx + 1]);
1544 /*Set local copy of WID*/
1545 /* pstrWIDresult->ps8WidVal = (s8*)(s32)cfg_sht; */
1552 u32 *pu32val = (u32 *)(pstrWIDresult->ps8WidVal);
1553 cfg_int = MAKE_WORD32(
1554 MAKE_WORD16(resp[idx], resp[idx + 1]),
1555 MAKE_WORD16(resp[idx + 2], resp[idx + 3])
1557 /*Set local copy of WID*/
1558 /* pstrWIDresult->ps8WidVal = (s8*)cfg_int; */
1564 memcpy(cfg_str, resp + idx, cfg_len);
1565 /* cfg_str[cfg_len] = '\0'; //mostafa: no need currently for NULL termination */
1566 if (pstrWIDresult->s32ValueSize >= cfg_len) {
1567 memcpy(pstrWIDresult->ps8WidVal, cfg_str, cfg_len); /* mostafa: no need currently for the extra NULL byte */
1568 pstrWIDresult->s32ValueSize = cfg_len;
1570 PRINT_ER("allocated WID buffer length is smaller than the received WID Length\n");
1577 create_mac_addr(cfg_str, resp + idx);
1579 strncpy(pstrWIDresult->ps8WidVal, cfg_str, strlen(cfg_str));
1580 pstrWIDresult->ps8WidVal[strlen(cfg_str)] = '\0';
1584 cfg_int = MAKE_WORD32(
1585 MAKE_WORD16(resp[idx], resp[idx + 1]),
1586 MAKE_WORD16(resp[idx + 2], resp[idx + 3])
1588 conv_int_to_ip(cfg_str, cfg_int);
1592 if (pstrWIDresult->s32ValueSize >= cfg_len) {
1593 memcpy(pstrWIDresult->ps8WidVal, resp + idx, cfg_len);
1594 pstrWIDresult->s32ValueSize = cfg_len;
1596 PRINT_ER("Allocated WID buffer length is smaller than the received WID Length Err(%d)\n", retval);
1602 PRINT_ER("ERROR: Check config database: Error(%d)\n", retval);
1610 /*****************************************************************************/
1612 /* Function Name : ParseResponse */
1614 /* Description : This function parses the command-line options and */
1615 /* creates the config packets which can be sent to the WLAN */
1618 /* Inputs : 1) The received response frame */
1620 /* Globals : g_opt_list, gastrWIDs */
1622 /* Processing : This function parses the options and creates different */
1623 /* types of packets depending upon the WID-type */
1624 /* corresponding to the option. */
1626 /* Outputs : None */
1628 /* Returns : 0 on Success & -1 on Failure */
1632 /* Revision History: */
1634 /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1635 /* 08 01 2008 Ittiam Draft */
1637 /*****************************************************************************/
1639 s32 ParseResponse(u8 *resp, tstrWID *pstrWIDcfgResult)
1644 tenuWIDtype enuWIDtype = WID_UNDEF;
1645 bool num_wid_processed = false;
1649 /* Check whether the received frame is a valid response */
1650 if (RESP_MSG_TYPE != resp[0]) {
1651 PRINT_INFO(CORECONFIG_DBG, "Received Message format incorrect.\n");
1655 /* Extract Response Length */
1656 u16RespLen = MAKE_WORD16(resp[2], resp[3]);
1657 Res_Len = u16RespLen;
1659 for (idx = MSG_HEADER_LEN; idx < u16RespLen; ) {
1660 u16WIDid = MAKE_WORD16(resp[idx], resp[idx + 1]);
1661 cfg_len = resp[idx + 2];
1662 /* Incase of Bin Type Wid, the length is given by two byte field */
1663 enuWIDtype = get_wid_type(u16WIDid);
1664 if (WID_BIN_DATA == enuWIDtype) {
1665 cfg_len |= ((u16)resp[idx + 3] << 8) & 0xFF00;
1669 if ((u16WIDid == g_wid_num) && (!num_wid_processed)) {
1670 num_wid_processed = true;
1672 if (-2 == further_process_response(&resp[idx], u16WIDid, cfg_len, true, 0, &pstrWIDcfgResult[ResCnt])) {
1677 for (cnt = 0; cnt < g_num_total_switches; cnt++) {
1678 if (gastrWIDs[cnt].u16WIDid == u16WIDid) {
1679 if (-2 == further_process_response(&resp[idx], u16WIDid, cfg_len, false, cnt,
1680 &pstrWIDcfgResult[ResCnt])) {
1688 /* In case if BIN type Wid, The last byte of the Cfg packet is the */
1689 /* Checksum. The WID Length field does not accounts for the checksum. */
1690 /* The Checksum is discarded. */
1691 if (WID_BIN_DATA == enuWIDtype) {
1700 * @brief parses the write response [just detects its status: success or failure]
1702 * @param[in] pu8RespBuffer The Response to be parsed
1703 * @return Error code indicating Write Operation status:
1704 * WRITE_RESP_SUCCESS (1) => Write Success.
1705 * WILC_FAIL (-100) => Write Failure.
1712 s32 ParseWriteResponse(u8 *pu8RespBuffer)
1714 s32 s32Error = WILC_FAIL;
1715 u16 u16WIDtype = (u16)WID_NIL;
1717 /* Check whether the received frame is a valid response */
1718 if (RESP_MSG_TYPE != pu8RespBuffer[0]) {
1719 PRINT_ER("Received Message format incorrect.\n");
1723 u16WIDtype = MAKE_WORD16(pu8RespBuffer[4], pu8RespBuffer[5]);
1725 /* Check for WID_STATUS ID and then check the length and status value */
1726 if ((u16WIDtype == WID_STATUS) &&
1727 (pu8RespBuffer[6] == 1) &&
1728 (pu8RespBuffer[7] == WRITE_RESP_SUCCESS)) {
1729 s32Error = WRITE_RESP_SUCCESS;
1733 /* If the length or status are not as expected return failure */
1734 s32Error = WILC_FAIL;
1740 * @brief creates the header of the Configuration Packet
1742 * @param[in,out] pcpacket The Configuration Packet
1743 * @param[in,out] ps32PacketLength Length of the Configuration Packet
1744 * @return Error code indicating success/failure
1751 s32 CreatePacketHeader(char *pcpacket, s32 *ps32PacketLength)
1753 s32 s32Error = WILC_SUCCESS;
1754 u16 u16MsgLen = (u16)(*ps32PacketLength);
1757 /* The format of the message is: */
1758 /* +-------------------------------------------------------------------+ */
1759 /* | Message Type | Message ID | Message Length |Message body | */
1760 /* +-------------------------------------------------------------------+ */
1761 /* | 1 Byte | 1 Byte | 2 Bytes | Message Length - 4 | */
1762 /* +-------------------------------------------------------------------+ */
1764 /* The format of a message body of a message type 'W' is: */
1765 /* +-------------------------------------------------------------------+ */
1766 /* | WID0 | WID0 Length | WID0 Value | ......................... | */
1767 /* +-------------------------------------------------------------------+ */
1768 /* | 2 Bytes | 1 Byte | WID0 Length | ......................... | */
1769 /* +-------------------------------------------------------------------+ */
1774 if (g_oper_mode == SET_CFG)
1775 pcpacket[u16MsgInd++] = WRITE_MSG_TYPE;
1777 pcpacket[u16MsgInd++] = QUERY_MSG_TYPE;
1779 /* Sequence Number */
1780 pcpacket[u16MsgInd++] = g_seqno++;
1782 /* Message Length */
1783 pcpacket[u16MsgInd++] = (u8)(u16MsgLen & 0xFF);
1784 pcpacket[u16MsgInd++] = (u8)((u16MsgLen >> 8) & 0xFF);
1786 *ps32PacketLength = u16MsgLen;
1792 * @brief creates Configuration packet based on the Input WIDs
1794 * @param[in] pstrWIDs WIDs to be sent in the configuration packet
1795 * @param[in] u32WIDsCount number of WIDs to be sent in the configuration packet
1796 * @param[out] ps8packet The created Configuration Packet
1797 * @param[out] ps32PacketLength Length of the created Configuration Packet
1798 * @return Error code indicating success/failure
1805 s32 CreateConfigPacket(s8 *ps8packet, s32 *ps32PacketLength,
1806 tstrWID *pstrWIDs, u32 u32WIDsCount)
1808 s32 s32Error = WILC_SUCCESS;
1810 *ps32PacketLength = MSG_HEADER_LEN;
1811 for (u32idx = 0; u32idx < u32WIDsCount; u32idx++) {
1812 switch (pstrWIDs[u32idx].enuWIDtype) {
1814 ProcessCharWid(ps8packet, ps32PacketLength, &pstrWIDs[u32idx],
1815 pstrWIDs[u32idx].ps8WidVal);
1819 ProcessShortWid(ps8packet, ps32PacketLength, &pstrWIDs[u32idx],
1820 pstrWIDs[u32idx].ps8WidVal);
1824 ProcessIntWid(ps8packet, ps32PacketLength, &pstrWIDs[u32idx],
1825 pstrWIDs[u32idx].ps8WidVal);
1829 ProcessStrWid(ps8packet, ps32PacketLength, &pstrWIDs[u32idx],
1830 pstrWIDs[u32idx].ps8WidVal, pstrWIDs[u32idx].s32ValueSize);
1834 ProcessIPwid(ps8packet, ps32PacketLength, &pstrWIDs[u32idx],
1835 pstrWIDs[u32idx].ps8WidVal);
1839 ProcessBinWid(ps8packet, ps32PacketLength, &pstrWIDs[u32idx],
1840 pstrWIDs[u32idx].ps8WidVal, pstrWIDs[u32idx].s32ValueSize);
1844 PRINT_ER("ERROR: Check Config database\n");
1848 CreatePacketHeader(ps8packet, ps32PacketLength);
1853 s32 ConfigWaitResponse(char *pcRespBuffer, s32 s32MaxRespBuffLen, s32 *ps32BytesRead,
1856 s32 s32Error = WILC_SUCCESS;
1858 /*removed to caller function*/
1859 /*gstrConfigPktInfo.pcRespBuffer = pcRespBuffer;
1860 * gstrConfigPktInfo.s32MaxRespBuffLen = s32MaxRespBuffLen;
1861 * gstrConfigPktInfo.bRespRequired = bRespRequired;*/
1864 if (gstrConfigPktInfo.bRespRequired) {
1865 down(&SemHandlePktResp);
1867 *ps32BytesRead = gstrConfigPktInfo.s32BytesRead;
1870 memset((void *)(&gstrConfigPktInfo), 0, sizeof(tstrConfigPktInfo));
1875 s32 ConfigProvideResponse(char *pcRespBuffer, s32 s32RespLen)
1877 s32 s32Error = WILC_SUCCESS;
1879 if (gstrConfigPktInfo.bRespRequired) {
1880 if (s32RespLen <= gstrConfigPktInfo.s32MaxRespBuffLen) {
1881 memcpy(gstrConfigPktInfo.pcRespBuffer, pcRespBuffer, s32RespLen);
1882 gstrConfigPktInfo.s32BytesRead = s32RespLen;
1884 memcpy(gstrConfigPktInfo.pcRespBuffer, pcRespBuffer, gstrConfigPktInfo.s32MaxRespBuffLen);
1885 gstrConfigPktInfo.s32BytesRead = gstrConfigPktInfo.s32MaxRespBuffLen;
1886 PRINT_ER("BusProvideResponse() Response greater than the prepared Buffer Size\n");
1889 up(&SemHandlePktResp);
1896 * @brief writes the received packet pu8RxPacket in the global Rx FIFO buffer
1898 * @param[in] pu8RxPacket The received packet
1899 * @param[in] s32RxPacketLen Length of the received packet
1900 * @return Error code indicating success/failure
1908 s32 ConfigPktReceived(u8 *pu8RxPacket, s32 s32RxPacketLen)
1910 s32 s32Error = WILC_SUCCESS;
1913 u8MsgType = pu8RxPacket[0];
1915 switch (u8MsgType) {
1917 ConfigProvideResponse(pu8RxPacket, s32RxPacketLen);
1922 PRINT_INFO(CORECONFIG_DBG, "NetworkInfo packet received\n");
1923 NetworkInfoReceived(pu8RxPacket, s32RxPacketLen);
1927 GnrlAsyncInfoReceived(pu8RxPacket, s32RxPacketLen);
1931 host_int_ScanCompleteReceived(pu8RxPacket, s32RxPacketLen);
1935 PRINT_ER("ConfigPktReceived(): invalid received msg type at the Core Configurator\n");
1943 * @brief Deinitializes the Core Configurator
1945 * @return Error code indicating success/failure
1952 s32 CoreConfiguratorDeInit(void)
1954 s32 s32Error = WILC_SUCCESS;
1956 PRINT_D(CORECONFIG_DBG, "CoreConfiguratorDeInit()\n");
1962 /*Using the global handle of the driver*/
1963 extern wilc_wlan_oup_t *gpstrWlanOps;
1965 * @brief sends certain Configuration Packet based on the input WIDs pstrWIDs
1966 * using driver config layer
1969 * @param[in] pstrWIDs WIDs to be sent in the configuration packet
1970 * @param[in] u32WIDsCount number of WIDs to be sent in the configuration packet
1971 * @param[out] pu8RxResp The received Packet Response
1972 * @param[out] ps32RxRespLen Length of the received Packet Response
1973 * @return Error code indicating success/failure
1979 s32 SendConfigPkt(u8 u8Mode, tstrWID *pstrWIDs,
1980 u32 u32WIDsCount, bool bRespRequired, u32 drvHandler)
1982 s32 counter = 0, ret = 0;
1983 if (gpstrWlanOps == NULL) {
1984 PRINT_D(CORECONFIG_DBG, "Net Dev is still not initialized\n");
1987 PRINT_D(CORECONFIG_DBG, "Net Dev is initialized\n");
1989 if (gpstrWlanOps->wlan_cfg_set == NULL ||
1990 gpstrWlanOps->wlan_cfg_get == NULL) {
1991 PRINT_D(CORECONFIG_DBG, "Set and Get is still not initialized\n");
1994 PRINT_D(CORECONFIG_DBG, "SET is initialized\n");
1996 if (u8Mode == GET_CFG) {
1997 for (counter = 0; counter < u32WIDsCount; counter++) {
1998 PRINT_INFO(CORECONFIG_DBG, "Sending CFG packet [%d][%d]\n", !counter,
1999 (counter == u32WIDsCount - 1));
2000 if (!gpstrWlanOps->wlan_cfg_get(!counter,
2001 pstrWIDs[counter].u16WIDid,
2002 (counter == u32WIDsCount - 1), drvHandler)) {
2004 printk("[Sendconfigpkt]Get Timed out\n");
2012 for (counter = 0; counter < u32WIDsCount; counter++) {
2013 pstrWIDs[counter].s32ValueSize = gpstrWlanOps->wlan_cfg_get_value(
2014 pstrWIDs[counter].u16WIDid,
2015 pstrWIDs[counter].ps8WidVal, pstrWIDs[counter].s32ValueSize);
2018 } else if (u8Mode == SET_CFG) {
2019 for (counter = 0; counter < u32WIDsCount; counter++) {
2020 PRINT_D(CORECONFIG_DBG, "Sending config SET PACKET WID:%x\n", pstrWIDs[counter].u16WIDid);
2021 if (!gpstrWlanOps->wlan_cfg_set(!counter,
2022 pstrWIDs[counter].u16WIDid, pstrWIDs[counter].ps8WidVal,
2023 pstrWIDs[counter].s32ValueSize,
2024 (counter == u32WIDsCount - 1), drvHandler)) {
2026 printk("[Sendconfigpkt]Set Timed out\n");