1/*! 2 * @file host_interface.h 3 * @brief File containg host interface APIs 4 * @author zsalah 5 * @sa host_interface.c 6 * @date 8 March 2012 7 * @version 1.0 8 */ 9 10#ifndef HOST_INT_H 11#define HOST_INT_H 12 13#include "coreconfigurator.h" 14#include "coreconfigsimulator.h" 15/*****************************************************************************/ 16/* Macros */ 17/*****************************************************************************/ 18#define FAIL 0x0000 19#define SUCCESS 0x0001 20 21#define IP_ALEN 4 22 23#define BIT2 ((u32)(1 << 2)) 24#define BIT1 ((u32)(1 << 1)) 25#define BIT0 ((u32)(1 << 0)) 26 27#define AP_MODE 0x01 28#define STATION_MODE 0x02 29#define GO_MODE 0x03 30#define CLIENT_MODE 0x04 31 32 33#define MAX_NUM_STA 9 34#define ACTIVE_SCAN_TIME 10 35#define PASSIVE_SCAN_TIME 1200 36#define MIN_SCAN_TIME 10 37#define MAX_SCAN_TIME 1200 38#define DEFAULT_SCAN 0 39#define USER_SCAN BIT0 40#define OBSS_PERIODIC_SCAN BIT1 41#define OBSS_ONETIME_SCAN BIT2 42#define GTK_RX_KEY_BUFF_LEN 24 43#define ADDKEY 0x1 44#define REMOVEKEY 0x2 45#define DEFAULTKEY 0x4 46#define ADDKEY_AP 0x8 47#define MAX_NUM_SCANNED_NETWORKS 100 /* 30 // rachel */ 48#define MAX_NUM_SCANNED_NETWORKS_SHADOW 130 49#define MAX_NUM_PROBED_SSID 10 /*One more than the number of scanned ssids*/ 50#define CHANNEL_SCAN_TIME 250 /* 250 */ 51 52#define TX_MIC_KEY_LEN 8 53#define RX_MIC_KEY_LEN 8 54#define PTK_KEY_LEN 16 55 56#define TX_MIC_KEY_MSG_LEN 26 57#define RX_MIC_KEY_MSG_LEN 48 58#define PTK_KEY_MSG_LEN 39 59 60#define PMKSA_KEY_LEN 22 61#define ETH_ALEN 6 62#define PMKID_LEN 16 63#define WILC_MAX_NUM_PMKIDS 16 64#define WILC_SUPP_MCS_SET_SIZE 16 65#define WILC_ADD_STA_LENGTH 40 /* Not including the rates field cause it has variable length*/ 66#define SCAN_EVENT_DONE_ABORTED 67/*****************************************************************************/ 68/* Data Types */ 69/*****************************************************************************/ 70/* typedef unsigned char uint8; */ 71/* typedef signed char int8; */ 72/* typedef unsigned short uint16; */ 73/* typedef unsigned long uint32; */ 74/* typedef uint32 Bool; */ 75 76typedef struct { 77 u16 cfg_wid; 78 WID_TYPE_T cfg_type; 79 s8 *pu8Para; 80} cfg_param_t; 81 82typedef struct _tstrStatistics { 83 u8 u8LinkSpeed; 84 s8 s8RSSI; 85 u32 u32TxCount; 86 u32 u32RxCount; 87 u32 u32TxFailureCount; 88 89} tstrStatistics; 90 91 92typedef enum { 93 HOST_IF_IDLE = 0, 94 HOST_IF_SCANNING = 1, 95 HOST_IF_CONNECTING = 2, 96 HOST_IF_WAITING_CONN_RESP = 3, 97 HOST_IF_CONNECTED = 4, 98 HOST_IF_P2P_LISTEN = 5, 99 HOST_IF_FORCE_32BIT = 0xFFFFFFFF 100} tenuHostIFstate; 101 102typedef struct _tstrHostIFpmkid { 103 u8 bssid[ETH_ALEN]; 104 u8 pmkid[PMKID_LEN]; 105} tstrHostIFpmkid; 106 107typedef struct _tstrHostIFpmkidAttr { 108 u8 numpmkid; 109 tstrHostIFpmkid pmkidlist[WILC_MAX_NUM_PMKIDS]; 110} tstrHostIFpmkidAttr; 111 112typedef enum { 113 AUTORATE = 0, 114 MBPS_1 = 1, 115 MBPS_2 = 2, 116 MBPS_5_5 = 5, 117 MBPS_11 = 11, 118 MBPS_6 = 6, 119 MBPS_9 = 9, 120 MBPS_12 = 12, 121 MBPS_18 = 18, 122 MBPS_24 = 24, 123 MBPS_36 = 36, 124 MBPS_48 = 48, 125 MBPS_54 = 54 126} CURRENT_TX_RATE_T; 127 128typedef struct { 129 u32 u32SetCfgFlag; 130 u8 ht_enable; 131 u8 bss_type; 132 u8 auth_type; 133 u16 auth_timeout; 134 u8 power_mgmt_mode; 135 u16 short_retry_limit; 136 u16 long_retry_limit; 137 u16 frag_threshold; 138 u16 rts_threshold; 139 u16 preamble_type; 140 u8 short_slot_allowed; 141 u8 txop_prot_disabled; 142 u16 beacon_interval; 143 u16 dtim_period; 144 SITE_SURVEY_T site_survey_enabled; 145 u16 site_survey_scan_time; 146 u8 scan_source; 147 u16 active_scan_time; 148 u16 passive_scan_time; 149 CURRENT_TX_RATE_T curr_tx_rate; 150 151} tstrCfgParamVal; 152 153typedef enum { 154 RETRY_SHORT = 1 << 0, 155 RETRY_LONG = 1 << 1, 156 FRAG_THRESHOLD = 1 << 2, 157 RTS_THRESHOLD = 1 << 3, 158 BSS_TYPE = 1 << 4, 159 AUTH_TYPE = 1 << 5, 160 AUTHEN_TIMEOUT = 1 << 6, 161 POWER_MANAGEMENT = 1 << 7, 162 PREAMBLE = 1 << 8, 163 SHORT_SLOT_ALLOWED = 1 << 9, 164 TXOP_PROT_DISABLE = 1 << 10, 165 BEACON_INTERVAL = 1 << 11, 166 DTIM_PERIOD = 1 << 12, 167 SITE_SURVEY = 1 << 13, 168 SITE_SURVEY_SCAN_TIME = 1 << 14, 169 ACTIVE_SCANTIME = 1 << 15, 170 PASSIVE_SCANTIME = 1 << 16, 171 CURRENT_TX_RATE = 1 << 17, 172 HT_ENABLE = 1 << 18, 173} tenuCfgParam; 174 175typedef struct { 176 u8 au8bssid[6]; 177 s8 s8rssi; 178} tstrFoundNetworkInfo; 179 180typedef enum {SCAN_EVENT_NETWORK_FOUND = 0, 181 SCAN_EVENT_DONE = 1, 182 SCAN_EVENT_ABORTED = 2, 183 SCAN_EVENT_FORCE_32BIT = 0xFFFFFFFF} tenuScanEvent; 184 185typedef enum { 186 CONN_DISCONN_EVENT_CONN_RESP = 0, 187 CONN_DISCONN_EVENT_DISCONN_NOTIF = 1, 188 CONN_DISCONN_EVENT_FORCE_32BIT = 0xFFFFFFFF 189} tenuConnDisconnEvent; 190 191typedef enum { 192 WEP, 193 WPARxGtk, 194 /* WPATxGtk, */ 195 WPAPtk, 196 PMKSA, 197} tenuKeyType; 198 199 200/*Scan callBack function definition*/ 201typedef void (*tWILCpfScanResult)(tenuScanEvent, tstrNetworkInfo *, void *, void *); 202 203/*Connect callBack function definition*/ 204typedef void (*tWILCpfConnectResult)(tenuConnDisconnEvent, 205 tstrConnectInfo *, 206 u8, 207 tstrDisconnectNotifInfo *, 208 void *); 209 210#ifdef WILC_P2P 211typedef void (*tWILCpfRemainOnChanExpired)(void *, u32); /*Remain on channel expiration callback function*/ 212typedef void (*tWILCpfRemainOnChanReady)(void *); /*Remain on channel callback function*/ 213#endif 214 215/* typedef u32 WILC_WFIDrvHandle; */ 216typedef struct { 217 s32 s32Dummy; 218} *WILC_WFIDrvHandle; 219 220/*! 221 * @struct tstrRcvdNetworkInfo 222 * @brief Structure to hold Received Asynchronous Network info 223 * @details 224 * @todo 225 * @sa 226 * @author Mostafa Abu Bakr 227 * @date 25 March 2012 228 * @version 1.0 229 */ 230typedef struct _tstrRcvdNetworkInfo { 231 u8 *pu8Buffer; 232 u32 u32Length; 233} tstrRcvdNetworkInfo; 234 235/*BugID_4156*/ 236typedef struct _tstrHiddenNetworkInfo { 237 u8 *pu8ssid; 238 u8 u8ssidlen; 239 240} tstrHiddenNetworkInfo; 241 242typedef struct _tstrHiddenNetwork { 243 /* MAX_SSID_LEN */ 244 tstrHiddenNetworkInfo *pstrHiddenNetworkInfo; 245 u8 u8ssidnum; 246 247} tstrHiddenNetwork; 248 249typedef struct { 250 /* Scan user call back function */ 251 tWILCpfScanResult pfUserScanResult; 252 253 /* User specific parameter to be delivered through the Scan User Callback function */ 254 void *u32UserScanPvoid; 255 256 u32 u32RcvdChCount; 257 tstrFoundNetworkInfo astrFoundNetworkInfo[MAX_NUM_SCANNED_NETWORKS]; 258} tstrWILC_UsrScanReq; 259 260typedef struct { 261 u8 *pu8bssid; 262 u8 *pu8ssid; 263 u8 u8security; 264 AUTHTYPE_T tenuAuth_type; 265 size_t ssidLen; 266 u8 *pu8ConnReqIEs; 267 size_t ConnReqIEsLen; 268 /* Connect user call back function */ 269 tWILCpfConnectResult pfUserConnectResult; 270 bool IsHTCapable; 271 /* User specific parameter to be delivered through the Connect User Callback function */ 272 void *u32UserConnectPvoid; 273} tstrWILC_UsrConnReq; 274 275typedef struct { 276 u32 u32Address; 277} tstrHostIfSetDrvHandler; 278 279typedef struct { 280 u32 u32Mode; 281} tstrHostIfSetOperationMode; 282 283/*BugID_5077*/ 284typedef struct { 285 u8 u8MacAddress[ETH_ALEN]; 286} tstrHostIfSetMacAddress; 287 288/*BugID_5213*/ 289typedef struct { 290 u8 *u8MacAddress; 291} tstrHostIfGetMacAddress; 292 293/*BugID_5222*/ 294typedef struct { 295 u8 au8Bssid[ETH_ALEN]; 296 u8 u8Ted; 297 u16 u16BufferSize; 298 u16 u16SessionTimeout; 299} tstrHostIfBASessionInfo; 300 301#ifdef WILC_P2P 302typedef struct { 303 u16 u16Channel; 304 u32 u32duration; 305 tWILCpfRemainOnChanExpired pRemainOnChanExpired; 306 tWILCpfRemainOnChanReady pRemainOnChanReady; 307 void *pVoid; 308 u32 u32ListenSessionID; 309} tstrHostIfRemainOnChan; 310 311typedef struct { 312 313 bool bReg; 314 u16 u16FrameType; 315 u8 u8Regid; 316 317 318} tstrHostIfRegisterFrame; 319 320 321#define ACTION 0xD0 322#define PROBE_REQ 0x40 323#define PROBE_RESP 0x50 324#define ACTION_FRM_IDX 0 325#define PROBE_REQ_IDX 1 326 327 328enum p2p_listen_state { 329 P2P_IDLE, 330 P2P_LISTEN, 331 P2P_GRP_FORMATION 332}; 333 334#endif 335typedef struct { 336 /* Scan user structure */ 337 tstrWILC_UsrScanReq strWILC_UsrScanReq; 338 339 /* Connect User structure */ 340 tstrWILC_UsrConnReq strWILC_UsrConnReq; 341 342 #ifdef WILC_P2P 343 /*Remain on channel struvture*/ 344 tstrHostIfRemainOnChan strHostIfRemainOnChan; 345 u8 u8RemainOnChan_pendingreq; 346 u64 u64P2p_MgmtTimeout; 347 u8 u8P2PConnect; 348 #endif 349 350 tenuHostIFstate enuHostIFstate; 351 352 /* bool bPendingConnRequest; */ 353 354 #ifndef CONNECT_DIRECT 355 u32 u32SurveyResultsCount; 356 wid_site_survey_reslts_s astrSurveyResults[MAX_NUM_SCANNED_NETWORKS]; 357 #endif 358 359 u8 au8AssociatedBSSID[ETH_ALEN]; 360 tstrCfgParamVal strCfgValues; 361/* semaphores */ 362 struct semaphore gtOsCfgValuesSem; 363 struct semaphore hSemTestKeyBlock; 364 365 struct semaphore hSemTestDisconnectBlock; 366 struct semaphore hSemGetRSSI; 367 struct semaphore hSemGetLINKSPEED; 368 struct semaphore hSemGetCHNL; 369 struct semaphore hSemInactiveTime; 370/* timer handlers */ 371 WILC_TimerHandle hScanTimer; 372 WILC_TimerHandle hConnectTimer; 373 #ifdef WILC_P2P 374 WILC_TimerHandle hRemainOnChannel; 375 #endif 376 377 bool IFC_UP; 378} tstrWILC_WFIDrv; 379 380/*! 381 * @enum tenuWILC_StaFlag 382 * @brief Used to decode the station flag set and mask in tstrWILC_AddStaParam 383 * @details 384 * @todo 385 * @sa tstrWILC_AddStaParam, enum nl80211_sta_flags 386 * @author Enumeraion's creator 387 * @date 12 July 2012 388 * @version 1.0 Description 389 */ 390 391typedef enum { 392 WILC_STA_FLAG_INVALID = 0, 393 WILC_STA_FLAG_AUTHORIZED, /*!< station is authorized (802.1X)*/ 394 WILC_STA_FLAG_SHORT_PREAMBLE, /*!< station is capable of receiving frames with short barker preamble*/ 395 WILC_STA_FLAG_WME, /*!< station is WME/QoS capable*/ 396 WILC_STA_FLAG_MFP, /*!< station uses management frame protection*/ 397 WILC_STA_FLAG_AUTHENTICATED /*!< station is authenticated*/ 398} tenuWILC_StaFlag; 399 400typedef struct { 401 u8 au8BSSID[ETH_ALEN]; 402 u16 u16AssocID; 403 u8 u8NumRates; 404 const u8 *pu8Rates; 405 bool bIsHTSupported; 406 u16 u16HTCapInfo; 407 u8 u8AmpduParams; 408 u8 au8SuppMCsSet[16]; 409 u16 u16HTExtParams; 410 u32 u32TxBeamformingCap; 411 u8 u8ASELCap; 412 u16 u16FlagsMask; /*<! Determines which of u16FlagsSet were changed>*/ 413 u16 u16FlagsSet; /*<! Decoded according to tenuWILC_StaFlag */ 414} tstrWILC_AddStaParam; 415 416/* extern void CfgDisconnected(void* pUserVoid, u16 u16reason, u8 * ie, size_t ie_len); */ 417 418/*****************************************************************************/ 419/* */ 420/* Host Interface API */ 421/* */ 422/*****************************************************************************/ 423 424/** 425 * @brief removes wpa/wpa2 keys 426 * @details only in BSS STA mode if External Supplicant support is enabled. 427 * removes all WPA/WPA2 station key entries from MAC hardware. 428 * @param[in,out] handle to the wifi driver 429 * @param[in] 6 bytes of Station Adress in the station entry table 430 * @return Error code indicating success/failure 431 * @note 432 * @author zsalah 433 * @date 8 March 2012 434 * @version 1.0 435 */ 436s32 host_int_remove_key(WILC_WFIDrvHandle hWFIDrv, const u8 *pu8StaAddress); 437/** 438 * @brief removes WEP key 439 * @details valid only in BSS STA mode if External Supplicant support is enabled. 440 * remove a WEP key entry from MAC HW. 441 * The BSS Station automatically finds the index of the entry using its 442 * BSS ID and removes that entry from the MAC hardware. 443 * @param[in,out] handle to the wifi driver 444 * @param[in] 6 bytes of Station Adress in the station entry table 445 * @return Error code indicating success/failure 446 * @note NO need for the STA add since it is not used for processing 447 * @author zsalah 448 * @date 8 March 2012 449 * @version 1.0 450 */ 451s32 host_int_remove_wep_key(WILC_WFIDrvHandle hWFIDrv, u8 u8Index); 452/** 453 * @brief sets WEP deafault key 454 * @details Sets the index of the WEP encryption key in use, 455 * in the key table 456 * @param[in,out] handle to the wifi driver 457 * @param[in] key index ( 0, 1, 2, 3) 458 * @return Error code indicating success/failure 459 * @note 460 * @author zsalah 461 * @date 8 March 2012 462 * @version 1.0 463 */ 464s32 host_int_set_WEPDefaultKeyID(WILC_WFIDrvHandle hWFIDrv, u8 u8Index); 465 466/** 467 * @brief sets WEP deafault key 468 * @details valid only in BSS STA mode if External Supplicant support is enabled. 469 * sets WEP key entry into MAC hardware when it receives the 470 * corresponding request from NDIS. 471 * @param[in,out] handle to the wifi driver 472 * @param[in] message containing WEP Key in the following format 473 *|---------------------------------------| 474 *|Key ID Value | Key Length | Key | 475 *|-------------|------------|------------| 476 | 1byte | 1byte | Key Length | 477 ||---------------------------------------| 478 | 479 * @return Error code indicating success/failure 480 * @note 481 * @author zsalah 482 * @date 8 March 2012 483 * @version 1.0 484 */ 485s32 host_int_add_wep_key_bss_sta(WILC_WFIDrvHandle hWFIDrv, const u8 *pu8WepKey, u8 u8WepKeylen, u8 u8Keyidx); 486/** 487 * @brief host_int_add_wep_key_bss_ap 488 * @details valid only in AP mode if External Supplicant support is enabled. 489 * sets WEP key entry into MAC hardware when it receives the 490 * corresponding request from NDIS. 491 * @param[in,out] handle to the wifi driver 492 * 493 * 494 * @return Error code indicating success/failure 495 * @note 496 * @author mdaftedar 497 * @date 28 Feb 2013 498 * @version 1.0 499 */ 500s32 host_int_add_wep_key_bss_ap(WILC_WFIDrvHandle hWFIDrv, const u8 *pu8WepKey, u8 u8WepKeylen, u8 u8Keyidx, u8 u8mode, AUTHTYPE_T tenuAuth_type); 501 502/** 503 * @brief adds ptk Key 504 * @details 505 * @param[in,out] handle to the wifi driver 506 * @param[in] message containing PTK Key in the following format 507 *|-------------------------------------------------------------------------| 508 *|Sta Adress | Key Length | Temporal Key | Rx Michael Key |Tx Michael Key | 509 *|-----------|------------|---------------|----------------|---------------| 510 | 6 bytes | 1byte | 16 bytes | 8 bytes | 8 bytes | 511 ||-------------------------------------------------------------------------| 512 * @return Error code indicating success/failure 513 * @note 514 * @author zsalah 515 * @date 8 March 2012 516 * @version 1.0 517 */ 518s32 host_int_add_ptk(WILC_WFIDrvHandle hWFIDrv, const u8 *pu8Ptk, u8 u8PtkKeylen, 519 const u8 *mac_addr, const u8 *pu8RxMic, const u8 *pu8TxMic, u8 mode, u8 u8Ciphermode, u8 u8Idx); 520 521/** 522 * @brief host_int_get_inactive_time 523 * @details 524 * @param[in,out] handle to the wifi driver 525 * @param[in] message containing inactive time 526 * 527 * @return Error code indicating success/failure 528 * @note 529 * @author mdaftedar 530 * @date 15 April 2013 531 * @version 1.0 532 */ 533s32 host_int_get_inactive_time(WILC_WFIDrvHandle hWFIDrv, const u8 *mac, u32 *pu32InactiveTime); 534 535/** 536 * @brief adds Rx GTk Key 537 * @details 538 * @param[in,out] handle to the wifi driver 539 * @param[in] message containing Rx GTK Key in the following format 540 *|----------------------------------------------------------------------------| 541 *|Sta Address | Key RSC | KeyID | Key Length | Temporal Key | Rx Michael Key | 542 *|------------|---------|-------|------------|---------------|----------------| 543 | 6 bytes | 8 byte |1 byte | 1 byte | 16 bytes | 8 bytes | 544 ||----------------------------------------------------------------------------| 545 * @return Error code indicating success/failure 546 * @note 547 * @author zsalah 548 * @date 8 March 2012 549 * @version 1.0 550 */ 551s32 host_int_add_rx_gtk(WILC_WFIDrvHandle hWFIDrv, const u8 *pu8RxGtk, u8 u8GtkKeylen, 552 u8 u8KeyIdx, u32 u32KeyRSClen, const u8 *KeyRSC, 553 const u8 *pu8RxMic, const u8 *pu8TxMic, u8 mode, u8 u8Ciphermode); 554 555 556/** 557 * @brief adds Tx GTk Key 558 * @details 559 * @param[in,out] handle to the wifi driver 560 * @param[in] message containing Tx GTK Key in the following format 561 *|----------------------------------------------------| 562 | KeyID | Key Length | Temporal Key | Tx Michael Key | 563 ||-------|------------|--------------|----------------| 564 ||1 byte | 1 byte | 16 bytes | 8 bytes | 565 ||----------------------------------------------------| 566 * @return Error code indicating success/failure 567 * @note 568 * @author zsalah 569 * @date 8 March 2012 570 * @version 1.0 571 */ 572s32 host_int_add_tx_gtk(WILC_WFIDrvHandle hWFIDrv, u8 u8KeyLen, u8 *pu8TxGtk, u8 u8KeyIdx); 573 574/** 575 * @brief caches the pmkid 576 * @details valid only in BSS STA mode if External Supplicant 577 * support is enabled. This Function sets the PMKID in firmware 578 * when host drivr receives the corresponding request from NDIS. 579 * The firmware then includes theset PMKID in the appropriate 580 * management frames 581 * @param[in,out] handle to the wifi driver 582 * @param[in] message containing PMKID Info in the following format 583 *|-----------------------------------------------------------------| 584 *|NumEntries | BSSID[1] | PMKID[1] | ... | BSSID[K] | PMKID[K] | 585 *|-----------|------------|----------|-------|----------|----------| 586 | 1 | 6 | 16 | ... | 6 | 16 | 587 ||-----------------------------------------------------------------| 588 * @return Error code indicating success/failure 589 * @note 590 * @author zsalah 591 * @date 8 March 2012 592 * @version 1.0 593 */ 594 595s32 host_int_set_pmkid_info(WILC_WFIDrvHandle hWFIDrv, tstrHostIFpmkidAttr *pu8PmkidInfoArray); 596/** 597 * @brief gets the cached the pmkid info 598 * @details valid only in BSS STA mode if External Supplicant 599 * support is enabled. This Function sets the PMKID in firmware 600 * when host drivr receives the corresponding request from NDIS. 601 * The firmware then includes theset PMKID in the appropriate 602 * management frames 603 * @param[in,out] handle to the wifi driver, 604 * 605 * message containing PMKID Info in the following format 606 *|-----------------------------------------------------------------| 607 *|NumEntries | BSSID[1] | PMKID[1] | ... | BSSID[K] | PMKID[K] | 608 *|-----------|------------|----------|-------|----------|----------| 609 | 1 | 6 | 16 | ... | 6 | 16 | 610 ||-----------------------------------------------------------------| 611 * @param[in] 612 * @return Error code indicating success/failure 613 * @note 614 * @author zsalah 615 * @date 8 March 2012 616 * @version 1.0 617 */ 618 619s32 host_int_get_pmkid_info(WILC_WFIDrvHandle hWFIDrv, u8 *pu8PmkidInfoArray, 620 u32 u32PmkidInfoLen); 621 622/** 623 * @brief sets the pass phrase 624 * @details AP/STA mode. This function gives the pass phrase used to 625 * generate the Pre-Shared Key when WPA/WPA2 is enabled 626 * The length of the field can vary from 8 to 64 bytes, 627 * the lower layer should get the 628 * @param[in,out] handle to the wifi driver, 629 * @param[in] String containing PSK 630 * @return Error code indicating success/failure 631 * @note 632 * @author zsalah 633 * @date 8 March 2012 634 * @version 1.0 635 */ 636s32 host_int_set_RSNAConfigPSKPassPhrase(WILC_WFIDrvHandle hWFIDrv, u8 *pu8PassPhrase, 637 u8 u8Psklength); 638/** 639 * @brief gets the pass phrase 640 * @details AP/STA mode. This function gets the pass phrase used to 641 * generate the Pre-Shared Key when WPA/WPA2 is enabled 642 * The length of the field can vary from 8 to 64 bytes, 643 * the lower layer should get the 644 * @param[in,out] handle to the wifi driver, 645 * String containing PSK 646 * @return Error code indicating success/failure 647 * @note 648 * @author zsalah 649 * @date 8 March 2012 650 * @version 1.0 651 */ 652s32 host_int_get_RSNAConfigPSKPassPhrase(WILC_WFIDrvHandle hWFIDrv, 653 u8 *pu8PassPhrase, u8 u8Psklength); 654 655/** 656 * @brief gets mac address 657 * @details 658 * @param[in,out] handle to the wifi driver, 659 * 660 * @return Error code indicating success/failure 661 * @note 662 * @author mdaftedar 663 * @date 19 April 2012 664 * @version 1.0 665 */ 666s32 host_int_get_MacAddress(WILC_WFIDrvHandle hWFIDrv, u8 *pu8MacAddress); 667 668/** 669 * @brief sets mac address 670 * @details 671 * @param[in,out] handle to the wifi driver, 672 * 673 * @return Error code indicating success/failure 674 * @note 675 * @author mabubakr 676 * @date 16 July 2012 677 * @version 1.0 678 */ 679s32 host_int_set_MacAddress(WILC_WFIDrvHandle hWFIDrv, u8 *pu8MacAddress); 680 681/** 682 * @brief wait until msg q is empty 683 * @details 684 * @param[in,out] 685 * 686 * @return Error code indicating success/failure 687 * @note 688 * @author asobhy 689 * @date 19 march 2014 690 * @version 1.0 691 */ 692s32 host_int_wait_msg_queue_idle(void); 693 694/** 695 * @brief gets the site survey results 696 * @details 697 * @param[in,out] handle to the wifi driver, 698 * Message containing site survey results in the 699 * following formate 700 *|---------------------------------------------------| 701 | MsgLength | fragNo. | MsgBodyLength | MsgBody | 702 ||-----------|-----------|---------------|-----------| 703 | 1 | 1 | 1 | 1 | 704 | ----------------------------------------- | ---------------- 705 | 706 ||---------------------------------------| 707 | Network1 | Netweork2 | ... | Network5 | 708 ||---------------------------------------| 709 | 44 | 44 | ... | 44 | 710 | -------------------------- | --------------------------------------- 711 | 712 ||---------------------------------------------------------------------| 713 | SSID | BSS Type | Channel | Security Status| BSSID | RSSI |Reserved | 714 ||------|----------|---------|----------------|-------|------|---------| 715 | 33 | 1 | 1 | 1 | 6 | 1 | 1 | 716 ||---------------------------------------------------------------------| 717 * @return Error code indicating success/failure 718 * @note 719 * @author zsalah 720 * @date 8 March 2012 721 * @version 1.0 722 */ 723#ifndef CONNECT_DIRECT 724s32 host_int_get_site_survey_results(WILC_WFIDrvHandle hWFIDrv, 725 u8 ppu8RcvdSiteSurveyResults[][MAX_SURVEY_RESULT_FRAG_SIZE], 726 u32 u32MaxSiteSrvyFragLen); 727#endif 728 729/** 730 * @brief sets a start scan request 731 * @details 732 * @param[in,out] handle to the wifi driver, 733 * @param[in] Scan Source one of the following values 734 * DEFAULT_SCAN 0 735 * USER_SCAN BIT0 736 * OBSS_PERIODIC_SCAN BIT1 737 * OBSS_ONETIME_SCAN BIT2 738 * @return Error code indicating success/failure 739 * @note 740 * @author zsalah 741 * @date 8 March 2012 742 * @version 1.0 743 */ 744 745s32 host_int_set_start_scan_req(WILC_WFIDrvHandle hWFIDrv, u8 scanSource); 746/** 747 * @brief gets scan source of the last scan 748 * @details 749 * @param[in,out] handle to the wifi driver, 750 * Scan Source one of the following values 751 * DEFAULT_SCAN 0 752 * USER_SCAN BIT0 753 * OBSS_PERIODIC_SCAN BIT1 754 * OBSS_ONETIME_SCAN BIT2 755 * @return Error code indicating success/failure 756 * @note 757 * @author zsalah 758 * @date 8 March 2012 759 * @version 1.0 760 */ 761s32 host_int_get_start_scan_req(WILC_WFIDrvHandle hWFIDrv, u8 *pu8ScanSource); 762 763/** 764 * @brief sets a join request 765 * @details 766 * @param[in,out] handle to the wifi driver, 767 * @param[in] Index of the bss descriptor 768 * @return Error code indicating success/failure 769 * @note 770 * @author zsalah 771 * @date 8 March 2012 772 * @version 1.0 773 */ 774 775s32 host_int_set_join_req(WILC_WFIDrvHandle hWFIDrv, u8 *pu8bssid, 776 const u8 *pu8ssid, size_t ssidLen, 777 const u8 *pu8IEs, size_t IEsLen, 778 tWILCpfConnectResult pfConnectResult, void *pvUserArg, 779 u8 u8security, AUTHTYPE_T tenuAuth_type, 780 u8 u8channel, 781 void *pJoinParams); 782 783/** 784 * @brief Flush a join request parameters to FW, but actual connection 785 * @details The function is called in situation where WILC is connected to AP and 786 * required to switch to hybrid FW for P2P connection 787 * @param[in] handle to the wifi driver, 788 * @return Error code indicating success/failure 789 * @note 790 * @author Amr Abdel-Moghny 791 * @date 19 DEC 2013 792 * @version 8.0 793 */ 794 795s32 host_int_flush_join_req(WILC_WFIDrvHandle hWFIDrv); 796 797 798/** 799 * @brief disconnects from the currently associated network 800 * @details 801 * @param[in,out] handle to the wifi driver, 802 * @param[in] Reason Code of the Disconnection 803 * @return Error code indicating success/failure 804 * @note 805 * @author zsalah 806 * @date 8 March 2012 807 * @version 1.0 808 */ 809s32 host_int_disconnect(WILC_WFIDrvHandle hWFIDrv, u16 u16ReasonCode); 810 811/** 812 * @brief disconnects a sta 813 * @details 814 * @param[in,out] handle to the wifi driver, 815 * @param[in] Association Id of the station to be disconnected 816 * @return Error code indicating success/failure 817 * @note 818 * @author zsalah 819 * @date 8 March 2012 820 * @version 1.0 821 */ 822s32 host_int_disconnect_station(WILC_WFIDrvHandle hWFIDrv, u8 assoc_id); 823/** 824 * @brief gets a Association request info 825 * @details 826 * @param[in,out] handle to the wifi driver, 827 * Message containg assoc. req info in the following format 828 * ------------------------------------------------------------------------ 829 | Management Frame Format | 830 ||-------------------------------------------------------------------| 831 ||Frame Control|Duration|DA|SA|BSSID|Sequence Control|Frame Body|FCS | 832 ||-------------|--------|--|--|-----|----------------|----------|----| 833 | 2 |2 |6 |6 |6 | 2 |0 - 2312 | 4 | 834 ||-------------------------------------------------------------------| 835 | | 836 | Association Request Frame - Frame Body | 837 ||-------------------------------------------------------------------| 838 | Capability Information | Listen Interval | SSID | Supported Rates | 839 ||------------------------|-----------------|------|-----------------| 840 | 2 | 2 | 2-34 | 3-10 | 841 | --------------------------------------------------------------------- 842 * @return Error code indicating success/failure 843 * @note 844 * @author zsalah 845 * @date 8 March 2012 846 * @version 1.0 847 */ 848 849s32 host_int_get_assoc_req_info(WILC_WFIDrvHandle hWFIDrv, u8 *pu8AssocReqInfo, 850 u32 u32AssocReqInfoLen); 851/** 852 * @brief gets a Association Response info 853 * @details 854 * @param[in,out] handle to the wifi driver, 855 * Message containg assoc. resp info 856 * @return Error code indicating success/failure 857 * @note 858 * @author zsalah 859 * @date 8 March 2012 860 * @version 1.0 861 */ 862 863s32 host_int_get_assoc_res_info(WILC_WFIDrvHandle hWFIDrv, u8 *pu8AssocRespInfo, 864 u32 u32MaxAssocRespInfoLen, u32 *pu32RcvdAssocRespInfoLen); 865/** 866 * @brief gets a Association Response info 867 * @details Valid only in STA mode. This function gives the RSSI 868 * values observed in all the channels at the time of scanning. 869 * The length of the field is 1 greater that the total number of 870 * channels supported. Byte 0 contains the number of channels while 871 * each of Byte N contains the observed RSSI value for the channel index N. 872 * @param[in,out] handle to the wifi driver, 873 * array of scanned channels' RSSI 874 * @return Error code indicating success/failure 875 * @note 876 * @author zsalah 877 * @date 8 March 2012 878 * @version 1.0 879 */ 880s32 host_int_get_rx_power_level(WILC_WFIDrvHandle hWFIDrv, u8 *pu8RxPowerLevel, 881 u32 u32RxPowerLevelLen); 882 883/** 884 * @brief sets a channel 885 * @details 886 * @param[in,out] handle to the wifi driver, 887 * @param[in] Index of the channel to be set 888 *|-------------------------------------------------------------------| 889 | CHANNEL1 CHANNEL2 .... CHANNEL14 | 890 | Input: 1 2 14 | 891 ||-------------------------------------------------------------------| 892 * @return Error code indicating success/failure 893 * @note 894 * @author zsalah 895 * @date 8 March 2012 896 * @version 1.0 897 */ 898s32 host_int_set_mac_chnl_num(WILC_WFIDrvHandle hWFIDrv, u8 u8ChNum); 899 900/** 901 * @brief gets the current channel index 902 * @details 903 * @param[in,out] handle to the wifi driver, 904 * current channel index 905 *|-----------------------------------------------------------------------| 906 | CHANNEL1 CHANNEL2 .... CHANNEL14 | 907 | Input: 1 2 14 | 908 ||-----------------------------------------------------------------------| 909 * @return Error code indicating success/failure 910 * @note 911 * @author zsalah 912 * @date 8 March 2012 913 * @version 1.0 914 */ 915s32 host_int_get_host_chnl_num(WILC_WFIDrvHandle hWFIDrv, u8 *pu8ChNo); 916/** 917 * @brief gets the sta rssi 918 * @details gets the currently maintained RSSI value for the station. 919 * The received signal strength value in dB. 920 * The range of valid values is -128 to 0. 921 * @param[in,out] handle to the wifi driver, 922 * rssi value in dB 923 * @return Error code indicating success/failure 924 * @note 925 * @author zsalah 926 * @date 8 March 2012 927 * @version 1.0 928 */ 929s32 host_int_get_rssi(WILC_WFIDrvHandle hWFIDrv, s8 *ps8Rssi); 930s32 host_int_get_link_speed(WILC_WFIDrvHandle hWFIDrv, s8 *ps8lnkspd); 931/** 932 * @brief scans a set of channels 933 * @details 934 * @param[in,out] handle to the wifi driver, 935 * @param[in] Scan source 936 * Scan Type PASSIVE_SCAN = 0, 937 * ACTIVE_SCAN = 1 938 * Channels Array 939 * Channels Array length 940 * Scan Callback function 941 * User Argument to be delivered back through the Scan Cllback function 942 * @return Error code indicating success/failure 943 * @note 944 * @author zsalah 945 * @date 8 March 2012 946 * @version 1.0 947 */ 948s32 host_int_scan(WILC_WFIDrvHandle hWFIDrv, u8 u8ScanSource, 949 u8 u8ScanType, u8 *pu8ChnlFreqList, 950 u8 u8ChnlListLen, const u8 *pu8IEs, 951 size_t IEsLen, tWILCpfScanResult ScanResult, 952 void *pvUserArg, tstrHiddenNetwork *pstrHiddenNetwork); 953/** 954 * @brief sets configuration wids values 955 * @details 956 * @param[in,out] handle to the wifi driver, 957 * @param[in] WID, WID value 958 * @return Error code indicating success/failure 959 * @note 960 * @author zsalah 961 * @date 8 March 2012 962 * @version 1.0 963 */ 964s32 hif_set_cfg(WILC_WFIDrvHandle hWFIDrv, tstrCfgParamVal *pstrCfgParamVal); 965 966/** 967 * @brief gets configuration wids values 968 * @details 969 * @param[in,out] handle to the wifi driver, 970 * WID value 971 * @param[in] WID, 972 * @return Error code indicating success/failure 973 * @note 974 * @author zsalah 975 * @date 8 March 2012 976 * @version 1.0 977 */ 978s32 hif_get_cfg(WILC_WFIDrvHandle hWFIDrv, u16 u16WID, u16 *pu16WID_Value); 979/*****************************************************************************/ 980/* Notification Functions */ 981/*****************************************************************************/ 982/** 983 * @brief notifies host with join and leave requests 984 * @details This function prepares an Information frame having the 985 * information about a joining/leaving station. 986 * @param[in,out] handle to the wifi driver, 987 * @param[in] 6 byte Sta Adress 988 * Join or leave flag: 989 * Join = 1, 990 * Leave =0 991 * @return Error code indicating success/failure 992 * @note 993 * @author zsalah 994 * @date 8 March 2012 995 * @version 1.0 996 */ 997void host_int_send_join_leave_info_to_host 998 (u16 assocId, u8 *stationAddr, bool joining); 999 1000/**
1001 * @brief notifies host with stations found in scan 1002 * @details sends the beacon/probe response from scan 1003 * @param[in,out] handle to the wifi driver, 1004 * @param[in] Sta Address, 1005 * Frame length, 1006 * Rssi of the Station found 1007 * @return Error code indicating success/failure 1008 * @note 1009 * @author zsalah 1010 * @date 8 March 2012 1011 * @version 1.0 1012 */ 1013void host_int_send_network_info_to_host 1014 (u8 *macStartAddress, u16 u16RxFrameLen, s8 s8Rssi); 1015 1016/** 1017 * @brief host interface initialization function 1018 * @details 1019 * @param[in,out] handle to the wifi driver, 1020 * @note 1021 * @author zsalah 1022 * @date 8 March 2012 1023 * @version 1.0 1024 */ 1025s32 host_int_init(WILC_WFIDrvHandle *phWFIDrv); 1026 1027/** 1028 * @brief host interface initialization function 1029 * @details 1030 * @param[in,out] handle to the wifi driver, 1031 * @note 1032 * @author zsalah 1033 * @date 8 March 2012 1034 * @version 1.0 1035 */ 1036s32 host_int_deinit(WILC_WFIDrvHandle hWFIDrv); 1037 1038 1039/*! 1040 * @fn s32 host_int_add_beacon(WILC_WFIDrvHandle hWFIDrv,u8 u8Index) 1041 * @brief Sends a beacon to the firmware to be transmitted over the air 1042 * @details 1043 * @param[in,out] hWFIDrv handle to the wifi driver 1044 * @param[in] u32Interval Beacon Interval. Period between two successive beacons on air 1045 * @param[in] u32DTIMPeriod DTIM Period. Indicates how many Beacon frames 1046 * (including the current frame) appear before the next DTIM 1047 * @param[in] u32Headlen Length of the head buffer in bytes 1048 * @param[in] pu8Head Pointer to the beacon's head buffer. Beacon's head 1049 * is the part from the beacon's start till the TIM element, NOT including the TIM 1050 * @param[in] u32Taillen Length of the tail buffer in bytes 1051 * @param[in] pu8Tail Pointer to the beacon's tail buffer. Beacon's tail 1052 * starts just after the TIM inormation element 1053 * @return 0 for Success, error otherwise 1054 * @todo 1055 * @sa 1056 * @author Adham Abozaeid 1057 * @date 10 Julys 2012 1058 * @version 1.0 Description 1059 * 1060 */ 1061s32 host_int_add_beacon(WILC_WFIDrvHandle hWFIDrv, u32 u32Interval, 1062 u32 u32DTIMPeriod, 1063 u32 u32HeadLen, u8 *pu8Head, 1064 u32 u32TailLen, u8 *pu8tail); 1065 1066 1067/*! 1068 * @fn s32 host_int_del_beacon(WILC_WFIDrvHandle hWFIDrv) 1069 * @brief Removes the beacon and stops trawilctting it over the air 1070 * @details 1071 * @param[in,out] hWFIDrv handle to the wifi driver 1072 * @return 0 for Success, error otherwise 1073 * @todo 1074 * @sa 1075 * @author Adham Abozaeid 1076 * @date 10 Julys 2012 1077 * @version 1.0 Description 1078 */ 1079s32 host_int_del_beacon(WILC_WFIDrvHandle hWFIDrv); 1080 1081/*! 1082 * @fn s32 host_int_add_station(WILC_WFIDrvHandle hWFIDrv, tstrWILC_AddStaParam strStaParams) 1083 * @brief Notifies the firmware with a new associated stations 1084 * @details 1085 * @param[in,out] hWFIDrv handle to the wifi driver 1086 * @param[in] pstrStaParams Station's parameters 1087 * @return 0 for Success, error otherwise 1088 * @todo 1089 * @sa 1090 * @author Adham Abozaeid 1091 * @date 12 July 2012 1092 * @version 1.0 Description 1093 */ 1094s32 host_int_add_station(WILC_WFIDrvHandle hWFIDrv, tstrWILC_AddStaParam *pstrStaParams); 1095 1096/*! 1097 * @fn s32 host_int_del_allstation(WILC_WFIDrvHandle hWFIDrv, const u8* pu8MacAddr) 1098 * @brief Deauthenticates clients when group is terminating 1099 * @details 1100 * @param[in,out] hWFIDrv handle to the wifi driver 1101 * @param[in] pu8MacAddr Station's mac address 1102 * @return 0 for Success, error otherwise 1103 * @todo 1104 * @sa 1105 * @author Mai Daftedar 1106 * @date 09 April 2014 1107 * @version 1.0 Description 1108 */ 1109s32 host_int_del_allstation(WILC_WFIDrvHandle hWFIDrv, u8 pu8MacAddr[][ETH_ALEN]); 1110 1111/*! 1112 * @fn s32 host_int_del_station(WILC_WFIDrvHandle hWFIDrv, u8* pu8MacAddr) 1113 * @brief Notifies the firmware with a new deleted station 1114 * @details 1115 * @param[in,out] hWFIDrv handle to the wifi driver 1116 * @param[in] pu8MacAddr Station's mac address 1117 * @return 0 for Success, error otherwise 1118 * @todo 1119 * @sa 1120 * @author Adham Abozaeid 1121 * @date 15 July 2012 1122 * @version 1.0 Description 1123 */ 1124s32 host_int_del_station(WILC_WFIDrvHandle hWFIDrv, const u8 *pu8MacAddr); 1125 1126/*! 1127 * @fn s32 host_int_edit_station(WILC_WFIDrvHandle hWFIDrv, tstrWILC_AddStaParam strStaParams) 1128 * @brief Notifies the firmware with new parameters of an already associated station 1129 * @details 1130 * @param[in,out] hWFIDrv handle to the wifi driver 1131 * @param[in] pstrStaParams Station's parameters 1132 * @return 0 for Success, error otherwise 1133 * @todo 1134 * @sa 1135 * @author Adham Abozaeid 1136 * @date 15 July 2012 1137 * @version 1.0 Description 1138 */ 1139s32 host_int_edit_station(WILC_WFIDrvHandle hWFIDrv, tstrWILC_AddStaParam *pstrStaParams); 1140 1141/*! 1142 * @fn s32 host_int_set_power_mgmt(WILC_WFIDrvHandle hWFIDrv, bool bIsEnabled, u32 u32Timeout) 1143 * @brief Set the power management mode to enabled or disabled 1144 * @details 1145 * @param[in,out] hWFIDrv handle to the wifi driver 1146 * @param[in] bIsEnabled TRUE if enabled, FALSE otherwise 1147 * @param[in] u32Timeout A timeout value of -1 allows the driver to adjust 1148 * the dynamic ps timeout value 1149 * @return 0 for Success, error otherwise 1150 * @todo 1151 * @sa 1152 * @author Adham Abozaeid 1153 * @date 24 November 2012 1154 * @version 1.0 Description 1155 */ 1156s32 host_int_set_power_mgmt(WILC_WFIDrvHandle hWFIDrv, bool bIsEnabled, u32 u32Timeout); 1157/* @param[in,out] hWFIDrv handle to the wifi driver 1158 * @param[in] bIsEnabled TRUE if enabled, FALSE otherwise 1159 * @param[in] u8count count of mac address entries in the filter table 1160 * 1161 * @return 0 for Success, error otherwise 1162 * @todo 1163 * @sa 1164 * @author Adham Abozaeid 1165 * @date 24 November 2012 1166 * @version 1.0 Description 1167 */ 1168s32 host_int_setup_multicast_filter(WILC_WFIDrvHandle hWFIDrv, bool bIsEnabled, u32 u32count); 1169/** 1170 * @brief host_int_setup_ipaddress 1171 * @details set IP address on firmware 1172 * @param[in] 1173 * @return Error code. 1174 * @author Abdelrahman Sobhy 1175 * @date 1176 * @version 1.0 1177 */ 1178s32 host_int_setup_ipaddress(WILC_WFIDrvHandle hWFIDrv, u8 *pu8IPAddr, u8 idx); 1179 1180 1181/** 1182 * @brief host_int_delBASession 1183 * @details Delete single Rx BA session 1184 * @param[in] 1185 * @return Error code. 1186 * @author Abdelrahman Sobhy 1187 * @date 1188 * @version 1.0 1189 */ 1190s32 host_int_delBASession(WILC_WFIDrvHandle hWFIDrv, char *pBSSID, char TID); 1191 1192/** 1193 * @brief host_int_delBASession 1194 * @details Delete all Rx BA session 1195 * @param[in] 1196 * @return Error code. 1197 * @author Abdelrahman Sobhy 1198 * @date 1199 * @version 1.0 1200 */ 1201s32 host_int_del_All_Rx_BASession(WILC_WFIDrvHandle hWFIDrv, char *pBSSID, char TID); 1202 1203 1204/** 1205 * @brief host_int_get_ipaddress 1206 * @details get IP address on firmware 1207 * @param[in] 1208 * @return Error code. 1209 * @author Abdelrahman Sobhy 1210 * @date 1211 * @version 1.0 1212 */ 1213s32 host_int_get_ipaddress(WILC_WFIDrvHandle hWFIDrv, u8 *pu8IPAddr, u8 idx); 1214 1215#ifdef WILC_P2P 1216/** 1217 * @brief host_int_remain_on_channel 1218 * @details 1219 * @param[in] 1220 * @return Error code. 1221 * @author 1222 * @date 1223 * @version 1.0 1224 */ 1225s32 host_int_remain_on_channel(WILC_WFIDrvHandle hWFIDrv, u32 u32SessionID, u32 u32duration, u16 chan, tWILCpfRemainOnChanExpired RemainOnChanExpired, tWILCpfRemainOnChanReady RemainOnChanReady, void *pvUserArg); 1226 1227/** 1228 * @brief host_int_ListenStateExpired 1229 * @details 1230 * @param[in] Handle to wifi driver 1231 * Duration to remain on channel 1232 * Channel to remain on 1233 * Pointer to fn to be called on receive frames in listen state 1234 * Pointer to remain-on-channel expired fn 1235 * Priv 1236 * @return Error code. 1237 * @author 1238 * @date 1239 * @version 1.0 1240 */ 1241s32 host_int_ListenStateExpired(WILC_WFIDrvHandle hWFIDrv, u32 u32SessionID); 1242 1243/** 1244 * @brief host_int_frame_register 1245 * @details 1246 * @param[in] 1247 * @return Error code. 1248 * @author 1249 * @date 1250 * @version 1.0 1251 */ 1252s32 host_int_frame_register(WILC_WFIDrvHandle hWFIDrv, u16 u16FrameType, bool bReg); 1253#endif 1254/** 1255 * @brief host_int_set_wfi_drv_handler 1256 * @details 1257 * @param[in] 1258 * @return Error code. 1259 * @author 1260 * @date 1261 * @version 1.0 1262 */ 1263s32 host_int_set_wfi_drv_handler(u32 u32address); 1264s32 host_int_set_operation_mode(WILC_WFIDrvHandle hWFIDrv, u32 u32mode); 1265 1266static s32 Handle_ScanDone(void *drvHandler, tenuScanEvent enuEvent); 1267 1268static int host_int_addBASession(WILC_WFIDrvHandle hWFIDrv, char *pBSSID, char TID, short int BufferSize, 1269 short int SessionTimeout, void *drvHandler); 1270 1271 1272void host_int_freeJoinParams(void *pJoinParams); 1273 1274s32 host_int_get_statistics(WILC_WFIDrvHandle hWFIDrv, tstrStatistics *pstrStatistics); 1275 1276/*****************************************************************************/ 1277/* */ 1278/* EOF */ 1279/* */ 1280/*****************************************************************************/ 1281#endif 1282