Staging: Add pristine upstream vt6656 driver sources to drivers/staging/vt6656.
Add pristine upstream vt6656 driver sources to drivers/staging/vt6656. These files were copied from the driver directory in the upstream source archive, available here: http://www.viaarena.com/Driver/VT6656_Linux_src_v1.19_12_x86.zip After copying, trailing whitespace was stripped. This is GPL-licensed code. Signed-off-by: Forest Bond <forest@alittletooquiet.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Родитель
36c7928c3e
Коммит
92b9679711
|
@ -0,0 +1,358 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: 80211hdr.h
|
||||
*
|
||||
* Purpose: 802.11 MAC headers related pre-defines and macros.
|
||||
*
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: Apr 8, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef __80211HDR_H__
|
||||
#define __80211HDR_H__
|
||||
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
// bit type
|
||||
#define BIT0 0x00000001
|
||||
#define BIT1 0x00000002
|
||||
#define BIT2 0x00000004
|
||||
#define BIT3 0x00000008
|
||||
#define BIT4 0x00000010
|
||||
#define BIT5 0x00000020
|
||||
#define BIT6 0x00000040
|
||||
#define BIT7 0x00000080
|
||||
#define BIT8 0x00000100
|
||||
#define BIT9 0x00000200
|
||||
#define BIT10 0x00000400
|
||||
#define BIT11 0x00000800
|
||||
#define BIT12 0x00001000
|
||||
#define BIT13 0x00002000
|
||||
#define BIT14 0x00004000
|
||||
#define BIT15 0x00008000
|
||||
#define BIT16 0x00010000
|
||||
#define BIT17 0x00020000
|
||||
#define BIT18 0x00040000
|
||||
#define BIT19 0x00080000
|
||||
#define BIT20 0x00100000
|
||||
#define BIT21 0x00200000
|
||||
#define BIT22 0x00400000
|
||||
#define BIT23 0x00800000
|
||||
#define BIT24 0x01000000
|
||||
#define BIT25 0x02000000
|
||||
#define BIT26 0x04000000
|
||||
#define BIT27 0x08000000
|
||||
#define BIT28 0x10000000
|
||||
#define BIT29 0x20000000
|
||||
#define BIT30 0x40000000
|
||||
#define BIT31 0x80000000
|
||||
|
||||
// 802.11 frame related, defined as 802.11 spec
|
||||
#define WLAN_ADDR_LEN 6
|
||||
#define WLAN_CRC_LEN 4
|
||||
#define WLAN_CRC32_LEN 4
|
||||
#define WLAN_FCS_LEN 4
|
||||
#define WLAN_BSSID_LEN 6
|
||||
#define WLAN_BSS_TS_LEN 8
|
||||
#define WLAN_HDR_ADDR2_LEN 16
|
||||
#define WLAN_HDR_ADDR3_LEN 24
|
||||
#define WLAN_HDR_ADDR4_LEN 30
|
||||
#define WLAN_IEHDR_LEN 2
|
||||
#define WLAN_SSID_MAXLEN 32
|
||||
//#define WLAN_RATES_MAXLEN 255
|
||||
#define WLAN_RATES_MAXLEN 16
|
||||
#define WLAN_RATES_MAXLEN_11B 4
|
||||
#define WLAN_RSN_MAXLEN 32
|
||||
#define WLAN_DATA_MAXLEN 2312
|
||||
#define WLAN_A3FR_MAXLEN (WLAN_HDR_ADDR3_LEN + WLAN_DATA_MAXLEN + WLAN_CRC_LEN)
|
||||
|
||||
|
||||
#define WLAN_BEACON_FR_MAXLEN WLAN_A3FR_MAXLEN
|
||||
#define WLAN_ATIM_FR_MAXLEN (WLAN_HDR_ADDR3_LEN + 0)
|
||||
#define WLAN_NULLDATA_FR_MAXLEN (WLAN_HDR_ADDR3_LEN + 0)
|
||||
#define WLAN_DISASSOC_FR_MAXLEN (WLAN_HDR_ADDR3_LEN + 2)
|
||||
#define WLAN_ASSOCREQ_FR_MAXLEN WLAN_A3FR_MAXLEN
|
||||
#define WLAN_ASSOCRESP_FR_MAXLEN WLAN_A3FR_MAXLEN
|
||||
#define WLAN_REASSOCREQ_FR_MAXLEN WLAN_A3FR_MAXLEN
|
||||
#define WLAN_REASSOCRESP_FR_MAXLEN WLAN_A3FR_MAXLEN
|
||||
#define WLAN_PROBEREQ_FR_MAXLEN WLAN_A3FR_MAXLEN
|
||||
#define WLAN_PROBERESP_FR_MAXLEN WLAN_A3FR_MAXLEN
|
||||
#define WLAN_AUTHEN_FR_MAXLEN WLAN_A3FR_MAXLEN
|
||||
#define WLAN_DEAUTHEN_FR_MAXLEN (WLAN_HDR_ADDR3_LEN + 2)
|
||||
|
||||
|
||||
#define WLAN_WEP_NKEYS 4
|
||||
#define WLAN_WEP40_KEYLEN 5
|
||||
#define WLAN_WEP104_KEYLEN 13
|
||||
#define WLAN_WEP232_KEYLEN 29
|
||||
//#define WLAN_WEPMAX_KEYLEN 29
|
||||
#define WLAN_WEPMAX_KEYLEN 32
|
||||
#define WLAN_CHALLENGE_IE_MAXLEN 255
|
||||
#define WLAN_CHALLENGE_IE_LEN 130
|
||||
#define WLAN_CHALLENGE_LEN 128
|
||||
#define WLAN_WEP_IV_LEN 4
|
||||
#define WLAN_WEP_ICV_LEN 4
|
||||
#define WLAN_FRAGS_MAX 16
|
||||
|
||||
// Frame Type
|
||||
#define WLAN_TYPE_MGR 0x00
|
||||
#define WLAN_TYPE_CTL 0x01
|
||||
#define WLAN_TYPE_DATA 0x02
|
||||
|
||||
#define WLAN_FTYPE_MGMT 0x00
|
||||
#define WLAN_FTYPE_CTL 0x01
|
||||
#define WLAN_FTYPE_DATA 0x02
|
||||
|
||||
|
||||
// Frame Subtypes
|
||||
#define WLAN_FSTYPE_ASSOCREQ 0x00
|
||||
#define WLAN_FSTYPE_ASSOCRESP 0x01
|
||||
#define WLAN_FSTYPE_REASSOCREQ 0x02
|
||||
#define WLAN_FSTYPE_REASSOCRESP 0x03
|
||||
#define WLAN_FSTYPE_PROBEREQ 0x04
|
||||
#define WLAN_FSTYPE_PROBERESP 0x05
|
||||
#define WLAN_FSTYPE_BEACON 0x08
|
||||
#define WLAN_FSTYPE_ATIM 0x09
|
||||
#define WLAN_FSTYPE_DISASSOC 0x0a
|
||||
#define WLAN_FSTYPE_AUTHEN 0x0b
|
||||
#define WLAN_FSTYPE_DEAUTHEN 0x0c
|
||||
#define WLAN_FSTYPE_ACTION 0x0d
|
||||
|
||||
// Control
|
||||
#define WLAN_FSTYPE_PSPOLL 0x0a
|
||||
#define WLAN_FSTYPE_RTS 0x0b
|
||||
#define WLAN_FSTYPE_CTS 0x0c
|
||||
#define WLAN_FSTYPE_ACK 0x0d
|
||||
#define WLAN_FSTYPE_CFEND 0x0e
|
||||
#define WLAN_FSTYPE_CFENDCFACK 0x0f
|
||||
|
||||
// Data
|
||||
#define WLAN_FSTYPE_DATAONLY 0x00
|
||||
#define WLAN_FSTYPE_DATA_CFACK 0x01
|
||||
#define WLAN_FSTYPE_DATA_CFPOLL 0x02
|
||||
#define WLAN_FSTYPE_DATA_CFACK_CFPOLL 0x03
|
||||
#define WLAN_FSTYPE_NULL 0x04
|
||||
#define WLAN_FSTYPE_CFACK 0x05
|
||||
#define WLAN_FSTYPE_CFPOLL 0x06
|
||||
#define WLAN_FSTYPE_CFACK_CFPOLL 0x07
|
||||
|
||||
|
||||
#ifdef __BIG_ENDIAN
|
||||
|
||||
// GET & SET Frame Control bit
|
||||
#define WLAN_GET_FC_PRVER(n) ((((WORD)(n) >> 8) & (BIT0 | BIT1))
|
||||
#define WLAN_GET_FC_FTYPE(n) ((((WORD)(n) >> 8) & (BIT2 | BIT3)) >> 2)
|
||||
#define WLAN_GET_FC_FSTYPE(n) ((((WORD)(n) >> 8) & (BIT4|BIT5|BIT6|BIT7)) >> 4)
|
||||
#define WLAN_GET_FC_TODS(n) ((((WORD)(n) << 8) & (BIT8)) >> 8)
|
||||
#define WLAN_GET_FC_FROMDS(n) ((((WORD)(n) << 8) & (BIT9)) >> 9)
|
||||
#define WLAN_GET_FC_MOREFRAG(n) ((((WORD)(n) << 8) & (BIT10)) >> 10)
|
||||
#define WLAN_GET_FC_RETRY(n) ((((WORD)(n) << 8) & (BIT11)) >> 11)
|
||||
#define WLAN_GET_FC_PWRMGT(n) ((((WORD)(n) << 8) & (BIT12)) >> 12)
|
||||
#define WLAN_GET_FC_MOREDATA(n) ((((WORD)(n) << 8) & (BIT13)) >> 13)
|
||||
#define WLAN_GET_FC_ISWEP(n) ((((WORD)(n) << 8) & (BIT14)) >> 14)
|
||||
#define WLAN_GET_FC_ORDER(n) ((((WORD)(n) << 8) & (BIT15)) >> 15)
|
||||
|
||||
// Sequence Field bit
|
||||
#define WLAN_GET_SEQ_FRGNUM(n) (((WORD)(n) >> 8) & (BIT0|BIT1|BIT2|BIT3))
|
||||
#define WLAN_GET_SEQ_SEQNUM(n) ((((WORD)(n) >> 8) & (~(BIT0|BIT1|BIT2|BIT3))) >> 4)
|
||||
|
||||
|
||||
// Capability Field bit
|
||||
#define WLAN_GET_CAP_INFO_ESS(n) (((n) >> 8) & BIT0)
|
||||
#define WLAN_GET_CAP_INFO_IBSS(n) ((((n) >> 8) & BIT1) >> 1)
|
||||
#define WLAN_GET_CAP_INFO_CFPOLLABLE(n) ((((n) >> 8) & BIT2) >> 2)
|
||||
#define WLAN_GET_CAP_INFO_CFPOLLREQ(n) ((((n) >> 8) & BIT3) >> 3)
|
||||
#define WLAN_GET_CAP_INFO_PRIVACY(n) ((((n) >> 8) & BIT4) >> 4)
|
||||
#define WLAN_GET_CAP_INFO_SHORTPREAMBLE(n) ((((n) >> 8) & BIT5) >> 5)
|
||||
#define WLAN_GET_CAP_INFO_PBCC(n) ((((n) >> 8) & BIT6) >> 6)
|
||||
#define WLAN_GET_CAP_INFO_AGILITY(n) ((((n) >> 8) & BIT7) >> 7)
|
||||
#define WLAN_GET_CAP_INFO_SPECTRUMMNG(n) ((((n)) & BIT8) >> 10)
|
||||
#define WLAN_GET_CAP_INFO_SHORTSLOTTIME(n) ((((n)) & BIT10) >> 10)
|
||||
#define WLAN_GET_CAP_INFO_DSSSOFDM(n) ((((n)) & BIT13) >> 13)
|
||||
#define WLAN_GET_CAP_INFO_GRPACK(n) ((((n)) & BIT14) >> 14)
|
||||
|
||||
|
||||
#else
|
||||
|
||||
// GET & SET Frame Control bit
|
||||
#define WLAN_GET_FC_PRVER(n) (((WORD)(n)) & (BIT0 | BIT1))
|
||||
#define WLAN_GET_FC_FTYPE(n) ((((WORD)(n)) & (BIT2 | BIT3)) >> 2)
|
||||
#define WLAN_GET_FC_FSTYPE(n) ((((WORD)(n)) & (BIT4|BIT5|BIT6|BIT7)) >> 4)
|
||||
#define WLAN_GET_FC_TODS(n) ((((WORD)(n)) & (BIT8)) >> 8)
|
||||
#define WLAN_GET_FC_FROMDS(n) ((((WORD)(n)) & (BIT9)) >> 9)
|
||||
#define WLAN_GET_FC_MOREFRAG(n) ((((WORD)(n)) & (BIT10)) >> 10)
|
||||
#define WLAN_GET_FC_RETRY(n) ((((WORD)(n)) & (BIT11)) >> 11)
|
||||
#define WLAN_GET_FC_PWRMGT(n) ((((WORD)(n)) & (BIT12)) >> 12)
|
||||
#define WLAN_GET_FC_MOREDATA(n) ((((WORD)(n)) & (BIT13)) >> 13)
|
||||
#define WLAN_GET_FC_ISWEP(n) ((((WORD)(n)) & (BIT14)) >> 14)
|
||||
#define WLAN_GET_FC_ORDER(n) ((((WORD)(n)) & (BIT15)) >> 15)
|
||||
|
||||
|
||||
// Sequence Field bit
|
||||
#define WLAN_GET_SEQ_FRGNUM(n) (((WORD)(n)) & (BIT0|BIT1|BIT2|BIT3))
|
||||
#define WLAN_GET_SEQ_SEQNUM(n) ((((WORD)(n)) & (~(BIT0|BIT1|BIT2|BIT3))) >> 4)
|
||||
|
||||
|
||||
// Capability Field bit
|
||||
#define WLAN_GET_CAP_INFO_ESS(n) ((n) & BIT0)
|
||||
#define WLAN_GET_CAP_INFO_IBSS(n) (((n) & BIT1) >> 1)
|
||||
#define WLAN_GET_CAP_INFO_CFPOLLABLE(n) (((n) & BIT2) >> 2)
|
||||
#define WLAN_GET_CAP_INFO_CFPOLLREQ(n) (((n) & BIT3) >> 3)
|
||||
#define WLAN_GET_CAP_INFO_PRIVACY(n) (((n) & BIT4) >> 4)
|
||||
#define WLAN_GET_CAP_INFO_SHORTPREAMBLE(n) (((n) & BIT5) >> 5)
|
||||
#define WLAN_GET_CAP_INFO_PBCC(n) (((n) & BIT6) >> 6)
|
||||
#define WLAN_GET_CAP_INFO_AGILITY(n) (((n) & BIT7) >> 7)
|
||||
#define WLAN_GET_CAP_INFO_SPECTRUMMNG(n) (((n) & BIT8) >> 10)
|
||||
#define WLAN_GET_CAP_INFO_SHORTSLOTTIME(n) (((n) & BIT10) >> 10)
|
||||
#define WLAN_GET_CAP_INFO_DSSSOFDM(n) (((n) & BIT13) >> 13)
|
||||
#define WLAN_GET_CAP_INFO_GRPACK(n) (((n) & BIT14) >> 14)
|
||||
|
||||
|
||||
#endif //#ifdef __BIG_ENDIAN
|
||||
|
||||
|
||||
#define WLAN_SET_CAP_INFO_ESS(n) (n)
|
||||
#define WLAN_SET_CAP_INFO_IBSS(n) ((n) << 1)
|
||||
#define WLAN_SET_CAP_INFO_CFPOLLABLE(n) ((n) << 2)
|
||||
#define WLAN_SET_CAP_INFO_CFPOLLREQ(n) ((n) << 3)
|
||||
#define WLAN_SET_CAP_INFO_PRIVACY(n) ((n) << 4)
|
||||
#define WLAN_SET_CAP_INFO_SHORTPREAMBLE(n) ((n) << 5)
|
||||
#define WLAN_SET_CAP_INFO_SPECTRUMMNG(n) ((n) << 8)
|
||||
#define WLAN_SET_CAP_INFO_PBCC(n) ((n) << 6)
|
||||
#define WLAN_SET_CAP_INFO_AGILITY(n) ((n) << 7)
|
||||
#define WLAN_SET_CAP_INFO_SHORTSLOTTIME(n) ((n) << 10)
|
||||
#define WLAN_SET_CAP_INFO_DSSSOFDM(n) ((n) << 13)
|
||||
#define WLAN_SET_CAP_INFO_GRPACK(n) ((n) << 14)
|
||||
|
||||
|
||||
#define WLAN_SET_FC_PRVER(n) ((WORD)(n))
|
||||
#define WLAN_SET_FC_FTYPE(n) (((WORD)(n)) << 2)
|
||||
#define WLAN_SET_FC_FSTYPE(n) (((WORD)(n)) << 4)
|
||||
#define WLAN_SET_FC_TODS(n) (((WORD)(n)) << 8)
|
||||
#define WLAN_SET_FC_FROMDS(n) (((WORD)(n)) << 9)
|
||||
#define WLAN_SET_FC_MOREFRAG(n) (((WORD)(n)) << 10)
|
||||
#define WLAN_SET_FC_RETRY(n) (((WORD)(n)) << 11)
|
||||
#define WLAN_SET_FC_PWRMGT(n) (((WORD)(n)) << 12)
|
||||
#define WLAN_SET_FC_MOREDATA(n) (((WORD)(n)) << 13)
|
||||
#define WLAN_SET_FC_ISWEP(n) (((WORD)(n)) << 14)
|
||||
#define WLAN_SET_FC_ORDER(n) (((WORD)(n)) << 15)
|
||||
|
||||
#define WLAN_SET_SEQ_FRGNUM(n) ((WORD)(n))
|
||||
#define WLAN_SET_SEQ_SEQNUM(n) (((WORD)(n)) << 4)
|
||||
|
||||
// ERP Field bit
|
||||
|
||||
#define WLAN_GET_ERP_NONERP_PRESENT(n) ((n) & BIT0)
|
||||
#define WLAN_GET_ERP_USE_PROTECTION(n) (((n) & BIT1) >> 1)
|
||||
#define WLAN_GET_ERP_BARKER_MODE(n) (((n) & BIT2) >> 2)
|
||||
|
||||
#define WLAN_SET_ERP_NONERP_PRESENT(n) (n)
|
||||
#define WLAN_SET_ERP_USE_PROTECTION(n) ((n) << 1)
|
||||
#define WLAN_SET_ERP_BARKER_MODE(n) ((n) << 2)
|
||||
|
||||
|
||||
|
||||
// Support & Basic Rates field
|
||||
#define WLAN_MGMT_IS_BASICRATE(b) ((b) & BIT7)
|
||||
#define WLAN_MGMT_GET_RATE(b) ((b) & ~BIT7)
|
||||
|
||||
// TIM field
|
||||
#define WLAN_MGMT_IS_MULTICAST_TIM(b) ((b) & BIT0)
|
||||
#define WLAN_MGMT_GET_TIM_OFFSET(b) (((b) & ~BIT0) >> 1)
|
||||
|
||||
// 3-Addr & 4-Addr
|
||||
#define WLAN_HDR_A3_DATA_PTR(p) (((PBYTE)(p)) + WLAN_HDR_ADDR3_LEN)
|
||||
#define WLAN_HDR_A4_DATA_PTR(p) (((PBYTE)(p)) + WLAN_HDR_ADDR4_LEN)
|
||||
|
||||
// IEEE ADDR
|
||||
#define IEEE_ADDR_UNIVERSAL 0x02
|
||||
#define IEEE_ADDR_GROUP 0x01
|
||||
|
||||
typedef struct {
|
||||
BYTE abyAddr[6];
|
||||
} IEEE_ADDR, *PIEEE_ADDR;
|
||||
|
||||
// 802.11 Header Format
|
||||
|
||||
typedef struct tagWLAN_80211HDR_A2 {
|
||||
|
||||
WORD wFrameCtl;
|
||||
WORD wDurationID;
|
||||
BYTE abyAddr1[WLAN_ADDR_LEN];
|
||||
BYTE abyAddr2[WLAN_ADDR_LEN];
|
||||
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_80211HDR_A2, *PWLAN_80211HDR_A2;
|
||||
|
||||
typedef struct tagWLAN_80211HDR_A3 {
|
||||
|
||||
WORD wFrameCtl;
|
||||
WORD wDurationID;
|
||||
BYTE abyAddr1[WLAN_ADDR_LEN];
|
||||
BYTE abyAddr2[WLAN_ADDR_LEN];
|
||||
BYTE abyAddr3[WLAN_ADDR_LEN];
|
||||
WORD wSeqCtl;
|
||||
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_80211HDR_A3, *PWLAN_80211HDR_A3;
|
||||
|
||||
typedef struct tagWLAN_80211HDR_A4 {
|
||||
|
||||
WORD wFrameCtl;
|
||||
WORD wDurationID;
|
||||
BYTE abyAddr1[WLAN_ADDR_LEN];
|
||||
BYTE abyAddr2[WLAN_ADDR_LEN];
|
||||
BYTE abyAddr3[WLAN_ADDR_LEN];
|
||||
WORD wSeqCtl;
|
||||
BYTE abyAddr4[WLAN_ADDR_LEN];
|
||||
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_80211HDR_A4, *PWLAN_80211HDR_A4;
|
||||
|
||||
|
||||
typedef union tagUWLAN_80211HDR {
|
||||
|
||||
WLAN_80211HDR_A2 sA2;
|
||||
WLAN_80211HDR_A3 sA3;
|
||||
WLAN_80211HDR_A4 sA4;
|
||||
|
||||
} UWLAN_80211HDR, *PUWLAN_80211HDR;
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
#endif // __80211HDR_H__
|
||||
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,867 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: 80211mgr.h
|
||||
*
|
||||
* Purpose: 802.11 managment frames pre-defines.
|
||||
*
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: May 8, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __80211MGR_H__
|
||||
#define __80211MGR_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__80211HDR_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
#define WLAN_MIN_ARRAY 1
|
||||
|
||||
// Information Element ID value
|
||||
#define WLAN_EID_SSID 0
|
||||
#define WLAN_EID_SUPP_RATES 1
|
||||
#define WLAN_EID_FH_PARMS 2
|
||||
#define WLAN_EID_DS_PARMS 3
|
||||
#define WLAN_EID_CF_PARMS 4
|
||||
#define WLAN_EID_TIM 5
|
||||
#define WLAN_EID_IBSS_PARMS 6
|
||||
#define WLAN_EID_COUNTRY 7
|
||||
#define WLAN_EID_CHALLENGE 16
|
||||
#define WLAN_EID_PWR_CONSTRAINT 32
|
||||
#define WLAN_EID_PWR_CAPABILITY 33
|
||||
#define WLAN_EID_TPC_REQ 34
|
||||
#define WLAN_EID_TPC_REP 35
|
||||
#define WLAN_EID_SUPP_CH 36
|
||||
#define WLAN_EID_CH_SWITCH 37
|
||||
#define WLAN_EID_MEASURE_REQ 38
|
||||
#define WLAN_EID_MEASURE_REP 39
|
||||
#define WLAN_EID_QUIET 40
|
||||
#define WLAN_EID_IBSS_DFS 41
|
||||
#define WLAN_EID_ERP 42
|
||||
// reference 802.11i 7.3.2 table 20
|
||||
#define WLAN_EID_RSN 48
|
||||
#define WLAN_EID_EXTSUPP_RATES 50
|
||||
// reference WiFi WPA spec.
|
||||
#define WLAN_EID_RSN_WPA 221
|
||||
|
||||
#ifdef Cisco_ccx
|
||||
#define WLAN_EID_CCX 133 //DavidWang
|
||||
#define WLAN_EID_CCX_IP 149 //DavidWang
|
||||
#define WLAN_EID_CCX_Ver 221 //DavidWang
|
||||
#endif
|
||||
|
||||
#define WLAN_EID_ERP_NONERP_PRESENT 0x01
|
||||
#define WLAN_EID_ERP_USE_PROTECTION 0x02
|
||||
#define WLAN_EID_ERP_BARKER_MODE 0x04
|
||||
|
||||
// Reason Codes
|
||||
#define WLAN_MGMT_REASON_RSVD 0
|
||||
#define WLAN_MGMT_REASON_UNSPEC 1
|
||||
#define WLAN_MGMT_REASON_PRIOR_AUTH_INVALID 2
|
||||
#define WLAN_MGMT_REASON_DEAUTH_LEAVING 3
|
||||
#define WLAN_MGMT_REASON_DISASSOC_INACTIVE 4
|
||||
#define WLAN_MGMT_REASON_DISASSOC_AP_BUSY 5
|
||||
#define WLAN_MGMT_REASON_CLASS2_NONAUTH 6
|
||||
#define WLAN_MGMT_REASON_CLASS3_NONASSOC 7
|
||||
#define WLAN_MGMT_REASON_DISASSOC_STA_HASLEFT 8
|
||||
#define WLAN_MGMT_REASON_CANT_ASSOC_NONAUTH 9
|
||||
#define WLAN_MGMT_REASON_DISASSOC_PWR_CAP_UNACCEPT 10
|
||||
#define WLAN_MGMT_REASON_DISASSOC_SUPP_CH_UNACCEPT 11
|
||||
#define WLAN_MGMT_REASON_INVALID_IE 13
|
||||
#define WLAN_MGMT_REASON_MIC_FAILURE 14
|
||||
#define WLAN_MGMT_REASON_4WAY_HANDSHAKE_TIMEOUT 15
|
||||
#define WLAN_MGMT_REASON_GRPKEY_UPDATE_TIMEOUT 16
|
||||
#define WLAN_MGMT_REASON_4WAY_INFO_DIFFERENT 17
|
||||
#define WLAN_MGMT_REASON_MULTCAST_CIPHER_INVALID 18
|
||||
#define WLAN_MGMT_REASON_UNCAST_CIPHER_INVALID 19
|
||||
#define WLAN_MGMT_REASON_AKMP_INVALID 20
|
||||
#define WLAN_MGMT_REASON_RSNE_UNSUPPORTED 21
|
||||
#define WLAN_MGMT_REASON_RSNE_CAP_INVALID 22
|
||||
#define WLAN_MGMT_REASON_80211X_AUTH_FAILED 23
|
||||
|
||||
// Status Codes
|
||||
#define WLAN_MGMT_STATUS_SUCCESS 0
|
||||
#define WLAN_MGMT_STATUS_UNSPEC_FAILURE 1
|
||||
#define WLAN_MGMT_STATUS_CAPS_UNSUPPORTED 10
|
||||
#define WLAN_MGMT_STATUS_REASSOC_NO_ASSOC 11
|
||||
#define WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC 12
|
||||
#define WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG 13
|
||||
#define WLAN_MGMT_STATUS_RX_AUTH_NOSEQ 14
|
||||
#define WLAN_MGMT_STATUS_CHALLENGE_FAIL 15
|
||||
#define WLAN_MGMT_STATUS_AUTH_TIMEOUT 16
|
||||
#define WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY 17
|
||||
#define WLAN_MGMT_STATUS_ASSOC_DENIED_RATES 18
|
||||
#define WLAN_MGMT_STATUS_ASSOC_DENIED_SHORTPREAMBLE 19
|
||||
#define WLAN_MGMT_STATUS_ASSOC_DENIED_PBCC 20
|
||||
#define WLAN_MGMT_STATUS_ASSOC_DENIED_AGILITY 21
|
||||
|
||||
// reference 802.11h 7.3.1.9
|
||||
//
|
||||
#define WLAN_MGMT_STATUS_ASSOC_REJECT_BCS_SPECTRUM_MNG 22
|
||||
#define WLAN_MGMT_STATUS_ASSOC_REJECT_BCS_PWR_CAP 23
|
||||
#define WLAN_MGMT_STATUS_ASSOC_REJECT_BCS_SUPP_CH 24
|
||||
//
|
||||
// reference 802.11g 7.3.1.9
|
||||
//
|
||||
#define WLAN_MGMT_STATUS_SHORTSLOTTIME_UNSUPPORTED 25
|
||||
#define WLAN_MGMT_STATUS_DSSSOFDM_UNSUPPORTED 26
|
||||
//
|
||||
// reference 802.11i 7.3.1.9 table 19
|
||||
//
|
||||
#define WLAN_MGMT_STATUS_INVALID_IE 40
|
||||
#define WLAN_MGMT_STATUS_GROUP_CIPHER_INVALID 41
|
||||
#define WLAN_MGMT_STATUS_PAIRWISE_CIPHER_INVALID 42
|
||||
#define WLAN_MGMT_STATUS_AKMP_INVALID 43
|
||||
#define WLAN_MGMT_STATUS_UNSUPPORT_RSN_IE_VER 44
|
||||
#define WLAN_MGMT_STATUS_INVALID_RSN_IE_CAP 45
|
||||
#define WLAN_MGMT_STATUS_CIPHER_REJECT 46
|
||||
|
||||
|
||||
|
||||
// Auth Algorithm
|
||||
#define WLAN_AUTH_ALG_OPENSYSTEM 0
|
||||
#define WLAN_AUTH_ALG_SHAREDKEY 1
|
||||
|
||||
|
||||
|
||||
// Management Frame Field Offsets
|
||||
// Note: Not all fields are listed because of variable lengths.
|
||||
// Note: These offsets are from the start of the frame data
|
||||
|
||||
#define WLAN_BEACON_OFF_TS 0
|
||||
#define WLAN_BEACON_OFF_BCN_INT 8
|
||||
#define WLAN_BEACON_OFF_CAPINFO 10
|
||||
#define WLAN_BEACON_OFF_SSID 12
|
||||
|
||||
#define WLAN_DISASSOC_OFF_REASON 0
|
||||
|
||||
#define WLAN_ASSOCREQ_OFF_CAP_INFO 0
|
||||
#define WLAN_ASSOCREQ_OFF_LISTEN_INT 2
|
||||
#define WLAN_ASSOCREQ_OFF_SSID 4
|
||||
|
||||
#define WLAN_ASSOCRESP_OFF_CAP_INFO 0
|
||||
#define WLAN_ASSOCRESP_OFF_STATUS 2
|
||||
#define WLAN_ASSOCRESP_OFF_AID 4
|
||||
#define WLAN_ASSOCRESP_OFF_SUPP_RATES 6
|
||||
|
||||
#define WLAN_REASSOCREQ_OFF_CAP_INFO 0
|
||||
#define WLAN_REASSOCREQ_OFF_LISTEN_INT 2
|
||||
#define WLAN_REASSOCREQ_OFF_CURR_AP 4
|
||||
#define WLAN_REASSOCREQ_OFF_SSID 10
|
||||
|
||||
#define WLAN_REASSOCRESP_OFF_CAP_INFO 0
|
||||
#define WLAN_REASSOCRESP_OFF_STATUS 2
|
||||
#define WLAN_REASSOCRESP_OFF_AID 4
|
||||
#define WLAN_REASSOCRESP_OFF_SUPP_RATES 6
|
||||
|
||||
#define WLAN_PROBEREQ_OFF_SSID 0
|
||||
|
||||
#define WLAN_PROBERESP_OFF_TS 0
|
||||
#define WLAN_PROBERESP_OFF_BCN_INT 8
|
||||
#define WLAN_PROBERESP_OFF_CAP_INFO 10
|
||||
#define WLAN_PROBERESP_OFF_SSID 12
|
||||
|
||||
#define WLAN_AUTHEN_OFF_AUTH_ALG 0
|
||||
#define WLAN_AUTHEN_OFF_AUTH_SEQ 2
|
||||
#define WLAN_AUTHEN_OFF_STATUS 4
|
||||
#define WLAN_AUTHEN_OFF_CHALLENGE 6
|
||||
|
||||
#define WLAN_DEAUTHEN_OFF_REASON 0
|
||||
|
||||
|
||||
//
|
||||
// Cipher Suite Selectors defiened in 802.11i
|
||||
//
|
||||
#define WLAN_11i_CSS_USE_GROUP 0
|
||||
#define WLAN_11i_CSS_WEP40 1
|
||||
#define WLAN_11i_CSS_TKIP 2
|
||||
#define WLAN_11i_CSS_CCMP 4
|
||||
#define WLAN_11i_CSS_WEP104 5
|
||||
#define WLAN_11i_CSS_UNKNOWN 255
|
||||
|
||||
//
|
||||
// Authentication and Key Management Suite Selectors defined in 802.11i
|
||||
//
|
||||
#define WLAN_11i_AKMSS_802_1X 1
|
||||
#define WLAN_11i_AKMSS_PSK 2
|
||||
#define WLAN_11i_AKMSS_UNKNOWN 255
|
||||
|
||||
// Measurement type definitions reference ieee 802.11h Table 20b
|
||||
#define MEASURE_TYPE_BASIC 0
|
||||
#define MEASURE_TYPE_CCA 1
|
||||
#define MEASURE_TYPE_RPI 2
|
||||
|
||||
// Measurement request mode definitions reference ieee 802.11h Figure 46h
|
||||
#define MEASURE_MODE_ENABLE 0x02
|
||||
#define MEASURE_MODE_REQ 0x04
|
||||
#define MEASURE_MODE_REP 0x08
|
||||
|
||||
// Measurement report mode definitions reference ieee 802.11h Figure 46m
|
||||
#define MEASURE_MODE_LATE 0x01
|
||||
#define MEASURE_MODE_INCAPABLE 0x02
|
||||
#define MEASURE_MODE_REFUSED 0x04
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
|
||||
// Information Element Types
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_IE, *PWLAN_IE;
|
||||
|
||||
|
||||
// Service Set Identity (SSID)
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_SSID {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abySSID[1];
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_IE_SSID, *PWLAN_IE_SSID;
|
||||
|
||||
|
||||
// Supported Rates
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_SUPP_RATES {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abyRates[1];
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_IE_SUPP_RATES, *PWLAN_IE_SUPP_RATES;
|
||||
|
||||
|
||||
|
||||
// FH Parameter Set
|
||||
#pragma pack(1)
|
||||
typedef struct _WLAN_IE_FH_PARMS {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
WORD wDwellTime;
|
||||
BYTE byHopSet;
|
||||
BYTE byHopPattern;
|
||||
BYTE byHopIndex;
|
||||
} WLAN_IE_FH_PARMS, *PWLAN_IE_FH_PARMS;
|
||||
|
||||
// DS Parameter Set
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_DS_PARMS {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byCurrChannel;
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_IE_DS_PARMS, *PWLAN_IE_DS_PARMS;
|
||||
|
||||
|
||||
// CF Parameter Set
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_CF_PARMS {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byCFPCount;
|
||||
BYTE byCFPPeriod;
|
||||
WORD wCFPMaxDuration;
|
||||
WORD wCFPDurRemaining;
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_IE_CF_PARMS, *PWLAN_IE_CF_PARMS;
|
||||
|
||||
|
||||
// TIM
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_TIM {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byDTIMCount;
|
||||
BYTE byDTIMPeriod;
|
||||
BYTE byBitMapCtl;
|
||||
BYTE byVirtBitMap[1];
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_IE_TIM, *PWLAN_IE_TIM;
|
||||
|
||||
|
||||
// IBSS Parameter Set
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_IBSS_PARMS {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
WORD wATIMWindow;
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_IE_IBSS_PARMS, *PWLAN_IE_IBSS_PARMS;
|
||||
|
||||
|
||||
// Challenge Text
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_CHALLENGE {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abyChallenge[1];
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_IE_CHALLENGE, *PWLAN_IE_CHALLENGE;
|
||||
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_RSN_EXT {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abyOUI[4];
|
||||
WORD wVersion;
|
||||
BYTE abyMulticast[4];
|
||||
WORD wPKCount;
|
||||
struct {
|
||||
BYTE abyOUI[4];
|
||||
} PKSList[1]; // the rest is variable so need to
|
||||
// overlay ieauth structure
|
||||
} WLAN_IE_RSN_EXT, *PWLAN_IE_RSN_EXT;
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_RSN_AUTH {
|
||||
WORD wAuthCount;
|
||||
struct {
|
||||
BYTE abyOUI[4];
|
||||
} AuthKSList[1];
|
||||
} WLAN_IE_RSN_AUTH, *PWLAN_IE_RSN_AUTH;
|
||||
|
||||
// RSN Identity
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_RSN {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
WORD wVersion;
|
||||
BYTE abyRSN[WLAN_MIN_ARRAY];
|
||||
} WLAN_IE_RSN, *PWLAN_IE_RSN;
|
||||
|
||||
//DavidWang
|
||||
// CCX Identity DavidWang
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_CCX {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abyCCX[30];
|
||||
} WLAN_IE_CCX, *PWLAN_IE_CCX;
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_CCX_IP {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abyCCXOUI[4];
|
||||
BYTE abyCCXIP[4];
|
||||
BYTE abyCCXREV[2];
|
||||
} WLAN_IE_CCX_IP, *PWLAN_IE_CCX_IP;
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_CCX_Ver {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abyCCXVer[5];
|
||||
} WLAN_IE_CCX_Ver, *PWLAN_IE_CCX_Ver;
|
||||
|
||||
//DavidWang
|
||||
|
||||
// ERP
|
||||
#pragma pack(1)
|
||||
typedef struct tagWLAN_IE_ERP {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byContext;
|
||||
}__attribute__ ((__packed__))
|
||||
WLAN_IE_ERP, *PWLAN_IE_ERP;
|
||||
|
||||
|
||||
#pragma pack(1)
|
||||
typedef struct _MEASEURE_REQ {
|
||||
BYTE byChannel;
|
||||
BYTE abyStartTime[8];
|
||||
BYTE abyDuration[2];
|
||||
} MEASEURE_REQ, *PMEASEURE_REQ,
|
||||
MEASEURE_REQ_BASIC, *PMEASEURE_REQ_BASIC,
|
||||
MEASEURE_REQ_CCA, *PMEASEURE_REQ_CCA,
|
||||
MEASEURE_REQ_RPI, *PMEASEURE_REQ_RPI;
|
||||
|
||||
typedef struct _MEASEURE_REP_BASIC {
|
||||
BYTE byChannel;
|
||||
BYTE abyStartTime[8];
|
||||
BYTE abyDuration[2];
|
||||
BYTE byMap;
|
||||
} MEASEURE_REP_BASIC, *PMEASEURE_REP_BASIC;
|
||||
|
||||
typedef struct _MEASEURE_REP_CCA {
|
||||
BYTE byChannel;
|
||||
BYTE abyStartTime[8];
|
||||
BYTE abyDuration[2];
|
||||
BYTE byCCABusyFraction;
|
||||
} MEASEURE_REP_CCA, *PMEASEURE_REP_CCA;
|
||||
|
||||
typedef struct _MEASEURE_REP_RPI {
|
||||
BYTE byChannel;
|
||||
BYTE abyStartTime[8];
|
||||
BYTE abyDuration[2];
|
||||
BYTE abyRPIdensity[8];
|
||||
} MEASEURE_REP_RPI, *PMEASEURE_REP_RPI;
|
||||
|
||||
typedef union _MEASEURE_REP {
|
||||
|
||||
MEASEURE_REP_BASIC sBasic;
|
||||
MEASEURE_REP_CCA sCCA;
|
||||
MEASEURE_REP_RPI sRPI;
|
||||
|
||||
} MEASEURE_REP, *PMEASEURE_REP;
|
||||
|
||||
typedef struct _WLAN_IE_MEASURE_REQ {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byToken;
|
||||
BYTE byMode;
|
||||
BYTE byType;
|
||||
MEASEURE_REQ sReq;
|
||||
} WLAN_IE_MEASURE_REQ, *PWLAN_IE_MEASURE_REQ;
|
||||
|
||||
typedef struct _WLAN_IE_MEASURE_REP {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byToken;
|
||||
BYTE byMode;
|
||||
BYTE byType;
|
||||
MEASEURE_REP sRep;
|
||||
} WLAN_IE_MEASURE_REP, *PWLAN_IE_MEASURE_REP;
|
||||
|
||||
typedef struct _WLAN_IE_CH_SW {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byMode;
|
||||
BYTE byChannel;
|
||||
BYTE byCount;
|
||||
} WLAN_IE_CH_SW, *PWLAN_IE_CH_SW;
|
||||
|
||||
typedef struct _WLAN_IE_QUIET {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byQuietCount;
|
||||
BYTE byQuietPeriod;
|
||||
BYTE abyQuietDuration[2];
|
||||
BYTE abyQuietOffset[2];
|
||||
} WLAN_IE_QUIET, *PWLAN_IE_QUIET;
|
||||
|
||||
typedef struct _WLAN_IE_COUNTRY {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abyCountryString[3];
|
||||
BYTE abyCountryInfo[3];
|
||||
} WLAN_IE_COUNTRY, *PWLAN_IE_COUNTRY;
|
||||
|
||||
typedef struct _WLAN_IE_PW_CONST {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byPower;
|
||||
} WLAN_IE_PW_CONST, *PWLAN_IE_PW_CONST;
|
||||
|
||||
typedef struct _WLAN_IE_PW_CAP {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byMinPower;
|
||||
BYTE byMaxPower;
|
||||
} WLAN_IE_PW_CAP, *PWLAN_IE_PW_CAP;
|
||||
|
||||
typedef struct _WLAN_IE_SUPP_CH {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abyChannelTuple[2];
|
||||
} WLAN_IE_SUPP_CH, *PWLAN_IE_SUPP_CH;
|
||||
|
||||
typedef struct _WLAN_IE_TPC_REQ {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
} WLAN_IE_TPC_REQ, *PWLAN_IE_TPC_REQ;
|
||||
|
||||
typedef struct _WLAN_IE_TPC_REP {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE byTxPower;
|
||||
BYTE byLinkMargin;
|
||||
} WLAN_IE_TPC_REP, *PWLAN_IE_TPC_REP;
|
||||
|
||||
|
||||
typedef struct _WLAN_IE_IBSS_DFS {
|
||||
BYTE byElementID;
|
||||
BYTE len;
|
||||
BYTE abyDFSOwner[6];
|
||||
BYTE byDFSRecovery;
|
||||
BYTE abyChannelMap[2];
|
||||
} WLAN_IE_IBSS_DFS, *PWLAN_IE_IBSS_DFS;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
|
||||
|
||||
// Frame Types
|
||||
// prototype structure, all mgmt frame types will start with these members
|
||||
typedef struct tagWLAN_FR_MGMT {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
|
||||
} WLAN_FR_MGMT, *PWLAN_FR_MGMT;
|
||||
|
||||
// Beacon frame
|
||||
typedef struct tagWLAN_FR_BEACON {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
// fixed fields
|
||||
PQWORD pqwTimestamp;
|
||||
PWORD pwBeaconInterval;
|
||||
PWORD pwCapInfo;
|
||||
/*-- info elements ----------*/
|
||||
PWLAN_IE_SSID pSSID;
|
||||
PWLAN_IE_SUPP_RATES pSuppRates;
|
||||
// PWLAN_IE_FH_PARMS pFHParms;
|
||||
PWLAN_IE_DS_PARMS pDSParms;
|
||||
PWLAN_IE_CF_PARMS pCFParms;
|
||||
PWLAN_IE_TIM pTIM;
|
||||
PWLAN_IE_IBSS_PARMS pIBSSParms;
|
||||
PWLAN_IE_RSN pRSN;
|
||||
PWLAN_IE_RSN_EXT pRSNWPA;
|
||||
PWLAN_IE_ERP pERP;
|
||||
PWLAN_IE_SUPP_RATES pExtSuppRates;
|
||||
PWLAN_IE_COUNTRY pIE_Country;
|
||||
PWLAN_IE_PW_CONST pIE_PowerConstraint;
|
||||
PWLAN_IE_CH_SW pIE_CHSW;
|
||||
PWLAN_IE_IBSS_DFS pIE_IBSSDFS;
|
||||
PWLAN_IE_QUIET pIE_Quiet;
|
||||
|
||||
} WLAN_FR_BEACON, *PWLAN_FR_BEACON;
|
||||
|
||||
|
||||
// IBSS ATIM frame
|
||||
typedef struct tagWLAN_FR_IBSSATIM {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
|
||||
// fixed fields
|
||||
// info elements
|
||||
// this frame type has a null body
|
||||
|
||||
} WLAN_FR_IBSSATIM, *PWLAN_FR_IBSSATIM;
|
||||
|
||||
// Disassociation
|
||||
typedef struct tagWLAN_FR_DISASSOC {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
/*-- fixed fields -----------*/
|
||||
PWORD pwReason;
|
||||
/*-- info elements ----------*/
|
||||
|
||||
} WLAN_FR_DISASSOC, *PWLAN_FR_DISASSOC;
|
||||
|
||||
// Association Request
|
||||
typedef struct tagWLAN_FR_ASSOCREQ {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
/*-- fixed fields -----------*/
|
||||
PWORD pwCapInfo;
|
||||
PWORD pwListenInterval;
|
||||
/*-- info elements ----------*/
|
||||
PWLAN_IE_SSID pSSID;
|
||||
PWLAN_IE_SUPP_RATES pSuppRates;
|
||||
PWLAN_IE_RSN pRSN;
|
||||
PWLAN_IE_CCX pCCX;
|
||||
PWLAN_IE_CCX_IP pCCXIP;
|
||||
PWLAN_IE_CCX_Ver pCCXVER;
|
||||
PWLAN_IE_RSN_EXT pRSNWPA;
|
||||
PWLAN_IE_SUPP_RATES pExtSuppRates;
|
||||
PWLAN_IE_PW_CAP pCurrPowerCap;
|
||||
PWLAN_IE_SUPP_CH pCurrSuppCh;
|
||||
|
||||
} WLAN_FR_ASSOCREQ, *PWLAN_FR_ASSOCREQ;
|
||||
|
||||
// Association Response
|
||||
typedef struct tagWLAN_FR_ASSOCRESP {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
/*-- fixed fields -----------*/
|
||||
PWORD pwCapInfo;
|
||||
PWORD pwStatus;
|
||||
PWORD pwAid;
|
||||
/*-- info elements ----------*/
|
||||
PWLAN_IE_SUPP_RATES pSuppRates;
|
||||
PWLAN_IE_SUPP_RATES pExtSuppRates;
|
||||
|
||||
} WLAN_FR_ASSOCRESP, *PWLAN_FR_ASSOCRESP;
|
||||
|
||||
// Reassociation Request
|
||||
typedef struct tagWLAN_FR_REASSOCREQ {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
|
||||
/*-- fixed fields -----------*/
|
||||
PWORD pwCapInfo;
|
||||
PWORD pwListenInterval;
|
||||
PIEEE_ADDR pAddrCurrAP;
|
||||
|
||||
/*-- info elements ----------*/
|
||||
PWLAN_IE_SSID pSSID;
|
||||
PWLAN_IE_SUPP_RATES pSuppRates;
|
||||
PWLAN_IE_RSN pRSN;
|
||||
PWLAN_IE_CCX pCCX;
|
||||
PWLAN_IE_CCX_IP pCCXIP;
|
||||
PWLAN_IE_CCX_Ver pCCXVER;
|
||||
PWLAN_IE_RSN_EXT pRSNWPA;
|
||||
PWLAN_IE_SUPP_RATES pExtSuppRates;
|
||||
|
||||
} WLAN_FR_REASSOCREQ, *PWLAN_FR_REASSOCREQ;
|
||||
|
||||
// Reassociation Response
|
||||
typedef struct tagWLAN_FR_REASSOCRESP {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
/*-- fixed fields -----------*/
|
||||
PWORD pwCapInfo;
|
||||
PWORD pwStatus;
|
||||
PWORD pwAid;
|
||||
/*-- info elements ----------*/
|
||||
PWLAN_IE_SUPP_RATES pSuppRates;
|
||||
PWLAN_IE_SUPP_RATES pExtSuppRates;
|
||||
|
||||
} WLAN_FR_REASSOCRESP, *PWLAN_FR_REASSOCRESP;
|
||||
|
||||
// Probe Request
|
||||
typedef struct tagWLAN_FR_PROBEREQ {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
/*-- fixed fields -----------*/
|
||||
/*-- info elements ----------*/
|
||||
PWLAN_IE_SSID pSSID;
|
||||
PWLAN_IE_SUPP_RATES pSuppRates;
|
||||
PWLAN_IE_SUPP_RATES pExtSuppRates;
|
||||
|
||||
} WLAN_FR_PROBEREQ, *PWLAN_FR_PROBEREQ;
|
||||
|
||||
// Probe Response
|
||||
typedef struct tagWLAN_FR_PROBERESP {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
/*-- fixed fields -----------*/
|
||||
PQWORD pqwTimestamp;
|
||||
PWORD pwBeaconInterval;
|
||||
PWORD pwCapInfo;
|
||||
/*-- info elements ----------*/
|
||||
PWLAN_IE_SSID pSSID;
|
||||
PWLAN_IE_SUPP_RATES pSuppRates;
|
||||
PWLAN_IE_DS_PARMS pDSParms;
|
||||
PWLAN_IE_CF_PARMS pCFParms;
|
||||
PWLAN_IE_IBSS_PARMS pIBSSParms;
|
||||
PWLAN_IE_RSN pRSN;
|
||||
PWLAN_IE_RSN_EXT pRSNWPA;
|
||||
PWLAN_IE_ERP pERP;
|
||||
PWLAN_IE_SUPP_RATES pExtSuppRates;
|
||||
PWLAN_IE_COUNTRY pIE_Country;
|
||||
PWLAN_IE_PW_CONST pIE_PowerConstraint;
|
||||
PWLAN_IE_CH_SW pIE_CHSW;
|
||||
PWLAN_IE_IBSS_DFS pIE_IBSSDFS;
|
||||
PWLAN_IE_QUIET pIE_Quiet;
|
||||
|
||||
} WLAN_FR_PROBERESP, *PWLAN_FR_PROBERESP;
|
||||
|
||||
// Authentication
|
||||
typedef struct tagWLAN_FR_AUTHEN {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
/*-- fixed fields -----------*/
|
||||
PWORD pwAuthAlgorithm;
|
||||
PWORD pwAuthSequence;
|
||||
PWORD pwStatus;
|
||||
/*-- info elements ----------*/
|
||||
PWLAN_IE_CHALLENGE pChallenge;
|
||||
|
||||
} WLAN_FR_AUTHEN, *PWLAN_FR_AUTHEN;
|
||||
|
||||
// Deauthenication
|
||||
typedef struct tagWLAN_FR_DEAUTHEN {
|
||||
|
||||
UINT uType;
|
||||
UINT len;
|
||||
PBYTE pBuf;
|
||||
PUWLAN_80211HDR pHdr;
|
||||
/*-- fixed fields -----------*/
|
||||
PWORD pwReason;
|
||||
|
||||
/*-- info elements ----------*/
|
||||
|
||||
} WLAN_FR_DEAUTHEN, *PWLAN_FR_DEAUTHEN;
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
VOID
|
||||
vMgrEncodeBeacon(
|
||||
IN PWLAN_FR_BEACON pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeBeacon(
|
||||
IN PWLAN_FR_BEACON pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeIBSSATIM(
|
||||
IN PWLAN_FR_IBSSATIM pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeIBSSATIM(
|
||||
IN PWLAN_FR_IBSSATIM pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeDisassociation(
|
||||
IN PWLAN_FR_DISASSOC pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeDisassociation(
|
||||
IN PWLAN_FR_DISASSOC pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeAssocRequest(
|
||||
IN PWLAN_FR_ASSOCREQ pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeAssocRequest(
|
||||
IN PWLAN_FR_ASSOCREQ pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeAssocResponse(
|
||||
IN PWLAN_FR_ASSOCRESP pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeAssocResponse(
|
||||
IN PWLAN_FR_ASSOCRESP pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeReassocRequest(
|
||||
IN PWLAN_FR_REASSOCREQ pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeReassocRequest(
|
||||
IN PWLAN_FR_REASSOCREQ pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeProbeRequest(
|
||||
IN PWLAN_FR_PROBEREQ pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeProbeRequest(
|
||||
IN PWLAN_FR_PROBEREQ pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeProbeResponse(
|
||||
IN PWLAN_FR_PROBERESP pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeProbeResponse(
|
||||
IN PWLAN_FR_PROBERESP pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeAuthen(
|
||||
IN PWLAN_FR_AUTHEN pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeAuthen(
|
||||
IN PWLAN_FR_AUTHEN pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeDeauthen(
|
||||
IN PWLAN_FR_DEAUTHEN pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeDeauthen(
|
||||
IN PWLAN_FR_DEAUTHEN pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrEncodeReassocResponse(
|
||||
IN PWLAN_FR_REASSOCRESP pFrame
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDecodeReassocResponse(
|
||||
IN PWLAN_FR_REASSOCRESP pFrame
|
||||
);
|
||||
|
||||
#endif// __80211MGR_H__
|
|
@ -0,0 +1,204 @@
|
|||
#
|
||||
# Build options:
|
||||
#
|
||||
#
|
||||
|
||||
HOSTAP := 1
|
||||
|
||||
|
||||
KSP := /lib/modules/$(shell uname -r)/build \
|
||||
/usr/src/linux-$(shell uname -r) \
|
||||
/usr/src/linux-$(shell uname -r | sed 's/-.*//') \
|
||||
/usr/src/kernel-headers-$(shell uname -r) \
|
||||
/usr/src/kernel-source-$(shell uname -r) \
|
||||
/usr/src/linux-$(shell uname -r | sed 's/\([0-9]*\.[0-9]*\)\..*/\1/') \
|
||||
/usr/src/linux
|
||||
|
||||
test_dir = $(shell [ -e $(dir)/include/linux ] && echo $(dir))
|
||||
KSP := $(foreach dir, $(KSP), $(test_dir))
|
||||
|
||||
KSRC := $(firstword $(KSP))
|
||||
|
||||
ifeq (,$(KSRC))
|
||||
$(error Linux kernel source not found)
|
||||
endif
|
||||
|
||||
# check kernel version
|
||||
KVER := $(shell uname -r | cut -c1-3 | sed 's/2\.[56]/2\.6/')
|
||||
KERVER2=$(shell uname -r | cut -d. -f2)
|
||||
|
||||
ifeq ($(KVER), 2.6)
|
||||
# 2.6 kernel
|
||||
TARGET = vntwusb.ko
|
||||
|
||||
else
|
||||
TARGET = vntwusb.o
|
||||
|
||||
endif
|
||||
|
||||
INSTDIR := $(shell find /lib/modules/$(shell uname -r) -name $(TARGET) -printf "%h\n" | sort | head -1)
|
||||
ifeq (,$(INSTDIR))
|
||||
ifeq (,$(KERVER2))
|
||||
ifneq (,$(wildcard /lib/modules/$(shell uname -r)/kernel))
|
||||
INSTDIR := /lib/modules/$(shell uname -r)/kernel/drivers/net
|
||||
else
|
||||
INSTDIR := /lib/modules/$(shell uname -r)/net
|
||||
endif
|
||||
else
|
||||
ifneq ($(KERVER2),2)
|
||||
INSTDIR := /lib/modules/$(shell uname -r)/kernel/drivers/net
|
||||
else
|
||||
INSTDIR := /lib/modules/$(shell uname -r)/net
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
SRC = main_usb.c card.c mac.c baseband.c wctl.c 80211mgr.c \
|
||||
wcmd.c wmgr.c bssdb.c wpa2.c rxtx.c dpc.c power.c datarate.c \
|
||||
mib.c rc4.c tether.c tcrc.c ioctl.c hostap.c wpa.c key.c \
|
||||
tkip.c michael.c rf.c iwctl.c wpactl.c aes_ccmp.c \
|
||||
usbpipe.c channel.c control.c firmware.c int.c
|
||||
|
||||
|
||||
ifeq ($(HOSTAP), 1)
|
||||
# CFLAGS += -DHOSTAP
|
||||
EXTRA_CFLAGS += -DHOSTAP
|
||||
endif
|
||||
|
||||
|
||||
#CFLAGS += -I$(PWD) -I$(PWD)/../include -I$(PWD)/include
|
||||
EXTRA_CFLAGS += -I$(PWD) -I$(PWD)/../include -I$(PWD)/include
|
||||
|
||||
# build rule
|
||||
ifeq ($(KVER), 2.6)
|
||||
# 2.6 kernel
|
||||
|
||||
ifndef KERNEL_CONF
|
||||
KERNEL_CONF= $(KSRC)/.config
|
||||
endif
|
||||
|
||||
include ${KERNEL_CONF}
|
||||
|
||||
obj-m += vntwusb.o
|
||||
|
||||
vntwusb-objs := main_usb.o card.o mac.o baseband.o wctl.o 80211mgr.o \
|
||||
wcmd.o wmgr.o bssdb.o rxtx.o dpc.o power.o datarate.o \
|
||||
mib.o rc4.o tether.o tcrc.o ioctl.o hostap.o wpa.o key.o tkip.o \
|
||||
michael.o rf.o iwctl.o wpactl.o wpa2.o aes_ccmp.o \
|
||||
usbpipe.o channel.o control.o firmware.o int.o
|
||||
|
||||
.c.o:
|
||||
# $(CC) $(CFLAGS) -o $@ $<
|
||||
$(CC) $(EXTRA_CFLAGS) -o $@ $<
|
||||
|
||||
default:
|
||||
make -C $(KSRC) SUBDIRS=$(shell pwd) modules
|
||||
|
||||
else
|
||||
|
||||
# 2.2/2.4 kernel
|
||||
OBJS := main_usb.o card.o mac.o baseband.o wctl.o 80211mgr.o \
|
||||
wcmd.o wmgr.o bssdb.o rxtx.o dpc.o power.o datarate.o \
|
||||
mib.o rc4.o tether.o tcrc.o ioctl.o hostap.o wpa.o key.o tkip.o \
|
||||
michael.o rf.o iwctl.o wpactl.o wpa2.o aes_ccmp.o \
|
||||
usbpipe.o channel.o control.o
|
||||
|
||||
VERSION_FILE := $(KSRC)/include/linux/version.h
|
||||
CONFIG_FILE := $(KSRC)/include/linux/config.h
|
||||
|
||||
|
||||
ifeq (,$(wildcard $(VERSION_FILE)))
|
||||
$(error Linux kernel source not configured - missing version.h)
|
||||
endif
|
||||
|
||||
ifeq (,$(wildcard $(CONFIG_FILE)))
|
||||
$(error Linux kernel source not configured - missing config.h)
|
||||
endif
|
||||
|
||||
ifneq (,$(findstring egcs-2.91.66, $(shell cat /proc/version)))
|
||||
CC := kgcc gcc cc
|
||||
else
|
||||
CC := gcc cc
|
||||
endif
|
||||
|
||||
test_cc = $(shell which $(cc) > /dev/null 2>&1 && echo $(cc))
|
||||
CC := $(foreach cc, $(CC), $(test_cc))
|
||||
CC := $(firstword $(CC))
|
||||
|
||||
#CFLAGS += -Wall -DLINUX -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -D__NO_VERSION__ -O2 -pipe
|
||||
#CFLAGS += -I$(KSRC)/include -Wstrict-prototypes -fomit-frame-pointer -fno-strict-aliasing
|
||||
#CFLAGS += $(shell [ -f $(KSRC)/include/linux/modversions.h ] && \
|
||||
# echo "-DMODVERSIONS -include $(KSRC)/include/linux/modversions.h")
|
||||
EXTRA_CFLAGS += -Wall -DLINUX -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -D__NO_VERSION__ -O2 -pipe
|
||||
EXTRA_CFLAGS += -I$(KSRC)/include -Wstrict-prototypes -fomit-frame-pointer -fno-strict-aliasing
|
||||
EXTRA_CFLAGS += $(shell [ -f $(KSRC)/include/linux/modversions.h ] && \
|
||||
echo "-DMODVERSIONS -include $(KSRC)/include/linux/modversions.h")
|
||||
|
||||
.SILENT: $(TARGET) clean
|
||||
|
||||
|
||||
# look for SMP in config.h
|
||||
#SMP := $(shell $(CC) $(CFLAGS) -E -dM $(CONFIG_FILE) | \
|
||||
# grep CONFIG_SMP | awk '{ print $$3 }')
|
||||
SMP := $(shell $(CC) $(EXTRA_CFLAGS) -E -dM $(CONFIG_FILE) | \
|
||||
grep CONFIG_SMP | awk '{ print $$3 }')
|
||||
ifneq ($(SMP),1)
|
||||
SMP := 0
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(SMP), 1)
|
||||
# CFLAGS += -D__SMP__
|
||||
EXTRA_CFLAGS += -D__SMP__
|
||||
endif
|
||||
|
||||
|
||||
|
||||
# check x86_64
|
||||
SUBARCH := $(shell uname -m)
|
||||
ifeq ($(SUBARCH),x86_64)
|
||||
# CFLAGS += -mcmodel=kernel -mno-red-zone
|
||||
EXTRA_CFLAGS += -mcmodel=kernel -mno-red-zone
|
||||
endif
|
||||
|
||||
|
||||
$(TARGET): $(filter-out $(TARGET), $(SRC:.c=.o))
|
||||
$(LD) -r $^ -o $@
|
||||
echo; echo
|
||||
echo "**************************************************"
|
||||
echo "Build options:"
|
||||
echo " VERSION $(KVER)"
|
||||
echo -n " SMP "
|
||||
if [ "$(SMP)" = "1" ]; \
|
||||
then echo "Enabled"; else echo "Disabled"; fi
|
||||
|
||||
|
||||
|
||||
endif # ifeq ($(KVER),2.6)
|
||||
|
||||
|
||||
ifeq ($(KVER), 2.6)
|
||||
install: default
|
||||
else
|
||||
install: clean $(TARGET)
|
||||
endif
|
||||
mkdir -p $(MOD_ROOT)$(INSTDIR)
|
||||
install -m 644 -o root $(TARGET) $(MOD_ROOT)$(INSTDIR)
|
||||
|
||||
ifeq (,$(MOD_ROOT))
|
||||
/sbin/depmod -a || true
|
||||
else
|
||||
/sbin/depmod -b $(MOD_ROOT) -a || true
|
||||
endif
|
||||
|
||||
|
||||
uninstall:
|
||||
rm -f $(INSTDIR)/$(TARGET)
|
||||
/sbin/depmod -a
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET) $(SRC:.c=.o) *~ *.o
|
||||
rm -f .*.o.d .*.o.cmd .*.ko.cmd *.mod.c *.mod.o
|
||||
|
||||
-include .depend.mak
|
|
@ -0,0 +1,410 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: aes_ccmp.c
|
||||
*
|
||||
* Purpose: AES_CCMP decryption
|
||||
*
|
||||
* Author: Warren Hsu
|
||||
*
|
||||
* Date: Feb 15, 2005
|
||||
*
|
||||
* Functions:
|
||||
* AESbGenCCMP - Parsing RX-packet
|
||||
*
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__80211HDR_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*
|
||||
* SBOX Table
|
||||
*/
|
||||
|
||||
BYTE sbox_table[256] =
|
||||
{
|
||||
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
|
||||
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
|
||||
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
|
||||
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
|
||||
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
|
||||
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
|
||||
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
|
||||
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
|
||||
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
|
||||
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
|
||||
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
|
||||
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
|
||||
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
|
||||
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
|
||||
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
|
||||
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
|
||||
};
|
||||
|
||||
BYTE dot2_table[256] = {
|
||||
0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,
|
||||
0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e,
|
||||
0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e,
|
||||
0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e,
|
||||
0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e,
|
||||
0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe,
|
||||
0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde,
|
||||
0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe,
|
||||
0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05,
|
||||
0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25,
|
||||
0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45,
|
||||
0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65,
|
||||
0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85,
|
||||
0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5,
|
||||
0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5,
|
||||
0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5
|
||||
};
|
||||
|
||||
BYTE dot3_table[256] = {
|
||||
0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11,
|
||||
0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21,
|
||||
0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71,
|
||||
0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41,
|
||||
0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1,
|
||||
0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1,
|
||||
0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1,
|
||||
0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81,
|
||||
0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a,
|
||||
0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, 0xbc, 0xb9, 0xba,
|
||||
0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea,
|
||||
0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda,
|
||||
0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a,
|
||||
0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a,
|
||||
0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a,
|
||||
0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a
|
||||
};
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
void xor_128(BYTE *a, BYTE *b, BYTE *out)
|
||||
{
|
||||
PDWORD dwPtrA = (PDWORD) a;
|
||||
PDWORD dwPtrB = (PDWORD) b;
|
||||
PDWORD dwPtrOut =(PDWORD) out;
|
||||
|
||||
(*dwPtrOut++) = (*dwPtrA++) ^ (*dwPtrB++);
|
||||
(*dwPtrOut++) = (*dwPtrA++) ^ (*dwPtrB++);
|
||||
(*dwPtrOut++) = (*dwPtrA++) ^ (*dwPtrB++);
|
||||
(*dwPtrOut++) = (*dwPtrA++) ^ (*dwPtrB++);
|
||||
}
|
||||
|
||||
|
||||
void xor_32(BYTE *a, BYTE *b, BYTE *out)
|
||||
{
|
||||
PDWORD dwPtrA = (PDWORD) a;
|
||||
PDWORD dwPtrB = (PDWORD) b;
|
||||
PDWORD dwPtrOut =(PDWORD) out;
|
||||
|
||||
(*dwPtrOut++) = (*dwPtrA++) ^ (*dwPtrB++);
|
||||
}
|
||||
|
||||
void AddRoundKey(BYTE *key, int round)
|
||||
{
|
||||
BYTE sbox_key[4];
|
||||
BYTE rcon_table[10] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36};
|
||||
|
||||
sbox_key[0] = sbox_table[key[13]];
|
||||
sbox_key[1] = sbox_table[key[14]];
|
||||
sbox_key[2] = sbox_table[key[15]];
|
||||
sbox_key[3] = sbox_table[key[12]];
|
||||
|
||||
key[0] = key[0] ^ rcon_table[round];
|
||||
xor_32(&key[0], sbox_key, &key[0]);
|
||||
|
||||
xor_32(&key[4], &key[0], &key[4]);
|
||||
xor_32(&key[8], &key[4], &key[8]);
|
||||
xor_32(&key[12], &key[8], &key[12]);
|
||||
}
|
||||
|
||||
void SubBytes(BYTE *in, BYTE *out)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i< 16; i++)
|
||||
{
|
||||
out[i] = sbox_table[in[i]];
|
||||
}
|
||||
}
|
||||
|
||||
void ShiftRows(BYTE *in, BYTE *out)
|
||||
{
|
||||
out[0] = in[0];
|
||||
out[1] = in[5];
|
||||
out[2] = in[10];
|
||||
out[3] = in[15];
|
||||
out[4] = in[4];
|
||||
out[5] = in[9];
|
||||
out[6] = in[14];
|
||||
out[7] = in[3];
|
||||
out[8] = in[8];
|
||||
out[9] = in[13];
|
||||
out[10] = in[2];
|
||||
out[11] = in[7];
|
||||
out[12] = in[12];
|
||||
out[13] = in[1];
|
||||
out[14] = in[6];
|
||||
out[15] = in[11];
|
||||
}
|
||||
|
||||
void MixColumns(BYTE *in, BYTE *out)
|
||||
{
|
||||
|
||||
out[0] = dot2_table[in[0]] ^ dot3_table[in[1]] ^ in[2] ^ in[3];
|
||||
out[1] = in[0] ^ dot2_table[in[1]] ^ dot3_table[in[2]] ^ in[3];
|
||||
out[2] = in[0] ^ in[1] ^ dot2_table[in[2]] ^ dot3_table[in[3]];
|
||||
out[3] = dot3_table[in[0]] ^ in[1] ^ in[2] ^ dot2_table[in[3]];
|
||||
}
|
||||
|
||||
|
||||
void AESv128(BYTE *key, BYTE *data, BYTE *ciphertext)
|
||||
{
|
||||
int i;
|
||||
int round;
|
||||
BYTE TmpdataA[16];
|
||||
BYTE TmpdataB[16];
|
||||
BYTE abyRoundKey[16];
|
||||
|
||||
for(i=0; i<16; i++)
|
||||
abyRoundKey[i] = key[i];
|
||||
|
||||
for (round = 0; round < 11; round++)
|
||||
{
|
||||
if (round == 0)
|
||||
{
|
||||
xor_128(abyRoundKey, data, ciphertext);
|
||||
AddRoundKey(abyRoundKey, round);
|
||||
}
|
||||
else if (round == 10)
|
||||
{
|
||||
SubBytes(ciphertext, TmpdataA);
|
||||
ShiftRows(TmpdataA, TmpdataB);
|
||||
xor_128(TmpdataB, abyRoundKey, ciphertext);
|
||||
}
|
||||
else // round 1 ~ 9
|
||||
{
|
||||
SubBytes(ciphertext, TmpdataA);
|
||||
ShiftRows(TmpdataA, TmpdataB);
|
||||
MixColumns(&TmpdataB[0], &TmpdataA[0]);
|
||||
MixColumns(&TmpdataB[4], &TmpdataA[4]);
|
||||
MixColumns(&TmpdataB[8], &TmpdataA[8]);
|
||||
MixColumns(&TmpdataB[12], &TmpdataA[12]);
|
||||
xor_128(TmpdataA, abyRoundKey, ciphertext);
|
||||
AddRoundKey(abyRoundKey, round);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Description: AES decryption
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pbyRxKey - The key used to decrypt
|
||||
* pbyFrame - Starting address of packet header
|
||||
* wFrameSize - Total packet size including CRC
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: MIC compare result
|
||||
*
|
||||
*/
|
||||
BOOL AESbGenCCMP(PBYTE pbyRxKey, PBYTE pbyFrame, WORD wFrameSize)
|
||||
{
|
||||
BYTE abyNonce[13];
|
||||
BYTE MIC_IV[16];
|
||||
BYTE MIC_HDR1[16];
|
||||
BYTE MIC_HDR2[16];
|
||||
BYTE abyMIC[16];
|
||||
BYTE abyCTRPLD[16];
|
||||
BYTE abyTmp[16];
|
||||
BYTE abyPlainText[16];
|
||||
BYTE abyLastCipher[16];
|
||||
|
||||
PS802_11Header pMACHeader = (PS802_11Header) pbyFrame;
|
||||
PBYTE pbyIV;
|
||||
PBYTE pbyPayload;
|
||||
WORD wHLen = 22;
|
||||
WORD wPayloadSize = wFrameSize - 8 - 8 - 4 - WLAN_HDR_ADDR3_LEN;//8 is IV, 8 is MIC, 4 is CRC
|
||||
BOOL bA4 = FALSE;
|
||||
BYTE byTmp;
|
||||
WORD wCnt;
|
||||
int ii,jj,kk;
|
||||
|
||||
|
||||
pbyIV = pbyFrame + WLAN_HDR_ADDR3_LEN;
|
||||
if ( WLAN_GET_FC_TODS(*(PWORD)pbyFrame) &&
|
||||
WLAN_GET_FC_FROMDS(*(PWORD)pbyFrame) ) {
|
||||
bA4 = TRUE;
|
||||
pbyIV += 6; // 6 is 802.11 address4
|
||||
wHLen += 6;
|
||||
wPayloadSize -= 6;
|
||||
}
|
||||
pbyPayload = pbyIV + 8; //IV-length
|
||||
|
||||
abyNonce[0] = 0x00; //now is 0, if Qos here will be priority
|
||||
MEMvCopy(&(abyNonce[1]), pMACHeader->abyAddr2, U_ETHER_ADDR_LEN);
|
||||
abyNonce[7] = pbyIV[7];
|
||||
abyNonce[8] = pbyIV[6];
|
||||
abyNonce[9] = pbyIV[5];
|
||||
abyNonce[10] = pbyIV[4];
|
||||
abyNonce[11] = pbyIV[1];
|
||||
abyNonce[12] = pbyIV[0];
|
||||
|
||||
//MIC_IV
|
||||
MIC_IV[0] = 0x59;
|
||||
MEMvCopy(&(MIC_IV[1]), &(abyNonce[0]), 13);
|
||||
MIC_IV[14] = (BYTE)(wPayloadSize >> 8);
|
||||
MIC_IV[15] = (BYTE)(wPayloadSize & 0xff);
|
||||
|
||||
//MIC_HDR1
|
||||
MIC_HDR1[0] = (BYTE)(wHLen >> 8);
|
||||
MIC_HDR1[1] = (BYTE)(wHLen & 0xff);
|
||||
byTmp = (BYTE)(pMACHeader->wFrameCtl & 0xff);
|
||||
MIC_HDR1[2] = byTmp & 0x8f;
|
||||
byTmp = (BYTE)(pMACHeader->wFrameCtl >> 8);
|
||||
byTmp &= 0x87;
|
||||
MIC_HDR1[3] = byTmp | 0x40;
|
||||
MEMvCopy(&(MIC_HDR1[4]), pMACHeader->abyAddr1, U_ETHER_ADDR_LEN);
|
||||
MEMvCopy(&(MIC_HDR1[10]), pMACHeader->abyAddr2, U_ETHER_ADDR_LEN);
|
||||
|
||||
//MIC_HDR2
|
||||
MEMvCopy(&(MIC_HDR2[0]), pMACHeader->abyAddr3, U_ETHER_ADDR_LEN);
|
||||
byTmp = (BYTE)(pMACHeader->wSeqCtl & 0xff);
|
||||
MIC_HDR2[6] = byTmp & 0x0f;
|
||||
MIC_HDR2[7] = 0;
|
||||
if ( bA4 ) {
|
||||
MEMvCopy(&(MIC_HDR2[8]), pMACHeader->abyAddr4, U_ETHER_ADDR_LEN);
|
||||
} else {
|
||||
MIC_HDR2[8] = 0x00;
|
||||
MIC_HDR2[9] = 0x00;
|
||||
MIC_HDR2[10] = 0x00;
|
||||
MIC_HDR2[11] = 0x00;
|
||||
MIC_HDR2[12] = 0x00;
|
||||
MIC_HDR2[13] = 0x00;
|
||||
}
|
||||
MIC_HDR2[14] = 0x00;
|
||||
MIC_HDR2[15] = 0x00;
|
||||
|
||||
//CCMP
|
||||
AESv128(pbyRxKey,MIC_IV,abyMIC);
|
||||
for ( kk=0; kk<16; kk++ ) {
|
||||
abyTmp[kk] = MIC_HDR1[kk] ^ abyMIC[kk];
|
||||
}
|
||||
AESv128(pbyRxKey,abyTmp,abyMIC);
|
||||
for ( kk=0; kk<16; kk++ ) {
|
||||
abyTmp[kk] = MIC_HDR2[kk] ^ abyMIC[kk];
|
||||
}
|
||||
AESv128(pbyRxKey,abyTmp,abyMIC);
|
||||
|
||||
wCnt = 1;
|
||||
abyCTRPLD[0] = 0x01;
|
||||
MEMvCopy(&(abyCTRPLD[1]), &(abyNonce[0]), 13);
|
||||
|
||||
for(jj=wPayloadSize; jj>16; jj=jj-16) {
|
||||
|
||||
abyCTRPLD[14] = (BYTE) (wCnt >> 8);
|
||||
abyCTRPLD[15] = (BYTE) (wCnt & 0xff);
|
||||
|
||||
AESv128(pbyRxKey,abyCTRPLD,abyTmp);
|
||||
|
||||
for ( kk=0; kk<16; kk++ ) {
|
||||
abyPlainText[kk] = abyTmp[kk] ^ pbyPayload[kk];
|
||||
}
|
||||
for ( kk=0; kk<16; kk++ ) {
|
||||
abyTmp[kk] = abyMIC[kk] ^ abyPlainText[kk];
|
||||
}
|
||||
AESv128(pbyRxKey,abyTmp,abyMIC);
|
||||
|
||||
MEMvCopy(pbyPayload, abyPlainText, 16);
|
||||
wCnt++;
|
||||
pbyPayload += 16;
|
||||
} //for wPayloadSize
|
||||
|
||||
//last payload
|
||||
MEMvCopy(&(abyLastCipher[0]), pbyPayload, jj);
|
||||
for ( ii=jj; ii<16; ii++ ) {
|
||||
abyLastCipher[ii] = 0x00;
|
||||
}
|
||||
|
||||
abyCTRPLD[14] = (BYTE) (wCnt >> 8);
|
||||
abyCTRPLD[15] = (BYTE) (wCnt & 0xff);
|
||||
|
||||
AESv128(pbyRxKey,abyCTRPLD,abyTmp);
|
||||
for ( kk=0; kk<16; kk++ ) {
|
||||
abyPlainText[kk] = abyTmp[kk] ^ abyLastCipher[kk];
|
||||
}
|
||||
MEMvCopy(pbyPayload, abyPlainText, jj);
|
||||
pbyPayload += jj;
|
||||
|
||||
//for MIC calculation
|
||||
for ( ii=jj; ii<16; ii++ ) {
|
||||
abyPlainText[ii] = 0x00;
|
||||
}
|
||||
for ( kk=0; kk<16; kk++ ) {
|
||||
abyTmp[kk] = abyMIC[kk] ^ abyPlainText[kk];
|
||||
}
|
||||
AESv128(pbyRxKey,abyTmp,abyMIC);
|
||||
|
||||
//=>above is the calculate MIC
|
||||
//--------------------------------------------
|
||||
|
||||
wCnt = 0;
|
||||
abyCTRPLD[14] = (BYTE) (wCnt >> 8);
|
||||
abyCTRPLD[15] = (BYTE) (wCnt & 0xff);
|
||||
AESv128(pbyRxKey,abyCTRPLD,abyTmp);
|
||||
for ( kk=0; kk<8; kk++ ) {
|
||||
abyTmp[kk] = abyTmp[kk] ^ pbyPayload[kk];
|
||||
}
|
||||
//=>above is the dec-MIC from packet
|
||||
//--------------------------------------------
|
||||
|
||||
if ( MEMEqualMemory(abyMIC,abyTmp,8) ) {
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: aes_ccmp.h
|
||||
*
|
||||
* Purpose: AES_CCMP Decryption
|
||||
*
|
||||
* Author: Warren Hsu
|
||||
*
|
||||
* Date: Feb 15, 2005
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __AES_H__
|
||||
#define __AES_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
BOOL AESbGenCCMP(PBYTE pbyRxKey, PBYTE pbyFrame, WORD wFrameSize);
|
||||
|
||||
#endif //__AES_H__
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: baseband.h
|
||||
*
|
||||
* Purpose: Implement functions to access baseband
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Jun. 5, 2002
|
||||
*
|
||||
* Revision History:
|
||||
* 06-10-2003 Bryan YC Fan: Re-write codes to support VT3253 spec.
|
||||
* 08-26-2003 Kyle Hsu : Add defines of packet type and TX rate.
|
||||
*/
|
||||
|
||||
#ifndef __BASEBAND_H__
|
||||
#define __BASEBAND_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
#define PREAMBLE_LONG 0
|
||||
#define PREAMBLE_SHORT 1
|
||||
|
||||
//
|
||||
// Registers in the BASEBAND
|
||||
//
|
||||
#define BB_MAX_CONTEXT_SIZE 256
|
||||
|
||||
#define C_SIFS_A 16 // micro sec.
|
||||
#define C_SIFS_BG 10
|
||||
|
||||
#define C_EIFS 80 // micro sec.
|
||||
|
||||
|
||||
#define C_SLOT_SHORT 9 // micro sec.
|
||||
#define C_SLOT_LONG 20
|
||||
|
||||
#define C_CWMIN_A 15 // slot time
|
||||
#define C_CWMIN_B 31
|
||||
|
||||
#define C_CWMAX 1023 // slot time
|
||||
|
||||
//0:11A 1:11B 2:11G
|
||||
#define BB_TYPE_11A 0
|
||||
#define BB_TYPE_11B 1
|
||||
#define BB_TYPE_11G 2
|
||||
|
||||
//0:11a,1:11b,2:11gb(only CCK in BasicRate),3:11ga(OFDM in Basic Rate)
|
||||
#define PK_TYPE_11A 0
|
||||
#define PK_TYPE_11B 1
|
||||
#define PK_TYPE_11GB 2
|
||||
#define PK_TYPE_11GA 3
|
||||
|
||||
#define TOP_RATE_54M 0x80000000
|
||||
#define TOP_RATE_48M 0x40000000
|
||||
#define TOP_RATE_36M 0x20000000
|
||||
#define TOP_RATE_24M 0x10000000
|
||||
#define TOP_RATE_18M 0x08000000
|
||||
#define TOP_RATE_12M 0x04000000
|
||||
#define TOP_RATE_11M 0x02000000
|
||||
#define TOP_RATE_9M 0x01000000
|
||||
#define TOP_RATE_6M 0x00800000
|
||||
#define TOP_RATE_55M 0x00400000
|
||||
#define TOP_RATE_2M 0x00200000
|
||||
#define TOP_RATE_1M 0x00100000
|
||||
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
UINT
|
||||
BBuGetFrameTime(
|
||||
IN BYTE byPreambleType,
|
||||
IN BYTE byFreqType,
|
||||
IN UINT cbFrameLength,
|
||||
IN WORD wRate
|
||||
);
|
||||
|
||||
VOID
|
||||
BBvCaculateParameter (
|
||||
IN PSDevice pDevice,
|
||||
IN UINT cbFrameLength,
|
||||
IN WORD wRate,
|
||||
IN BYTE byPacketType,
|
||||
OUT PWORD pwPhyLen,
|
||||
OUT PBYTE pbyPhySrv,
|
||||
OUT PBYTE pbyPhySgn
|
||||
);
|
||||
|
||||
// timer for antenna diversity
|
||||
|
||||
VOID
|
||||
TimerSQ3CallBack (
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
VOID
|
||||
TimerSQ3Tmax3CallBack (
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
VOID BBvAntennaDiversity (PSDevice pDevice, BYTE byRxRate, BYTE bySQ3);
|
||||
void BBvLoopbackOn (PSDevice pDevice);
|
||||
void BBvLoopbackOff (PSDevice pDevice);
|
||||
void BBvSoftwareReset (PSDevice pDevice);
|
||||
|
||||
void BBvSetShortSlotTime(PSDevice pDevice);
|
||||
VOID BBvSetVGAGainOffset(PSDevice pDevice, BYTE byData);
|
||||
void BBvSetAntennaMode(PSDevice pDevice, BYTE byAntennaMode);
|
||||
BOOL BBbVT3184Init (PSDevice pDevice);
|
||||
VOID BBvSetDeepSleep (PSDevice pDevice);
|
||||
VOID BBvExitDeepSleep (PSDevice pDevice);
|
||||
VOID BBvUpdatePreEDThreshold(
|
||||
IN PSDevice pDevice,
|
||||
IN BOOL bScanning
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif // __BASEBAND_H__
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,370 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: bssdb.h
|
||||
*
|
||||
* Purpose: Handles the Basic Service Set & Node Database functions
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: July 16, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __BSSDB_H__
|
||||
#define __BSSDB_H__
|
||||
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#if !defined(__80211HDR_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
#if !defined(__80211MGR_H__)
|
||||
#include "80211mgr.h"
|
||||
#endif
|
||||
#if !defined(__CARD_H__)
|
||||
#include "card.h"
|
||||
#endif
|
||||
#if !defined(__MIB_H__)
|
||||
#include "mib.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
#define MAX_NODE_NUM 64
|
||||
#define MAX_BSS_NUM 42
|
||||
#define LOST_BEACON_COUNT 10 // 10 sec, XP defined
|
||||
#define MAX_PS_TX_BUF 32 // sta max power saving tx buf
|
||||
#define ADHOC_LOST_BEACON_COUNT 30 // 30 sec, beacon lost for adhoc only
|
||||
#define MAX_INACTIVE_COUNT 300 // 300 sec, inactive STA node refresh
|
||||
|
||||
#define USE_PROTECT_PERIOD 10 // 10 sec, Use protect mode check period
|
||||
#define ERP_RECOVER_COUNT 30 // 30 sec, ERP support callback check
|
||||
#define BSS_CLEAR_COUNT 1
|
||||
|
||||
#define RSSI_STAT_COUNT 10
|
||||
#define MAX_CHECK_RSSI_COUNT 8
|
||||
|
||||
// STA dwflags
|
||||
#define WLAN_STA_AUTH BIT0
|
||||
#define WLAN_STA_ASSOC BIT1
|
||||
#define WLAN_STA_PS BIT2
|
||||
#define WLAN_STA_TIM BIT3
|
||||
// permanent; do not remove entry on expiration
|
||||
#define WLAN_STA_PERM BIT4
|
||||
// If 802.1X is used, this flag is
|
||||
// controlling whether STA is authorized to
|
||||
// send and receive non-IEEE 802.1X frames
|
||||
#define WLAN_STA_AUTHORIZED BIT5
|
||||
|
||||
//#define MAX_RATE 12
|
||||
|
||||
#define MAX_WPA_IE_LEN 64
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
//
|
||||
// IEEE 802.11 Structures and definitions
|
||||
//
|
||||
|
||||
typedef struct tagSERPObject {
|
||||
BOOL bERPExist;
|
||||
BYTE byERP;
|
||||
}ERPObject, DEF* PERPObject;
|
||||
|
||||
|
||||
typedef struct tagSRSNCapObject {
|
||||
BOOL bRSNCapExist;
|
||||
WORD wRSNCap;
|
||||
}SRSNCapObject, DEF* PSRSNCapObject;
|
||||
|
||||
// BSS info(AP)
|
||||
#pragma pack(1)
|
||||
typedef struct tagKnownBSS {
|
||||
// BSS info
|
||||
BOOL bActive;
|
||||
BYTE abyBSSID[WLAN_BSSID_LEN];
|
||||
UINT uChannel;
|
||||
BYTE abySuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
|
||||
BYTE abyExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
|
||||
UINT uRSSI;
|
||||
BYTE bySQ;
|
||||
WORD wBeaconInterval;
|
||||
WORD wCapInfo;
|
||||
BYTE abySSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
|
||||
BYTE byRxRate;
|
||||
|
||||
// WORD wATIMWindow;
|
||||
BYTE byRSSIStatCnt;
|
||||
LONG ldBmMAX;
|
||||
LONG ldBmAverage[RSSI_STAT_COUNT];
|
||||
LONG ldBmAverRange;
|
||||
//For any BSSID selection improvment
|
||||
BOOL bSelected;
|
||||
|
||||
//++ WPA informations
|
||||
BOOL bWPAValid;
|
||||
BYTE byGKType;
|
||||
BYTE abyPKType[4];
|
||||
WORD wPKCount;
|
||||
BYTE abyAuthType[4];
|
||||
WORD wAuthCount;
|
||||
BYTE byDefaultK_as_PK;
|
||||
BYTE byReplayIdx;
|
||||
//--
|
||||
|
||||
//++ WPA2 informations
|
||||
BOOL bWPA2Valid;
|
||||
BYTE byCSSGK;
|
||||
WORD wCSSPKCount;
|
||||
BYTE abyCSSPK[4];
|
||||
WORD wAKMSSAuthCount;
|
||||
BYTE abyAKMSSAuthType[4];
|
||||
|
||||
//++ wpactl
|
||||
BYTE byWPAIE[MAX_WPA_IE_LEN];
|
||||
BYTE byRSNIE[MAX_WPA_IE_LEN];
|
||||
WORD wWPALen;
|
||||
WORD wRSNLen;
|
||||
|
||||
// Clear count
|
||||
UINT uClearCount;
|
||||
// BYTE abyIEs[WLAN_BEACON_FR_MAXLEN];
|
||||
UINT uIELength;
|
||||
QWORD qwBSSTimestamp;
|
||||
QWORD qwLocalTSF; // local TSF timer
|
||||
|
||||
CARD_PHY_TYPE eNetworkTypeInUse;
|
||||
|
||||
ERPObject sERP;
|
||||
SRSNCapObject sRSNCapObj;
|
||||
BYTE abyIEs[1024]; // don't move this field !!
|
||||
|
||||
}__attribute__ ((__packed__))
|
||||
KnownBSS , DEF* PKnownBSS;
|
||||
|
||||
|
||||
|
||||
typedef enum tagNODE_STATE {
|
||||
NODE_FREE,
|
||||
NODE_AGED,
|
||||
NODE_KNOWN,
|
||||
NODE_AUTH,
|
||||
NODE_ASSOC
|
||||
} NODE_STATE, *PNODE_STATE;
|
||||
|
||||
|
||||
// STA node info
|
||||
typedef struct tagKnownNodeDB {
|
||||
// STA info
|
||||
BOOL bActive;
|
||||
BYTE abyMACAddr[WLAN_ADDR_LEN];
|
||||
BYTE abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
|
||||
BYTE abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
|
||||
WORD wTxDataRate;
|
||||
BOOL bShortPreamble;
|
||||
BOOL bERPExist;
|
||||
BOOL bShortSlotTime;
|
||||
UINT uInActiveCount;
|
||||
WORD wMaxBasicRate; //Get from byTopOFDMBasicRate or byTopCCKBasicRate which depends on packetTyp.
|
||||
WORD wMaxSuppRate; //Records the highest supported rate getting from SuppRates IE and ExtSuppRates IE in Beacon.
|
||||
WORD wSuppRate;
|
||||
BYTE byTopOFDMBasicRate;//Records the highest basic rate in OFDM mode
|
||||
BYTE byTopCCKBasicRate; //Records the highest basic rate in CCK mode
|
||||
|
||||
// For AP mode
|
||||
struct sk_buff_head sTxPSQueue;
|
||||
WORD wCapInfo;
|
||||
WORD wListenInterval;
|
||||
WORD wAID;
|
||||
NODE_STATE eNodeState;
|
||||
BOOL bPSEnable;
|
||||
BOOL bRxPSPoll;
|
||||
BYTE byAuthSequence;
|
||||
ULONG ulLastRxJiffer;
|
||||
BYTE bySuppRate;
|
||||
DWORD dwFlags;
|
||||
WORD wEnQueueCnt;
|
||||
|
||||
BOOL bOnFly;
|
||||
ULONGLONG KeyRSC;
|
||||
BYTE byKeyIndex;
|
||||
DWORD dwKeyIndex;
|
||||
BYTE byCipherSuite;
|
||||
DWORD dwTSC47_16;
|
||||
WORD wTSC15_0;
|
||||
UINT uWepKeyLength;
|
||||
BYTE abyWepKey[WLAN_WEPMAX_KEYLEN];
|
||||
//
|
||||
// Auto rate fallback vars
|
||||
BOOL bIsInFallback;
|
||||
UINT uAverageRSSI;
|
||||
UINT uRateRecoveryTimeout;
|
||||
UINT uRatePollTimeout;
|
||||
UINT uTxFailures;
|
||||
UINT uTxAttempts;
|
||||
|
||||
UINT uTxRetry;
|
||||
UINT uFailureRatio;
|
||||
UINT uRetryRatio;
|
||||
UINT uTxOk[MAX_RATE+1];
|
||||
UINT uTxFail[MAX_RATE+1];
|
||||
UINT uTimeCount;
|
||||
|
||||
} KnownNodeDB, DEF* PKnownNodeDB;
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
PKnownBSS
|
||||
BSSpSearchBSSList(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PBYTE pbyDesireBSSID,
|
||||
IN PBYTE pbyDesireSSID,
|
||||
IN CARD_PHY_TYPE ePhyType
|
||||
);
|
||||
|
||||
PKnownBSS
|
||||
BSSpAddrIsInBSSList(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PBYTE abyBSSID,
|
||||
IN PWLAN_IE_SSID pSSID
|
||||
);
|
||||
|
||||
VOID
|
||||
BSSvClearBSSList(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN BOOL bKeepCurrBSSID
|
||||
);
|
||||
|
||||
BOOL
|
||||
BSSbInsertToBSSList(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PBYTE abyBSSIDAddr,
|
||||
IN QWORD qwTimestamp,
|
||||
IN WORD wBeaconInterval,
|
||||
IN WORD wCapInfo,
|
||||
IN BYTE byCurrChannel,
|
||||
IN PWLAN_IE_SSID pSSID,
|
||||
IN PWLAN_IE_SUPP_RATES pSuppRates,
|
||||
IN PWLAN_IE_SUPP_RATES pExtSuppRates,
|
||||
IN PERPObject psERP,
|
||||
IN PWLAN_IE_RSN pRSN,
|
||||
IN PWLAN_IE_RSN_EXT pRSNWPA,
|
||||
IN PWLAN_IE_COUNTRY pIE_Country,
|
||||
IN PWLAN_IE_QUIET pIE_Quiet,
|
||||
IN UINT uIELength,
|
||||
IN PBYTE pbyIEs,
|
||||
IN HANDLE pRxPacketContext
|
||||
);
|
||||
|
||||
|
||||
BOOL
|
||||
BSSbUpdateToBSSList(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN QWORD qwTimestamp,
|
||||
IN WORD wBeaconInterval,
|
||||
IN WORD wCapInfo,
|
||||
IN BYTE byCurrChannel,
|
||||
IN BOOL bChannelHit,
|
||||
IN PWLAN_IE_SSID pSSID,
|
||||
IN PWLAN_IE_SUPP_RATES pSuppRates,
|
||||
IN PWLAN_IE_SUPP_RATES pExtSuppRates,
|
||||
IN PERPObject psERP,
|
||||
IN PWLAN_IE_RSN pRSN,
|
||||
IN PWLAN_IE_RSN_EXT pRSNWPA,
|
||||
IN PWLAN_IE_COUNTRY pIE_Country,
|
||||
IN PWLAN_IE_QUIET pIE_Quiet,
|
||||
IN PKnownBSS pBSSList,
|
||||
IN UINT uIELength,
|
||||
IN PBYTE pbyIEs,
|
||||
IN HANDLE pRxPacketContext
|
||||
);
|
||||
|
||||
|
||||
BOOL
|
||||
BSSbIsSTAInNodeDB(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PBYTE abyDstAddr,
|
||||
OUT PUINT puNodeIndex
|
||||
);
|
||||
|
||||
VOID
|
||||
BSSvCreateOneNode(
|
||||
IN HANDLE hDeviceContext,
|
||||
OUT PUINT puNodeIndex
|
||||
);
|
||||
|
||||
VOID
|
||||
BSSvUpdateAPNode(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PWORD pwCapInfo,
|
||||
IN PWLAN_IE_SUPP_RATES pItemRates,
|
||||
IN PWLAN_IE_SUPP_RATES pExtSuppRates
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
BSSvSecondCallBack(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
BSSvUpdateNodeTxCounter(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PSStatCounter pStatistic,
|
||||
IN BYTE byTSR,
|
||||
IN BYTE byPktNO
|
||||
);
|
||||
|
||||
VOID
|
||||
BSSvRemoveOneNode(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN UINT uNodeIndex
|
||||
);
|
||||
|
||||
VOID
|
||||
BSSvAddMulticastNode(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
BSSvClearNodeDBTable(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN UINT uStartIndex
|
||||
);
|
||||
|
||||
VOID
|
||||
BSSvClearAnyBSSJoinRecord(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
#endif //__BSSDB_H__
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: card.h
|
||||
*
|
||||
* Purpose: Provide functions to setup NIC operation mode
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __CARD_H__
|
||||
#define __CARD_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
// Init card type
|
||||
|
||||
typedef enum _CARD_PHY_TYPE {
|
||||
|
||||
PHY_TYPE_AUTO=0,
|
||||
PHY_TYPE_11B,
|
||||
PHY_TYPE_11G,
|
||||
PHY_TYPE_11A
|
||||
} CARD_PHY_TYPE, DEF* PCARD_PHY_TYPE;
|
||||
|
||||
typedef enum _CARD_OP_MODE {
|
||||
|
||||
OP_MODE_INFRASTRUCTURE=0,
|
||||
OP_MODE_ADHOC,
|
||||
OP_MODE_AP,
|
||||
OP_MODE_UNKNOWN
|
||||
} CARD_OP_MODE, *PCARD_OP_MODE;
|
||||
|
||||
#define CB_MAX_CHANNEL_24G 14
|
||||
//#define CB_MAX_CHANNEL_5G 24
|
||||
#define CB_MAX_CHANNEL_5G 42 //[20050104] add channel9(5045MHz), 41==>42
|
||||
#define CB_MAX_CHANNEL (CB_MAX_CHANNEL_24G+CB_MAX_CHANNEL_5G)
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
BOOL CARDbSetMediaChannel(PVOID pDeviceHandler, UINT uConnectionChannel);
|
||||
void CARDvSetRSPINF(PVOID pDeviceHandler, BYTE byBBType);
|
||||
void vUpdateIFS(PVOID pDeviceHandler);
|
||||
void CARDvUpdateBasicTopRate(PVOID pDeviceHandler);
|
||||
BOOL CARDbAddBasicRate(PVOID pDeviceHandler, WORD wRateIdx);
|
||||
BOOL CARDbIsOFDMinBasicRate(PVOID pDeviceHandler);
|
||||
void CARDvAdjustTSF(PVOID pDeviceHandler, BYTE byRxRate, QWORD qwBSSTimestamp, QWORD qwLocalTSF);
|
||||
BOOL CARDbGetCurrentTSF (PVOID pDeviceHandler, PQWORD pqwCurrTSF);
|
||||
BOOL CARDbClearCurrentTSF(PVOID pDeviceHandler);
|
||||
void CARDvSetFirstNextTBTT(PVOID pDeviceHandler, WORD wBeaconInterval);
|
||||
void CARDvUpdateNextTBTT(PVOID pDeviceHandler, QWORD qwTSF, WORD wBeaconInterval);
|
||||
QWORD CARDqGetNextTBTT(QWORD qwTSF, WORD wBeaconInterval);
|
||||
QWORD CARDqGetTSFOffset(BYTE byRxRate, QWORD qwTSF1, QWORD qwTSF2);
|
||||
BOOL CARDbRadioPowerOff(PVOID pDeviceHandler);
|
||||
BOOL CARDbRadioPowerOn(PVOID pDeviceHandler);
|
||||
BYTE CARDbyGetPktType(PVOID pDeviceHandler);
|
||||
void CARDvSetBSSMode(PVOID pDeviceHandler);
|
||||
|
||||
BOOL
|
||||
CARDbChannelSwitch (
|
||||
IN PVOID pDeviceHandler,
|
||||
IN BYTE byMode,
|
||||
IN BYTE byNewChannel,
|
||||
IN BYTE byCount
|
||||
);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif // __CARD_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,535 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: channel.c
|
||||
*
|
||||
* Purpose: Channel number maping
|
||||
*
|
||||
* Author: Lucas Lin
|
||||
*
|
||||
* Date: Dec 24, 2004
|
||||
*
|
||||
*
|
||||
*
|
||||
* Revision History:
|
||||
* 01-18-2005 RobertYu: remove the for loop searching in ChannelValid,
|
||||
* change ChannelRuleTab to lookup-type, reorder table items.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined (_COUNTRY_H_)
|
||||
#include "country.h"
|
||||
#endif
|
||||
#if !defined (_CHANNEL_H_)
|
||||
#include "channel.h"
|
||||
#endif
|
||||
#if !defined(__RF_H__)
|
||||
#include "rf.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
static SChannelTblElement sChannelTbl[CB_MAX_CHANNEL+1] =
|
||||
{
|
||||
{0, 0, FALSE},
|
||||
{1, 2412, TRUE},
|
||||
{2, 2417, TRUE},
|
||||
{3, 2422, TRUE},
|
||||
{4, 2427, TRUE},
|
||||
{5, 2432, TRUE},
|
||||
{6, 2437, TRUE},
|
||||
{7, 2442, TRUE},
|
||||
{8, 2447, TRUE},
|
||||
{9, 2452, TRUE},
|
||||
{10, 2457, TRUE},
|
||||
{11, 2462, TRUE},
|
||||
{12, 2467, TRUE},
|
||||
{13, 2472, TRUE},
|
||||
{14, 2484, TRUE},
|
||||
{183, 4915, TRUE}, //15
|
||||
{184, 4920, TRUE}, //16
|
||||
{185, 4925, TRUE}, //17
|
||||
{187, 4935, TRUE}, //18
|
||||
{188, 4940, TRUE}, //19
|
||||
{189, 4945, TRUE}, //20
|
||||
{192, 4960, TRUE}, //21
|
||||
{196, 4980, TRUE}, //22
|
||||
{7, 5035, TRUE}, //23
|
||||
{8, 5040, TRUE}, //24
|
||||
{9, 5045, TRUE}, //25
|
||||
{11, 5055, TRUE}, //26
|
||||
{12, 5060, TRUE}, //27
|
||||
{16, 5080, TRUE}, //28
|
||||
{34, 5170, TRUE}, //29
|
||||
{36, 5180, TRUE}, //30
|
||||
{38, 5190, TRUE}, //31
|
||||
{40, 5200, TRUE}, //32
|
||||
{42, 5210, TRUE}, //33
|
||||
{44, 5220, TRUE}, //34
|
||||
{46, 5230, TRUE}, //35
|
||||
{48, 5240, TRUE}, //36
|
||||
{52, 5260, TRUE}, //37
|
||||
{56, 5280, TRUE}, //38
|
||||
{60, 5300, TRUE}, //39
|
||||
{64, 5320, TRUE}, //40
|
||||
{100, 5500, TRUE}, //41
|
||||
{104, 5520, TRUE}, //42
|
||||
{108, 5540, TRUE}, //43
|
||||
{112, 5560, TRUE}, //44
|
||||
{116, 5580, TRUE}, //45
|
||||
{120, 5600, TRUE}, //46
|
||||
{124, 5620, TRUE}, //47
|
||||
{128, 5640, TRUE}, //48
|
||||
{132, 5660, TRUE}, //49
|
||||
{136, 5680, TRUE}, //50
|
||||
{140, 5700, TRUE}, //51
|
||||
{149, 5745, TRUE}, //52
|
||||
{153, 5765, TRUE}, //53
|
||||
{157, 5785, TRUE}, //54
|
||||
{161, 5805, TRUE}, //55
|
||||
{165, 5825, TRUE} //56
|
||||
};
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* The Radar regulation rules for each country
|
||||
************************************************************************/
|
||||
static struct
|
||||
{
|
||||
BYTE byChannelCountryCode; /* The country code */
|
||||
CHAR chCountryCode[2];
|
||||
BYTE bChannelIdxList[CB_MAX_CHANNEL]; /* Available channels Index */
|
||||
BYTE byPower[CB_MAX_CHANNEL];
|
||||
} ChannelRuleTab[] =
|
||||
{
|
||||
/************************************************************************
|
||||
* This table is based on Athero driver rules
|
||||
************************************************************************/
|
||||
/* Country Available channels, ended with 0 */
|
||||
/* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 */
|
||||
{CCODE_FCC, {'U','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_TELEC, {'J','P'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 23, 0, 0, 23, 0, 23, 23, 0, 23, 0, 0, 23, 23, 23, 0, 23, 0, 23, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ETSI, {'E','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESV3, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESV4, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESV5, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESV6, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESV7, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESV8, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESV9, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESVa, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESVb, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESVc, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESVd, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RESVe, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ALLBAND, {' ',' '}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ALBANIA, {'A','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ALGERIA, {'D','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ARGENTINA, {'A','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 0} },
|
||||
{CCODE_ARMENIA, {'A','M'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_AUSTRALIA, {'A','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_AUSTRIA, {'A','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_AZERBAIJAN, {'A','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_BAHRAIN, {'B','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_BELARUS, {'B','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_BELGIUM, {'B','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_BELIZE, {'B','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_BOLIVIA, {'B','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_BRAZIL, {'B','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_BRUNEI_DARUSSALAM, {'B','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_BULGARIA, {'B','G'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0} },
|
||||
{CCODE_CANADA, {'C','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_CHILE, {'C','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17} },
|
||||
{CCODE_CHINA, {'C','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_COLOMBIA, {'C','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_COSTA_RICA, {'C','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_CROATIA, {'H','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_CYPRUS, {'C','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_CZECH, {'C','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_DENMARK, {'D','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_DOMINICAN_REPUBLIC, {'D','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_ECUADOR, {'E','C'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_EGYPT, {'E','G'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_EL_SALVADOR, {'S','V'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ESTONIA, {'E','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_FINLAND, {'F','I'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_FRANCE, {'F','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_GERMANY, {'D','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_GREECE, {'G','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_GEORGIA, {'G','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_GUATEMALA, {'G','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_HONDURAS, {'H','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_HONG_KONG, {'H','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_HUNGARY, {'H','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ICELAND, {'I','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_INDIA, {'I','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_INDONESIA, {'I','D'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_IRAN, {'I','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_IRELAND, {'I','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ITALY, {'I','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ISRAEL, {'I','L'}, { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_JAPAN, {'J','P'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_JORDAN, {'J','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_KAZAKHSTAN, {'K','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_KUWAIT, {'K','W'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_LATVIA, {'L','V'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_LEBANON, {'L','B'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_LEICHTENSTEIN, {'L','I'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_LITHUANIA, {'L','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_LUXEMBURG, {'L','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_MACAU, {'M','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_MACEDONIA, {'M','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_MALTA, {'M','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0} },
|
||||
{CCODE_MALAYSIA, {'M','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_MEXICO, {'M','X'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_MONACO, {'M','C'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_MOROCCO, {'M','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_NETHERLANDS, {'N','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_NEW_ZEALAND, {'N','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_NORTH_KOREA, {'K','P'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} },
|
||||
{CCODE_NORWAY, {'N','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_OMAN, {'O','M'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_PAKISTAN, {'P','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_PANAMA, {'P','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_PERU, {'P','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_PHILIPPINES, {'P','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_POLAND, {'P','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_PORTUGAL, {'P','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_PUERTO_RICO, {'P','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_QATAR, {'Q','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ROMANIA, {'R','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_RUSSIA, {'R','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_SAUDI_ARABIA, {'S','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_SINGAPORE, {'S','G'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20} },
|
||||
{CCODE_SLOVAKIA, {'S','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0} },
|
||||
{CCODE_SLOVENIA, {'S','I'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_SOUTH_AFRICA, {'Z','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_SOUTH_KOREA, {'K','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} },
|
||||
{CCODE_SPAIN, {'E','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0} },
|
||||
{CCODE_SWEDEN, {'S','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_SWITZERLAND, {'C','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_SYRIA, {'S','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_TAIWAN, {'T','W'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 0} },
|
||||
{CCODE_THAILAND, {'T','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} },
|
||||
{CCODE_TRINIDAD_TOBAGO, {'T','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_TUNISIA, {'T','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_TURKEY, {'T','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_UK, {'G','B'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} },
|
||||
{CCODE_UKRAINE, {'U','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_UNITED_ARAB_EMIRATES, {'A','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_UNITED_STATES, {'U','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}
|
||||
, { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} },
|
||||
{CCODE_URUGUAY, {'U','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} },
|
||||
{CCODE_UZBEKISTAN, {'U','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_VENEZUELA, {'V','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0}
|
||||
, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} },
|
||||
{CCODE_VIETNAM, {'V','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_YEMEN, {'Y','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_ZIMBABWE, {'Z','W'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_JAPAN_W52_W53, {'J','J'}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
|
||||
{CCODE_MAX, {'U','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
|
||||
, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }
|
||||
/* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 */
|
||||
};
|
||||
|
||||
#define NUM_RULES (sizeof(ChannelRuleTab) / sizeof(ChannelRuleTab[0]))
|
||||
|
||||
/*--------------------- Export function -------------------------*/
|
||||
/************************************************************************
|
||||
* Country Channel Valid
|
||||
* Input: CountryCode, ChannelNum
|
||||
* ChanneIndex is defined as VT3253 MAC channel:
|
||||
* 1 = 2.4G channel 1
|
||||
* 2 = 2.4G channel 2
|
||||
* ...
|
||||
* 14 = 2.4G channel 14
|
||||
* 15 = 4.9G channel 183
|
||||
* 16 = 4.9G channel 184
|
||||
* .....
|
||||
* Output: TRUE if the specified 5GHz band is allowed to be used.
|
||||
False otherwise.
|
||||
// 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22)
|
||||
|
||||
// 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64,
|
||||
// 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56)
|
||||
************************************************************************/
|
||||
BOOL
|
||||
ChannelValid(UINT CountryCode, UINT ChannelIndex)
|
||||
{
|
||||
BOOL bValid;
|
||||
|
||||
bValid = FALSE;
|
||||
/*
|
||||
* If Channel Index is invalid, return invalid
|
||||
*/
|
||||
if ((ChannelIndex > CB_MAX_CHANNEL) ||
|
||||
(ChannelIndex == 0))
|
||||
{
|
||||
bValid = FALSE;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
bValid = sChannelTbl[ChannelIndex].bValid;
|
||||
|
||||
exit:
|
||||
return (bValid);
|
||||
|
||||
} /* end ChannelValid */
|
||||
|
||||
/************************************************************************
|
||||
* CHvChannelGetList
|
||||
* Get Available Channel List for a given country
|
||||
* Input:
|
||||
* CountryCode = The country code defined in country.h
|
||||
* Output:
|
||||
* ChannelBitMask = (QWORD *) correspondent bit mask
|
||||
* of available channels
|
||||
* 0x0000000000000001 means channel 1 is supported
|
||||
* 0x0000000000000003 means channel 1,2 are supported
|
||||
* 0x000000000000000F means channel 1,2,..15 are supported
|
||||
************************************************************************/
|
||||
BOOL
|
||||
CHvChannelGetList (
|
||||
IN UINT uCountryCodeIdx,
|
||||
OUT PBYTE pbyChannelTable
|
||||
)
|
||||
{
|
||||
if (uCountryCodeIdx >= CCODE_MAX) {
|
||||
return (FALSE);
|
||||
}
|
||||
MEMvCopy(pbyChannelTable, ChannelRuleTab[uCountryCodeIdx].bChannelIdxList, CB_MAX_CHANNEL);
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
||||
VOID CHvInitChannelTable (PVOID pDeviceHandler)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
BOOL bMultiBand = FALSE;
|
||||
UINT ii;
|
||||
|
||||
for(ii=1;ii<=CB_MAX_CHANNEL;ii++) {
|
||||
sChannelTbl[ii].bValid = FALSE;
|
||||
}
|
||||
|
||||
switch (pDevice->byRFType) {
|
||||
case RF_AL2230:
|
||||
case RF_AL2230S:
|
||||
case RF_VT3226:
|
||||
case RF_VT3226D0:
|
||||
bMultiBand = FALSE;
|
||||
break;
|
||||
case RF_AIROHA7230:
|
||||
case RF_VT3342A0:
|
||||
default :
|
||||
bMultiBand = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((pDevice->dwDiagRefCount != 0) ||
|
||||
(pDevice->b11hEable == TRUE)) {
|
||||
if (bMultiBand == TRUE) {
|
||||
for(ii=0;ii<CB_MAX_CHANNEL;ii++) {
|
||||
sChannelTbl[ii+1].bValid = TRUE;
|
||||
//pDevice->abyRegPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1];
|
||||
//pDevice->abyLocalPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1];
|
||||
}
|
||||
for(ii=0;ii<CB_MAX_CHANNEL_24G;ii++) {
|
||||
//pDevice->abyRegPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1];
|
||||
//pDevice->abyLocalPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1];
|
||||
}
|
||||
} else {
|
||||
for(ii=0;ii<CB_MAX_CHANNEL_24G;ii++) {
|
||||
sChannelTbl[ii+1].bValid = TRUE;
|
||||
//pDevice->abyRegPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1];
|
||||
//pDevice->abyLocalPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1];
|
||||
}
|
||||
}
|
||||
} else if (pDevice->byZoneType <= CCODE_MAX) {
|
||||
if (bMultiBand == TRUE) {
|
||||
for(ii=0;ii<CB_MAX_CHANNEL;ii++) {
|
||||
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) {
|
||||
sChannelTbl[ii+1].bValid = TRUE;
|
||||
//pDevice->abyRegPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii];
|
||||
//pDevice->abyLocalPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(ii=0;ii<CB_MAX_CHANNEL_24G;ii++) {
|
||||
if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) {
|
||||
sChannelTbl[ii+1].bValid = TRUE;
|
||||
//pDevice->abyRegPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii];
|
||||
//pDevice->abyLocalPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO"Zone=[%d][%c][%c]!!\n",pDevice->byZoneType,ChannelRuleTab[pDevice->byZoneType].chCountryCode[0],ChannelRuleTab[pDevice->byZoneType].chCountryCode[1]);
|
||||
for(ii=0;ii<CB_MAX_CHANNEL;ii++) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Channel[%d] is [%d]\n",sChannelTbl[ii].byChannelNumber,sChannelTbl[ii+1].bValid);
|
||||
/*if (pDevice->abyRegPwr[ii+1] == 0) {
|
||||
pDevice->abyRegPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1];
|
||||
}
|
||||
if (pDevice->abyLocalPwr[ii+1] == 0) {
|
||||
pDevice->abyLocalPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1];
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
BYTE CHbyGetChannelMapping(BYTE byChannelNumber)
|
||||
{
|
||||
BYTE ii;
|
||||
BYTE byCHMapping = 0;
|
||||
|
||||
for (ii=1; ii<=CB_MAX_CHANNEL; ii++ ) {
|
||||
if ( sChannelTbl[ii].byChannelNumber == byChannelNumber ) {
|
||||
byCHMapping = ii;
|
||||
}
|
||||
}
|
||||
return byCHMapping;
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: channel.h
|
||||
*
|
||||
* Purpose: Country Regulation Rules header file
|
||||
*
|
||||
* Author: Lucas Lin
|
||||
*
|
||||
* Date: Dec 23, 2004
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _CHANNEL_H_
|
||||
#define _CHANNEL_H_
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
typedef struct tagSChannelTblElement {
|
||||
BYTE byChannelNumber;
|
||||
UINT uFrequency;
|
||||
BOOL bValid;
|
||||
}SChannelTblElement, DEF* PSChannelTblElement;
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
BOOL ChannelValid(UINT CountryCode, UINT ChannelNum);
|
||||
VOID CHvInitChannelTable (PVOID pDeviceHandler);
|
||||
BYTE CHbyGetChannelMapping(BYTE byChannelNumber);
|
||||
|
||||
BOOL
|
||||
CHvChannelGetList (
|
||||
IN UINT uCountryCodeIdx,
|
||||
OUT PBYTE pbyChannelTable
|
||||
);
|
||||
#endif /* _REGULATE_H_ */
|
|
@ -0,0 +1,116 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: control.c
|
||||
*
|
||||
* Purpose: Handle USB control endpoint
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Apr. 5, 2004
|
||||
*
|
||||
* Functions:
|
||||
* CONTROLnsRequestOut - Write variable length bytes to MEM/BB/MAC/EEPROM
|
||||
* CONTROLnsRequestIn - Read variable length bytes from MEM/BB/MAC/EEPROM
|
||||
* ControlvWriteByte - Write one byte to MEM/BB/MAC/EEPROM
|
||||
* ControlvReadByte - Read one byte from MEM/BB/MAC/EEPROM
|
||||
* ControlvMaskByte - Read one byte from MEM/BB/MAC/EEPROM and clear/set some bits in the same address
|
||||
*
|
||||
* Revision History:
|
||||
* 04-05-2004 Jerry Chen: Initial release
|
||||
* 11-24-2004 Warren Hsu: Add ControlvWriteByte,ControlvReadByte,ControlvMaskByte
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(__CONTROL_H__)
|
||||
#include "control.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__RNDIS_H__)
|
||||
#include "rndis.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
//static int msglevel =MSG_LEVEL_INFO;
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
void ControlvWriteByte(PSDevice pDevice, BYTE byRegType, BYTE byRegOfs, BYTE byData)
|
||||
{
|
||||
BYTE byData1;
|
||||
|
||||
byData1 = byData;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE,
|
||||
byRegOfs,
|
||||
byRegType,
|
||||
1,
|
||||
&byData1
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void ControlvReadByte(PSDevice pDevice, BYTE byRegType, BYTE byRegOfs, PBYTE pbyData)
|
||||
{
|
||||
NTSTATUS ntStatus;
|
||||
BYTE byData1;
|
||||
|
||||
|
||||
ntStatus = CONTROLnsRequestIn(pDevice,
|
||||
MESSAGE_TYPE_READ,
|
||||
byRegOfs,
|
||||
byRegType,
|
||||
1,
|
||||
&byData1);
|
||||
|
||||
*pbyData = byData1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ControlvMaskByte(PSDevice pDevice, BYTE byRegType, BYTE byRegOfs, BYTE byMask, BYTE byData)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
pbyData[0] = byData;
|
||||
pbyData[1] = byMask;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MASK,
|
||||
byRegOfs,
|
||||
byRegType,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: control.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Apr. 5, 2004
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __CONTROL_H__
|
||||
#define __CONTROL_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__USBPIPE_H__)
|
||||
#include "usbpipe.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
#define CONTROLnsRequestOut( Device,Request,Value,Index,Length,Buffer) \
|
||||
PIPEnsControlOut( Device,Request,Value,Index,Length,Buffer)
|
||||
|
||||
#define CONTROLnsRequestOutAsyn( Device,Request,Value,Index,Length,Buffer) \
|
||||
PIPEnsControlOutAsyn( Device,Request,Value,Index,Length,Buffer)
|
||||
|
||||
#define CONTROLnsRequestIn( Device,Request,Value,Index,Length,Buffer) \
|
||||
PIPEnsControlIn( Device,Request,Value,Index,Length,Buffer)
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
void ControlvWriteByte(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byRegType,
|
||||
IN BYTE byRegOfs,
|
||||
IN BYTE byData
|
||||
);
|
||||
|
||||
|
||||
void ControlvReadByte(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byRegType,
|
||||
IN BYTE byRegOfs,
|
||||
IN PBYTE pbyData
|
||||
);
|
||||
|
||||
|
||||
void ControlvMaskByte(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byRegType,
|
||||
IN BYTE byRegOfs,
|
||||
IN BYTE byMask,
|
||||
IN BYTE byData
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __RCV_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: country.h
|
||||
*
|
||||
* Purpose: Country Code information
|
||||
*
|
||||
* Author: Lucas Lin
|
||||
*
|
||||
* Date: Dec 23, 2004
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __COUNTRY_H__
|
||||
#define __COUNTRY_H__
|
||||
|
||||
/************************************************************************
|
||||
* The definition here should be complied with the INF country order
|
||||
* Please check with VNWL.inf/VNWL64.inf/VNWL*.inf
|
||||
************************************************************************/
|
||||
typedef enum _COUNTRY_CODE {
|
||||
CCODE_FCC = 0,
|
||||
CCODE_TELEC,
|
||||
CCODE_ETSI,
|
||||
CCODE_RESV3,
|
||||
CCODE_RESV4,
|
||||
CCODE_RESV5,
|
||||
CCODE_RESV6,
|
||||
CCODE_RESV7,
|
||||
CCODE_RESV8,
|
||||
CCODE_RESV9,
|
||||
CCODE_RESVa,
|
||||
CCODE_RESVb,
|
||||
CCODE_RESVc,
|
||||
CCODE_RESVd,
|
||||
CCODE_RESVe,
|
||||
CCODE_ALLBAND,
|
||||
CCODE_ALBANIA,
|
||||
CCODE_ALGERIA,
|
||||
CCODE_ARGENTINA,
|
||||
CCODE_ARMENIA,
|
||||
CCODE_AUSTRALIA,
|
||||
CCODE_AUSTRIA,
|
||||
CCODE_AZERBAIJAN,
|
||||
CCODE_BAHRAIN,
|
||||
CCODE_BELARUS,
|
||||
CCODE_BELGIUM,
|
||||
CCODE_BELIZE,
|
||||
CCODE_BOLIVIA,
|
||||
CCODE_BRAZIL,
|
||||
CCODE_BRUNEI_DARUSSALAM,
|
||||
CCODE_BULGARIA,
|
||||
CCODE_CANADA,
|
||||
CCODE_CHILE,
|
||||
CCODE_CHINA,
|
||||
CCODE_COLOMBIA,
|
||||
CCODE_COSTA_RICA,
|
||||
CCODE_CROATIA,
|
||||
CCODE_CYPRUS,
|
||||
CCODE_CZECH,
|
||||
CCODE_DENMARK,
|
||||
CCODE_DOMINICAN_REPUBLIC,
|
||||
CCODE_ECUADOR,
|
||||
CCODE_EGYPT,
|
||||
CCODE_EL_SALVADOR,
|
||||
CCODE_ESTONIA,
|
||||
CCODE_FINLAND,
|
||||
CCODE_FRANCE,
|
||||
CCODE_GERMANY,
|
||||
CCODE_GREECE,
|
||||
CCODE_GEORGIA,
|
||||
CCODE_GUATEMALA,
|
||||
CCODE_HONDURAS,
|
||||
CCODE_HONG_KONG,
|
||||
CCODE_HUNGARY,
|
||||
CCODE_ICELAND,
|
||||
CCODE_INDIA,
|
||||
CCODE_INDONESIA,
|
||||
CCODE_IRAN,
|
||||
CCODE_IRELAND,
|
||||
CCODE_ITALY,
|
||||
CCODE_ISRAEL,
|
||||
CCODE_JAPAN,
|
||||
CCODE_JORDAN,
|
||||
CCODE_KAZAKHSTAN,
|
||||
CCODE_KUWAIT,
|
||||
CCODE_LATVIA,
|
||||
CCODE_LEBANON,
|
||||
CCODE_LEICHTENSTEIN,
|
||||
CCODE_LITHUANIA,
|
||||
CCODE_LUXEMBURG,
|
||||
CCODE_MACAU,
|
||||
CCODE_MACEDONIA,
|
||||
CCODE_MALTA,
|
||||
CCODE_MALAYSIA,
|
||||
CCODE_MEXICO,
|
||||
CCODE_MONACO,
|
||||
CCODE_MOROCCO,
|
||||
CCODE_NETHERLANDS,
|
||||
CCODE_NEW_ZEALAND,
|
||||
CCODE_NORTH_KOREA,
|
||||
CCODE_NORWAY,
|
||||
CCODE_OMAN,
|
||||
CCODE_PAKISTAN,
|
||||
CCODE_PANAMA,
|
||||
CCODE_PERU,
|
||||
CCODE_PHILIPPINES,
|
||||
CCODE_POLAND,
|
||||
CCODE_PORTUGAL,
|
||||
CCODE_PUERTO_RICO,
|
||||
CCODE_QATAR,
|
||||
CCODE_ROMANIA,
|
||||
CCODE_RUSSIA,
|
||||
CCODE_SAUDI_ARABIA,
|
||||
CCODE_SINGAPORE,
|
||||
CCODE_SLOVAKIA,
|
||||
CCODE_SLOVENIA,
|
||||
CCODE_SOUTH_AFRICA,
|
||||
CCODE_SOUTH_KOREA,
|
||||
CCODE_SPAIN,
|
||||
CCODE_SWEDEN,
|
||||
CCODE_SWITZERLAND,
|
||||
CCODE_SYRIA,
|
||||
CCODE_TAIWAN,
|
||||
CCODE_THAILAND,
|
||||
CCODE_TRINIDAD_TOBAGO,
|
||||
CCODE_TUNISIA,
|
||||
CCODE_TURKEY,
|
||||
CCODE_UK,
|
||||
CCODE_UKRAINE,
|
||||
CCODE_UNITED_ARAB_EMIRATES,
|
||||
CCODE_UNITED_STATES,
|
||||
CCODE_URUGUAY,
|
||||
CCODE_UZBEKISTAN,
|
||||
CCODE_VENEZUELA,
|
||||
CCODE_VIETNAM,
|
||||
CCODE_YEMEN,
|
||||
CCODE_ZIMBABWE,
|
||||
CCODE_JAPAN_W52_W53,
|
||||
CCODE_MAX
|
||||
} COUNTRY_CODE;
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function prototype
|
||||
************************************************************************/
|
||||
#endif /* __COUNTRY_H__ */
|
|
@ -0,0 +1,518 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: datarate.c
|
||||
*
|
||||
* Purpose: Handles the auto fallback & data rates functions
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: July 17, 2002
|
||||
*
|
||||
* Functions:
|
||||
* RATEvParseMaxRate - Parsing the highest basic & support rate in rate field of frame
|
||||
* RATEvTxRateFallBack - Rate fallback Algorithm Implementaion
|
||||
* RATEuSetIE- Set rate IE field.
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
#if !defined(__MAC_H__)
|
||||
#include "mac.h"
|
||||
#endif
|
||||
#if !defined(__80211MGR_H__)
|
||||
#include "80211mgr.h"
|
||||
#endif
|
||||
#if !defined(__BSSDB_H__)
|
||||
#include "bssdb.h"
|
||||
#endif
|
||||
#if !defined(__DATARATE_H__)
|
||||
#include "datarate.h"
|
||||
#endif
|
||||
#if !defined(__CARD_H__)
|
||||
#include "card.h"
|
||||
#endif
|
||||
#if !defined(__BASEBAND_H__)
|
||||
#include "baseband.h"
|
||||
#endif
|
||||
#if !defined(__SROM_H__)
|
||||
#include "srom.h"
|
||||
#endif
|
||||
#if !defined(__RF_H__)
|
||||
#include "rf.h"
|
||||
#endif
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
const BYTE acbyIERate[MAX_RATE] =
|
||||
{0x02, 0x04, 0x0B, 0x16, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
|
||||
|
||||
#define AUTORATE_TXOK_CNT 0x0400
|
||||
#define AUTORATE_TXFAIL_CNT 0x0064
|
||||
#define AUTORATE_TIMEOUT 10
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
VOID s_vResetCounter (
|
||||
IN PKnownNodeDB psNodeDBTable
|
||||
);
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
s_vResetCounter (
|
||||
IN PKnownNodeDB psNodeDBTable
|
||||
)
|
||||
{
|
||||
BYTE ii;
|
||||
|
||||
// clear statistic counter for auto_rate
|
||||
for(ii=0;ii<=MAX_RATE;ii++) {
|
||||
psNodeDBTable->uTxOk[ii] = 0;
|
||||
psNodeDBTable->uTxFail[ii] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Get RateIdx from the value in SuppRates IE or ExtSuppRates IE
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* BYTE - Rate value in SuppRates IE or ExtSuppRates IE
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: RateIdx
|
||||
*
|
||||
-*/
|
||||
BYTE
|
||||
DATARATEbyGetRateIdx (
|
||||
IN BYTE byRate
|
||||
)
|
||||
{
|
||||
BYTE ii;
|
||||
|
||||
//Erase basicRate flag.
|
||||
byRate = byRate & 0x7F;//0111 1111
|
||||
|
||||
for (ii = 0; ii < MAX_RATE; ii ++) {
|
||||
if (acbyIERate[ii] == byRate)
|
||||
return ii;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Routine Description:
|
||||
* Rate fallback Algorithm Implementaion
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to the adapter
|
||||
* psNodeDBTable - Pointer to Node Data Base
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
-*/
|
||||
#define AUTORATE_TXCNT_THRESHOLD 20
|
||||
#define AUTORATE_INC_THRESHOLD 30
|
||||
|
||||
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Get RateIdx from the value in SuppRates IE or ExtSuppRates IE
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* BYTE - Rate value in SuppRates IE or ExtSuppRates IE
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: RateIdx
|
||||
*
|
||||
-*/
|
||||
WORD
|
||||
RATEwGetRateIdx(
|
||||
IN BYTE byRate
|
||||
)
|
||||
{
|
||||
WORD ii;
|
||||
|
||||
//Erase basicRate flag.
|
||||
byRate = byRate & 0x7F;//0111 1111
|
||||
|
||||
for (ii = 0; ii < MAX_RATE; ii ++) {
|
||||
if (acbyIERate[ii] == byRate)
|
||||
return ii;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Parsing the highest basic & support rate in rate field of frame.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to the adapter
|
||||
* pItemRates - Pointer to Rate field defined in 802.11 spec.
|
||||
* pItemExtRates - Pointer to Extended Rate field defined in 802.11 spec.
|
||||
* Out:
|
||||
* pwMaxBasicRate - Maximum Basic Rate
|
||||
* pwMaxSuppRate - Maximum Supported Rate
|
||||
* pbyTopCCKRate - Maximum Basic Rate in CCK mode
|
||||
* pbyTopOFDMRate - Maximum Basic Rate in OFDM mode
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
-*/
|
||||
VOID
|
||||
RATEvParseMaxRate (
|
||||
IN PVOID pDeviceHandler,
|
||||
IN PWLAN_IE_SUPP_RATES pItemRates,
|
||||
IN PWLAN_IE_SUPP_RATES pItemExtRates,
|
||||
IN BOOL bUpdateBasicRate,
|
||||
OUT PWORD pwMaxBasicRate,
|
||||
OUT PWORD pwMaxSuppRate,
|
||||
OUT PWORD pwSuppRate,
|
||||
OUT PBYTE pbyTopCCKRate,
|
||||
OUT PBYTE pbyTopOFDMRate
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
UINT ii;
|
||||
BYTE byHighSuppRate = 0;
|
||||
BYTE byRate = 0;
|
||||
WORD wOldBasicRate = pDevice->wBasicRate;
|
||||
UINT uRateLen;
|
||||
|
||||
|
||||
if (pItemRates == NULL)
|
||||
return;
|
||||
|
||||
*pwSuppRate = 0;
|
||||
uRateLen = pItemRates->len;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ParseMaxRate Len: %d\n", uRateLen);
|
||||
if (pDevice->byBBType != BB_TYPE_11B) {
|
||||
if (uRateLen > WLAN_RATES_MAXLEN)
|
||||
uRateLen = WLAN_RATES_MAXLEN;
|
||||
} else {
|
||||
if (uRateLen > WLAN_RATES_MAXLEN_11B)
|
||||
uRateLen = WLAN_RATES_MAXLEN_11B;
|
||||
}
|
||||
|
||||
for (ii = 0; ii < uRateLen; ii++) {
|
||||
byRate = (BYTE)(pItemRates->abyRates[ii]);
|
||||
if (WLAN_MGMT_IS_BASICRATE(byRate) &&
|
||||
(bUpdateBasicRate == TRUE)) {
|
||||
// Add to basic rate set, update pDevice->byTopCCKBasicRate and pDevice->byTopOFDMBasicRate
|
||||
CARDbAddBasicRate((PVOID)pDevice, RATEwGetRateIdx(byRate));
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ParseMaxRate AddBasicRate: %d\n", RATEwGetRateIdx(byRate));
|
||||
}
|
||||
byRate = (BYTE)(pItemRates->abyRates[ii]&0x7F);
|
||||
if (byHighSuppRate == 0)
|
||||
byHighSuppRate = byRate;
|
||||
if (byRate > byHighSuppRate)
|
||||
byHighSuppRate = byRate;
|
||||
*pwSuppRate |= (1<<RATEwGetRateIdx(byRate));
|
||||
}
|
||||
if ((pItemExtRates != NULL) && (pItemExtRates->byElementID == WLAN_EID_EXTSUPP_RATES) &&
|
||||
(pDevice->byBBType != BB_TYPE_11B)) {
|
||||
|
||||
UINT uExtRateLen = pItemExtRates->len;
|
||||
|
||||
if (uExtRateLen > WLAN_RATES_MAXLEN)
|
||||
uExtRateLen = WLAN_RATES_MAXLEN;
|
||||
|
||||
for (ii = 0; ii < uExtRateLen ; ii++) {
|
||||
byRate = (BYTE)(pItemExtRates->abyRates[ii]);
|
||||
// select highest basic rate
|
||||
if (WLAN_MGMT_IS_BASICRATE(pItemExtRates->abyRates[ii])) {
|
||||
// Add to basic rate set, update pDevice->byTopCCKBasicRate and pDevice->byTopOFDMBasicRate
|
||||
CARDbAddBasicRate((PVOID)pDevice, RATEwGetRateIdx(byRate));
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ParseMaxRate AddBasicRate: %d\n", RATEwGetRateIdx(byRate));
|
||||
}
|
||||
byRate = (BYTE)(pItemExtRates->abyRates[ii]&0x7F);
|
||||
if (byHighSuppRate == 0)
|
||||
byHighSuppRate = byRate;
|
||||
if (byRate > byHighSuppRate)
|
||||
byHighSuppRate = byRate;
|
||||
*pwSuppRate |= (1<<RATEwGetRateIdx(byRate));
|
||||
//DBG_PRN_GRP09(("ParseMaxRate : HighSuppRate: %d, %X\n", RATEwGetRateIdx(byRate), byRate));
|
||||
}
|
||||
} //if(pItemExtRates != NULL)
|
||||
|
||||
if ((pDevice->byPacketType == PK_TYPE_11GB) && CARDbIsOFDMinBasicRate((PVOID)pDevice)) {
|
||||
pDevice->byPacketType = PK_TYPE_11GA;
|
||||
}
|
||||
|
||||
*pbyTopCCKRate = pDevice->byTopCCKBasicRate;
|
||||
*pbyTopOFDMRate = pDevice->byTopOFDMBasicRate;
|
||||
*pwMaxSuppRate = RATEwGetRateIdx(byHighSuppRate);
|
||||
if ((pDevice->byPacketType==PK_TYPE_11B) || (pDevice->byPacketType==PK_TYPE_11GB))
|
||||
*pwMaxBasicRate = pDevice->byTopCCKBasicRate;
|
||||
else
|
||||
*pwMaxBasicRate = pDevice->byTopOFDMBasicRate;
|
||||
if (wOldBasicRate != pDevice->wBasicRate)
|
||||
CARDvSetRSPINF((PVOID)pDevice, pDevice->byBBType);
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Exit ParseMaxRate\n");
|
||||
}
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Routine Description:
|
||||
* Rate fallback Algorithm Implementaion
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to the adapter
|
||||
* psNodeDBTable - Pointer to Node Data Base
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
-*/
|
||||
#define AUTORATE_TXCNT_THRESHOLD 20
|
||||
#define AUTORATE_INC_THRESHOLD 30
|
||||
|
||||
VOID
|
||||
RATEvTxRateFallBack (
|
||||
IN PVOID pDeviceHandler,
|
||||
IN PKnownNodeDB psNodeDBTable
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
#if 1 //mike fixed old: use packet lose ratio algorithm to control rate
|
||||
WORD wIdxDownRate = 0;
|
||||
UINT ii;
|
||||
BOOL bAutoRate[MAX_RATE] = {TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE};
|
||||
DWORD dwThroughputTbl[MAX_RATE] = {10, 20, 55, 110, 60, 90, 120, 180, 240, 360, 480, 540};
|
||||
DWORD dwThroughput = 0;
|
||||
WORD wIdxUpRate = 0;
|
||||
DWORD dwTxDiff = 0;
|
||||
|
||||
if (pMgmt->eScanState != WMAC_NO_SCANNING) {
|
||||
// Don't do Fallback when scanning Channel
|
||||
return;
|
||||
}
|
||||
psNodeDBTable->uTimeCount ++;
|
||||
|
||||
if (psNodeDBTable->uTxFail[MAX_RATE] > psNodeDBTable->uTxOk[MAX_RATE])
|
||||
dwTxDiff = psNodeDBTable->uTxFail[MAX_RATE] - psNodeDBTable->uTxOk[MAX_RATE];
|
||||
|
||||
if ((psNodeDBTable->uTxOk[MAX_RATE] < AUTORATE_TXOK_CNT) &&
|
||||
(dwTxDiff < AUTORATE_TXFAIL_CNT) &&
|
||||
(psNodeDBTable->uTimeCount < AUTORATE_TIMEOUT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (psNodeDBTable->uTimeCount >= AUTORATE_TIMEOUT) {
|
||||
psNodeDBTable->uTimeCount = 0;
|
||||
}
|
||||
|
||||
for(ii=0;ii<MAX_RATE;ii++) {
|
||||
if (psNodeDBTable->wSuppRate & (0x0001<<ii)) {
|
||||
if (bAutoRate[ii] == TRUE) {
|
||||
wIdxUpRate = (WORD) ii;
|
||||
}
|
||||
} else {
|
||||
bAutoRate[ii] = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
for(ii=0;ii<=psNodeDBTable->wTxDataRate;ii++) {
|
||||
if ( (psNodeDBTable->uTxOk[ii] != 0) ||
|
||||
(psNodeDBTable->uTxFail[ii] != 0) ) {
|
||||
dwThroughputTbl[ii] *= psNodeDBTable->uTxOk[ii];
|
||||
if (ii < RATE_11M) {
|
||||
psNodeDBTable->uTxFail[ii] *= 4;
|
||||
}
|
||||
dwThroughputTbl[ii] /= (psNodeDBTable->uTxOk[ii] + psNodeDBTable->uTxFail[ii]);
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rate %d,Ok: %d, Fail:%d, Throughput:%d\n",
|
||||
ii, (int)psNodeDBTable->uTxOk[ii], (int)psNodeDBTable->uTxFail[ii], (int)dwThroughputTbl[ii]);
|
||||
}
|
||||
dwThroughput = dwThroughputTbl[psNodeDBTable->wTxDataRate];
|
||||
|
||||
wIdxDownRate = psNodeDBTable->wTxDataRate;
|
||||
for(ii = psNodeDBTable->wTxDataRate; ii > 0;) {
|
||||
ii--;
|
||||
if ( (dwThroughputTbl[ii] > dwThroughput) &&
|
||||
(bAutoRate[ii]==TRUE) ) {
|
||||
dwThroughput = dwThroughputTbl[ii];
|
||||
wIdxDownRate = (WORD) ii;
|
||||
}
|
||||
}
|
||||
psNodeDBTable->wTxDataRate = wIdxDownRate;
|
||||
if (psNodeDBTable->uTxOk[MAX_RATE]) {
|
||||
if (psNodeDBTable->uTxOk[MAX_RATE] >
|
||||
(psNodeDBTable->uTxFail[MAX_RATE] * 4) ) {
|
||||
psNodeDBTable->wTxDataRate = wIdxUpRate;
|
||||
}
|
||||
}else { // adhoc, if uTxOk(total) =0 & uTxFail(total) = 0
|
||||
if (psNodeDBTable->uTxFail[MAX_RATE] == 0)
|
||||
psNodeDBTable->wTxDataRate = wIdxUpRate;
|
||||
}
|
||||
|
||||
if (pDevice->byBBType == BB_TYPE_11A) {
|
||||
if (psNodeDBTable->wTxDataRate <= RATE_11M)
|
||||
psNodeDBTable->wTxDataRate = RATE_6M;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uTxOk[MAX_RATE] %d, uTxFail[MAX_RATE]:%d\n",(int)psNodeDBTable->uTxOk[MAX_RATE], (int)psNodeDBTable->uTxFail[MAX_RATE]);
|
||||
s_vResetCounter(psNodeDBTable);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rate: %d, U:%d, D:%d\n", (int)psNodeDBTable->wTxDataRate, (int)wIdxUpRate, (int)wIdxDownRate);
|
||||
return;
|
||||
#else //mike fixed new: use differ-signal strength to control rate
|
||||
WORD wIdxUpRate = 0;
|
||||
BOOL bAutoRate[MAX_RATE] = {TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE};
|
||||
UINT ii;
|
||||
long ldBm;
|
||||
|
||||
if (pMgmt->eScanState != WMAC_NO_SCANNING) {
|
||||
// Don't do Fallback when scanning Channel
|
||||
return;
|
||||
}
|
||||
|
||||
for(ii=0;ii<MAX_RATE;ii++) {
|
||||
if (psNodeDBTable->wSuppRate & (0x0001<<ii)) {
|
||||
if (bAutoRate[ii] == TRUE) {
|
||||
wIdxUpRate = (WORD) ii;
|
||||
}
|
||||
} else {
|
||||
bAutoRate[ii] = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
RFvRSSITodBm(pDevice, (BYTE)(pDevice->uCurrRSSI), &ldBm);
|
||||
|
||||
if (ldBm > -55) {
|
||||
if ( psNodeDBTable->wSuppRate & (0x0001<<RATE_54M) ) //11a/g
|
||||
{
|
||||
psNodeDBTable->wTxDataRate = RATE_54M;
|
||||
}
|
||||
else{ //11b
|
||||
psNodeDBTable->wTxDataRate = RATE_11M;
|
||||
}
|
||||
}
|
||||
|
||||
if (wIdxUpRate == RATE_54M ) { //11a/g
|
||||
if (ldBm > -56 )
|
||||
psNodeDBTable->wTxDataRate = RATE_54M;
|
||||
else if (ldBm > -61 )
|
||||
psNodeDBTable->wTxDataRate = RATE_48M;
|
||||
else if (ldBm > -66 )
|
||||
psNodeDBTable->wTxDataRate = RATE_36M;
|
||||
else if (ldBm > -72 )
|
||||
psNodeDBTable->wTxDataRate = RATE_24M;
|
||||
else if (ldBm > -80 )
|
||||
psNodeDBTable->wTxDataRate = RATE_5M;
|
||||
else {
|
||||
psNodeDBTable->wTxDataRate = RATE_1M;
|
||||
//increasingVGA = TRUE;
|
||||
}
|
||||
}
|
||||
else { //11b
|
||||
if (ldBm > -65 )
|
||||
psNodeDBTable->wTxDataRate = RATE_11M;
|
||||
else if (ldBm > -75 )
|
||||
psNodeDBTable->wTxDataRate = RATE_5M;
|
||||
else
|
||||
psNodeDBTable->wTxDataRate = RATE_1M;
|
||||
}
|
||||
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* This routine is used to assemble available Rate IE.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice
|
||||
* Out:
|
||||
*
|
||||
* Return Value: None
|
||||
*
|
||||
-*/
|
||||
BYTE
|
||||
RATEuSetIE (
|
||||
IN PWLAN_IE_SUPP_RATES pSrcRates,
|
||||
IN PWLAN_IE_SUPP_RATES pDstRates,
|
||||
IN UINT uRateLen
|
||||
)
|
||||
{
|
||||
UINT ii, uu, uRateCnt = 0;
|
||||
|
||||
if ((pSrcRates == NULL) || (pDstRates == NULL))
|
||||
return 0;
|
||||
|
||||
if (pSrcRates->len == 0)
|
||||
return 0;
|
||||
|
||||
for (ii = 0; ii < uRateLen; ii++) {
|
||||
for (uu = 0; uu < pSrcRates->len; uu++) {
|
||||
if ((pSrcRates->abyRates[uu] & 0x7F) == acbyIERate[ii]) {
|
||||
pDstRates->abyRates[uRateCnt ++] = pSrcRates->abyRates[uu];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return (BYTE)uRateCnt;
|
||||
}
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: datarate.h
|
||||
*
|
||||
* Purpose: Handles the auto fallback & data rates functions
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: July 16, 2002
|
||||
*
|
||||
*/
|
||||
#ifndef __DATARATE_H__
|
||||
#define __DATARATE_H__
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
#define FALLBACK_PKT_COLLECT_TR_H 50 // pkts
|
||||
#define FALLBACK_PKT_COLLECT_TR_L 10 // pkts
|
||||
#define FALLBACK_POLL_SECOND 5 // 5 sec
|
||||
#define FALLBACK_RECOVER_SECOND 30 // 30 sec
|
||||
#define FALLBACK_THRESHOLD 15 // percent
|
||||
#define UPGRADE_THRESHOLD 5 // percent
|
||||
#define UPGRADE_CNT_THRD 3 // times
|
||||
#define RETRY_TIMES_THRD_H 2 // times
|
||||
#define RETRY_TIMES_THRD_L 1 // times
|
||||
|
||||
|
||||
#define RATE_1M 0
|
||||
#define RATE_2M 1
|
||||
#define RATE_5M 2
|
||||
#define RATE_11M 3
|
||||
#define RATE_6M 4
|
||||
#define RATE_9M 5
|
||||
#define RATE_12M 6
|
||||
#define RATE_18M 7
|
||||
#define RATE_24M 8
|
||||
#define RATE_36M 9
|
||||
#define RATE_48M 10
|
||||
#define RATE_54M 11
|
||||
#define RATE_AUTO 12
|
||||
#define MAX_RATE 12
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
RATEvParseMaxRate(
|
||||
IN PVOID pDeviceHandler,
|
||||
IN PWLAN_IE_SUPP_RATES pItemRates,
|
||||
IN PWLAN_IE_SUPP_RATES pItemExtRates,
|
||||
IN BOOL bUpdateBasicRate,
|
||||
OUT PWORD pwMaxBasicRate,
|
||||
OUT PWORD pwMaxSuppRate,
|
||||
OUT PWORD pwSuppRate,
|
||||
OUT PBYTE pbyTopCCKRate,
|
||||
OUT PBYTE pbyTopOFDMRate
|
||||
);
|
||||
|
||||
VOID
|
||||
RATEvTxRateFallBack(
|
||||
IN PVOID pDeviceHandler,
|
||||
IN PKnownNodeDB psNodeDBTable
|
||||
);
|
||||
|
||||
BYTE
|
||||
RATEuSetIE(
|
||||
IN PWLAN_IE_SUPP_RATES pSrcRates,
|
||||
IN PWLAN_IE_SUPP_RATES pDstRates,
|
||||
IN UINT uRateLen
|
||||
);
|
||||
|
||||
WORD
|
||||
RATEwGetRateIdx(
|
||||
IN BYTE byRate
|
||||
);
|
||||
|
||||
|
||||
BYTE
|
||||
DATARATEbyGetRateIdx(
|
||||
IN BYTE byRate
|
||||
);
|
||||
|
||||
|
||||
#endif //__DATARATE_H__
|
|
@ -0,0 +1,453 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: desc.h
|
||||
*
|
||||
* Purpose:The header file of descriptor
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __DESC_H__
|
||||
#define __DESC_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
// max transmit or receive buffer size
|
||||
#define CB_MAX_BUF_SIZE 2900U // max buffer size
|
||||
// NOTE: must be multiple of 4
|
||||
|
||||
#define CB_MAX_TX_BUF_SIZE CB_MAX_BUF_SIZE // max Tx buffer size
|
||||
#define CB_MAX_RX_BUF_SIZE_NORMAL CB_MAX_BUF_SIZE // max Rx buffer size when not use Multi-RD
|
||||
|
||||
#define CB_BEACON_BUF_SIZE 512U // default beacon buffer size
|
||||
|
||||
#define MAX_TOTAL_SIZE_WITH_ALL_HEADERS CB_MAX_BUF_SIZE
|
||||
|
||||
#define MAX_INTERRUPT_SIZE 32
|
||||
|
||||
|
||||
#define RX_BLOCKS 64 // form 0x60 to 0xA0
|
||||
#define TX_BLOCKS 32 // from 0xA0 to 0xC0
|
||||
|
||||
#define CB_MAX_RX_DESC 128 // max # of descriptor
|
||||
#define CB_MIN_RX_DESC 16 // min # of rx descriptor
|
||||
#define CB_MAX_TX_DESC 128 // max # of descriptor
|
||||
#define CB_MIN_TX_DESC 16 // min # of tx descriptor
|
||||
|
||||
#define CB_RD_NUM 64 // default # of RD
|
||||
#define CB_TD_NUM 64 // default # of TD
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Bits in the RSR register
|
||||
//
|
||||
#define RSR_ADDRBROAD 0x80 // 1000 0000
|
||||
#define RSR_ADDRMULTI 0x40 // 0100 0000
|
||||
#define RSR_ADDRUNI 0x00 // 0000 0000
|
||||
#define RSR_IVLDTYP 0x20 // 0010 0000 , invalid packet type
|
||||
#define RSR_IVLDLEN 0x10 // 0001 0000 , invalid len (> 2312 byte)
|
||||
#define RSR_BSSIDOK 0x08 // 0000 1000
|
||||
#define RSR_CRCOK 0x04 // 0000 0100
|
||||
#define RSR_BCNSSIDOK 0x02 // 0000 0010
|
||||
#define RSR_ADDROK 0x01 // 0000 0001
|
||||
|
||||
//
|
||||
// Bits in the new RSR register
|
||||
//
|
||||
#define NEWRSR_DECRYPTOK 0x10 // 0001 0000
|
||||
#define NEWRSR_CFPIND 0x08 // 0000 1000
|
||||
#define NEWRSR_HWUTSF 0x04 // 0000 0100
|
||||
#define NEWRSR_BCNHITAID 0x02 // 0000 0010
|
||||
#define NEWRSR_BCNHITAID0 0x01 // 0000 0001
|
||||
|
||||
|
||||
//
|
||||
// Bits in the TSR register
|
||||
//
|
||||
#define TSR_RETRYTMO 0x08 // 0000 1000
|
||||
#define TSR_TMO 0x04 // 0000 0100
|
||||
#define TSR_ACKDATA 0x02 // 0000 0010
|
||||
#define TSR_VALID 0x01 // 0000 0001
|
||||
|
||||
|
||||
#define CB_PROTOCOL_RESERVED_SECTION 16
|
||||
|
||||
|
||||
|
||||
// if retrys excess 15 times , tx will abort, and
|
||||
// if tx fifo underflow, tx will fail
|
||||
// we should try to resend it
|
||||
#define CB_MAX_TX_ABORT_RETRY 3
|
||||
|
||||
|
||||
#define FIFOCTL_AUTO_FB_1 0x1000 // 0001 0000 0000 0000
|
||||
#define FIFOCTL_AUTO_FB_0 0x0800 // 0000 1000 0000 0000
|
||||
#define FIFOCTL_GRPACK 0x0400 // 0000 0100 0000 0000
|
||||
#define FIFOCTL_11GA 0x0300 // 0000 0011 0000 0000
|
||||
#define FIFOCTL_11GB 0x0200 // 0000 0010 0000 0000
|
||||
#define FIFOCTL_11B 0x0100 // 0000 0001 0000 0000
|
||||
#define FIFOCTL_11A 0x0000 // 0000 0000 0000 0000
|
||||
#define FIFOCTL_RTS 0x0080 // 0000 0000 1000 0000
|
||||
#define FIFOCTL_ISDMA0 0x0040 // 0000 0000 0100 0000
|
||||
#define FIFOCTL_GENINT 0x0020 // 0000 0000 0010 0000
|
||||
#define FIFOCTL_TMOEN 0x0010 // 0000 0000 0001 0000
|
||||
#define FIFOCTL_LRETRY 0x0008 // 0000 0000 0000 1000
|
||||
#define FIFOCTL_CRCDIS 0x0004 // 0000 0000 0000 0100
|
||||
#define FIFOCTL_NEEDACK 0x0002 // 0000 0000 0000 0010
|
||||
#define FIFOCTL_LHEAD 0x0001 // 0000 0000 0000 0001
|
||||
|
||||
//WMAC definition Frag Control
|
||||
#define FRAGCTL_AES 0x0300 // 0000 0011 0000 0000
|
||||
#define FRAGCTL_TKIP 0x0200 // 0000 0010 0000 0000
|
||||
#define FRAGCTL_LEGACY 0x0100 // 0000 0001 0000 0000
|
||||
#define FRAGCTL_NONENCRYPT 0x0000 // 0000 0000 0000 0000
|
||||
//#define FRAGCTL_AC3 0x000C // 0000 0000 0000 1100
|
||||
//#define FRAGCTL_AC2 0x0008 // 0000 0000 0000 1000
|
||||
//#define FRAGCTL_AC1 0x0004 // 0000 0000 0000 0100
|
||||
//#define FRAGCTL_AC0 0x0000 // 0000 0000 0000 0000
|
||||
#define FRAGCTL_ENDFRAG 0x0003 // 0000 0000 0000 0011
|
||||
#define FRAGCTL_MIDFRAG 0x0002 // 0000 0000 0000 0010
|
||||
#define FRAGCTL_STAFRAG 0x0001 // 0000 0000 0000 0001
|
||||
#define FRAGCTL_NONFRAG 0x0000 // 0000 0000 0000 0000
|
||||
|
||||
|
||||
//#define TYPE_AC0DMA 0
|
||||
//#define TYPE_TXDMA0 1
|
||||
#define TYPE_TXDMA0 0
|
||||
#define TYPE_AC0DMA 1
|
||||
#define TYPE_ATIMDMA 2
|
||||
#define TYPE_SYNCDMA 3
|
||||
#define TYPE_MAXTD 2
|
||||
|
||||
#define TYPE_BEACONDMA 4
|
||||
|
||||
#define TYPE_RXDMA0 0
|
||||
#define TYPE_RXDMA1 1
|
||||
#define TYPE_MAXRD 2
|
||||
|
||||
|
||||
|
||||
// TD_INFO flags control bit
|
||||
#define TD_FLAGS_NETIF_SKB 0x01 // check if need release skb
|
||||
#define TD_FLAGS_PRIV_SKB 0x02 // check if called from private skb(hostap)
|
||||
#define TD_FLAGS_PS_RETRY 0x04 // check if PS STA frame re-transmit
|
||||
//#define TD_FLAGS_NETIF_SKB 0x04
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
|
||||
//
|
||||
// RsvTime buffer header
|
||||
//
|
||||
typedef struct tagSRrvTime_gRTS {
|
||||
WORD wRTSTxRrvTime_ba;
|
||||
WORD wRTSTxRrvTime_aa;
|
||||
WORD wRTSTxRrvTime_bb;
|
||||
WORD wReserved;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
}__attribute__ ((__packed__))
|
||||
SRrvTime_gRTS, DEF* PSRrvTime_gRTS;
|
||||
typedef const SRrvTime_gRTS DEF* PCSRrvTime_gRTS;
|
||||
|
||||
typedef struct tagSRrvTime_gCTS {
|
||||
WORD wCTSTxRrvTime_ba;
|
||||
WORD wReserved;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
}__attribute__ ((__packed__))
|
||||
SRrvTime_gCTS, DEF* PSRrvTime_gCTS;
|
||||
typedef const SRrvTime_gCTS DEF* PCSRrvTime_gCTS;
|
||||
|
||||
typedef struct tagSRrvTime_ab {
|
||||
WORD wRTSTxRrvTime;
|
||||
WORD wTxRrvTime;
|
||||
}__attribute__ ((__packed__))
|
||||
SRrvTime_ab, DEF* PSRrvTime_ab;
|
||||
typedef const SRrvTime_ab DEF* PCSRrvTime_ab;
|
||||
|
||||
typedef struct tagSRrvTime_atim {
|
||||
WORD wCTSTxRrvTime_ba;
|
||||
WORD wTxRrvTime_a;
|
||||
}__attribute__ ((__packed__))
|
||||
SRrvTime_atim, DEF* PSRrvTime_atim;
|
||||
typedef const SRrvTime_atim DEF* PCSRrvTime_atim;
|
||||
|
||||
//
|
||||
// RTS buffer header
|
||||
//
|
||||
typedef struct tagSRTSData {
|
||||
WORD wFrameControl;
|
||||
WORD wDurationID;
|
||||
BYTE abyRA[U_ETHER_ADDR_LEN];
|
||||
BYTE abyTA[U_ETHER_ADDR_LEN];
|
||||
}__attribute__ ((__packed__))
|
||||
SRTSData, DEF* PSRTSData;
|
||||
typedef const SRTSData DEF* PCSRTSData;
|
||||
|
||||
typedef struct tagSRTS_g {
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_ba;
|
||||
WORD wDuration_aa;
|
||||
WORD wDuration_bb;
|
||||
WORD wReserved;
|
||||
SRTSData Data;
|
||||
}__attribute__ ((__packed__))
|
||||
SRTS_g, DEF* PSRTS_g;
|
||||
typedef const SRTS_g DEF* PCSRTS_g;
|
||||
|
||||
|
||||
typedef struct tagSRTS_g_FB {
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_ba;
|
||||
WORD wDuration_aa;
|
||||
WORD wDuration_bb;
|
||||
WORD wReserved;
|
||||
WORD wRTSDuration_ba_f0;
|
||||
WORD wRTSDuration_aa_f0;
|
||||
WORD wRTSDuration_ba_f1;
|
||||
WORD wRTSDuration_aa_f1;
|
||||
SRTSData Data;
|
||||
}__attribute__ ((__packed__))
|
||||
SRTS_g_FB, DEF* PSRTS_g_FB;
|
||||
typedef const SRTS_g_FB DEF* PCSRTS_g_FB;
|
||||
|
||||
|
||||
typedef struct tagSRTS_ab {
|
||||
BYTE bySignalField;
|
||||
BYTE byServiceField;
|
||||
WORD wTransmitLength;
|
||||
WORD wDuration;
|
||||
WORD wReserved;
|
||||
SRTSData Data;
|
||||
}__attribute__ ((__packed__))
|
||||
SRTS_ab, DEF* PSRTS_ab;
|
||||
typedef const SRTS_ab DEF* PCSRTS_ab;
|
||||
|
||||
|
||||
typedef struct tagSRTS_a_FB {
|
||||
BYTE bySignalField;
|
||||
BYTE byServiceField;
|
||||
WORD wTransmitLength;
|
||||
WORD wDuration;
|
||||
WORD wReserved;
|
||||
WORD wRTSDuration_f0;
|
||||
WORD wRTSDuration_f1;
|
||||
SRTSData Data;
|
||||
}__attribute__ ((__packed__))
|
||||
SRTS_a_FB, DEF* PSRTS_a_FB;
|
||||
typedef const SRTS_a_FB DEF* PCSRTS_a_FB;
|
||||
|
||||
|
||||
//
|
||||
// CTS buffer header
|
||||
//
|
||||
typedef struct tagSCTSData {
|
||||
WORD wFrameControl;
|
||||
WORD wDurationID;
|
||||
BYTE abyRA[U_ETHER_ADDR_LEN];
|
||||
WORD wReserved;
|
||||
}__attribute__ ((__packed__))
|
||||
SCTSData, DEF* PSCTSData;
|
||||
|
||||
typedef struct tagSCTS {
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
WORD wDuration_ba;
|
||||
WORD wReserved;
|
||||
SCTSData Data;
|
||||
}__attribute__ ((__packed__))
|
||||
SCTS, DEF* PSCTS;
|
||||
typedef const SCTS DEF* PCSCTS;
|
||||
|
||||
typedef struct tagSCTS_FB {
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
WORD wDuration_ba;
|
||||
WORD wReserved;
|
||||
WORD wCTSDuration_ba_f0;
|
||||
WORD wCTSDuration_ba_f1;
|
||||
SCTSData Data;
|
||||
}__attribute__ ((__packed__))
|
||||
SCTS_FB, DEF* PSCTS_FB;
|
||||
typedef const SCTS_FB DEF* PCSCTS_FB;
|
||||
|
||||
|
||||
//
|
||||
// Tx FIFO header
|
||||
//
|
||||
typedef struct tagSTxBufHead {
|
||||
DWORD adwTxKey[4];
|
||||
WORD wFIFOCtl;
|
||||
WORD wTimeStamp;
|
||||
WORD wFragCtl;
|
||||
WORD wReserved;
|
||||
}__attribute__ ((__packed__))
|
||||
STxBufHead, DEF* PSTxBufHead;
|
||||
typedef const STxBufHead DEF* PCSTxBufHead;
|
||||
|
||||
typedef struct tagSTxShortBufHead {
|
||||
WORD wFIFOCtl;
|
||||
WORD wTimeStamp;
|
||||
}__attribute__ ((__packed__))
|
||||
STxShortBufHead, DEF* PSTxShortBufHead;
|
||||
typedef const STxShortBufHead DEF* PCSTxShortBufHead;
|
||||
|
||||
//
|
||||
// Tx data header
|
||||
//
|
||||
typedef struct tagSTxDataHead_g {
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
}__attribute__ ((__packed__))
|
||||
STxDataHead_g, DEF* PSTxDataHead_g;
|
||||
typedef const STxDataHead_g DEF* PCSTxDataHead_g;
|
||||
|
||||
typedef struct tagSTxDataHead_g_FB {
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wDuration_a_f0;
|
||||
WORD wDuration_a_f1;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
}__attribute__ ((__packed__))
|
||||
STxDataHead_g_FB, DEF* PSTxDataHead_g_FB;
|
||||
typedef const STxDataHead_g_FB DEF* PCSTxDataHead_g_FB;
|
||||
|
||||
|
||||
typedef struct tagSTxDataHead_ab {
|
||||
BYTE bySignalField;
|
||||
BYTE byServiceField;
|
||||
WORD wTransmitLength;
|
||||
WORD wDuration;
|
||||
WORD wTimeStampOff;
|
||||
}__attribute__ ((__packed__))
|
||||
STxDataHead_ab, DEF* PSTxDataHead_ab;
|
||||
typedef const STxDataHead_ab DEF* PCSTxDataHead_ab;
|
||||
|
||||
|
||||
typedef struct tagSTxDataHead_a_FB {
|
||||
BYTE bySignalField;
|
||||
BYTE byServiceField;
|
||||
WORD wTransmitLength;
|
||||
WORD wDuration;
|
||||
WORD wTimeStampOff;
|
||||
WORD wDuration_f0;
|
||||
WORD wDuration_f1;
|
||||
}__attribute__ ((__packed__))
|
||||
STxDataHead_a_FB, DEF* PSTxDataHead_a_FB;
|
||||
typedef const STxDataHead_a_FB DEF* PCSTxDataHead_a_FB;
|
||||
|
||||
//
|
||||
// MICHDR data header
|
||||
//
|
||||
typedef struct tagSMICHDRHead {
|
||||
DWORD adwHDR0[4];
|
||||
DWORD adwHDR1[4];
|
||||
DWORD adwHDR2[4];
|
||||
}__attribute__ ((__packed__))
|
||||
SMICHDRHead, DEF* PSMICHDRHead;
|
||||
typedef const SMICHDRHead DEF* PCSMICHDRHead;
|
||||
|
||||
typedef struct tagSBEACONCtl {
|
||||
DWORD BufReady : 1;
|
||||
DWORD TSF : 15;
|
||||
DWORD BufLen : 11;
|
||||
DWORD Reserved : 5;
|
||||
}__attribute__ ((__packed__))
|
||||
SBEACONCtl;
|
||||
|
||||
|
||||
typedef struct tagSSecretKey {
|
||||
DWORD dwLowDword;
|
||||
BYTE byHighByte;
|
||||
}__attribute__ ((__packed__))
|
||||
SSecretKey;
|
||||
|
||||
typedef struct tagSKeyEntry {
|
||||
BYTE abyAddrHi[2];
|
||||
WORD wKCTL;
|
||||
BYTE abyAddrLo[4];
|
||||
DWORD dwKey0[4];
|
||||
DWORD dwKey1[4];
|
||||
DWORD dwKey2[4];
|
||||
DWORD dwKey3[4];
|
||||
DWORD dwKey4[4];
|
||||
}__attribute__ ((__packed__))
|
||||
SKeyEntry;
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __DESC_H__
|
||||
|
|
@ -0,0 +1,988 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: device.h
|
||||
*
|
||||
* Purpose: MAC Data structure
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: Mar 17, 1997
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __DEVICE_H__
|
||||
#define __DEVICE_H__
|
||||
|
||||
#ifdef MODULE
|
||||
#ifdef MODVERSIONS
|
||||
#include <linux/modversions.h>
|
||||
#endif /* MODVERSIONS */
|
||||
#include <linux/module.h>
|
||||
#endif /* MODULE */
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/if.h>
|
||||
#include <linux/rtnetlink.h>//James
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
|
||||
#include <linux/config.h>
|
||||
#endif
|
||||
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/inetdevice.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/signal.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
#ifdef SIOCETHTOOL
|
||||
#define DEVICE_ETHTOOL_IOCTL_SUPPORT
|
||||
#include <linux/ethtool.h>
|
||||
#else
|
||||
#undef DEVICE_ETHTOOL_IOCTL_SUPPORT
|
||||
#endif
|
||||
/* Include Wireless Extension definition and check version - Jean II */
|
||||
#include <linux/wireless.h>
|
||||
#if WIRELESS_EXT > 12
|
||||
#include <net/iw_handler.h> // New driver API
|
||||
#endif /* WIRELESS_EXT > 12 */
|
||||
|
||||
//2008-0409-07, <Add> by Einsn Liu
|
||||
#if WIRELESS_EXT > 17
|
||||
#ifndef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
|
||||
#define WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//2007-0920-01<Add>by MikeLiu
|
||||
#ifndef SndEvt_ToAPI
|
||||
#define SndEvt_ToAPI
|
||||
//please copy below macro to driver_event.c for API
|
||||
#define RT_INSMOD_EVENT_FLAG 0x0101
|
||||
#define RT_UPDEV_EVENT_FLAG 0x0102
|
||||
#define RT_DISCONNECTED_EVENT_FLAG 0x0103
|
||||
#define RT_WPACONNECTED_EVENT_FLAG 0x0104
|
||||
#define RT_DOWNDEV_EVENT_FLAG 0x0105
|
||||
#define RT_RMMOD_EVENT_FLAG 0x0106
|
||||
#endif
|
||||
|
||||
//
|
||||
// device specific
|
||||
//
|
||||
|
||||
#if !defined(_KCOMPAT_H)
|
||||
#include "kcompat.h"
|
||||
#endif
|
||||
|
||||
#if !defined(__DEVICE_CONFIG_H)
|
||||
#include "device_cfg.h"
|
||||
#endif
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__80211HDR_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
#if !defined(__WMGR_H__)
|
||||
#include "wmgr.h"
|
||||
#endif
|
||||
#if !defined(__WCMD_H__)
|
||||
#include "wcmd.h"
|
||||
#endif
|
||||
#if !defined(__MIB_H__)
|
||||
#include "mib.h"
|
||||
#endif
|
||||
#if !defined(__SROM_H__)
|
||||
#include "srom.h"
|
||||
#endif
|
||||
#if !defined(__RC4_H__)
|
||||
#include "rc4.h"
|
||||
#endif
|
||||
#if !defined(__TPCI_H__)
|
||||
#include "tpci.h"
|
||||
#endif
|
||||
#if !defined(__DESC_H__)
|
||||
#include "desc.h"
|
||||
#endif
|
||||
#if !defined(__KEY_H__)
|
||||
#include "key.h"
|
||||
#endif
|
||||
#if !defined(__CARD_H__)
|
||||
#include "card.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
#define VNT_USB_VENDOR_ID 0x160A
|
||||
#define VNT_USB_PRODUCT_ID 0x3184
|
||||
|
||||
#define MAC_MAX_CONTEXT_REG (256+128)
|
||||
|
||||
#define MAX_MULTICAST_ADDRESS_NUM 32
|
||||
#define MULTICAST_ADDRESS_LIST_SIZE (MAX_MULTICAST_ADDRESS_NUM * U_ETHER_ADDR_LEN)
|
||||
|
||||
|
||||
//#define OP_MODE_INFRASTRUCTURE 0
|
||||
//#define OP_MODE_ADHOC 1
|
||||
//#define OP_MODE_AP 2
|
||||
|
||||
#define DUPLICATE_RX_CACHE_LENGTH 5
|
||||
|
||||
#define NUM_KEY_ENTRY 11
|
||||
|
||||
#define TX_WEP_NONE 0
|
||||
#define TX_WEP_OTF 1
|
||||
#define TX_WEP_SW 2
|
||||
#define TX_WEP_SWOTP 3
|
||||
#define TX_WEP_OTPSW 4
|
||||
#define TX_WEP_SW232 5
|
||||
|
||||
#define KEYSEL_WEP40 0
|
||||
#define KEYSEL_WEP104 1
|
||||
#define KEYSEL_TKIP 2
|
||||
#define KEYSEL_CCMP 3
|
||||
|
||||
|
||||
|
||||
#define AUTO_FB_NONE 0
|
||||
#define AUTO_FB_0 1
|
||||
#define AUTO_FB_1 2
|
||||
|
||||
#define FB_RATE0 0
|
||||
#define FB_RATE1 1
|
||||
|
||||
// Antenna Mode
|
||||
#define ANT_A 0
|
||||
#define ANT_B 1
|
||||
#define ANT_DIVERSITY 2
|
||||
#define ANT_RXD_TXA 3
|
||||
#define ANT_RXD_TXB 4
|
||||
#define ANT_UNKNOWN 0xFF
|
||||
#define ANT_TXA 0
|
||||
#define ANT_TXB 1
|
||||
#define ANT_RXA 2
|
||||
#define ANT_RXB 3
|
||||
|
||||
|
||||
#define MAXCHECKHANGCNT 4
|
||||
|
||||
//Packet type
|
||||
#define TX_PKT_UNI 0x00
|
||||
#define TX_PKT_MULTI 0x01
|
||||
#define TX_PKT_BROAD 0x02
|
||||
|
||||
#define BB_VGA_LEVEL 4
|
||||
#define BB_VGA_CHANGE_THRESHOLD 3
|
||||
|
||||
|
||||
|
||||
#ifndef RUN_AT
|
||||
#define RUN_AT(x) (jiffies+(x))
|
||||
#endif
|
||||
|
||||
// DMA related
|
||||
#define RESERV_AC0DMA 4
|
||||
|
||||
#define PRIVATE_Message 0
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
#define DBG_PRT(l, p, args...) {if (l<=msglevel) printk( p ,##args);}
|
||||
#define PRINT_K(p, args...) {if (PRIVATE_Message) printk( p ,##args);}
|
||||
|
||||
typedef enum __device_msg_level {
|
||||
MSG_LEVEL_ERR=0, //Errors that will cause abnormal operation.
|
||||
MSG_LEVEL_NOTICE=1, //Some errors need users to be notified.
|
||||
MSG_LEVEL_INFO=2, //Normal message.
|
||||
MSG_LEVEL_VERBOSE=3, //Will report all trival errors.
|
||||
MSG_LEVEL_DEBUG=4 //Only for debug purpose.
|
||||
} DEVICE_MSG_LEVEL, *PDEVICE_MSG_LEVEL;
|
||||
|
||||
typedef enum __device_init_type {
|
||||
DEVICE_INIT_COLD=0, // cold init
|
||||
DEVICE_INIT_RESET, // reset init or Dx to D0 power remain init
|
||||
DEVICE_INIT_DXPL // Dx to D0 power lost init
|
||||
} DEVICE_INIT_TYPE, *PDEVICE_INIT_TYPE;
|
||||
|
||||
|
||||
//USB
|
||||
|
||||
//
|
||||
// Enum of context types for SendPacket
|
||||
//
|
||||
typedef enum _CONTEXT_TYPE {
|
||||
CONTEXT_DATA_PACKET = 1,
|
||||
CONTEXT_MGMT_PACKET
|
||||
} CONTEXT_TYPE;
|
||||
|
||||
|
||||
|
||||
|
||||
// RCB (Receive Control Block)
|
||||
typedef struct _RCB
|
||||
{
|
||||
PVOID Next;
|
||||
LONG Ref;
|
||||
PVOID pDevice;
|
||||
struct urb *pUrb;
|
||||
SRxMgmtPacket sMngPacket;
|
||||
struct sk_buff* skb;
|
||||
BOOL bBoolInUse;
|
||||
|
||||
} RCB, *PRCB;
|
||||
|
||||
|
||||
// used to track bulk out irps
|
||||
typedef struct _USB_SEND_CONTEXT {
|
||||
PVOID pDevice;
|
||||
struct sk_buff *pPacket;
|
||||
struct urb *pUrb;
|
||||
UINT uBufLen;
|
||||
CONTEXT_TYPE Type;
|
||||
SEthernetHeader sEthHeader;
|
||||
PVOID Next;
|
||||
BOOL bBoolInUse;
|
||||
UCHAR Data[MAX_TOTAL_SIZE_WITH_ALL_HEADERS];
|
||||
} USB_SEND_CONTEXT, *PUSB_SEND_CONTEXT;
|
||||
|
||||
|
||||
//structure got from configuration file as user desired default setting.
|
||||
typedef struct _DEFAULT_CONFIG{
|
||||
INT ZoneType;
|
||||
INT eConfigMode;
|
||||
INT eAuthenMode; //open/wep/wpa
|
||||
INT bShareKeyAlgorithm; //open-open/open-sharekey/wep-sharekey
|
||||
INT keyidx; //wepkey index
|
||||
INT eEncryptionStatus;
|
||||
|
||||
}DEFAULT_CONFIG,*PDEFAULT_CONFIG;
|
||||
|
||||
//
|
||||
// Structure to keep track of usb interrupt packets
|
||||
//
|
||||
typedef struct {
|
||||
UINT uDataLen;
|
||||
PBYTE pDataBuf;
|
||||
// struct urb *pUrb;
|
||||
BOOL bInUse;
|
||||
} INT_BUFFER, *PINT_BUFFER;
|
||||
|
||||
|
||||
|
||||
//0:11A 1:11B 2:11G
|
||||
typedef enum _VIA_BB_TYPE
|
||||
{
|
||||
BB_TYPE_11A=0,
|
||||
BB_TYPE_11B,
|
||||
BB_TYPE_11G
|
||||
} VIA_BB_TYPE, *PVIA_BB_TYPE;
|
||||
|
||||
//0:11a,1:11b,2:11gb(only CCK in BasicRate),3:11ga(OFDM in Basic Rate)
|
||||
typedef enum _VIA_PKT_TYPE
|
||||
{
|
||||
PK_TYPE_11A=0,
|
||||
PK_TYPE_11B,
|
||||
PK_TYPE_11GB,
|
||||
PK_TYPE_11GA
|
||||
} VIA_PKT_TYPE, *PVIA_PKT_TYPE;
|
||||
|
||||
|
||||
|
||||
|
||||
//++ NDIS related
|
||||
|
||||
#define NDIS_STATUS int
|
||||
#define NTSTATUS int
|
||||
|
||||
typedef enum __DEVICE_NDIS_STATUS {
|
||||
STATUS_SUCCESS=0,
|
||||
STATUS_FAILURE,
|
||||
STATUS_RESOURCES,
|
||||
STATUS_PENDING,
|
||||
} DEVICE_NDIS_STATUS, *PDEVICE_NDIS_STATUS;
|
||||
|
||||
|
||||
#define MAX_BSSIDINFO_4_PMKID 16
|
||||
#define MAX_PMKIDLIST 5
|
||||
//Flags for PMKID Candidate list structure
|
||||
#define NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED 0x01
|
||||
|
||||
// PMKID Structures
|
||||
typedef UCHAR NDIS_802_11_PMKID_VALUE[16];
|
||||
|
||||
|
||||
typedef enum _NDIS_802_11_WEP_STATUS
|
||||
{
|
||||
Ndis802_11WEPEnabled,
|
||||
Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
|
||||
Ndis802_11WEPDisabled,
|
||||
Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
|
||||
Ndis802_11WEPKeyAbsent,
|
||||
Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
|
||||
Ndis802_11WEPNotSupported,
|
||||
Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
|
||||
Ndis802_11Encryption2Enabled,
|
||||
Ndis802_11Encryption2KeyAbsent,
|
||||
Ndis802_11Encryption3Enabled,
|
||||
Ndis802_11Encryption3KeyAbsent
|
||||
} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
|
||||
NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
|
||||
|
||||
|
||||
typedef enum _NDIS_802_11_STATUS_TYPE
|
||||
{
|
||||
Ndis802_11StatusType_Authentication,
|
||||
Ndis802_11StatusType_MediaStreamMode,
|
||||
Ndis802_11StatusType_PMKID_CandidateList,
|
||||
Ndis802_11StatusTypeMax // not a real type, defined as an upper bound
|
||||
} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE;
|
||||
|
||||
//Added new types for PMKID Candidate lists.
|
||||
typedef struct _PMKID_CANDIDATE {
|
||||
NDIS_802_11_MAC_ADDRESS BSSID;
|
||||
ULONG Flags;
|
||||
} PMKID_CANDIDATE, *PPMKID_CANDIDATE;
|
||||
|
||||
|
||||
typedef struct _BSSID_INFO
|
||||
{
|
||||
NDIS_802_11_MAC_ADDRESS BSSID;
|
||||
NDIS_802_11_PMKID_VALUE PMKID;
|
||||
} BSSID_INFO, *PBSSID_INFO;
|
||||
|
||||
typedef struct tagSPMKID {
|
||||
ULONG Length;
|
||||
ULONG BSSIDInfoCount;
|
||||
BSSID_INFO BSSIDInfo[MAX_BSSIDINFO_4_PMKID];
|
||||
} SPMKID, *PSPMKID;
|
||||
|
||||
typedef struct tagSPMKIDCandidateEvent {
|
||||
NDIS_802_11_STATUS_TYPE StatusType;
|
||||
ULONG Version; // Version of the structure
|
||||
ULONG NumCandidates; // No. of pmkid candidates
|
||||
PMKID_CANDIDATE CandidateList[MAX_PMKIDLIST];
|
||||
} SPMKIDCandidateEvent, DEF* PSPMKIDCandidateEvent;
|
||||
|
||||
//--
|
||||
|
||||
//++ 802.11h related
|
||||
#define MAX_QUIET_COUNT 8
|
||||
|
||||
typedef struct tagSQuietControl {
|
||||
BOOL bEnable;
|
||||
DWORD dwStartTime;
|
||||
BYTE byPeriod;
|
||||
WORD wDuration;
|
||||
} SQuietControl, DEF* PSQuietControl;
|
||||
|
||||
//--
|
||||
|
||||
|
||||
// The receive duplicate detection cache entry
|
||||
typedef struct tagSCacheEntry{
|
||||
WORD wFmSequence;
|
||||
BYTE abyAddr2[U_ETHER_ADDR_LEN];
|
||||
WORD wFrameCtl;
|
||||
} SCacheEntry, *PSCacheEntry;
|
||||
|
||||
typedef struct tagSCache{
|
||||
/* The receive cache is updated circularly. The next entry to be written is
|
||||
* indexed by the "InPtr".
|
||||
*/
|
||||
UINT uInPtr; // Place to use next
|
||||
SCacheEntry asCacheEntry[DUPLICATE_RX_CACHE_LENGTH];
|
||||
} SCache, *PSCache;
|
||||
|
||||
#define CB_MAX_RX_FRAG 64
|
||||
// DeFragment Control Block, used for collecting fragments prior to reassembly
|
||||
typedef struct tagSDeFragControlBlock
|
||||
{
|
||||
WORD wSequence;
|
||||
WORD wFragNum;
|
||||
BYTE abyAddr2[U_ETHER_ADDR_LEN];
|
||||
UINT uLifetime;
|
||||
struct sk_buff* skb;
|
||||
PBYTE pbyRxBuffer;
|
||||
UINT cbFrameLength;
|
||||
BOOL bInUse;
|
||||
} SDeFragControlBlock, DEF* PSDeFragControlBlock;
|
||||
|
||||
|
||||
|
||||
//flags for options
|
||||
#define DEVICE_FLAGS_UNPLUG 0x00000001UL
|
||||
#define DEVICE_FLAGS_PREAMBLE_TYPE 0x00000002UL
|
||||
#define DEVICE_FLAGS_OP_MODE 0x00000004UL
|
||||
#define DEVICE_FLAGS_PS_MODE 0x00000008UL
|
||||
#define DEVICE_FLAGS_80211h_MODE 0x00000010UL
|
||||
|
||||
//flags for driver status
|
||||
#define DEVICE_FLAGS_OPENED 0x00010000UL
|
||||
#define DEVICE_FLAGS_WOL_ENABLED 0x00080000UL
|
||||
//flags for capbilities
|
||||
#define DEVICE_FLAGS_TX_ALIGN 0x01000000UL
|
||||
#define DEVICE_FLAGS_HAVE_CAM 0x02000000UL
|
||||
#define DEVICE_FLAGS_FLOW_CTRL 0x04000000UL
|
||||
|
||||
//flags for MII status
|
||||
#define DEVICE_LINK_FAIL 0x00000001UL
|
||||
#define DEVICE_SPEED_10 0x00000002UL
|
||||
#define DEVICE_SPEED_100 0x00000004UL
|
||||
#define DEVICE_SPEED_1000 0x00000008UL
|
||||
#define DEVICE_DUPLEX_FULL 0x00000010UL
|
||||
#define DEVICE_AUTONEG_ENABLE 0x00000020UL
|
||||
#define DEVICE_FORCED_BY_EEPROM 0x00000040UL
|
||||
//for device_set_media_duplex
|
||||
#define DEVICE_LINK_CHANGE 0x00000001UL
|
||||
|
||||
|
||||
typedef struct __device_opt {
|
||||
int nRxDescs0; //Number of RX descriptors0
|
||||
int nTxDescs0; //Number of TX descriptors 0, 1, 2, 3
|
||||
int rts_thresh; //rts threshold
|
||||
int frag_thresh;
|
||||
int OpMode;
|
||||
int data_rate;
|
||||
int channel_num;
|
||||
int short_retry;
|
||||
int long_retry;
|
||||
int bbp_type;
|
||||
U32 flags;
|
||||
} OPTIONS, *POPTIONS;
|
||||
|
||||
|
||||
typedef struct __device_info {
|
||||
|
||||
// netdev
|
||||
struct usb_device* usb;
|
||||
struct net_device* dev;
|
||||
struct net_device_stats stats;
|
||||
|
||||
OPTIONS sOpts;
|
||||
|
||||
struct tasklet_struct CmdWorkItem;
|
||||
struct tasklet_struct EventWorkItem;
|
||||
struct tasklet_struct ReadWorkItem;
|
||||
struct tasklet_struct RxMngWorkItem;
|
||||
|
||||
U32 rx_buf_sz;
|
||||
int multicast_limit;
|
||||
BYTE byRxMode;
|
||||
|
||||
spinlock_t lock;
|
||||
|
||||
U32 rx_bytes;
|
||||
|
||||
BYTE byRevId;
|
||||
|
||||
U32 flags;
|
||||
ULONG Flags;
|
||||
|
||||
SCache sDupRxCache;
|
||||
|
||||
SDeFragControlBlock sRxDFCB[CB_MAX_RX_FRAG];
|
||||
UINT cbDFCB;
|
||||
UINT cbFreeDFCB;
|
||||
UINT uCurrentDFCBIdx;
|
||||
|
||||
// +++USB
|
||||
|
||||
struct urb *pControlURB;
|
||||
struct urb *pInterruptURB;
|
||||
struct usb_ctrlrequest sUsbCtlRequest;
|
||||
|
||||
UINT int_interval;
|
||||
//
|
||||
// Variables to track resources for the BULK In Pipe
|
||||
//
|
||||
PRCB pRCBMem;
|
||||
PRCB apRCB[CB_MAX_RX_DESC];
|
||||
UINT cbRD;
|
||||
PRCB FirstRecvFreeList;
|
||||
PRCB LastRecvFreeList;
|
||||
UINT NumRecvFreeList;
|
||||
PRCB FirstRecvMngList;
|
||||
PRCB LastRecvMngList;
|
||||
UINT NumRecvMngList;
|
||||
BOOL bIsRxWorkItemQueued;
|
||||
BOOL bIsRxMngWorkItemQueued;
|
||||
ULONG ulRcvRefCount; // number of packets that have not been returned back
|
||||
|
||||
//
|
||||
// Variables to track resources for the BULK Out Pipe
|
||||
//
|
||||
|
||||
PUSB_SEND_CONTEXT apTD[CB_MAX_TX_DESC];
|
||||
UINT cbTD;
|
||||
|
||||
//
|
||||
// Variables to track resources for the Interript In Pipe
|
||||
//
|
||||
INT_BUFFER intBuf;
|
||||
BOOL fKillEventPollingThread;
|
||||
BOOL bEventAvailable;
|
||||
|
||||
|
||||
//default config from file by user setting
|
||||
DEFAULT_CONFIG config_file;
|
||||
|
||||
|
||||
//
|
||||
// Statistic for USB
|
||||
// protect with spinlock
|
||||
ULONG ulBulkInPosted;
|
||||
ULONG ulBulkInError;
|
||||
ULONG ulBulkInContCRCError;
|
||||
ULONG ulBulkInBytesRead;
|
||||
|
||||
ULONG ulBulkOutPosted;
|
||||
ULONG ulBulkOutError;
|
||||
ULONG ulBulkOutContCRCError;
|
||||
ULONG ulBulkOutBytesWrite;
|
||||
|
||||
ULONG ulIntInPosted;
|
||||
ULONG ulIntInError;
|
||||
ULONG ulIntInContCRCError;
|
||||
ULONG ulIntInBytesRead;
|
||||
|
||||
|
||||
// Version control
|
||||
WORD wFirmwareVersion;
|
||||
BYTE byLocalID;
|
||||
BYTE byRFType;
|
||||
BYTE byBBRxConf;
|
||||
|
||||
|
||||
BYTE byZoneType;
|
||||
BOOL bZoneRegExist;
|
||||
|
||||
BYTE byOriginalZonetype;
|
||||
|
||||
BOOL bLinkPass; // link status: OK or fail
|
||||
BYTE abyCurrentNetAddr[U_ETHER_ADDR_LEN];
|
||||
BYTE abyPermanentNetAddr[U_ETHER_ADDR_LEN];
|
||||
// SW network address
|
||||
// BYTE abySoftwareNetAddr[U_ETHER_ADDR_LEN];
|
||||
BOOL bExistSWNetAddr;
|
||||
|
||||
// Adapter statistics
|
||||
SStatCounter scStatistic;
|
||||
// 802.11 counter
|
||||
SDot11Counters s802_11Counter;
|
||||
|
||||
//
|
||||
// Maintain statistical debug info.
|
||||
//
|
||||
ULONG packetsReceived;
|
||||
ULONG packetsReceivedDropped;
|
||||
ULONG packetsReceivedOverflow;
|
||||
ULONG packetsSent;
|
||||
ULONG packetsSentDropped;
|
||||
ULONG SendContextsInUse;
|
||||
ULONG RcvBuffersInUse;
|
||||
|
||||
|
||||
// 802.11 management
|
||||
SMgmtObject sMgmtObj;
|
||||
|
||||
QWORD qwCurrTSF;
|
||||
UINT cbBulkInMax;
|
||||
BOOL bPSRxBeacon;
|
||||
|
||||
// 802.11 MAC specific
|
||||
UINT uCurrRSSI;
|
||||
BYTE byCurrSQ;
|
||||
|
||||
|
||||
//Antenna Diversity
|
||||
BOOL bTxRxAntInv;
|
||||
DWORD dwRxAntennaSel;
|
||||
DWORD dwTxAntennaSel;
|
||||
BYTE byAntennaCount;
|
||||
BYTE byRxAntennaMode;
|
||||
BYTE byTxAntennaMode;
|
||||
BYTE byRadioCtl;
|
||||
BYTE bHWRadioOff;
|
||||
|
||||
//SQ3 functions for antenna diversity
|
||||
struct timer_list TimerSQ3Tmax1;
|
||||
struct timer_list TimerSQ3Tmax2;
|
||||
struct timer_list TimerSQ3Tmax3;
|
||||
|
||||
BOOL bDiversityRegCtlON;
|
||||
BOOL bDiversityEnable;
|
||||
ULONG ulDiversityNValue;
|
||||
ULONG ulDiversityMValue;
|
||||
BYTE byTMax;
|
||||
BYTE byTMax2;
|
||||
BYTE byTMax3;
|
||||
ULONG ulSQ3TH;
|
||||
|
||||
ULONG uDiversityCnt;
|
||||
BYTE byAntennaState;
|
||||
ULONG ulRatio_State0;
|
||||
ULONG ulRatio_State1;
|
||||
ULONG ulSQ3_State0;
|
||||
ULONG ulSQ3_State1;
|
||||
|
||||
ULONG aulSQ3Val[MAX_RATE];
|
||||
ULONG aulPktNum[MAX_RATE];
|
||||
|
||||
// IFS & Cw
|
||||
UINT uSIFS; //Current SIFS
|
||||
UINT uDIFS; //Current DIFS
|
||||
UINT uEIFS; //Current EIFS
|
||||
UINT uSlot; //Current SlotTime
|
||||
UINT uCwMin; //Current CwMin
|
||||
UINT uCwMax; //CwMax is fixed on 1023.
|
||||
// PHY parameter
|
||||
BYTE bySIFS;
|
||||
BYTE byDIFS;
|
||||
BYTE byEIFS;
|
||||
BYTE bySlot;
|
||||
BYTE byCWMaxMin;
|
||||
|
||||
// Rate
|
||||
VIA_BB_TYPE byBBType; //0: 11A, 1:11B, 2:11G
|
||||
VIA_PKT_TYPE byPacketType; //0:11a,1:11b,2:11gb(only CCK in BasicRate),3:11ga(OFDM in Basic Rate)
|
||||
WORD wBasicRate;
|
||||
BYTE byACKRate;
|
||||
BYTE byTopOFDMBasicRate;
|
||||
BYTE byTopCCKBasicRate;
|
||||
|
||||
|
||||
DWORD dwAotoRateTxOkCnt;
|
||||
DWORD dwAotoRateTxFailCnt;
|
||||
DWORD dwErrorRateThreshold[13];
|
||||
DWORD dwTPTable[MAX_RATE];
|
||||
BYTE abyEEPROM[EEP_MAX_CONTEXT_SIZE]; //DWORD alignment
|
||||
|
||||
BYTE byMinChannel;
|
||||
BYTE byMaxChannel;
|
||||
UINT uConnectionRate;
|
||||
|
||||
BYTE byPreambleType;
|
||||
BYTE byShortPreamble;
|
||||
// CARD_PHY_TYPE
|
||||
BYTE eConfigPHYMode;
|
||||
|
||||
// For RF Power table
|
||||
BYTE byCCKPwr;
|
||||
BYTE byOFDMPwrG;
|
||||
BYTE byOFDMPwrA;
|
||||
BYTE byCurPwr;
|
||||
BYTE abyCCKPwrTbl[14];
|
||||
BYTE abyOFDMPwrTbl[14];
|
||||
BYTE abyOFDMAPwrTbl[42];
|
||||
|
||||
WORD wCurrentRate;
|
||||
WORD wRTSThreshold;
|
||||
WORD wFragmentationThreshold;
|
||||
BYTE byShortRetryLimit;
|
||||
BYTE byLongRetryLimit;
|
||||
CARD_OP_MODE eOPMode;
|
||||
BOOL bBSSIDFilter;
|
||||
WORD wMaxTransmitMSDULifetime;
|
||||
BYTE abyBSSID[U_ETHER_ADDR_LEN];
|
||||
BYTE abyDesireBSSID[U_ETHER_ADDR_LEN];
|
||||
WORD wCTSDuration; // update while speed change
|
||||
WORD wACKDuration; // update while speed change
|
||||
WORD wRTSTransmitLen; // update while speed change
|
||||
BYTE byRTSServiceField; // update while speed change
|
||||
BYTE byRTSSignalField; // update while speed change
|
||||
|
||||
DWORD dwMaxReceiveLifetime; // dot11MaxReceiveLifetime
|
||||
|
||||
BOOL bCCK;
|
||||
BOOL bEncryptionEnable;
|
||||
BOOL bLongHeader;
|
||||
BOOL bSoftwareGenCrcErr;
|
||||
BOOL bShortSlotTime;
|
||||
BOOL bProtectMode;
|
||||
BOOL bNonERPPresent;
|
||||
BOOL bBarkerPreambleMd;
|
||||
|
||||
BYTE byERPFlag;
|
||||
WORD wUseProtectCntDown;
|
||||
|
||||
BOOL bRadioControlOff;
|
||||
BOOL bRadioOff;
|
||||
|
||||
// Power save
|
||||
BOOL bEnablePSMode;
|
||||
WORD wListenInterval;
|
||||
BOOL bPWBitOn;
|
||||
WMAC_POWER_MODE ePSMode;
|
||||
ULONG ulPSModeWaitTx;
|
||||
BOOL bPSModeTxBurst;
|
||||
|
||||
// Beacon releated
|
||||
WORD wSeqCounter;
|
||||
BOOL bBeaconBufReady;
|
||||
BOOL bBeaconSent;
|
||||
BOOL bFixRate;
|
||||
BYTE byCurrentCh;
|
||||
UINT uScanTime;
|
||||
|
||||
CMD_STATE eCommandState;
|
||||
|
||||
CMD_CODE eCommand;
|
||||
BOOL bBeaconTx;
|
||||
BYTE byScanBBType;
|
||||
|
||||
BOOL bStopBeacon;
|
||||
BOOL bStopDataPkt;
|
||||
BOOL bStopTx0Pkt;
|
||||
UINT uAutoReConnectTime;
|
||||
UINT uIsroamingTime;
|
||||
|
||||
// 802.11 counter
|
||||
|
||||
CMD_ITEM eCmdQueue[CMD_Q_SIZE];
|
||||
UINT uCmdDequeueIdx;
|
||||
UINT uCmdEnqueueIdx;
|
||||
UINT cbFreeCmdQueue;
|
||||
BOOL bCmdRunning;
|
||||
BOOL bCmdClear;
|
||||
BOOL bNeedRadioOFF;
|
||||
|
||||
BOOL bEnableRoaming; //DavidWang
|
||||
BOOL bIsRoaming; //DavidWang
|
||||
BOOL bFastRoaming; //DavidWang
|
||||
BYTE bSameBSSMaxNum; //Davidwang
|
||||
BYTE bSameBSSCurNum; //DavidWang
|
||||
BOOL bRoaming;
|
||||
BOOL b11hEable;
|
||||
ULONG ulTxPower;
|
||||
|
||||
// Encryption
|
||||
NDIS_802_11_WEP_STATUS eEncryptionStatus;
|
||||
BOOL bTransmitKey;
|
||||
|
||||
//2007-0925-01<Add>by MikeLiu
|
||||
//mike add :save old Encryption
|
||||
NDIS_802_11_WEP_STATUS eOldEncryptionStatus;
|
||||
|
||||
SKeyManagement sKey;
|
||||
DWORD dwIVCounter;
|
||||
|
||||
|
||||
RC4Ext SBox;
|
||||
BYTE abyPRNG[WLAN_WEPMAX_KEYLEN+3];
|
||||
BYTE byKeyIndex;
|
||||
|
||||
BOOL bAES;
|
||||
BYTE byCntMeasure;
|
||||
|
||||
UINT uKeyLength;
|
||||
BYTE abyKey[WLAN_WEP232_KEYLEN];
|
||||
|
||||
// for AP mode
|
||||
UINT uAssocCount;
|
||||
BOOL bMoreData;
|
||||
|
||||
// QoS
|
||||
BOOL bGrpAckPolicy;
|
||||
|
||||
|
||||
BYTE byAutoFBCtrl;
|
||||
|
||||
BOOL bTxMICFail;
|
||||
BOOL bRxMICFail;
|
||||
|
||||
|
||||
// For Update BaseBand VGA Gain Offset
|
||||
BOOL bUpdateBBVGA;
|
||||
UINT uBBVGADiffCount;
|
||||
BYTE byBBVGANew;
|
||||
BYTE byBBVGACurrent;
|
||||
BYTE abyBBVGA[BB_VGA_LEVEL];
|
||||
LONG ldBmThreshold[BB_VGA_LEVEL];
|
||||
|
||||
BYTE byBBPreEDRSSI;
|
||||
BYTE byBBPreEDIndex;
|
||||
|
||||
|
||||
BOOL bRadioCmd;
|
||||
DWORD dwDiagRefCount;
|
||||
|
||||
// For FOE Tuning
|
||||
BYTE byFOETuning;
|
||||
|
||||
// For Auto Power Tunning
|
||||
|
||||
BYTE byAutoPwrTunning;
|
||||
|
||||
// BaseBand Loopback Use
|
||||
BYTE byBBCR4d;
|
||||
BYTE byBBCRc9;
|
||||
BYTE byBBCR88;
|
||||
BYTE byBBCR09;
|
||||
|
||||
// command timer
|
||||
struct timer_list sTimerCommand;
|
||||
|
||||
//2007-0115-01<Add>by MikeLiu
|
||||
#ifdef TxInSleep
|
||||
struct timer_list sTimerTxData;
|
||||
ULONG nTxDataTimeCout;
|
||||
BOOL fTxDataInSleep;
|
||||
BOOL IsTxDataTrigger;
|
||||
#endif
|
||||
|
||||
#ifdef WPA_SM_Transtatus
|
||||
BOOL fWPA_Authened; //is WPA/WPA-PSK or WPA2/WPA2-PSK authen??
|
||||
#endif
|
||||
BYTE byReAssocCount; //mike add:re-association retry times!
|
||||
BYTE byLinkWaitCount;
|
||||
|
||||
SEthernetHeader sTxEthHeader;
|
||||
SEthernetHeader sRxEthHeader;
|
||||
BYTE abyBroadcastAddr[U_ETHER_ADDR_LEN];
|
||||
BYTE abySNAP_RFC1042[U_ETHER_ADDR_LEN];
|
||||
BYTE abySNAP_Bridgetunnel[U_ETHER_ADDR_LEN];
|
||||
|
||||
// Pre-Authentication & PMK cache
|
||||
SPMKID gsPMKID;
|
||||
SPMKIDCandidateEvent gsPMKIDCandidate;
|
||||
|
||||
|
||||
// for 802.11h
|
||||
BOOL b11hEnable;
|
||||
|
||||
BOOL bChannelSwitch;
|
||||
BYTE byNewChannel;
|
||||
BYTE byChannelSwitchCount;
|
||||
|
||||
//WPA supplicant daemon
|
||||
struct net_device *wpadev;
|
||||
BOOL bWPADEVUp;
|
||||
struct sk_buff *skb;
|
||||
//--
|
||||
|
||||
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
|
||||
BOOL bwextstep0;
|
||||
BOOL bwextstep1;
|
||||
BOOL bwextstep2;
|
||||
BOOL bwextstep3;
|
||||
BOOL bWPASuppWextEnabled;
|
||||
#endif
|
||||
|
||||
#ifdef HOSTAP
|
||||
// user space daemon: hostapd, is used for HOSTAP
|
||||
BOOL bEnableHostapd;
|
||||
BOOL bEnable8021x;
|
||||
BOOL bEnableHostWEP;
|
||||
struct net_device *apdev;
|
||||
int (*tx_80211)(struct sk_buff *skb, struct net_device *dev);
|
||||
#endif
|
||||
UINT uChannel;
|
||||
|
||||
#ifdef WIRELESS_EXT
|
||||
struct iw_statistics wstats; // wireless stats
|
||||
#endif /* WIRELESS_EXT */
|
||||
BOOL bCommit;
|
||||
|
||||
} DEVICE_INFO, *PSDevice;
|
||||
|
||||
|
||||
|
||||
|
||||
#define EnqueueRCB(_Head, _Tail, _RCB) \
|
||||
{ \
|
||||
if (!_Head) { \
|
||||
_Head = _RCB; \
|
||||
} \
|
||||
else { \
|
||||
_Tail->Next = _RCB; \
|
||||
} \
|
||||
_RCB->Next = NULL; \
|
||||
_Tail = _RCB; \
|
||||
}
|
||||
|
||||
#define DequeueRCB(Head, Tail) \
|
||||
{ \
|
||||
PRCB RCB = Head; \
|
||||
if (!RCB->Next) { \
|
||||
Tail = NULL; \
|
||||
} \
|
||||
Head = RCB->Next; \
|
||||
}
|
||||
|
||||
|
||||
#define ADD_ONE_WITH_WRAP_AROUND(uVar, uModulo) { \
|
||||
if ((uVar) >= ((uModulo) - 1)) \
|
||||
(uVar) = 0; \
|
||||
else \
|
||||
(uVar)++; \
|
||||
}
|
||||
|
||||
|
||||
#define fMP_RESET_IN_PROGRESS 0x00000001
|
||||
#define fMP_DISCONNECTED 0x00000002
|
||||
#define fMP_HALT_IN_PROGRESS 0x00000004
|
||||
#define fMP_SURPRISE_REMOVED 0x00000008
|
||||
#define fMP_RECV_LOOKASIDE 0x00000010
|
||||
#define fMP_INIT_IN_PROGRESS 0x00000020
|
||||
#define fMP_SEND_SIDE_RESOURCE_ALLOCATED 0x00000040
|
||||
#define fMP_RECV_SIDE_RESOURCE_ALLOCATED 0x00000080
|
||||
#define fMP_POST_READS 0x00000100
|
||||
#define fMP_POST_WRITES 0x00000200
|
||||
#define fMP_CONTROL_READS 0x00000400
|
||||
#define fMP_CONTROL_WRITES 0x00000800
|
||||
|
||||
|
||||
|
||||
#define MP_SET_FLAG(_M, _F) ((_M)->Flags |= (_F))
|
||||
#define MP_CLEAR_FLAG(_M, _F) ((_M)->Flags &= ~(_F))
|
||||
#define MP_TEST_FLAG(_M, _F) (((_M)->Flags & (_F)) != 0)
|
||||
#define MP_TEST_FLAGS(_M, _F) (((_M)->Flags & (_F)) == (_F))
|
||||
|
||||
#define MP_IS_READY(_M) (((_M)->Flags & \
|
||||
(fMP_DISCONNECTED | fMP_RESET_IN_PROGRESS | fMP_HALT_IN_PROGRESS | fMP_INIT_IN_PROGRESS | fMP_SURPRISE_REMOVED)) == 0)
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
//BOOL device_dma0_xmit(PSDevice pDevice, struct sk_buff *skb, UINT uNodeIndex);
|
||||
BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF);
|
||||
|
||||
#endif
|
||||
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: dpc.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Jun. 27, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __DPC_H__
|
||||
#define __DPC_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__WCMD_H__)
|
||||
#include "wcmd.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
RXvWorkItem(
|
||||
PVOID Context
|
||||
);
|
||||
|
||||
VOID
|
||||
RXvMngWorkItem(
|
||||
PVOID Context
|
||||
);
|
||||
|
||||
VOID
|
||||
RXvFreeRCB(
|
||||
IN PRCB pRCB,
|
||||
IN BOOL bReAllocSkb
|
||||
);
|
||||
|
||||
BOOL
|
||||
RXbBulkInProcessData(
|
||||
IN PSDevice pDevice,
|
||||
IN PRCB pRCB,
|
||||
IN ULONG BytesToIndicate
|
||||
);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __RXTX_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,887 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: baseband.c
|
||||
*
|
||||
* Purpose: Implement functions to access baseband
|
||||
*
|
||||
* Author: Yiching Chen
|
||||
*
|
||||
* Date: May 20, 2004
|
||||
*
|
||||
* Functions:
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__FIRMWARE_H__)
|
||||
#include "firmware.h"
|
||||
#endif
|
||||
#if !defined(__CONTROL_H__)
|
||||
#include "control.h"
|
||||
#endif
|
||||
#if !defined(__RNDIS_H__)
|
||||
#include "rndis.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*
|
||||
* This is firmware version 1.51
|
||||
*/
|
||||
#define FIRMWARE_VERSION 0x133
|
||||
|
||||
const BYTE abyFirmware[] = {
|
||||
|
||||
0x02, 0x35, 0x62, 0x02, 0x3B, 0xED, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x3E, 0x21, 0xD2, 0x04,
|
||||
0x90, 0x06, 0x24, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x21, 0xE0, 0x90, 0x45, 0x39, 0xF0, 0xE0, 0x90,
|
||||
0x06, 0x21, 0xF0, 0x90, 0x06, 0x10, 0xE0, 0x54, 0x60, 0x60, 0x03, 0x02, 0x1A, 0xE9, 0xA3, 0xE0,
|
||||
0x12, 0x28, 0x7E, 0x18, 0x15, 0x00, 0x18, 0xF6, 0x01, 0x19, 0xD1, 0x03, 0x16, 0x79, 0x05, 0x12,
|
||||
0x52, 0x06, 0x17, 0xE5, 0x08, 0x16, 0xAF, 0x09, 0x17, 0x33, 0x0A, 0x17, 0x91, 0x0B, 0x00, 0x00,
|
||||
0x1A, 0xE1, 0x90, 0x06, 0x17, 0xE0, 0xFE, 0x90, 0x06, 0x16, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x31,
|
||||
0xF0, 0xED, 0xA3, 0xF0, 0x90, 0x10, 0x3D, 0x74, 0x05, 0xF0, 0x90, 0x06, 0x24, 0x74, 0x08, 0xF0,
|
||||
0x90, 0x06, 0x13, 0xE0, 0x24, 0xFE, 0x60, 0x47, 0x14, 0x70, 0x03, 0x02, 0x14, 0x79, 0x24, 0xFD,
|
||||
0x60, 0x25, 0x14, 0x70, 0x03, 0x02, 0x13, 0x9C, 0x24, 0x06, 0x60, 0x03, 0x02, 0x16, 0x54, 0x7B,
|
||||
0x01, 0x7A, 0x10, 0x79, 0x8B, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90, 0x10, 0x4C, 0xE4, 0xF0,
|
||||
0xA3, 0x74, 0x12, 0xF0, 0x02, 0x16, 0x5C, 0x7B, 0x01, 0x7A, 0x10, 0x79, 0x81, 0x90, 0x10, 0x46,
|
||||
0x12, 0x27, 0xBA, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x02, 0x16, 0x5C, 0x7B,
|
||||
0x01, 0x7A, 0x10, 0x79, 0x51, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90, 0x10, 0x52, 0x74, 0x02,
|
||||
0xF0, 0x90, 0x10, 0x54, 0xE0, 0xFE, 0x90, 0x10, 0x53, 0xE0, 0xFD, 0xEE, 0x90, 0x10, 0x4C, 0xF0,
|
||||
0xED, 0xA3, 0xF0, 0x30, 0x06, 0x5A, 0xE0, 0xFD, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5,
|
||||
0x83, 0xE4, 0xF0, 0x74, 0x48, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x02, 0xF0,
|
||||
0x74, 0x4E, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x4F, 0x2D, 0xF5,
|
||||
0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x90, 0x10, 0x98, 0xE0, 0xFE, 0x90, 0x10,
|
||||
0x97, 0xE0, 0xFB, 0xEE, 0xEB, 0xC3, 0x94, 0x20, 0xEE, 0x94, 0x01, 0x40, 0x03, 0x02, 0x16, 0x5C,
|
||||
0x74, 0x50, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x02, 0x16, 0x5C,
|
||||
0x90, 0x10, 0x4D, 0xE0, 0xFD, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x40,
|
||||
0xF0, 0x74, 0x48, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x4E, 0x2D,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x40, 0xF0, 0x74, 0x4F, 0x2D, 0xF5, 0x82, 0xE4,
|
||||
0x34, 0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x10, 0x98, 0xE0, 0xFE, 0x90, 0x10, 0x97, 0xE0, 0xFB,
|
||||
0xEE, 0xEB, 0xC3, 0x94, 0x20, 0xEE, 0x94, 0x01, 0x40, 0x03, 0x02, 0x16, 0x5C, 0x74, 0x50, 0x2D,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x02, 0x16, 0x5C, 0x7B, 0x01, 0x7A, 0x10,
|
||||
0x79, 0x51, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90, 0x10, 0x52, 0x74, 0x07, 0xF0, 0x90, 0x10,
|
||||
0x54, 0xE0, 0xFE, 0x90, 0x10, 0x53, 0xE0, 0xFD, 0xEE, 0x90, 0x10, 0x4C, 0xF0, 0xED, 0xA3, 0xF0,
|
||||
0x30, 0x06, 0x59, 0xE0, 0xFD, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x40,
|
||||
0xF0, 0x74, 0x48, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x4E, 0x2D,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x40, 0xF0, 0x74, 0x4F, 0x2D, 0xF5, 0x82, 0xE4,
|
||||
0x34, 0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x10, 0x98, 0xE0, 0xFE, 0x90, 0x10, 0x97, 0xE0, 0xFB,
|
||||
0xEE, 0xEB, 0xC3, 0x94, 0x20, 0xEE, 0x94, 0x01, 0x40, 0x03, 0x02, 0x16, 0x5C, 0x74, 0x50, 0x2D,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x02, 0x16, 0x5C, 0x90, 0x10, 0x4D, 0xE0,
|
||||
0xFD, 0x24, 0x47, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x48, 0x2D, 0xF5,
|
||||
0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x74, 0x4E, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
|
||||
0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x4F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x10, 0xF5, 0x83, 0x74,
|
||||
0x02, 0xF0, 0x90, 0x10, 0x98, 0xE0, 0xFE, 0x90, 0x10, 0x97, 0xE0, 0xFB, 0xEE, 0xEB, 0xC3, 0x94,
|
||||
0x20, 0xEE, 0x94, 0x01, 0x40, 0x03, 0x02, 0x16, 0x5C, 0x74, 0x50, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
|
||||
0x10, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x02, 0x16, 0x5C, 0x90, 0x06, 0x12, 0xE0, 0x14, 0x60, 0x2F,
|
||||
0x14, 0x70, 0x03, 0x02, 0x15, 0x34, 0x14, 0x70, 0x03, 0x02, 0x15, 0xD5, 0x24, 0x03, 0x60, 0x03,
|
||||
0x02, 0x16, 0x4C, 0x7B, 0x01, 0x7A, 0x43, 0x79, 0x1A, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90,
|
||||
0x43, 0x1A, 0xE0, 0xFF, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x02, 0x16, 0x5C, 0x90,
|
||||
0x10, 0x98, 0xE0, 0xFE, 0x90, 0x10, 0x97, 0xE0, 0xFD, 0xEE, 0xED, 0xC3, 0x94, 0x20, 0xEE, 0x94,
|
||||
0x01, 0x50, 0x1C, 0x7B, 0x01, 0x7A, 0x10, 0x79, 0x14, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90,
|
||||
0x10, 0x14, 0xE0, 0xFF, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x02, 0x16, 0x5C, 0x90,
|
||||
0x10, 0x3C, 0xE0, 0xC3, 0x94, 0x01, 0x50, 0x08, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22,
|
||||
0x90, 0x10, 0x0D, 0xE0, 0x20, 0xE0, 0x1C, 0x7B, 0x01, 0x7A, 0x10, 0x79, 0x14, 0x90, 0x10, 0x46,
|
||||
0x12, 0x27, 0xBA, 0x90, 0x10, 0x14, 0xE0, 0xFF, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0,
|
||||
0x02, 0x16, 0x5C, 0x90, 0x10, 0x2E, 0x12, 0x27, 0x9A, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90,
|
||||
0x10, 0x2E, 0x12, 0x27, 0x9A, 0x12, 0x26, 0x36, 0xFF, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0xEF,
|
||||
0xF0, 0x02, 0x16, 0x5C, 0x90, 0x10, 0x98, 0xE0, 0xFE, 0x90, 0x10, 0x97, 0xE0, 0xFD, 0xEE, 0xED,
|
||||
0xC3, 0x94, 0x20, 0xEE, 0x94, 0x01, 0x50, 0x33, 0x90, 0x10, 0x99, 0xE0, 0x70, 0x0C, 0xA3, 0xE0,
|
||||
0x70, 0x08, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x10, 0x2E, 0x12, 0x27, 0x9A,
|
||||
0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90, 0x10, 0x2E, 0x12, 0x27, 0x9A, 0x12, 0x26, 0x36, 0xFF,
|
||||
0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x02, 0x16, 0x5C, 0x90, 0x10, 0x3C, 0xE0, 0xC3,
|
||||
0x94, 0x02, 0x50, 0x08, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x10, 0x0D, 0xE0,
|
||||
0x20, 0xE0, 0x21, 0x90, 0x10, 0x2E, 0x12, 0x27, 0x9A, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90,
|
||||
0x10, 0x2E, 0x12, 0x27, 0x9A, 0x12, 0x26, 0x36, 0xFF, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0xEF,
|
||||
0xF0, 0x02, 0x16, 0x5C, 0x90, 0x10, 0x31, 0x12, 0x27, 0x9A, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA,
|
||||
0x90, 0x10, 0x31, 0x12, 0x27, 0x9A, 0x12, 0x26, 0x36, 0xFF, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3,
|
||||
0xEF, 0xF0, 0x02, 0x16, 0x5C, 0x90, 0x10, 0x98, 0xE0, 0xFE, 0x90, 0x10, 0x97, 0xE0, 0xFD, 0xEE,
|
||||
0xED, 0xC3, 0x94, 0x20, 0xEE, 0x94, 0x01, 0x50, 0x32, 0x90, 0x10, 0x99, 0xE0, 0x60, 0x04, 0xA3,
|
||||
0xE0, 0x70, 0x08, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x10, 0x31, 0x12, 0x27,
|
||||
0x9A, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90, 0x10, 0x31, 0x12, 0x27, 0x9A, 0x12, 0x26, 0x36,
|
||||
0xFF, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x41, 0x90, 0x10, 0x3C, 0xE0, 0xC3,
|
||||
0x94, 0x03, 0x50, 0x08, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x10, 0x31, 0x12,
|
||||
0x27, 0x9A, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90, 0x10, 0x31, 0x12, 0x27, 0x9A, 0x12, 0x26,
|
||||
0x36, 0xFF, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x10, 0x90, 0x06, 0x22, 0xE0,
|
||||
0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x45, 0x31, 0xE0,
|
||||
0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x10, 0x4D, 0xE0, 0x9F, 0x90, 0x10, 0x4C, 0xE0, 0x9E, 0x40,
|
||||
0x05, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x02, 0x33, 0xF6, 0x90, 0x06, 0x12, 0xE0, 0x90, 0x10, 0x3E,
|
||||
0xF0, 0x90, 0x10, 0x3D, 0x74, 0x04, 0xF0, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08,
|
||||
0xF0, 0xA3, 0xF0, 0x90, 0x10, 0x3E, 0xE0, 0xFF, 0x44, 0x80, 0x90, 0x06, 0x06, 0xF0, 0xEF, 0x70,
|
||||
0x07, 0x90, 0x10, 0x38, 0x74, 0x07, 0xF0, 0x22, 0x90, 0x10, 0x38, 0x74, 0x0F, 0xF0, 0x22, 0x90,
|
||||
0x06, 0x13, 0xE0, 0xFE, 0x90, 0x06, 0x12, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x35, 0xF0, 0xED, 0xA3,
|
||||
0xF0, 0x90, 0x45, 0x35, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x64, 0x01, 0x4E, 0x60, 0x0C, 0xEF, 0x4E,
|
||||
0x60, 0x08, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x12, 0xE0, 0x90, 0x10,
|
||||
0x3A, 0xF0, 0x90, 0x10, 0x3D, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x08, 0x74, 0x02, 0xF0, 0xA3, 0x04,
|
||||
0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3,
|
||||
0xF0, 0x90, 0x10, 0x3A, 0xE0, 0x70, 0x0D, 0x90, 0x10, 0x38, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x07,
|
||||
0x74, 0x02, 0xF0, 0x22, 0x90, 0x10, 0x38, 0x74, 0x1F, 0xF0, 0x90, 0x06, 0x07, 0xE0, 0x44, 0x1C,
|
||||
0xF0, 0x90, 0x06, 0x0B, 0x74, 0x70, 0xF0, 0xE4, 0x90, 0x10, 0x34, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
|
||||
0xA3, 0xF0, 0x22, 0x90, 0x10, 0x38, 0xE0, 0x64, 0x1F, 0x70, 0x4E, 0x90, 0x06, 0x15, 0xE0, 0xFE,
|
||||
0x90, 0x06, 0x14, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x33, 0xF0, 0xED, 0xA3, 0xF0, 0x90, 0x10, 0x55,
|
||||
0xE0, 0xFF, 0xC3, 0x90, 0x45, 0x34, 0xE0, 0x9F, 0x90, 0x45, 0x33, 0xE0, 0x94, 0x00, 0x50, 0x21,
|
||||
0xE4, 0x90, 0x06, 0x60, 0xF0, 0x90, 0x10, 0x3D, 0x74, 0x09, 0xF0, 0xE4, 0x90, 0x10, 0x4C, 0xF0,
|
||||
0xA3, 0xF0, 0xC2, 0x04, 0x90, 0x06, 0x23, 0x74, 0x81, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0,
|
||||
0x22, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0,
|
||||
0x22, 0x90, 0x06, 0x13, 0xE0, 0xFE, 0x90, 0x06, 0x12, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x35, 0xF0,
|
||||
0xED, 0xA3, 0xF0, 0x90, 0x06, 0x15, 0xE0, 0xFE, 0x90, 0x06, 0x14, 0xE0, 0xFD, 0xEE, 0x90, 0x45,
|
||||
0x33, 0xF0, 0xED, 0xA3, 0xF0, 0xA3, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x70, 0x13, 0x90, 0x10, 0x55,
|
||||
0xE0, 0xFF, 0xC3, 0x90, 0x45, 0x34, 0xE0, 0x9F, 0x90, 0x45, 0x33, 0xE0, 0x94, 0x00, 0x40, 0x08,
|
||||
0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xA3, 0x74,
|
||||
0x08, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x10, 0x38, 0xE0, 0xB4, 0x1F, 0x08, 0x90, 0x06, 0x60, 0x74,
|
||||
0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x06, 0x60, 0xF0, 0x90, 0x10, 0x3D, 0x74, 0x07, 0xF0, 0xE4,
|
||||
0x90, 0x10, 0x4C, 0xF0, 0xA3, 0xF0, 0xC2, 0x04, 0x90, 0x06, 0x23, 0x74, 0x81, 0xF0, 0xA3, 0x74,
|
||||
0x08, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x06, 0x10, 0xE0, 0x24, 0x7F, 0x60, 0x14, 0x14, 0x60, 0x4E,
|
||||
0x24, 0x02, 0x60, 0x03, 0x02, 0x18, 0xD2, 0xE4, 0x90, 0x06, 0x60, 0xF0, 0xA3, 0xF0, 0x02, 0x18,
|
||||
0xDA, 0x90, 0x06, 0x15, 0xE0, 0xFE, 0x90, 0x06, 0x14, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x33, 0xF0,
|
||||
0xED, 0xA3, 0xF0, 0x90, 0x10, 0x55, 0xE0, 0xFF, 0xC3, 0x90, 0x45, 0x34, 0xE0, 0x9F, 0x90, 0x45,
|
||||
0x33, 0xE0, 0x94, 0x00, 0x50, 0x07, 0x90, 0x10, 0x38, 0xE0, 0xB4, 0x0F, 0x08, 0x90, 0x06, 0x22,
|
||||
0xE0, 0x44, 0x08, 0xF0, 0x22, 0xE4, 0x90, 0x06, 0x60, 0xF0, 0xA3, 0xF0, 0x80, 0x6C, 0x90, 0x06,
|
||||
0x15, 0xE0, 0xFE, 0x90, 0x06, 0x14, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x33, 0xF0, 0xED, 0xA3, 0xF0,
|
||||
0x90, 0x45, 0x33, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x64, 0x81, 0x4E, 0x60, 0x0C, 0xEF, 0x64, 0x82,
|
||||
0x4E, 0x60, 0x06, 0xEF, 0x64, 0x03, 0x4E, 0x70, 0x0B, 0x90, 0x10, 0x38, 0xE0, 0xB4, 0x0F, 0x0C,
|
||||
0xEF, 0x4E, 0x60, 0x08, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x7E, 0x00, 0xEF, 0x54,
|
||||
0x7F, 0x24, 0x34, 0xF5, 0x82, 0xEE, 0x34, 0x10, 0xF5, 0x83, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0x06,
|
||||
0x60, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x06, 0x60, 0xF0, 0xE4, 0x90, 0x06, 0x61, 0xF0,
|
||||
0x80, 0x08, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x10, 0x3D, 0x74, 0x01, 0xF0,
|
||||
0xE4, 0x90, 0x10, 0x4C, 0xF0, 0xA3, 0xF0, 0xC2, 0x04, 0x90, 0x06, 0x23, 0x74, 0x82, 0xF0, 0xA3,
|
||||
0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x06, 0x10, 0xE0, 0x24, 0xFE, 0x60, 0x03, 0x02, 0x19,
|
||||
0xBA, 0x90, 0x06, 0x15, 0xE0, 0xFE, 0x90, 0x06, 0x14, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x33, 0xF0,
|
||||
0xED, 0xA3, 0xF0, 0x90, 0x06, 0x13, 0xE0, 0xFE, 0x90, 0x06, 0x12, 0xE0, 0xFD, 0xEE, 0x90, 0x45,
|
||||
0x35, 0xF0, 0xED, 0xA3, 0xF0, 0x90, 0x10, 0x38, 0xE0, 0xF9, 0x64, 0x1F, 0x70, 0x76, 0x90, 0x45,
|
||||
0x33, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x64, 0x81, 0x4E, 0x70, 0x19, 0x90, 0x06, 0x0B, 0xE0, 0x54,
|
||||
0xFB, 0xF0, 0x7C, 0x00, 0xEF, 0x54, 0x7F, 0x24, 0x34, 0xF5, 0x82, 0xEC, 0x34, 0x10, 0xF5, 0x83,
|
||||
0xE4, 0xF0, 0x80, 0x6E, 0xEF, 0x64, 0x82, 0x4E, 0x70, 0x1C, 0x90, 0x06, 0x0B, 0xE0, 0x54, 0xFE,
|
||||
0xF0, 0x7E, 0x00, 0x90, 0x45, 0x34, 0xE0, 0x54, 0x7F, 0x24, 0x34, 0xF5, 0x82, 0xEE, 0x34, 0x10,
|
||||
0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x4C, 0x90, 0x45, 0x33, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x64, 0x03,
|
||||
0x4E, 0x70, 0x19, 0x90, 0x06, 0x0B, 0xE0, 0x54, 0xFD, 0xF0, 0x7E, 0x00, 0xEF, 0x54, 0x7F, 0x24,
|
||||
0x34, 0xF5, 0x82, 0xEE, 0x34, 0x10, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x26, 0x90, 0x06, 0x22, 0xE0,
|
||||
0x44, 0x08, 0xF0, 0x22, 0xE9, 0xB4, 0x0F, 0x1A, 0x90, 0x45, 0x33, 0xE0, 0x70, 0x02, 0xA3, 0xE0,
|
||||
0x60, 0x10, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08,
|
||||
0xF0, 0x22, 0xC2, 0x04, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0,
|
||||
0x22, 0x90, 0x06, 0x10, 0xE0, 0x24, 0xFE, 0x60, 0x44, 0x24, 0x02, 0x60, 0x03, 0x02, 0x1A, 0xCA,
|
||||
0x90, 0x06, 0x13, 0xE0, 0xFE, 0x90, 0x06, 0x12, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x35, 0xF0, 0xED,
|
||||
0xA3, 0xF0, 0x90, 0x45, 0x35, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x64, 0x02, 0x70, 0x17, 0x90, 0x06,
|
||||
0x14, 0xE0, 0x70, 0x11, 0x90, 0x10, 0x3D, 0x74, 0x0F, 0xF0, 0x90, 0x06, 0x15, 0xE0, 0x90, 0x10,
|
||||
0x50, 0xF0, 0x02, 0x1A, 0xD2, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x15,
|
||||
0xE0, 0xFE, 0x90, 0x06, 0x14, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x33, 0xF0, 0xED, 0xA3, 0xF0, 0x90,
|
||||
0x06, 0x13, 0xE0, 0xFE, 0x90, 0x06, 0x12, 0xE0, 0xFD, 0xEE, 0x90, 0x45, 0x35, 0xF0, 0xED, 0xA3,
|
||||
0xF0, 0x90, 0x10, 0x38, 0xE0, 0x64, 0x1F, 0x70, 0x79, 0x90, 0x45, 0x33, 0xE0, 0xFE, 0xA3, 0xE0,
|
||||
0xFF, 0x64, 0x81, 0x4E, 0x70, 0x1A, 0x90, 0x06, 0x0B, 0xE0, 0x44, 0x04, 0xF0, 0x7C, 0x00, 0xEF,
|
||||
0x54, 0x7F, 0x24, 0x34, 0xF5, 0x82, 0xEC, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x62,
|
||||
0xEF, 0x64, 0x82, 0x4E, 0x70, 0x1D, 0x90, 0x06, 0x0B, 0xE0, 0x44, 0x01, 0xF0, 0x7E, 0x00, 0x90,
|
||||
0x45, 0x34, 0xE0, 0x54, 0x7F, 0x24, 0x34, 0xF5, 0x82, 0xEE, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x01,
|
||||
0xF0, 0x80, 0x3F, 0x90, 0x45, 0x33, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x64, 0x03, 0x4E, 0x70, 0x1A,
|
||||
0x90, 0x06, 0x0B, 0xE0, 0x44, 0x02, 0xF0, 0x7E, 0x00, 0xEF, 0x54, 0x7F, 0x24, 0x34, 0xF5, 0x82,
|
||||
0xEE, 0x34, 0x10, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x18, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08,
|
||||
0xF0, 0x22, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08,
|
||||
0xF0, 0x22, 0xC2, 0x04, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0,
|
||||
0x22, 0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x10, 0xE0, 0x64, 0x40, 0x60,
|
||||
0x03, 0x02, 0x1C, 0xA2, 0xE0, 0x90, 0x43, 0x1E, 0xF0, 0x90, 0x06, 0x11, 0xE0, 0x90, 0x43, 0x1F,
|
||||
0xF0, 0x90, 0x06, 0x13, 0xE0, 0xFE, 0x90, 0x06, 0x12, 0xE0, 0xFD, 0xEE, 0x90, 0x43, 0x20, 0xF0,
|
||||
0xED, 0xA3, 0xF0, 0x90, 0x06, 0x15, 0xE0, 0xFE, 0x90, 0x06, 0x14, 0xE0, 0xFD, 0xEE, 0x90, 0x43,
|
||||
0x22, 0xF0, 0xED, 0xA3, 0xF0, 0x90, 0x06, 0x17, 0xE0, 0xFE, 0x90, 0x06, 0x16, 0xE0, 0xFD, 0xEE,
|
||||
0x90, 0x43, 0x24, 0xF0, 0xED, 0xA3, 0xF0, 0xE4, 0x90, 0x10, 0x44, 0xF0, 0xA3, 0xF0, 0x90, 0x43,
|
||||
0x24, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x10, 0x42, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x43, 0x1F,
|
||||
0xE0, 0x12, 0x28, 0x7E, 0x1B, 0x70, 0x00, 0x1B, 0xE6, 0x01, 0x1B, 0x79, 0x07, 0x1B, 0x8F, 0x0B,
|
||||
0x1B, 0xAF, 0x0C, 0x1B, 0xC9, 0x10, 0x1B, 0xD9, 0x12, 0x1B, 0xFE, 0x13, 0x00, 0x00, 0x1C, 0x6A,
|
||||
0x90, 0x10, 0x3D, 0x74, 0x0B, 0xF0, 0x02, 0x1C, 0x8E, 0x90, 0x10, 0x3D, 0x74, 0x0B, 0xF0, 0x12,
|
||||
0x3D, 0x31, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x22, 0x90,
|
||||
0x10, 0x3D, 0x74, 0x0B, 0xF0, 0x90, 0x43, 0x21, 0xE0, 0xFF, 0x90, 0x45, 0x45, 0xE0, 0xFD, 0x12,
|
||||
0x39, 0xB4, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x22, 0x90,
|
||||
0x45, 0x45, 0xE0, 0xFF, 0x90, 0x06, 0x12, 0xE0, 0xFD, 0x12, 0x39, 0x2D, 0x90, 0x06, 0x23, 0x74,
|
||||
0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x3E, 0x03, 0x90, 0x06, 0x23, 0x74,
|
||||
0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xA3,
|
||||
0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x10, 0x3D, 0x74, 0x10, 0xF0, 0x90, 0x06, 0x23, 0x74,
|
||||
0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x12, 0x3D, 0xBA, 0x02, 0x1C, 0x8E, 0x90, 0x06,
|
||||
0x23, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0x7A, 0xE0, 0x90, 0x45,
|
||||
0x39, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x44, 0x80, 0xF0, 0x90, 0x04, 0x7A, 0xF0, 0x7D, 0x17, 0x7F,
|
||||
0x0C, 0x12, 0x3D, 0x00, 0x7D, 0xB9, 0x7F, 0x0D, 0x12, 0x3D, 0x00, 0x90, 0x04, 0x54, 0x74, 0x01,
|
||||
0xF0, 0xE4, 0x90, 0x04, 0x78, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x20, 0x74, 0x20, 0xF0, 0x90, 0x04,
|
||||
0x59, 0x74, 0x10, 0xF0, 0xE4, 0x90, 0x06, 0x05, 0xF0, 0x90, 0x06, 0x07, 0x74, 0x03, 0xF0, 0x75,
|
||||
0xA8, 0x81, 0x43, 0x87, 0x01, 0x90, 0x06, 0x20, 0x74, 0x21, 0xF0, 0x90, 0x04, 0x58, 0x74, 0x14,
|
||||
0xF0, 0xA3, 0x74, 0x50, 0xF0, 0x43, 0xA8, 0x81, 0x80, 0x24, 0x90, 0x10, 0x3D, 0x74, 0x0D, 0xF0,
|
||||
0x7B, 0x01, 0x7A, 0x43, 0x79, 0x26, 0x90, 0x10, 0x3F, 0x12, 0x27, 0xBA, 0x90, 0x06, 0x17, 0xE0,
|
||||
0xFE, 0x90, 0x06, 0x16, 0xE0, 0xFD, 0xEE, 0x90, 0x10, 0x42, 0xF0, 0xED, 0xA3, 0xF0, 0xE4, 0x90,
|
||||
0x06, 0x24, 0xF0, 0x90, 0x06, 0x23, 0x74, 0xC0, 0xF0, 0x90, 0x06, 0x25, 0x74, 0x08, 0xF0, 0xC2,
|
||||
0x04, 0x22, 0x90, 0x06, 0x10, 0xE0, 0x64, 0xC0, 0x60, 0x03, 0x02, 0x1E, 0x86, 0xE0, 0x90, 0x43,
|
||||
0x1E, 0xF0, 0x90, 0x06, 0x11, 0xE0, 0x90, 0x43, 0x1F, 0xF0, 0x90, 0x06, 0x13, 0xE0, 0xFE, 0x90,
|
||||
0x06, 0x12, 0xE0, 0xFD, 0xEE, 0x90, 0x43, 0x20, 0xF0, 0xED, 0xA3, 0xF0, 0x90, 0x06, 0x15, 0xE0,
|
||||
0xFE, 0x90, 0x06, 0x14, 0xE0, 0xFD, 0xEE, 0x90, 0x43, 0x22, 0xF0, 0xED, 0xA3, 0xF0, 0x90, 0x06,
|
||||
0x17, 0xE0, 0xFE, 0x90, 0x06, 0x16, 0xE0, 0xFD, 0xEE, 0x90, 0x43, 0x24, 0xF0, 0xED, 0xA3, 0xF0,
|
||||
0x90, 0x43, 0x24, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x10, 0x4C, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
|
||||
0x43, 0x1F, 0xE0, 0x24, 0xFA, 0x70, 0x03, 0x02, 0x1E, 0x58, 0x24, 0x05, 0x60, 0x03, 0x02, 0x1E,
|
||||
0x6F, 0x90, 0x43, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xEE, 0x60, 0x03, 0x02, 0x1E, 0x50, 0xEF,
|
||||
0x24, 0xFE, 0x70, 0x03, 0x02, 0x1D, 0xCD, 0x14, 0x60, 0x31, 0x14, 0x60, 0x4E, 0x24, 0xFC, 0x70,
|
||||
0x03, 0x02, 0x1E, 0x1A, 0x24, 0x07, 0x60, 0x03, 0x02, 0x1E, 0x50, 0x7B, 0x01, 0x7A, 0x00, 0x79,
|
||||
0x00, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90, 0x43, 0x20, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90,
|
||||
0x10, 0x47, 0xEE, 0x8F, 0xF0, 0x12, 0x26, 0xB0, 0x02, 0x1E, 0x77, 0x7B, 0x01, 0x7A, 0x04, 0x79,
|
||||
0x00, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0x90, 0x43, 0x20, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90,
|
||||
0x10, 0x47, 0xEE, 0x8F, 0xF0, 0x12, 0x26, 0xB0, 0x02, 0x1E, 0x77, 0x7B, 0x01, 0x7A, 0x43, 0x79,
|
||||
0x26, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0xE4, 0x90, 0x45, 0x37, 0xF0, 0xA3, 0xF0, 0x90, 0x43,
|
||||
0x24, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x45, 0x38, 0xE0, 0x9F, 0x90, 0x45, 0x37, 0xE0,
|
||||
0x9E, 0x40, 0x03, 0x02, 0x1E, 0x77, 0xA3, 0xE0, 0xFF, 0x90, 0x43, 0x21, 0xE0, 0x2F, 0xFF, 0x12,
|
||||
0x3B, 0x25, 0x90, 0x45, 0x38, 0xE0, 0x24, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xEF,
|
||||
0xF0, 0x90, 0x45, 0x37, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0, 0x80, 0xC1, 0x7B, 0x01, 0x7A,
|
||||
0x43, 0x79, 0x26, 0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0xE4, 0x90, 0x45, 0x37, 0xF0, 0xA3, 0xF0,
|
||||
0x90, 0x43, 0x24, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x45, 0x38, 0xE0, 0x9F, 0x90, 0x45,
|
||||
0x37, 0xE0, 0x9E, 0x40, 0x03, 0x02, 0x1E, 0x77, 0xA3, 0xE0, 0xFE, 0x90, 0x43, 0x21, 0xE0, 0x2E,
|
||||
0xFF, 0x74, 0x26, 0x2E, 0xF9, 0xE4, 0x34, 0x43, 0xFA, 0x7B, 0x01, 0x12, 0x3C, 0xCD, 0x90, 0x45,
|
||||
0x37, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0, 0x80, 0xC6, 0x7B, 0x01, 0x7A, 0x43, 0x79, 0x26,
|
||||
0x90, 0x10, 0x46, 0x12, 0x27, 0xBA, 0xD3, 0x90, 0x43, 0x25, 0xE0, 0x94, 0x02, 0x90, 0x43, 0x24,
|
||||
0xE0, 0x94, 0x00, 0x40, 0x0F, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x10, 0x4C, 0xE4, 0xF0,
|
||||
0xA3, 0x74, 0x02, 0xF0, 0x90, 0x43, 0x26, 0x74, 0x33, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x80, 0x27,
|
||||
0x90, 0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0x44, 0x79, 0x2E, 0x90, 0x10,
|
||||
0x46, 0x12, 0x27, 0xBA, 0x90, 0x10, 0x4C, 0xE4, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x80, 0x08, 0x90,
|
||||
0x06, 0x22, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x24, 0x74, 0x08, 0xF0, 0x12, 0x33, 0xF6,
|
||||
0x90, 0x10, 0x3D, 0x74, 0x0C, 0xF0, 0x22, 0xD2, 0x00, 0x90, 0x43, 0x1F, 0xE0, 0x12, 0x28, 0x7E,
|
||||
0x1E, 0xAF, 0x04, 0x1F, 0xB1, 0x05, 0x1F, 0xC4, 0x08, 0x20, 0xE2, 0x09, 0x21, 0x37, 0x0A, 0x21,
|
||||
0xE9, 0x0D, 0x22, 0x7F, 0x0E, 0x22, 0xB1, 0x0F, 0x23, 0x3B, 0x11, 0x00, 0x00, 0x23, 0x4F, 0x90,
|
||||
0x43, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xEE, 0x60, 0x03, 0x02, 0x23, 0x4F, 0xEF, 0x24, 0xFE,
|
||||
0x70, 0x03, 0x02, 0x1F, 0x7D, 0x14, 0x60, 0x4B, 0x14, 0x70, 0x03, 0x02, 0x1F, 0x51, 0x24, 0x03,
|
||||
0x60, 0x03, 0x02, 0x23, 0x4F, 0x90, 0x43, 0x21, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
|
||||
0x00, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0x90, 0x43, 0x27, 0xE0, 0xF4, 0xFD, 0xEE,
|
||||
0x5D, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x00, 0xF5, 0x83,
|
||||
0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0x43, 0x26, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0,
|
||||
0x83, 0xF0, 0x22, 0x90, 0x43, 0x21, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5,
|
||||
0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFE, 0x90, 0x43, 0x27, 0xE0, 0xF4, 0xFD, 0xEE, 0x5D, 0xD0,
|
||||
0x82, 0xD0, 0x83, 0xF0, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xC0, 0x83,
|
||||
0xC0, 0x82, 0xE0, 0xFF, 0x90, 0x43, 0x26, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0,
|
||||
0x22, 0x90, 0x43, 0x21, 0xE0, 0xFF, 0x12, 0x3B, 0x25, 0x90, 0x45, 0x37, 0xEF, 0xF0, 0x90, 0x43,
|
||||
0x27, 0xE0, 0xF4, 0x5F, 0xFF, 0x90, 0x45, 0x37, 0xF0, 0xFE, 0x90, 0x43, 0x21, 0xE0, 0xFF, 0x90,
|
||||
0x43, 0x26, 0xE0, 0x4E, 0xFD, 0x12, 0x3A, 0x33, 0x72, 0x00, 0x92, 0x00, 0x22, 0x90, 0x43, 0x21,
|
||||
0xE0, 0xFF, 0x7B, 0x01, 0x7A, 0x45, 0x79, 0x37, 0x12, 0x3C, 0xCD, 0x90, 0x45, 0x37, 0xE0, 0xFF,
|
||||
0x90, 0x43, 0x27, 0xE0, 0xF4, 0xFE, 0xEF, 0x5E, 0xFF, 0x90, 0x45, 0x37, 0xF0, 0xFE, 0x90, 0x43,
|
||||
0x21, 0xE0, 0xFF, 0x90, 0x43, 0x26, 0xE0, 0x4E, 0xFD, 0x12, 0x3D, 0x00, 0x72, 0x00, 0x92, 0x00,
|
||||
0x22, 0x7B, 0x01, 0x7A, 0x44, 0x79, 0x2E, 0x90, 0x45, 0x3B, 0x12, 0x27, 0xBA, 0x7A, 0x43, 0x79,
|
||||
0x26, 0x02, 0x2A, 0xF6, 0x90, 0x43, 0x21, 0xE0, 0xFD, 0x90, 0x04, 0xBC, 0xF0, 0x90, 0x43, 0x20,
|
||||
0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0x04, 0xBD, 0xF0, 0x90, 0x43, 0x26, 0xE0, 0x90, 0x04,
|
||||
0xC0, 0xF0, 0x90, 0x43, 0x27, 0xE0, 0x90, 0x04, 0xC1, 0xF0, 0x90, 0x43, 0x28, 0xE0, 0x90, 0x04,
|
||||
0xC2, 0xF0, 0x90, 0x43, 0x29, 0xE0, 0x90, 0x04, 0xC3, 0xF0, 0x90, 0x04, 0xBE, 0x74, 0x01, 0xF0,
|
||||
0xED, 0x04, 0x90, 0x04, 0xBC, 0xF0, 0xEB, 0x24, 0x01, 0xE4, 0x3A, 0xA3, 0xF0, 0x90, 0x43, 0x2A,
|
||||
0xE0, 0x90, 0x04, 0xC0, 0xF0, 0x90, 0x43, 0x2B, 0xE0, 0x90, 0x04, 0xC1, 0xF0, 0x90, 0x43, 0x2C,
|
||||
0xE0, 0x90, 0x04, 0xC2, 0xF0, 0x90, 0x43, 0x2D, 0xE0, 0x90, 0x04, 0xC3, 0xF0, 0x90, 0x04, 0xBE,
|
||||
0x74, 0x01, 0xF0, 0xE4, 0x90, 0x45, 0x35, 0xF0, 0xA3, 0xF0, 0x90, 0x45, 0x35, 0xE0, 0xFE, 0xA3,
|
||||
0xE0, 0xFF, 0xC3, 0x94, 0x04, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x03, 0x02, 0x23, 0x4F, 0x90,
|
||||
0x43, 0x21, 0xE0, 0x24, 0x02, 0xFD, 0x90, 0x45, 0x36, 0xE0, 0xF9, 0x2D, 0xFD, 0x90, 0x43, 0x23,
|
||||
0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x2D, 0x90, 0x04, 0xBC, 0xF0, 0x90, 0x43, 0x21, 0xE0, 0x24, 0x02,
|
||||
0xFD, 0x90, 0x43, 0x20, 0xE0, 0x34, 0x00, 0xCD, 0x2F, 0xCD, 0x3E, 0xFC, 0x90, 0x43, 0x22, 0xE0,
|
||||
0xFE, 0xA3, 0xE0, 0x78, 0x02, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x2D, 0xEC, 0x3E, 0x90,
|
||||
0x04, 0xBD, 0xF0, 0x75, 0xF0, 0x04, 0xE9, 0x90, 0x43, 0x2E, 0x12, 0x27, 0x8E, 0xE0, 0x90, 0x04,
|
||||
0xC0, 0xF0, 0x75, 0xF0, 0x04, 0xE9, 0x90, 0x43, 0x2F, 0x12, 0x27, 0x8E, 0xE0, 0x90, 0x04, 0xC1,
|
||||
0xF0, 0x75, 0xF0, 0x04, 0xE9, 0x90, 0x43, 0x30, 0x12, 0x27, 0x8E, 0xE0, 0x90, 0x04, 0xC2, 0xF0,
|
||||
0x75, 0xF0, 0x04, 0xE9, 0x90, 0x43, 0x31, 0x12, 0x27, 0x8E, 0xE0, 0x90, 0x04, 0xC3, 0xF0, 0x90,
|
||||
0x04, 0xBE, 0x74, 0x01, 0xF0, 0x90, 0x45, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0, 0x02,
|
||||
0x20, 0x3A, 0xE4, 0x90, 0x04, 0xBD, 0xF0, 0x90, 0x04, 0xC0, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
|
||||
0xF0, 0x90, 0x45, 0x35, 0xF0, 0xA3, 0xF0, 0x90, 0x43, 0x24, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3,
|
||||
0x90, 0x45, 0x36, 0xE0, 0x9F, 0x90, 0x45, 0x35, 0xE0, 0x9E, 0x40, 0x03, 0x02, 0x23, 0x4F, 0xA3,
|
||||
0xE0, 0x24, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE0, 0x75, 0xF0, 0x16, 0xA4, 0x24,
|
||||
0x20, 0x90, 0x04, 0xBC, 0xF0, 0x90, 0x04, 0xBE, 0x74, 0x01, 0xF0, 0x90, 0x45, 0x35, 0xE4, 0x75,
|
||||
0xF0, 0x01, 0x12, 0x26, 0xB0, 0x80, 0xC0, 0xE4, 0x90, 0x45, 0x35, 0xF0, 0xA3, 0xF0, 0xFD, 0xFC,
|
||||
0x90, 0x43, 0x24, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x45, 0x36, 0xE0, 0x9F, 0x90, 0x45,
|
||||
0x35, 0xE0, 0x9E, 0x40, 0x03, 0x02, 0x23, 0x4F, 0x90, 0x43, 0x21, 0xE0, 0x2D, 0x90, 0x04, 0xBC,
|
||||
0xF0, 0x90, 0x43, 0x21, 0xE0, 0x2D, 0x90, 0x43, 0x20, 0xE0, 0x3C, 0x90, 0x04, 0xBD, 0xF0, 0x90,
|
||||
0x45, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xC6, 0xFE, 0x74, 0x26, 0x25, 0xF0, 0xF5, 0x82,
|
||||
0x74, 0x43, 0x3E, 0xF5, 0x83, 0xE0, 0x90, 0x04, 0xC0, 0xF0, 0x90, 0x45, 0x35, 0xE4, 0x75, 0xF0,
|
||||
0x01, 0x12, 0x26, 0xC6, 0xFE, 0x74, 0x26, 0x25, 0xF0, 0xF5, 0x82, 0x74, 0x43, 0x3E, 0xF5, 0x83,
|
||||
0xE0, 0x90, 0x04, 0xC1, 0xF0, 0x90, 0x45, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xC6, 0xFE,
|
||||
0x74, 0x26, 0x25, 0xF0, 0xF5, 0x82, 0x74, 0x43, 0x3E, 0xF5, 0x83, 0xE0, 0x90, 0x04, 0xC2, 0xF0,
|
||||
0x90, 0x45, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xC6, 0xFE, 0x74, 0x26, 0x25, 0xF0, 0xF5,
|
||||
0x82, 0x74, 0x43, 0x3E, 0xF5, 0x83, 0xE0, 0x90, 0x04, 0xC3, 0xF0, 0x90, 0x04, 0xBE, 0x74, 0x01,
|
||||
0xF0, 0x0D, 0xBD, 0x00, 0x01, 0x0C, 0x02, 0x21, 0x40, 0x90, 0x43, 0x20, 0xE0, 0xFE, 0xA3, 0xE0,
|
||||
0xFF, 0x64, 0x05, 0x4E, 0x70, 0x40, 0x90, 0x45, 0x35, 0xF0, 0xA3, 0xF0, 0x90, 0x45, 0x36, 0xE0,
|
||||
0xFD, 0x24, 0x26, 0xF5, 0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE0, 0xFC, 0x74, 0x40, 0x2D, 0xF5,
|
||||
0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xEC, 0xF0, 0x90, 0x45, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12,
|
||||
0x26, 0xB0, 0x90, 0x45, 0x35, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x64, 0x08, 0x70, 0xCE, 0x90, 0x04,
|
||||
0x48, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xEF, 0x64, 0x06, 0x4E, 0x60, 0x03, 0x02, 0x23, 0x4F, 0x90,
|
||||
0x45, 0x35, 0xF0, 0xA3, 0xF0, 0x90, 0x45, 0x36, 0xE0, 0xFF, 0x24, 0x26, 0xF5, 0x82, 0xE4, 0x34,
|
||||
0x43, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xEE,
|
||||
0xF0, 0x90, 0x45, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0, 0x90, 0x45, 0x35, 0xE0, 0x70,
|
||||
0x04, 0xA3, 0xE0, 0x64, 0x08, 0x70, 0xCE, 0x90, 0x04, 0x48, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90,
|
||||
0x43, 0x26, 0xE0, 0x90, 0x04, 0x22, 0xF0, 0x90, 0x43, 0x27, 0xE0, 0x90, 0x04, 0x23, 0xF0, 0x90,
|
||||
0x43, 0x28, 0xE0, 0x90, 0x04, 0x24, 0xF0, 0x90, 0x43, 0x29, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90,
|
||||
0x43, 0x2A, 0xE0, 0x90, 0x04, 0x28, 0xF0, 0x90, 0x43, 0x2B, 0xE0, 0xFD, 0x7F, 0x0A, 0x02, 0x3D,
|
||||
0x00, 0x90, 0x43, 0x26, 0xE0, 0x90, 0x04, 0x22, 0xF0, 0x90, 0x43, 0x27, 0xE0, 0x90, 0x04, 0x23,
|
||||
0xF0, 0x90, 0x43, 0x28, 0xE0, 0x90, 0x04, 0x24, 0xF0, 0x90, 0x43, 0x29, 0xE0, 0x90, 0x04, 0x25,
|
||||
0xF0, 0x90, 0x43, 0x2A, 0xE0, 0x90, 0x04, 0x28, 0xF0, 0x90, 0x43, 0x2B, 0xE0, 0xFD, 0x7F, 0x0A,
|
||||
0x12, 0x3D, 0x00, 0x90, 0x43, 0x2C, 0xE0, 0xFD, 0x7F, 0x88, 0x12, 0x3D, 0x00, 0x90, 0x04, 0x4C,
|
||||
0xE0, 0x54, 0xFC, 0xF0, 0xE0, 0xFF, 0x90, 0x43, 0x2D, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x04, 0x4C,
|
||||
0xF0, 0xE4, 0x90, 0x45, 0x35, 0xF0, 0xA3, 0xF0, 0x90, 0x45, 0x36, 0xE0, 0xFF, 0x24, 0x2E, 0xF5,
|
||||
0x82, 0xE4, 0x34, 0x43, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xDC, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04,
|
||||
0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x45, 0x35, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0, 0x90, 0x45,
|
||||
0x35, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x64, 0x22, 0x70, 0xCE, 0x22, 0x90, 0x43, 0x26, 0xE0, 0xFF,
|
||||
0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x12, 0x3C, 0x90, 0x22,
|
||||
0x90, 0x06, 0x30, 0x74, 0x70, 0xF0, 0x90, 0x06, 0x31, 0x74, 0xA0, 0xF0, 0xE0, 0x90, 0x06, 0x35,
|
||||
0xF0, 0x90, 0x06, 0x36, 0x74, 0xC0, 0xF0, 0x90, 0x06, 0x37, 0x74, 0x08, 0xF0, 0xE4, 0x90, 0x45,
|
||||
0x46, 0xF0, 0xA3, 0xF0, 0xC2, 0x05, 0x90, 0x06, 0x20, 0x74, 0x21, 0xF0, 0x90, 0x04, 0x58, 0x74,
|
||||
0x14, 0xF0, 0xA3, 0x74, 0x50, 0xF0, 0x12, 0x3C, 0x43, 0x75, 0xA8, 0x81, 0x90, 0x06, 0x05, 0x74,
|
||||
0x04, 0xF0, 0x90, 0x06, 0x0F, 0xE0, 0x30, 0xE4, 0x04, 0xD2, 0x06, 0x80, 0x02, 0xC2, 0x06, 0xE4,
|
||||
0x90, 0x43, 0x19, 0xF0, 0x20, 0x05, 0x03, 0x02, 0x25, 0xFB, 0xC2, 0x05, 0x90, 0x10, 0x39, 0xE0,
|
||||
0xFF, 0x20, 0xE5, 0x03, 0x02, 0x24, 0xCD, 0x54, 0xDF, 0xF0, 0x90, 0x06, 0x0E, 0xE0, 0x20, 0xE0,
|
||||
0x03, 0x02, 0x24, 0x4D, 0x7D, 0x17, 0x7F, 0x0C, 0x12, 0x3D, 0x00, 0x7D, 0xB9, 0x7F, 0x0D, 0x12,
|
||||
0x3D, 0x00, 0x90, 0x04, 0x54, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x45, 0x2F, 0xF0, 0xA3, 0xF0, 0x90,
|
||||
0x04, 0x54, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x45, 0x2F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0,
|
||||
0x90, 0x45, 0x2F, 0xE0, 0xB4, 0x07, 0xE8, 0xA3, 0xE0, 0xB4, 0xFF, 0xE3, 0xE4, 0x90, 0x04, 0x78,
|
||||
0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x06, 0x0E, 0xE0, 0x54, 0x01, 0xF0, 0x90, 0x06, 0x30, 0x74,
|
||||
0x70, 0xF0, 0x90, 0x06, 0x31, 0x74, 0xA0, 0xF0, 0xE0, 0x90, 0x06, 0x35, 0xF0, 0x90, 0x06, 0x36,
|
||||
0x74, 0xC0, 0xF0, 0x90, 0x06, 0x37, 0x74, 0x08, 0xF0, 0x90, 0x06, 0x38, 0x74, 0x03, 0xF0, 0x90,
|
||||
0x06, 0x01, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x06, 0x07, 0x74, 0x02, 0xF0, 0x90, 0x10, 0x38, 0x74,
|
||||
0x07, 0xF0, 0x90, 0x06, 0x0E, 0xE0, 0x30, 0xE1, 0x04, 0xE0, 0x54, 0x02, 0xF0, 0x90, 0x06, 0x0E,
|
||||
0xE0, 0x30, 0xE3, 0x11, 0xE0, 0x54, 0x08, 0xF0, 0x90, 0x06, 0x0F, 0xE0, 0x30, 0xE4, 0x04, 0xD2,
|
||||
0x06, 0x80, 0x02, 0xC2, 0x06, 0x90, 0x06, 0x0E, 0xE0, 0x30, 0xE2, 0x0A, 0xE0, 0x54, 0x04, 0xF0,
|
||||
0x90, 0x04, 0x79, 0x74, 0x11, 0xF0, 0x90, 0x06, 0x0E, 0xE0, 0x30, 0xE1, 0x50, 0xE0, 0x20, 0xE0,
|
||||
0x4C, 0x7D, 0x17, 0x7F, 0x0C, 0x12, 0x3D, 0x00, 0x7D, 0xB9, 0x7F, 0x0D, 0x12, 0x3D, 0x00, 0x90,
|
||||
0x04, 0x54, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x04, 0x78, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x0E, 0xE0,
|
||||
0x54, 0x02, 0xF0, 0x90, 0x06, 0x20, 0x74, 0x20, 0xF0, 0xE4, 0x90, 0x04, 0x58, 0xF0, 0x90, 0x06,
|
||||
0x07, 0x74, 0x03, 0xF0, 0x90, 0x04, 0x7A, 0xE0, 0x90, 0x45, 0x2E, 0xF0, 0xE0, 0x54, 0xF9, 0xF0,
|
||||
0x44, 0x02, 0xF0, 0x90, 0x04, 0x7A, 0xF0, 0x43, 0xA8, 0x81, 0x43, 0x87, 0x01, 0x90, 0x10, 0x39,
|
||||
0xE0, 0x30, 0xE0, 0x22, 0x90, 0x06, 0x24, 0xE0, 0x30, 0xE4, 0x05, 0x12, 0x12, 0x0E, 0x80, 0x0F,
|
||||
0x90, 0x06, 0x24, 0xE0, 0x30, 0xE3, 0x05, 0x12, 0x34, 0xB9, 0x80, 0x03, 0x12, 0x28, 0xF4, 0x90,
|
||||
0x10, 0x39, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x45, 0x46, 0xE0, 0x54, 0x14, 0x70, 0x09, 0xA3, 0xE0,
|
||||
0xFF, 0x20, 0xE6, 0x03, 0x30, 0xE3, 0x4F, 0x7B, 0x01, 0x7A, 0x06, 0x79, 0x40, 0x12, 0x33, 0x2B,
|
||||
0x90, 0x45, 0x46, 0xE0, 0xFF, 0x90, 0x06, 0x48, 0xF0, 0x90, 0x45, 0x47, 0xE0, 0x90, 0x06, 0x49,
|
||||
0xF0, 0x90, 0x04, 0x2C, 0xE0, 0x90, 0x06, 0x4A, 0xF0, 0x90, 0x04, 0x2D, 0xE0, 0x90, 0x06, 0x4B,
|
||||
0xF0, 0x90, 0x04, 0x2E, 0xE0, 0x90, 0x06, 0x4C, 0xF0, 0x90, 0x04, 0x2F, 0xE0, 0x90, 0x06, 0x4D,
|
||||
0xF0, 0x90, 0x06, 0x3F, 0x74, 0x01, 0xF0, 0xEF, 0x54, 0xEB, 0x90, 0x45, 0x46, 0xF0, 0xA3, 0xE0,
|
||||
0x54, 0xBF, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0x45, 0x47, 0xE0, 0xFF, 0x20, 0xE4, 0x03, 0x02, 0x25,
|
||||
0xE8, 0x90, 0x04, 0x7A, 0xE0, 0x54, 0xDF, 0xF0, 0xE0, 0x90, 0x45, 0x2E, 0xF0, 0xE0, 0x20, 0xE6,
|
||||
0x54, 0x90, 0x04, 0x7A, 0xE0, 0x90, 0x45, 0x2E, 0xF0, 0xE0, 0x54, 0x7F, 0xF0, 0x44, 0x80, 0xF0,
|
||||
0x90, 0x04, 0x7A, 0xF0, 0xEF, 0x54, 0xEF, 0x90, 0x45, 0x47, 0xF0, 0x7D, 0x17, 0x7F, 0x0C, 0x12,
|
||||
0x3D, 0x00, 0x7D, 0xB9, 0x7F, 0x0D, 0x12, 0x3D, 0x00, 0x90, 0x04, 0x54, 0x74, 0x01, 0xF0, 0xE4,
|
||||
0x90, 0x04, 0x78, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x20, 0x74, 0x20, 0xF0, 0x90, 0x04, 0x59, 0x74,
|
||||
0x10, 0xF0, 0xE4, 0x90, 0x06, 0x05, 0xF0, 0x90, 0x06, 0x07, 0x74, 0x03, 0xF0, 0x75, 0xA8, 0x81,
|
||||
0x43, 0x87, 0x01, 0x80, 0x23, 0x90, 0x04, 0x7A, 0xE0, 0x90, 0x45, 0x2E, 0xF0, 0xE0, 0x54, 0x7F,
|
||||
0xF0, 0x90, 0x04, 0x7A, 0xF0, 0x90, 0x10, 0x38, 0x74, 0x07, 0xF0, 0x90, 0x06, 0x05, 0x74, 0x04,
|
||||
0xF0, 0x90, 0x45, 0x47, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0x20, 0x74, 0x21, 0xF0, 0x90, 0x04,
|
||||
0x58, 0x74, 0x14, 0xF0, 0xA3, 0x74, 0x50, 0xF0, 0x43, 0xA8, 0x81, 0x90, 0x43, 0x19, 0xE0, 0x64,
|
||||
0x01, 0x60, 0x03, 0x02, 0x23, 0xA4, 0xF0, 0x90, 0x06, 0x24, 0xE0, 0x30, 0xE3, 0x03, 0x02, 0x23,
|
||||
0xA4, 0x90, 0x06, 0x25, 0xE0, 0x54, 0xF7, 0xF0, 0x30, 0x04, 0x07, 0xE4, 0x90, 0x06, 0x23, 0xF0,
|
||||
0x80, 0x06, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0x90, 0x06, 0x24, 0x74, 0x08, 0xF0, 0x90, 0x06,
|
||||
0x25, 0xF0, 0x02, 0x23, 0xA4, 0x22, 0xBB, 0x01, 0x06, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0x22, 0x50,
|
||||
0x02, 0xE7, 0x22, 0xBB, 0xFE, 0x02, 0xE3, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0x22, 0xBB,
|
||||
0x01, 0x0C, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0x22, 0x50, 0x06,
|
||||
0xE9, 0x25, 0x82, 0xF8, 0xE6, 0x22, 0xBB, 0xFE, 0x06, 0xE9, 0x25, 0x82, 0xF8, 0xE2, 0x22, 0xE5,
|
||||
0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE4, 0x93, 0x22, 0xBB, 0x01, 0x06, 0x89,
|
||||
0x82, 0x8A, 0x83, 0xF0, 0x22, 0x50, 0x02, 0xF7, 0x22, 0xBB, 0xFE, 0x01, 0xF3, 0x22, 0xF8, 0xBB,
|
||||
0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8, 0xF0, 0x22, 0x50,
|
||||
0x06, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x22, 0xBB, 0xFE, 0x05, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0x22,
|
||||
0xC5, 0xF0, 0xF8, 0xA3, 0xE0, 0x28, 0xF0, 0xC5, 0xF0, 0xF8, 0xE5, 0x82, 0x15, 0x82, 0x70, 0x02,
|
||||
0x15, 0x83, 0xE0, 0x38, 0xF0, 0x22, 0xA3, 0xF8, 0xE0, 0xC5, 0xF0, 0x25, 0xF0, 0xF0, 0xE5, 0x82,
|
||||
0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0xC8, 0x38, 0xF0, 0xE8, 0x22, 0xBB, 0x01, 0x10, 0xE5,
|
||||
0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE0, 0x22, 0x50,
|
||||
0x09, 0xE9, 0x25, 0x82, 0xF8, 0x86, 0xF0, 0x08, 0xE6, 0x22, 0xBB, 0xFE, 0x0A, 0xE9, 0x25, 0x82,
|
||||
0xF8, 0xE2, 0xF5, 0xF0, 0x08, 0xE2, 0x22, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0xE9, 0x93, 0xF5, 0xF0,
|
||||
0xA3, 0xE9, 0x93, 0x22, 0xBB, 0x01, 0x0D, 0xC5, 0x82, 0x29, 0xC5, 0x82, 0xC5, 0x83, 0x3A, 0xC5,
|
||||
0x83, 0x02, 0x26, 0xB0, 0x50, 0x11, 0xC5, 0x82, 0x29, 0xF8, 0x08, 0xE5, 0xF0, 0x26, 0xF6, 0x18,
|
||||
0xF5, 0xF0, 0xE5, 0x82, 0x36, 0xF6, 0x22, 0xBB, 0xFE, 0x11, 0xC5, 0x82, 0x29, 0xF8, 0x08, 0xE2,
|
||||
0x25, 0xF0, 0xF5, 0xF0, 0xF2, 0x18, 0xE2, 0x35, 0x82, 0xF2, 0x22, 0xF8, 0xE5, 0x82, 0x29, 0xF5,
|
||||
0x82, 0xE5, 0x83, 0x2A, 0xF5, 0x83, 0x74, 0x01, 0x93, 0x25, 0xF0, 0xF5, 0xF0, 0xE4, 0x93, 0x38,
|
||||
0x22, 0xF8, 0xBB, 0x01, 0x11, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83, 0xE8,
|
||||
0xF0, 0xE5, 0xF0, 0xA3, 0xF0, 0x22, 0x50, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF6, 0x08, 0xA6, 0xF0,
|
||||
0x22, 0xBB, 0xFE, 0x09, 0xE9, 0x25, 0x82, 0xC8, 0xF2, 0xE5, 0xF0, 0x08, 0xF2, 0x22, 0xA4, 0x25,
|
||||
0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3,
|
||||
0xE0, 0xF9, 0x22, 0xF8, 0xE0, 0xFB, 0xA3, 0xA3, 0xE0, 0xF9, 0x25, 0xF0, 0xF0, 0xE5, 0x82, 0x15,
|
||||
0x82, 0x70, 0x02, 0x15, 0x83, 0xE0, 0xFA, 0x38, 0xF0, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3,
|
||||
0xE9, 0xF0, 0x22, 0xBB, 0x01, 0x0D, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83,
|
||||
0x02, 0x27, 0x9A, 0x50, 0x07, 0xE9, 0x25, 0x82, 0xF8, 0x02, 0x28, 0xA4, 0xBB, 0xFE, 0x07, 0xE9,
|
||||
0x25, 0x82, 0xF8, 0x02, 0x28, 0xC6, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A, 0xF5, 0x83,
|
||||
0x02, 0x28, 0xE8, 0xBB, 0x01, 0x0D, 0xC5, 0x82, 0x29, 0xC5, 0x82, 0xC5, 0x83, 0x3A, 0xC5, 0x83,
|
||||
0x02, 0x27, 0xA3, 0x50, 0x08, 0xF8, 0xE9, 0x25, 0x82, 0xC8, 0x02, 0x28, 0xAD, 0xBB, 0xFE, 0x08,
|
||||
0xF8, 0xE9, 0x25, 0x82, 0xC8, 0x02, 0x28, 0xCF, 0xC5, 0x82, 0x29, 0xC5, 0x82, 0xC5, 0x83, 0x3A,
|
||||
0xC5, 0x83, 0x02, 0x28, 0xE8, 0xBB, 0x01, 0x20, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x3A,
|
||||
0xF5, 0x83, 0xD0, 0xF0, 0xD0, 0xE0, 0xF8, 0xD0, 0xE0, 0xF9, 0xD0, 0xE0, 0xFA, 0xD0, 0xE0, 0xFB,
|
||||
0xE8, 0xC0, 0xE0, 0xC0, 0xF0, 0x02, 0x27, 0xBA, 0x50, 0x18, 0xE9, 0x25, 0x82, 0xF8, 0xD0, 0x83,
|
||||
0xD0, 0x82, 0xD0, 0xE0, 0xF9, 0xD0, 0xE0, 0xFA, 0xD0, 0xE0, 0xFB, 0xC0, 0x82, 0xC0, 0x83, 0x02,
|
||||
0x28, 0xBD, 0xBB, 0xFE, 0x18, 0xE9, 0x25, 0x82, 0xF8, 0xD0, 0x83, 0xD0, 0x82, 0xD0, 0xE0, 0xF9,
|
||||
0xD0, 0xE0, 0xFA, 0xD0, 0xE0, 0xFB, 0xC0, 0x82, 0xC0, 0x83, 0x02, 0x28, 0xDF, 0x22, 0xD0, 0x83,
|
||||
0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8,
|
||||
0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3,
|
||||
0xA3, 0xA3, 0x80, 0xDF, 0xE6, 0xFB, 0x08, 0xE6, 0xFA, 0x08, 0xE6, 0xF9, 0x22, 0xFA, 0xE6, 0xFB,
|
||||
0x08, 0x08, 0xE6, 0xF9, 0x25, 0xF0, 0xF6, 0x18, 0xE6, 0xCA, 0x3A, 0xF6, 0x22, 0xEB, 0xF6, 0x08,
|
||||
0xEA, 0xF6, 0x08, 0xE9, 0xF6, 0x22, 0xE2, 0xFB, 0x08, 0xE2, 0xFA, 0x08, 0xE2, 0xF9, 0x22, 0xFA,
|
||||
0xE2, 0xFB, 0x08, 0x08, 0xE2, 0xF9, 0x25, 0xF0, 0xF2, 0x18, 0xE2, 0xCA, 0x3A, 0xF2, 0x22, 0xEB,
|
||||
0xF2, 0x08, 0xEA, 0xF2, 0x08, 0xE9, 0xF2, 0x22, 0xE4, 0x93, 0xFB, 0x74, 0x01, 0x93, 0xFA, 0x74,
|
||||
0x02, 0x93, 0xF9, 0x22, 0x90, 0x06, 0x23, 0xE0, 0x54, 0x7F, 0xFF, 0xC3, 0x74, 0x40, 0x9F, 0x90,
|
||||
0x45, 0x31, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x10, 0x3D, 0xE0, 0x64, 0x0B, 0x60, 0x03, 0x02, 0x2A,
|
||||
0x60, 0x90, 0x10, 0x44, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x43, 0x21, 0xE0, 0x2F, 0x90, 0x45,
|
||||
0x34, 0xF0, 0x90, 0x43, 0x20, 0xE0, 0x3E, 0x90, 0x45, 0x33, 0xF0, 0x90, 0x45, 0x31, 0xE0, 0x70,
|
||||
0x03, 0x02, 0x2A, 0xA6, 0x14, 0xF0, 0x90, 0x43, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xEE, 0x60,
|
||||
0x03, 0x02, 0x2A, 0x57, 0xEF, 0x12, 0x28, 0x7E, 0x29, 0x6A, 0x01, 0x29, 0x94, 0x02, 0x29, 0xB5,
|
||||
0x03, 0x29, 0xDE, 0x04, 0x29, 0xFE, 0x07, 0x2A, 0x31, 0x09, 0x2A, 0x31, 0x0A, 0x2A, 0x31, 0x0B,
|
||||
0x2A, 0x31, 0x0C, 0x2A, 0x31, 0x0D, 0x00, 0x00, 0x2A, 0x57, 0x90, 0x45, 0x32, 0xE0, 0x24, 0x60,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x45, 0x33, 0xE4, 0x75, 0xF0, 0x01,
|
||||
0x12, 0x26, 0xC6, 0xFC, 0x74, 0x00, 0x25, 0xF0, 0xF5, 0x82, 0x74, 0x00, 0x3C, 0xF5, 0x83, 0xEF,
|
||||
0xF0, 0x02, 0x2A, 0x57, 0x90, 0x45, 0x33, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xC6, 0xAF, 0xF0,
|
||||
0x90, 0x45, 0x32, 0xE0, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFD, 0x12,
|
||||
0x3D, 0x00, 0x02, 0x2A, 0x57, 0x90, 0x45, 0x32, 0xE0, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x06,
|
||||
0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x45, 0x33, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xC6, 0xFC, 0x74,
|
||||
0x00, 0x25, 0xF0, 0xF5, 0x82, 0x74, 0x04, 0x3C, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x79, 0x90, 0x45,
|
||||
0x33, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xC6, 0xAF, 0xF0, 0x90, 0x45, 0x32, 0xE0, 0x24, 0x60,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFD, 0x12, 0x3A, 0x33, 0x80, 0x59, 0x90, 0x45,
|
||||
0x32, 0xE0, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFD, 0x7F, 0xF1, 0x12,
|
||||
0x3D, 0x00, 0x90, 0x45, 0x34, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0xF0, 0x12, 0x3D, 0x00, 0x90, 0x45,
|
||||
0x33, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xC6, 0xAD, 0xF0, 0x7F, 0xF0, 0x12, 0x3D, 0x00, 0x80,
|
||||
0x26, 0x90, 0x43, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x45, 0x33, 0xE4, 0x75, 0xF0, 0x01,
|
||||
0x12, 0x26, 0xC6, 0xAD, 0xF0, 0x90, 0x45, 0x32, 0xE0, 0x24, 0x60, 0xF5, 0x82, 0xE4, 0x34, 0x06,
|
||||
0xF5, 0x83, 0xE0, 0xFB, 0x12, 0x3A, 0xAE, 0x90, 0x45, 0x32, 0xE0, 0x04, 0xF0, 0x02, 0x29, 0x2B,
|
||||
0x90, 0x10, 0x3D, 0xE0, 0xFF, 0xB4, 0x0D, 0x2D, 0x90, 0x45, 0x31, 0xE0, 0x60, 0x38, 0xA3, 0xE0,
|
||||
0xFE, 0x04, 0xF0, 0x74, 0x60, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x90,
|
||||
0x10, 0x3F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x27, 0xA3, 0xEE, 0x12, 0x26, 0x7C, 0x90, 0x45, 0x31,
|
||||
0xE0, 0x14, 0xF0, 0x80, 0xD3, 0xEF, 0xB4, 0x0C, 0x07, 0xC2, 0x8C, 0xE4, 0x90, 0x43, 0x19, 0xF0,
|
||||
0xE4, 0x90, 0x10, 0x3D, 0xF0, 0x22, 0x30, 0x04, 0x0A, 0xC2, 0x04, 0x90, 0x06, 0x23, 0x74, 0xC0,
|
||||
0xF0, 0x80, 0x08, 0xD2, 0x04, 0x90, 0x06, 0x23, 0x74, 0x40, 0xF0, 0x90, 0x45, 0x32, 0xE0, 0xFF,
|
||||
0x90, 0x10, 0x44, 0xE4, 0x8F, 0xF0, 0x12, 0x26, 0xB0, 0x90, 0x10, 0x42, 0xE0, 0xFE, 0xA3, 0xE0,
|
||||
0xFF, 0xA3, 0xE0, 0xB5, 0x06, 0x19, 0xA3, 0xE0, 0xB5, 0x07, 0x14, 0x90, 0x10, 0x3D, 0xE0, 0xB4,
|
||||
0x0D, 0x03, 0x12, 0x1E, 0x87, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90,
|
||||
0x06, 0x25, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x45, 0x38, 0x12, 0x27, 0xBA, 0x12, 0x26, 0x36, 0x60,
|
||||
0x03, 0x02, 0x2B, 0x8F, 0x7F, 0x1C, 0x12, 0x3B, 0x25, 0x90, 0x45, 0x3B, 0x12, 0x27, 0x9A, 0x90,
|
||||
0x00, 0x08, 0xEF, 0x12, 0x26, 0x8E, 0x7F, 0x1D, 0x12, 0x3B, 0x25, 0x90, 0x45, 0x3B, 0x12, 0x27,
|
||||
0x9A, 0x90, 0x00, 0x09, 0xEF, 0x12, 0x26, 0x8E, 0x7F, 0x1B, 0x12, 0x3B, 0x25, 0x90, 0x45, 0x3B,
|
||||
0x12, 0x27, 0x9A, 0x90, 0x00, 0x07, 0xEF, 0x12, 0x26, 0x8E, 0xE9, 0x24, 0x07, 0xF9, 0xE4, 0x3A,
|
||||
0xFA, 0x12, 0x26, 0x36, 0x54, 0x7F, 0x12, 0x26, 0x7C, 0x90, 0x45, 0x3B, 0x12, 0x27, 0x9A, 0x90,
|
||||
0x00, 0x07, 0x12, 0x26, 0x4F, 0x90, 0x45, 0x45, 0xF0, 0x90, 0x04, 0x2B, 0x74, 0xFF, 0xF0, 0x12,
|
||||
0x3C, 0x43, 0x90, 0x45, 0x3B, 0x12, 0x27, 0x9A, 0x90, 0x00, 0x07, 0x12, 0x26, 0x4F, 0xFF, 0x12,
|
||||
0x3D, 0x62, 0x90, 0x45, 0x3B, 0x12, 0x27, 0x9A, 0x90, 0x00, 0x08, 0x12, 0x26, 0x4F, 0xFD, 0x90,
|
||||
0x40, 0xC0, 0xF0, 0x90, 0x00, 0x07, 0x12, 0x26, 0x4F, 0xFF, 0x12, 0x39, 0x2D, 0x80, 0x1B, 0x12,
|
||||
0x3D, 0xE2, 0x90, 0x04, 0x54, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x06, 0x38, 0x74, 0x03, 0xF0, 0x12,
|
||||
0x3D, 0x31, 0x90, 0x04, 0x48, 0x74, 0x02, 0xF0, 0x14, 0xF0, 0xE4, 0xFF, 0xFE, 0x74, 0xC4, 0x2F,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xFD, 0x90, 0x45, 0x3B, 0x12, 0x27, 0x9A, 0xE9,
|
||||
0x24, 0x01, 0xF9, 0xE4, 0x3A, 0xFA, 0xE9, 0x2F, 0xF9, 0xEA, 0x3E, 0xFA, 0xED, 0x12, 0x26, 0x7C,
|
||||
0x0F, 0xBF, 0x00, 0x01, 0x0E, 0xEF, 0x64, 0x06, 0x4E, 0x70, 0xD2, 0x90, 0x45, 0x38, 0x12, 0x27,
|
||||
0x9A, 0x90, 0x00, 0x01, 0x12, 0x26, 0x4F, 0x60, 0x31, 0xE4, 0xFE, 0xFF, 0x90, 0x45, 0x38, 0x12,
|
||||
0x27, 0x9A, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0xFA, 0xE9, 0x2F, 0xF9, 0xEA, 0x3E, 0xFA, 0x12,
|
||||
0x26, 0x36, 0xFD, 0x74, 0xC4, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xED, 0xF0, 0x0F,
|
||||
0xBF, 0x00, 0x01, 0x0E, 0xEF, 0x64, 0x06, 0x4E, 0x70, 0xD2, 0x90, 0x45, 0x38, 0x12, 0x27, 0x9A,
|
||||
0x90, 0x00, 0x08, 0x12, 0x26, 0x4F, 0x90, 0x04, 0x21, 0xF0, 0x90, 0x00, 0x09, 0x12, 0x26, 0x4F,
|
||||
0x90, 0x04, 0x20, 0xF0, 0x90, 0x04, 0x50, 0xE0, 0x44, 0x82, 0xF0, 0x90, 0x04, 0x54, 0x74, 0x0E,
|
||||
0xF0, 0x90, 0x45, 0x3B, 0x12, 0x27, 0x9A, 0xE4, 0x12, 0x26, 0x7C, 0xD3, 0x22, 0xAC, 0x07, 0xAA,
|
||||
0x05, 0xD2, 0x03, 0x90, 0x04, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0xEC, 0xD3, 0x94, 0x0E, 0x40, 0x03,
|
||||
0x02, 0x2C, 0xFA, 0xEA, 0x94, 0x0E, 0x50, 0x03, 0x02, 0x2C, 0xFA, 0x90, 0x40, 0xC9, 0xE0, 0xFD,
|
||||
0x90, 0x40, 0xC8, 0xE0, 0xFB, 0x90, 0x40, 0xC7, 0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03, 0x90,
|
||||
0x40, 0xCC, 0xE0, 0xFD, 0x90, 0x40, 0xCB, 0xE0, 0xFB, 0x90, 0x40, 0xCA, 0x12, 0x3C, 0x89, 0x82,
|
||||
0x03, 0x92, 0x03, 0x90, 0x40, 0xD2, 0xE0, 0xFD, 0x90, 0x40, 0xD1, 0xE0, 0xFB, 0x90, 0x40, 0xD0,
|
||||
0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03, 0x90, 0x40, 0xD8, 0xE0, 0xFD, 0x90, 0x40, 0xD7, 0xE0,
|
||||
0xFB, 0x90, 0x40, 0xD6, 0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03, 0x90, 0x40, 0xE1, 0xE0, 0xFD,
|
||||
0x90, 0x40, 0xE0, 0xE0, 0xFB, 0x90, 0x40, 0xDF, 0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03, 0x90,
|
||||
0x40, 0xE7, 0xE0, 0xFD, 0x90, 0x40, 0xE6, 0xE0, 0xFB, 0x90, 0x40, 0xE5, 0x12, 0x3C, 0x89, 0x82,
|
||||
0x03, 0x92, 0x03, 0x90, 0x40, 0xF0, 0xE0, 0xFD, 0x90, 0x40, 0xEF, 0xE0, 0xFB, 0x90, 0x40, 0xEE,
|
||||
0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03, 0x02, 0x2D, 0x98, 0xEC, 0xD3, 0x94, 0x0E, 0x50, 0x03,
|
||||
0x02, 0x2D, 0x98, 0xEA, 0xD3, 0x94, 0x0E, 0x40, 0x03, 0x02, 0x2D, 0x98, 0x90, 0x42, 0xF1, 0xE0,
|
||||
0xFD, 0x90, 0x42, 0xF0, 0xE0, 0xFB, 0x90, 0x42, 0xEF, 0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03,
|
||||
0x90, 0x42, 0xF4, 0xE0, 0xFD, 0x90, 0x42, 0xF3, 0xE0, 0xFB, 0x90, 0x42, 0xF2, 0x12, 0x3C, 0x89,
|
||||
0x82, 0x03, 0x92, 0x03, 0x90, 0x42, 0xFA, 0xE0, 0xFD, 0x90, 0x42, 0xF9, 0xE0, 0xFB, 0x90, 0x42,
|
||||
0xF8, 0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03, 0x90, 0x43, 0x00, 0xE0, 0xFD, 0x90, 0x42, 0xFF,
|
||||
0xE0, 0xFB, 0x90, 0x42, 0xFE, 0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03, 0x90, 0x43, 0x09, 0xE0,
|
||||
0xFD, 0x90, 0x43, 0x08, 0xE0, 0xFB, 0x90, 0x43, 0x07, 0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03,
|
||||
0x90, 0x43, 0x0F, 0xE0, 0xFD, 0x90, 0x43, 0x0E, 0xE0, 0xFB, 0x90, 0x43, 0x0D, 0x12, 0x3C, 0x89,
|
||||
0x82, 0x03, 0x92, 0x03, 0x90, 0x43, 0x18, 0xE0, 0xFD, 0x90, 0x43, 0x17, 0xE0, 0xFB, 0x90, 0x43,
|
||||
0x16, 0x12, 0x3C, 0x89, 0x82, 0x03, 0x92, 0x03, 0x90, 0x04, 0x78, 0xE0, 0x44, 0x01, 0xF0, 0xA2,
|
||||
0x03, 0x22, 0xAC, 0x07, 0xAA, 0x05, 0xD2, 0x03, 0xEC, 0xD3, 0x94, 0x0E, 0x40, 0x03, 0x02, 0x2E,
|
||||
0x43, 0xEA, 0x94, 0x0E, 0x50, 0x03, 0x02, 0x2E, 0x43, 0x90, 0x40, 0xC9, 0xE0, 0xFD, 0x90, 0x40,
|
||||
0xC8, 0xE0, 0xFB, 0x90, 0x40, 0xC7, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90,
|
||||
0x82, 0x03, 0x92, 0x03, 0x90, 0x40, 0xD8, 0xE0, 0xFD, 0x90, 0x40, 0xD7, 0xE0, 0xFB, 0x90, 0x40,
|
||||
0xD6, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x03, 0x92, 0x03, 0x90,
|
||||
0x40, 0xDE, 0xE0, 0xFD, 0x90, 0x40, 0xDD, 0xE0, 0xFB, 0x90, 0x40, 0xDC, 0xE0, 0x90, 0x45, 0x44,
|
||||
0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x03, 0x92, 0x03, 0x90, 0x40, 0xE7, 0xE0, 0xFD, 0x90,
|
||||
0x40, 0xE6, 0xE0, 0xFB, 0x90, 0x40, 0xE5, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C,
|
||||
0x90, 0x82, 0x03, 0x92, 0x03, 0x90, 0x40, 0xED, 0xE0, 0xFD, 0x90, 0x40, 0xEC, 0xE0, 0xFB, 0x90,
|
||||
0x40, 0xEB, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x03, 0x92, 0x03,
|
||||
0x02, 0x2E, 0xDC, 0xEC, 0xD3, 0x94, 0x0E, 0x50, 0x03, 0x02, 0x2E, 0xDC, 0xEA, 0xD3, 0x94, 0x0E,
|
||||
0x40, 0x03, 0x02, 0x2E, 0xDC, 0x90, 0x42, 0xF1, 0xE0, 0xFD, 0x90, 0x42, 0xF0, 0xE0, 0xFB, 0x90,
|
||||
0x42, 0xEF, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x03, 0x92, 0x03,
|
||||
0x90, 0x43, 0x00, 0xE0, 0xFD, 0x90, 0x42, 0xFF, 0xE0, 0xFB, 0x90, 0x42, 0xFE, 0xE0, 0x90, 0x45,
|
||||
0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x03, 0x92, 0x03, 0x90, 0x43, 0x06, 0xE0, 0xFD,
|
||||
0x90, 0x43, 0x05, 0xE0, 0xFB, 0x90, 0x43, 0x04, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12,
|
||||
0x3C, 0x90, 0x82, 0x03, 0x92, 0x03, 0x90, 0x43, 0x0F, 0xE0, 0xFD, 0x90, 0x43, 0x0E, 0xE0, 0xFB,
|
||||
0x90, 0x43, 0x0D, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x03, 0x92,
|
||||
0x03, 0x90, 0x43, 0x15, 0xE0, 0xFD, 0x90, 0x43, 0x14, 0xE0, 0xFB, 0x90, 0x43, 0x13, 0xE0, 0x90,
|
||||
0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x03, 0x92, 0x03, 0xA2, 0x03, 0x22, 0x90,
|
||||
0x45, 0x40, 0xEF, 0xF0, 0xD2, 0x02, 0x90, 0x40, 0xC0, 0xE0, 0xFF, 0x90, 0x45, 0x40, 0xE0, 0xFD,
|
||||
0x12, 0x2D, 0xA2, 0x82, 0x02, 0x92, 0x02, 0x90, 0x45, 0x40, 0xE0, 0xFC, 0xD3, 0x94, 0x0E, 0x50,
|
||||
0x10, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0x7B, 0x8A, 0x7D, 0xF1, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x80,
|
||||
0x3A, 0xEC, 0xD3, 0x94, 0x28, 0x50, 0x10, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0x7B, 0x8B, 0x7D, 0xF1,
|
||||
0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x80, 0x24, 0xEC, 0xD3, 0x94, 0x33, 0x50, 0x10, 0xE4, 0x90, 0x45,
|
||||
0x44, 0xF0, 0x7B, 0x8B, 0x7D, 0xB1, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x80, 0x0E, 0xE4, 0x90, 0x45,
|
||||
0x44, 0xF0, 0x7B, 0x8B, 0x7D, 0x91, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x90, 0x45, 0x40, 0xE0, 0xFF,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x24, 0xF0, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0xFD, 0xEF,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x24, 0xEF, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0xFB, 0xEF,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x24, 0xEE, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0x90, 0x45,
|
||||
0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02, 0x90, 0x45, 0x40, 0xE0, 0xFF,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x24, 0x98, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0xFD, 0xEF,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x24, 0x97, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0xFB, 0xEF,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0x90, 0x45,
|
||||
0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02, 0x90, 0x45, 0x40, 0xE0, 0xFF,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x24, 0x40, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xE0, 0xFD, 0xEF,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x24, 0x3F, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xE0, 0xFB, 0xEF,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x24, 0x3E, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xE0, 0x90, 0x45,
|
||||
0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02, 0xE4, 0x90, 0x45, 0x44, 0xF0,
|
||||
0xFB, 0xFD, 0x7F, 0xC8, 0x12, 0x3D, 0x90, 0xA2, 0x02, 0x22, 0xD2, 0x01, 0xE4, 0x90, 0x04, 0x78,
|
||||
0xF0, 0xA3, 0x74, 0x13, 0xF0, 0x7B, 0x01, 0x7A, 0x45, 0x79, 0x40, 0x7F, 0x0D, 0x12, 0x3C, 0xCD,
|
||||
0x90, 0x45, 0x40, 0xE0, 0x54, 0xFE, 0xFF, 0xF0, 0xFD, 0x7F, 0x0D, 0x12, 0x3D, 0x00, 0xE4, 0x90,
|
||||
0x45, 0x3E, 0xF0, 0xA3, 0xF0, 0x90, 0x45, 0x3E, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0x10,
|
||||
0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x57, 0x90, 0x42, 0xEB, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27,
|
||||
0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x90, 0x42, 0xEA, 0x75,
|
||||
0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0,
|
||||
0xFB, 0x90, 0x42, 0xE9, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4,
|
||||
0x25, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x01,
|
||||
0x92, 0x01, 0x90, 0x45, 0x3E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0, 0x80, 0x97, 0x90, 0x04,
|
||||
0x78, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0xFB, 0xFD, 0x7F, 0x96, 0x12, 0x3D, 0x90,
|
||||
0x90, 0x45, 0x44, 0x74, 0x9A, 0xF0, 0x7B, 0xBA, 0x7D, 0x8F, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82,
|
||||
0x01, 0x92, 0x01, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0xFB, 0xFD, 0x7F, 0x1E, 0x12, 0x3D, 0x90, 0x90,
|
||||
0x45, 0x44, 0x74, 0x3A, 0xF0, 0x7B, 0xBA, 0x7D, 0x8F, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x01,
|
||||
0x92, 0x01, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0xFB, 0xFD, 0x7F, 0x1E, 0x12, 0x3D, 0x90, 0x90, 0x43,
|
||||
0x18, 0xE0, 0xFD, 0x90, 0x43, 0x17, 0xE0, 0xFB, 0x90, 0x43, 0x16, 0xE0, 0x90, 0x45, 0x44, 0xF0,
|
||||
0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x01, 0x92, 0x01, 0x90, 0x04, 0x79, 0x74, 0x13, 0xF0, 0x90,
|
||||
0x04, 0x78, 0x74, 0x05, 0xF0, 0x7B, 0x01, 0x7A, 0x45, 0x79, 0x40, 0x7F, 0x0D, 0x12, 0x3C, 0xCD,
|
||||
0x90, 0x45, 0x40, 0xE0, 0x44, 0x01, 0xFF, 0xF0, 0xFD, 0x7F, 0x0D, 0x12, 0x3D, 0x00, 0x90, 0x04,
|
||||
0x62, 0x74, 0xC0, 0xF0, 0xA2, 0x01, 0x22, 0xD2, 0x01, 0xE4, 0x90, 0x04, 0x78, 0xF0, 0xA3, 0x74,
|
||||
0x13, 0xF0, 0xE4, 0x90, 0x45, 0x3E, 0xF0, 0xA3, 0xF0, 0x90, 0x45, 0x3E, 0xE0, 0xFE, 0xA3, 0xE0,
|
||||
0xFF, 0xC3, 0x94, 0x0F, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x57, 0x90, 0x42, 0xEB, 0x75, 0xF0,
|
||||
0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0, 0xFD,
|
||||
0x90, 0x42, 0xEA, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25,
|
||||
0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x90, 0x42, 0xE9, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE,
|
||||
0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12,
|
||||
0x3C, 0x90, 0x82, 0x01, 0x92, 0x01, 0x90, 0x45, 0x3E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0,
|
||||
0x80, 0x97, 0x90, 0x04, 0x78, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0xFB, 0xFD, 0x7F,
|
||||
0x96, 0x12, 0x3D, 0x90, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0x7B, 0xD8, 0x7D, 0x0F, 0x7F, 0xB9, 0x12,
|
||||
0x3C, 0x90, 0x82, 0x01, 0x92, 0x01, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0xFB, 0xFD, 0x7F, 0x1E, 0x12,
|
||||
0x3D, 0x90, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0x7B, 0x78, 0x7D, 0x0F, 0x7F, 0xB9, 0x12, 0x3C, 0x90,
|
||||
0x82, 0x01, 0x92, 0x01, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0xFB, 0xFD, 0x7F, 0x1E, 0x12, 0x3D, 0x90,
|
||||
0x90, 0x43, 0x15, 0xE0, 0xFD, 0x90, 0x43, 0x14, 0xE0, 0xFB, 0x90, 0x43, 0x13, 0xE0, 0x90, 0x45,
|
||||
0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x01, 0x92, 0x01, 0x90, 0x04, 0x78, 0x74, 0x05,
|
||||
0xF0, 0x90, 0x04, 0x62, 0x74, 0xC0, 0xF0, 0xA2, 0x01, 0x22, 0x90, 0x45, 0x40, 0xEF, 0xF0, 0xD2,
|
||||
0x02, 0x90, 0x04, 0x78, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x45, 0x40, 0xE0, 0xFF, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x24, 0xF0, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0xFD, 0xEF, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x24, 0xEF, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0xFB, 0xEF, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x24, 0xEE, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F,
|
||||
0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02, 0x90, 0x45, 0x40, 0xE0, 0xFF, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x24, 0x98, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0xFD, 0xEF, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x24, 0x97, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0xFB, 0xEF, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F,
|
||||
0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02, 0x90, 0x45, 0x40, 0xE0, 0xFF, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x24, 0x40, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xE0, 0xFD, 0xEF, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x24, 0x3F, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xE0, 0xFB, 0xEF, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x24, 0x3E, 0xF5, 0x82, 0xE4, 0x34, 0x42, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F,
|
||||
0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02, 0x90, 0x04, 0x78, 0xE0, 0x44, 0x01, 0xF0, 0xE4,
|
||||
0x90, 0x45, 0x44, 0xF0, 0xFB, 0xFD, 0x7F, 0xC8, 0x12, 0x3D, 0x90, 0x90, 0x40, 0xC0, 0xE0, 0xFF,
|
||||
0x90, 0x45, 0x40, 0xE0, 0xFD, 0x12, 0x2C, 0x4D, 0xA2, 0x02, 0x22, 0x90, 0x45, 0x31, 0x12, 0x27,
|
||||
0xBA, 0xE4, 0xFF, 0x90, 0x04, 0x48, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0xFD, 0xFC, 0x90, 0x04, 0x48,
|
||||
0xE0, 0xFF, 0x30, 0xE4, 0x0B, 0x0D, 0xBD, 0x00, 0x01, 0x0C, 0xBC, 0x07, 0xF0, 0xBD, 0xFF, 0xED,
|
||||
0xAE, 0x04, 0xAF, 0x05, 0xBE, 0x07, 0x05, 0xBF, 0xFF, 0x02, 0xC3, 0x22, 0x90, 0x04, 0x30, 0xE0,
|
||||
0xFF, 0x90, 0x45, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x27, 0xA3, 0xEF, 0x12, 0x26, 0x7C, 0x90,
|
||||
0x04, 0x31, 0xE0, 0xFF, 0x90, 0x45, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x27, 0xA3, 0xEF, 0x12,
|
||||
0x26, 0x7C, 0x90, 0x04, 0x32, 0xE0, 0xFF, 0x90, 0x45, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x27,
|
||||
0xA3, 0xEF, 0x12, 0x26, 0x7C, 0x90, 0x04, 0x33, 0xE0, 0xFF, 0x90, 0x45, 0x31, 0xE4, 0x75, 0xF0,
|
||||
0x01, 0x12, 0x27, 0xA3, 0xEF, 0x12, 0x26, 0x7C, 0x90, 0x04, 0x34, 0xE0, 0xFF, 0x90, 0x45, 0x31,
|
||||
0xE4, 0x75, 0xF0, 0x01, 0x12, 0x27, 0xA3, 0xEF, 0x12, 0x26, 0x7C, 0x90, 0x04, 0x35, 0xE0, 0xFF,
|
||||
0x90, 0x45, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x27, 0xA3, 0xEF, 0x12, 0x26, 0x7C, 0x90, 0x04,
|
||||
0x36, 0xE0, 0xFF, 0x90, 0x45, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x27, 0xA3, 0xEF, 0x12, 0x26,
|
||||
0x7C, 0x90, 0x04, 0x37, 0xE0, 0xFF, 0x90, 0x45, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x27, 0xA3,
|
||||
0xEF, 0x12, 0x26, 0x7C, 0xD3, 0x22, 0x7B, 0x01, 0x7A, 0x10, 0x79, 0x34, 0x90, 0x45, 0x3A, 0x12,
|
||||
0x27, 0xBA, 0x90, 0x45, 0x3A, 0x12, 0x27, 0x9A, 0x90, 0x00, 0x12, 0x12, 0x27, 0xC3, 0xC0, 0x03,
|
||||
0xC0, 0x02, 0xC0, 0x01, 0x90, 0x45, 0x3A, 0x12, 0x27, 0x9A, 0x90, 0x00, 0x15, 0x12, 0x28, 0x25,
|
||||
0x90, 0x45, 0x3A, 0x12, 0x27, 0x9A, 0x90, 0x00, 0x18, 0x12, 0x26, 0xDC, 0xFF, 0x90, 0x00, 0x1A,
|
||||
0xE5, 0xF0, 0x8F, 0xF0, 0x12, 0x27, 0x61, 0xE4, 0xFF, 0xEF, 0xC3, 0x94, 0x40, 0x50, 0x44, 0x90,
|
||||
0x45, 0x3A, 0x12, 0x27, 0x9A, 0x90, 0x00, 0x18, 0x12, 0x26, 0xDC, 0xD3, 0x94, 0x00, 0xE5, 0xF0,
|
||||
0x94, 0x00, 0x40, 0x2F, 0x90, 0x00, 0x12, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x27, 0xF3, 0x12, 0x26,
|
||||
0x36, 0xFE, 0xAD, 0x07, 0x0F, 0x74, 0x60, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xEE,
|
||||
0xF0, 0x90, 0x45, 0x3A, 0x12, 0x27, 0x9A, 0x90, 0x00, 0x18, 0x74, 0xFF, 0xF5, 0xF0, 0x12, 0x27,
|
||||
0x14, 0x80, 0xB6, 0xEF, 0x70, 0x17, 0x90, 0x06, 0x23, 0x74, 0x80, 0xF0, 0xE4, 0xA3, 0xF0, 0x90,
|
||||
0x10, 0x3D, 0xE0, 0xB4, 0x0C, 0x1C, 0x12, 0x3E, 0x36, 0xD2, 0x8C, 0x80, 0x15, 0x30, 0x04, 0x0B,
|
||||
0xC2, 0x04, 0xEF, 0x44, 0x80, 0x90, 0x06, 0x23, 0xF0, 0x80, 0x07, 0xD2, 0x04, 0x90, 0x06, 0x23,
|
||||
0xEF, 0xF0, 0x90, 0x06, 0x25, 0x74, 0x08, 0xF0, 0x22, 0x90, 0x06, 0x25, 0xE0, 0x30, 0xE0, 0x2F,
|
||||
0x90, 0x10, 0x3D, 0xE0, 0x24, 0xFB, 0x70, 0x1D, 0x90, 0x10, 0x49, 0x12, 0x27, 0x9A, 0x90, 0x10,
|
||||
0x46, 0x12, 0x27, 0xBA, 0x90, 0x10, 0x4E, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x10, 0x4C, 0xCF, 0xF0,
|
||||
0xA3, 0xEF, 0xF0, 0x80, 0x07, 0xE4, 0x90, 0x10, 0x4C, 0xF0, 0xA3, 0xF0, 0x02, 0x33, 0xF6, 0x90,
|
||||
0x10, 0x3D, 0xE0, 0x12, 0x28, 0x7E, 0x35, 0x12, 0x01, 0x35, 0x12, 0x05, 0x35, 0x12, 0x07, 0x35,
|
||||
0x12, 0x09, 0x35, 0x15, 0x0B, 0x35, 0x12, 0x0C, 0x35, 0x1B, 0x0D, 0x35, 0x21, 0x0F, 0x00, 0x00,
|
||||
0x35, 0x5C, 0x02, 0x33, 0xF6, 0xE4, 0x90, 0x10, 0x3D, 0xF0, 0x22, 0xE4, 0x90, 0x10, 0x3D, 0xF0,
|
||||
0x22, 0x90, 0x10, 0x50, 0xE0, 0xFF, 0xB4, 0x01, 0x07, 0x90, 0x06, 0x07, 0x74, 0x20, 0xF0, 0x22,
|
||||
0xEF, 0xB4, 0x02, 0x07, 0x90, 0x06, 0x07, 0x74, 0x40, 0xF0, 0x22, 0xEF, 0xB4, 0x03, 0x07, 0x90,
|
||||
0x06, 0x07, 0x74, 0x60, 0xF0, 0x22, 0xEF, 0xB4, 0x04, 0x07, 0x90, 0x06, 0x07, 0x74, 0x80, 0xF0,
|
||||
0x22, 0xEF, 0xB4, 0x05, 0x0C, 0x90, 0x06, 0x07, 0x74, 0xA0, 0xF0, 0x22, 0xE4, 0x90, 0x10, 0x3D,
|
||||
0xF0, 0x22, 0x78, 0x7F, 0xE4, 0xF6, 0xD8, 0xFD, 0x75, 0x81, 0x20, 0x02, 0x35, 0xA9, 0x02, 0x23,
|
||||
0x50, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF,
|
||||
0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54,
|
||||
0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80,
|
||||
0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x3E, 0x45, 0xE4, 0x7E, 0x01, 0x93,
|
||||
0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60,
|
||||
0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4,
|
||||
0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3,
|
||||
0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0xAC, 0x07,
|
||||
0xD2, 0x02, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xF0, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83,
|
||||
0xE0, 0xFD, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xEF, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83,
|
||||
0xE0, 0xFB, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xEE, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83,
|
||||
0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02, 0xEC, 0x75,
|
||||
0xF0, 0x03, 0xA4, 0x24, 0x98, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0xFD, 0xEC, 0x75,
|
||||
0xF0, 0x03, 0xA4, 0x24, 0x97, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0xFB, 0xEC, 0x75,
|
||||
0xF0, 0x03, 0xA4, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44,
|
||||
0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0xFB,
|
||||
0xFD, 0x7F, 0xC8, 0x12, 0x3D, 0x90, 0xA2, 0x02, 0x22, 0xAC, 0x07, 0xD2, 0x02, 0xEC, 0x75, 0xF0,
|
||||
0x03, 0xA4, 0x24, 0xF0, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0xFD, 0xEC, 0x75, 0xF0,
|
||||
0x03, 0xA4, 0x24, 0xEF, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0xFB, 0xEC, 0x75, 0xF0,
|
||||
0x03, 0xA4, 0x24, 0xEE, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0,
|
||||
0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x98,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0xFD, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x97,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0xFB, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x96,
|
||||
0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C,
|
||||
0x90, 0x82, 0x02, 0x92, 0x02, 0xE4, 0x90, 0x45, 0x44, 0xF0, 0xFB, 0xFD, 0x7F, 0xC8, 0x12, 0x3D,
|
||||
0x90, 0xA2, 0x02, 0x22, 0xAC, 0x07, 0xD2, 0x02, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xF0, 0xF5,
|
||||
0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0xFD, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xEF, 0xF5,
|
||||
0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0xFB, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xEE, 0xF5,
|
||||
0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90,
|
||||
0x82, 0x02, 0x92, 0x02, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x98, 0xF5, 0x82, 0xE4, 0x34, 0x41,
|
||||
0xF5, 0x83, 0xE0, 0xFD, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x97, 0xF5, 0x82, 0xE4, 0x34, 0x41,
|
||||
0xF5, 0x83, 0xE0, 0xFB, 0xEC, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x41,
|
||||
0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x02, 0x92, 0x02,
|
||||
0xE4, 0x90, 0x45, 0x44, 0xF0, 0xFB, 0xFD, 0x7F, 0xC8, 0x12, 0x3D, 0x90, 0xA2, 0x02, 0x22, 0xD2,
|
||||
0x01, 0xE4, 0x90, 0x04, 0x78, 0xF0, 0xA3, 0x74, 0x1B, 0xF0, 0x90, 0x04, 0x78, 0x74, 0x05, 0xF0,
|
||||
0xE4, 0x90, 0x45, 0x3E, 0xF0, 0xA3, 0xF0, 0x90, 0x45, 0x3E, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3,
|
||||
0x94, 0x0B, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x57, 0x90, 0x42, 0xEB, 0x75, 0xF0, 0x03, 0xEF,
|
||||
0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x90, 0x42,
|
||||
0xEA, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5,
|
||||
0x83, 0xE0, 0xFB, 0x90, 0x42, 0xE9, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0,
|
||||
0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90,
|
||||
0x82, 0x01, 0x92, 0x01, 0x90, 0x45, 0x3E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0, 0x80, 0x97,
|
||||
0x90, 0x04, 0x62, 0x74, 0xC0, 0xF0, 0xA2, 0x01, 0x22, 0xD2, 0x01, 0xE4, 0x90, 0x04, 0x78, 0xF0,
|
||||
0xA3, 0x74, 0x1B, 0xF0, 0x90, 0x04, 0x78, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x45, 0x3E, 0xF0, 0xA3,
|
||||
0xF0, 0x90, 0x45, 0x3E, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0x0D, 0xEE, 0x64, 0x80, 0x94,
|
||||
0x80, 0x50, 0x57, 0x90, 0x42, 0xEB, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0,
|
||||
0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x90, 0x42, 0xEA, 0x75, 0xF0, 0x03, 0xEF, 0x12,
|
||||
0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x90, 0x42, 0xE9,
|
||||
0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83,
|
||||
0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9, 0x12, 0x3C, 0x90, 0x82, 0x01, 0x92, 0x01, 0x90, 0x45,
|
||||
0x3E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x26, 0xB0, 0x80, 0x97, 0x90, 0x04, 0x62, 0x74, 0xC0, 0xF0,
|
||||
0xA2, 0x01, 0x22, 0xD2, 0x01, 0xE4, 0x90, 0x04, 0x78, 0xF0, 0xA3, 0x74, 0x1B, 0xF0, 0x90, 0x04,
|
||||
0x78, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x45, 0x3E, 0xF0, 0xA3, 0xF0, 0x90, 0x45, 0x3E, 0xE0, 0xFE,
|
||||
0xA3, 0xE0, 0xFF, 0xC3, 0x94, 0x0F, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x57, 0x90, 0x42, 0xEB,
|
||||
0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83,
|
||||
0xE0, 0xFD, 0x90, 0x42, 0xEA, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27, 0x8E, 0xEE, 0x75, 0xF0, 0x03,
|
||||
0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0, 0xFB, 0x90, 0x42, 0xE9, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x27,
|
||||
0x8E, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0x25, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F,
|
||||
0xB9, 0x12, 0x3C, 0x90, 0x82, 0x01, 0x92, 0x01, 0x90, 0x45, 0x3E, 0xE4, 0x75, 0xF0, 0x01, 0x12,
|
||||
0x26, 0xB0, 0x80, 0x97, 0x90, 0x04, 0x62, 0x74, 0xC0, 0xF0, 0xA2, 0x01, 0x22, 0x90, 0x45, 0x3E,
|
||||
0xED, 0xF0, 0xD2, 0x01, 0x90, 0x04, 0x57, 0xE0, 0x90, 0x45, 0x3F, 0xF0, 0x90, 0x04, 0x57, 0xE0,
|
||||
0x54, 0xFE, 0xF0, 0xEF, 0x12, 0x28, 0x7E, 0x39, 0x60, 0x03, 0x39, 0x78, 0x09, 0x39, 0x6C, 0x0A,
|
||||
0x39, 0x78, 0x0C, 0x39, 0x84, 0x0D, 0x39, 0x60, 0x0E, 0x39, 0x90, 0x0F, 0x00, 0x00, 0x39, 0x9C,
|
||||
0x90, 0x45, 0x3E, 0xE0, 0xFF, 0x12, 0x35, 0xEE, 0x92, 0x01, 0x80, 0x32, 0x90, 0x45, 0x3E, 0xE0,
|
||||
0xFF, 0x12, 0x32, 0x3A, 0x92, 0x01, 0x80, 0x26, 0x90, 0x45, 0x3E, 0xE0, 0xFF, 0x12, 0x36, 0x79,
|
||||
0x92, 0x01, 0x80, 0x1A, 0x90, 0x45, 0x3E, 0xE0, 0xFF, 0x12, 0x37, 0x04, 0x92, 0x01, 0x80, 0x0E,
|
||||
0x90, 0x45, 0x3E, 0xE0, 0xFF, 0x12, 0x2E, 0xDF, 0x92, 0x01, 0x80, 0x02, 0xC2, 0x01, 0x12, 0x3D,
|
||||
0xE2, 0x90, 0x45, 0x3F, 0xE0, 0x90, 0x04, 0x57, 0xF0, 0x90, 0x45, 0x3E, 0xE0, 0x90, 0x40, 0xC0,
|
||||
0xF0, 0xA2, 0x01, 0x22, 0xAC, 0x07, 0xE4, 0x90, 0x45, 0x3A, 0xF0, 0xA3, 0xF0, 0xD2, 0x00, 0x7D,
|
||||
0x03, 0xEC, 0x70, 0x13, 0x12, 0x3C, 0xC5, 0x90, 0x45, 0x3B, 0xE0, 0x54, 0xF9, 0xFF, 0xF0, 0xFD,
|
||||
0x7F, 0x09, 0x12, 0x3D, 0x00, 0x80, 0x59, 0xEC, 0xB4, 0x01, 0x16, 0x12, 0x3C, 0xC5, 0x90, 0x45,
|
||||
0x3B, 0xE0, 0x54, 0xFD, 0xF0, 0x44, 0x04, 0xFF, 0xF0, 0xFD, 0x7F, 0x09, 0x12, 0x3D, 0x00, 0x80,
|
||||
0x3F, 0xEC, 0xB4, 0x02, 0x1B, 0x7B, 0x01, 0x7A, 0x45, 0x79, 0x3A, 0x7F, 0x0A, 0x12, 0x3C, 0xCD,
|
||||
0x90, 0x45, 0x3A, 0xE0, 0x54, 0xFC, 0xFF, 0xF0, 0xFD, 0x7F, 0x0A, 0x12, 0x3D, 0x00, 0x80, 0x20,
|
||||
0xEC, 0xB4, 0x03, 0x1C, 0x7B, 0x01, 0x7A, 0x45, 0x79, 0x3A, 0x7F, 0x0A, 0x12, 0x3C, 0xCD, 0x90,
|
||||
0x45, 0x3A, 0xE0, 0x54, 0xFE, 0xF0, 0x44, 0x02, 0xFF, 0xF0, 0xFD, 0x7F, 0x0A, 0x12, 0x3D, 0x00,
|
||||
0xA2, 0x00, 0x22, 0x90, 0x45, 0x38, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x04, 0x0B, 0xE0, 0xF9,
|
||||
0x54, 0xFB, 0xF0, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x09, 0x74, 0x50, 0xF0, 0x90, 0x45, 0x38, 0xE0,
|
||||
0x90, 0x04, 0x0A, 0xF0, 0x90, 0x45, 0x39, 0xE0, 0x90, 0x04, 0x0E, 0xF0, 0x90, 0x04, 0x08, 0x74,
|
||||
0x80, 0xF0, 0xE4, 0xFD, 0xFC, 0x90, 0x04, 0x08, 0xE0, 0x90, 0x45, 0x3A, 0xF0, 0xE0, 0x54, 0x03,
|
||||
0x70, 0x0B, 0x0D, 0xBD, 0x00, 0x01, 0x0C, 0xBC, 0x07, 0xEB, 0xBD, 0xFF, 0xE8, 0xC3, 0xED, 0x94,
|
||||
0xFF, 0xEC, 0x94, 0x07, 0x50, 0x07, 0x90, 0x45, 0x3A, 0xE0, 0x30, 0xE1, 0x0B, 0x0F, 0xBF, 0x00,
|
||||
0x01, 0x0E, 0xBE, 0x07, 0xB1, 0xBF, 0xFF, 0xAE, 0xBE, 0x07, 0x0A, 0xBF, 0xFF, 0x07, 0x90, 0x04,
|
||||
0x0B, 0xE9, 0xF0, 0xC3, 0x22, 0xAF, 0x01, 0x90, 0x04, 0x0B, 0xE9, 0xF0, 0xD3, 0x22, 0x90, 0x45,
|
||||
0x35, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xEE, 0x70, 0x56, 0xEF, 0x24, 0xF6, 0x60, 0x1B, 0x14, 0x60,
|
||||
0x26, 0x14, 0x60, 0x31, 0x14, 0x60, 0x3C, 0x24, 0x04, 0x70, 0x44, 0x7B, 0x01, 0x7A, 0x42, 0x79,
|
||||
0xE9, 0x90, 0x45, 0x37, 0x12, 0x27, 0xBA, 0x80, 0x36, 0x7B, 0x01, 0x7A, 0x40, 0x79, 0xC1, 0x90,
|
||||
0x45, 0x37, 0x12, 0x27, 0xBA, 0x80, 0x28, 0x7B, 0x01, 0x7A, 0x40, 0x79, 0xF1, 0x90, 0x45, 0x37,
|
||||
0x12, 0x27, 0xBA, 0x80, 0x1A, 0x7B, 0x01, 0x7A, 0x41, 0x79, 0x99, 0x90, 0x45, 0x37, 0x12, 0x27,
|
||||
0xBA, 0x80, 0x0C, 0x7B, 0x01, 0x7A, 0x42, 0x79, 0x41, 0x90, 0x45, 0x37, 0x12, 0x27, 0xBA, 0x90,
|
||||
0x45, 0x36, 0xE0, 0xFF, 0xA3, 0x12, 0x27, 0x9A, 0x90, 0x45, 0x35, 0xE0, 0xF5, 0x82, 0x75, 0x83,
|
||||
0x00, 0xEF, 0x02, 0x26, 0x8E, 0x90, 0x45, 0x3F, 0xEF, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0x90, 0x04,
|
||||
0x0B, 0xE0, 0x90, 0x45, 0x41, 0xF0, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x09, 0x74, 0x50, 0xF0, 0x90,
|
||||
0x45, 0x3F, 0xE0, 0x90, 0x04, 0x0A, 0xF0, 0x90, 0x04, 0x08, 0x74, 0x40, 0xF0, 0xE4, 0xFD, 0xFC,
|
||||
0x90, 0x04, 0x08, 0xE0, 0xF9, 0x54, 0x03, 0x70, 0x0B, 0x0D, 0xBD, 0x00, 0x01, 0x0C, 0xBC, 0x07,
|
||||
0xEF, 0xBD, 0xFF, 0xEC, 0xC3, 0xED, 0x94, 0xFF, 0xEC, 0x94, 0x07, 0x50, 0x04, 0xE9, 0x30, 0xE1,
|
||||
0x0B, 0x0F, 0xBF, 0x00, 0x01, 0x0E, 0xBE, 0x07, 0xC0, 0xBF, 0xFF, 0xBD, 0x90, 0x04, 0x0C, 0xE0,
|
||||
0x90, 0x45, 0x40, 0xF0, 0xA3, 0xE0, 0x90, 0x04, 0x0B, 0xF0, 0x90, 0x45, 0x40, 0xE0, 0xFF, 0x22,
|
||||
0xE4, 0xFE, 0xEF, 0x30, 0xE5, 0x11, 0xE4, 0xFC, 0xFD, 0x7C, 0x08, 0x90, 0x04, 0xD4, 0xE4, 0xF0,
|
||||
0xA3, 0xDC, 0xFC, 0x7C, 0x00, 0x7D, 0x08, 0xEF, 0x54, 0xC0, 0x60, 0x12, 0xE4, 0xFC, 0xFD, 0x7C,
|
||||
0x08, 0x90, 0x04, 0xD4, 0x74, 0xFF, 0xF0, 0xA3, 0xDC, 0xFC, 0x7C, 0x00, 0x7D, 0x08, 0xEF, 0x30,
|
||||
0xE6, 0x07, 0xEE, 0x44, 0x78, 0xFE, 0x54, 0xFE, 0xFE, 0xEF, 0x54, 0x88, 0x60, 0x04, 0xEE, 0x44,
|
||||
0x08, 0xFE, 0xEF, 0x30, 0xE4, 0x04, 0xEE, 0x44, 0x10, 0xFE, 0xEF, 0x30, 0xE1, 0x04, 0xEE, 0x44,
|
||||
0x02, 0xFE, 0x90, 0x04, 0x56, 0xE0, 0xFF, 0x6E, 0x60, 0x02, 0xEE, 0xF0, 0x22, 0xC0, 0xE0, 0xC0,
|
||||
0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x07, 0xD2, 0x05, 0x53, 0xA8, 0xFE, 0x90,
|
||||
0x06, 0x20, 0xE4, 0xF0, 0x90, 0x04, 0x58, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x21, 0xE0, 0xFF, 0x90,
|
||||
0x10, 0x39, 0xE0, 0x4F, 0xF0, 0x90, 0x06, 0x21, 0xEF, 0xF0, 0x90, 0x04, 0x5C, 0xE0, 0xFF, 0x90,
|
||||
0x45, 0x46, 0xE0, 0x4F, 0xF0, 0x90, 0x04, 0x5C, 0xEF, 0xF0, 0xA3, 0xE0, 0xFF, 0x90, 0x45, 0x47,
|
||||
0xE0, 0x4F, 0xF0, 0x90, 0x04, 0x5D, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83,
|
||||
0xD0, 0xE0, 0x32, 0x90, 0x04, 0x79, 0x74, 0x11, 0xF0, 0x12, 0x3D, 0x31, 0xE4, 0x90, 0x45, 0x3E,
|
||||
0xF0, 0x90, 0x45, 0x3E, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x1A, 0x12, 0x3B, 0x25, 0x90, 0x45,
|
||||
0x3E, 0xE0, 0x24, 0xC4, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x45, 0x3E,
|
||||
0xE0, 0x04, 0xF0, 0x80, 0xDC, 0x90, 0x04, 0x48, 0x74, 0x02, 0xF0, 0x14, 0xF0, 0x7F, 0x30, 0x12,
|
||||
0x3B, 0x90, 0x90, 0x04, 0x54, 0x74, 0x02, 0xF0, 0x22, 0xE0, 0x90, 0x45, 0x44, 0xF0, 0x7F, 0xB9,
|
||||
0x90, 0x04, 0x71, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x45, 0x44, 0xE0, 0x90, 0x04, 0x73, 0xF0,
|
||||
0x90, 0x04, 0x70, 0xEF, 0xF0, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x70, 0xE0, 0xFD, 0x20, 0xE2, 0x0B,
|
||||
0x0F, 0xBF, 0x00, 0x01, 0x0E, 0xBE, 0x07, 0xF0, 0xBF, 0xFF, 0xED, 0xBE, 0x07, 0x05, 0xBF, 0xFF,
|
||||
0x02, 0xC3, 0x22, 0xD3, 0x22, 0x7B, 0x01, 0x7A, 0x45, 0x79, 0x3B, 0x7F, 0x09, 0x90, 0x04, 0x6E,
|
||||
0xEF, 0xF0, 0x90, 0x04, 0x6C, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x6C, 0xE0,
|
||||
0xFD, 0x20, 0xE2, 0x0B, 0x0F, 0xBF, 0x00, 0x01, 0x0E, 0xBE, 0x07, 0xF0, 0xBF, 0xFF, 0xED, 0x90,
|
||||
0x04, 0x6F, 0xE0, 0x12, 0x26, 0x7C, 0xBE, 0x07, 0x05, 0xBF, 0xFF, 0x02, 0xC3, 0x22, 0xD3, 0x22,
|
||||
0x90, 0x04, 0x6E, 0xEF, 0xF0, 0x90, 0x04, 0x6F, 0xED, 0xF0, 0x90, 0x04, 0x6C, 0xE0, 0x44, 0x01,
|
||||
0xF0, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x6C, 0xE0, 0xFD, 0x20, 0xE2, 0x0B, 0x0F, 0xBF, 0x00, 0x01,
|
||||
0x0E, 0xBE, 0x07, 0xF0, 0xBF, 0xFF, 0xED, 0xBE, 0x07, 0x05, 0xBF, 0xFF, 0x02, 0xC3, 0x22, 0xD3,
|
||||
0x22, 0x90, 0x04, 0x54, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x54, 0xE0, 0xFD, 0x30,
|
||||
0xE0, 0x0B, 0x0F, 0xBF, 0x00, 0x01, 0x0E, 0xBE, 0x07, 0xF0, 0xBF, 0xFF, 0xED, 0xBE, 0x07, 0x05,
|
||||
0xBF, 0xFF, 0x02, 0xC3, 0x22, 0x90, 0x06, 0x38, 0xE0, 0x44, 0x02, 0xF0, 0xE0, 0x44, 0x01, 0xF0,
|
||||
0xD3, 0x22, 0xEF, 0x12, 0x28, 0x7E, 0x3D, 0x7F, 0x03, 0x3D, 0x85, 0x09, 0x3D, 0x82, 0x0A, 0x3D,
|
||||
0x85, 0x0C, 0x3D, 0x88, 0x0D, 0x3D, 0x7F, 0x0E, 0x3D, 0x8B, 0x0F, 0x00, 0x00, 0x3D, 0x8E, 0x02,
|
||||
0x31, 0x47, 0x02, 0x30, 0x1A, 0x02, 0x37, 0x8F, 0x02, 0x38, 0x19, 0x02, 0x38, 0xA3, 0xC3, 0x22,
|
||||
0x90, 0x04, 0x1C, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x45, 0x44, 0xE0, 0x90,
|
||||
0x04, 0x1F, 0xF0, 0x90, 0x04, 0x18, 0x74, 0x03, 0xF0, 0x90, 0x04, 0x18, 0xE0, 0xFF, 0x60, 0x04,
|
||||
0xEF, 0x30, 0xE2, 0xF5, 0xE4, 0x90, 0x04, 0x18, 0xF0, 0x22, 0x7F, 0xFF, 0x90, 0x04, 0x14, 0xE0,
|
||||
0xFF, 0x14, 0x60, 0x0E, 0x14, 0x60, 0x0F, 0x14, 0x60, 0x10, 0x24, 0x03, 0x70, 0x10, 0x02, 0x0B,
|
||||
0xBE, 0x22, 0x02, 0x0B, 0xB5, 0x22, 0x02, 0x0B, 0xAE, 0x22, 0x02, 0x0B, 0xEF, 0x22, 0x02, 0x00,
|
||||
0x00, 0x22, 0xD2, 0x02, 0x7D, 0x40, 0x7F, 0x50, 0x12, 0x3D, 0x00, 0xE4, 0xFD, 0x7F, 0x50, 0x12,
|
||||
0x3D, 0x00, 0x7D, 0x01, 0x7F, 0x9C, 0x12, 0x3D, 0x00, 0xE4, 0xFD, 0x7F, 0x9C, 0x12, 0x3D, 0x00,
|
||||
0xA2, 0x02, 0x22, 0x90, 0x04, 0x61, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x61,
|
||||
0xE0, 0xFD, 0x20, 0xE5, 0x0B, 0x0F, 0xBF, 0x00, 0x01, 0x0E, 0xBE, 0x07, 0xF0, 0xBF, 0xFF, 0xED,
|
||||
0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC2, 0x8C, 0x90, 0x43, 0x19, 0x74, 0x01, 0xF0, 0xD0,
|
||||
0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xC2, 0x8C, 0x75, 0x89, 0x01, 0x75, 0x8C, 0xF9, 0x75, 0x8A,
|
||||
0x7E, 0x43, 0xA8, 0x02, 0x22, 0x44, 0x43, 0x1A, 0x04, 0x03, 0x09, 0x04, 0x00,
|
||||
};
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
BOOLEAN
|
||||
FIRMWAREbDownload(
|
||||
IN PSDevice pDevice
|
||||
)
|
||||
{
|
||||
NDIS_STATUS NdisStatus;
|
||||
PBYTE pBuffer = NULL;
|
||||
WORD wLength;
|
||||
int ii;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Download firmware\n");
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
pBuffer = kmalloc(sizeof(abyFirmware), GFP_KERNEL);
|
||||
if (pBuffer != NULL) {
|
||||
|
||||
for (ii=0;ii<sizeof(abyFirmware);ii++)
|
||||
pBuffer[ii] = abyFirmware[ii];
|
||||
|
||||
for (ii=0;ii<sizeof(abyFirmware);ii+=0x400) {
|
||||
|
||||
if ((sizeof(abyFirmware) - ii) < 0x400)
|
||||
wLength = (sizeof(abyFirmware) - ii);
|
||||
else
|
||||
wLength = 0x400;
|
||||
|
||||
NdisStatus = CONTROLnsRequestOutAsyn(pDevice,
|
||||
0,
|
||||
0x1200+ii,
|
||||
0x0000,
|
||||
wLength,
|
||||
&(pBuffer[ii])
|
||||
);
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Download firmware...%d %d\n", ii, sizeof(abyFirmware));
|
||||
if (NdisStatus != STATUS_SUCCESS) {
|
||||
if (pBuffer)
|
||||
kfree(pBuffer);
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pBuffer)
|
||||
kfree(pBuffer);
|
||||
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
FIRMWAREbBrach2Sram(
|
||||
IN PSDevice pDevice
|
||||
)
|
||||
{
|
||||
NDIS_STATUS NdisStatus;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Branch to Sram\n");
|
||||
|
||||
NdisStatus = CONTROLnsRequestOut(pDevice,
|
||||
1,
|
||||
0x1200,
|
||||
0x0000,
|
||||
0,
|
||||
NULL
|
||||
);
|
||||
|
||||
if (NdisStatus != STATUS_SUCCESS) {
|
||||
return (FALSE);
|
||||
} else {
|
||||
return (TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
FIRMWAREbCheckVersion(
|
||||
IN PSDevice pDevice
|
||||
)
|
||||
{
|
||||
NTSTATUS ntStatus;
|
||||
|
||||
ntStatus = CONTROLnsRequestIn(pDevice,
|
||||
MESSAGE_TYPE_READ,
|
||||
0,
|
||||
MESSAGE_REQUEST_VERSION,
|
||||
2,
|
||||
(PBYTE) &(pDevice->wFirmwareVersion));
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Firmware Version [%04x]\n", pDevice->wFirmwareVersion);
|
||||
if (ntStatus != STATUS_SUCCESS) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Firmware Invalid.\n");
|
||||
return FALSE;
|
||||
}
|
||||
if (pDevice->wFirmwareVersion == 0xFFFF) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"In Loader.\n");
|
||||
return FALSE;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Firmware Version [%04x]\n", pDevice->wFirmwareVersion);
|
||||
if (pDevice->wFirmwareVersion != FIRMWARE_VERSION) {
|
||||
// branch to loader for download new firmware
|
||||
FIRMWAREbBrach2Sram(pDevice);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: firmware.h
|
||||
*
|
||||
* Purpose: Version and Release Information
|
||||
*
|
||||
* Author: Yiching Chen
|
||||
*
|
||||
* Date: May 20, 2004
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __FIRMWARE_H__
|
||||
#define __FIRMWARE_H__
|
||||
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
BOOL
|
||||
FIRMWAREbDownload(
|
||||
IN PSDevice pDevice
|
||||
);
|
||||
|
||||
BOOL
|
||||
FIRMWAREbBrach2Sram(
|
||||
IN PSDevice pDevice
|
||||
);
|
||||
|
||||
BOOL
|
||||
FIRMWAREbCheckVersion(
|
||||
IN PSDevice pDevice
|
||||
);
|
||||
|
||||
|
||||
#endif // __FIRMWARE_H__
|
|
@ -0,0 +1,881 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: hostap.c
|
||||
*
|
||||
* Purpose: handle hostap deamon ioctl input/out functions
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: Oct. 20, 2003
|
||||
*
|
||||
* Functions:
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__HOSTAP_H__)
|
||||
#include "hostap.h"
|
||||
#endif
|
||||
#if !defined(__IOCMD_H__)
|
||||
#include "iocmd.h"
|
||||
#endif
|
||||
#if !defined(__MAC_H__)
|
||||
#include "mac.h"
|
||||
#endif
|
||||
#if !defined(__CARD_H__)
|
||||
#include "card.h"
|
||||
#endif
|
||||
#if !defined(__BASEBAND_H__)
|
||||
#include "baseband.h"
|
||||
#endif
|
||||
#if !defined(__WPACTL_H__)
|
||||
#include "wpactl.h"
|
||||
#endif
|
||||
#if !defined(__KEY_H__)
|
||||
#include "key.h"
|
||||
#endif
|
||||
#if !defined(__MAC_H__)
|
||||
#include "mac.h"
|
||||
#endif
|
||||
#if !defined(__DATARATE_H__)
|
||||
#include "datarate.h"
|
||||
#endif
|
||||
|
||||
|
||||
#define VIAWGET_HOSTAPD_MAX_BUF_SIZE 1024
|
||||
#define HOSTAP_CRYPT_FLAG_SET_TX_KEY BIT0
|
||||
#define HOSTAP_CRYPT_FLAG_PERMANENT BIT1
|
||||
#define HOSTAP_CRYPT_ERR_UNKNOWN_ALG 2
|
||||
#define HOSTAP_CRYPT_ERR_UNKNOWN_ADDR 3
|
||||
#define HOSTAP_CRYPT_ERR_CRYPT_INIT_FAILED 4
|
||||
#define HOSTAP_CRYPT_ERR_KEY_SET_FAILED 5
|
||||
#define HOSTAP_CRYPT_ERR_TX_KEY_SET_FAILED 6
|
||||
#define HOSTAP_CRYPT_ERR_CARD_CONF_FAILED 7
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* register net_device (AP) for hostap deamon
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* rtnl_locked -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
|
||||
static int hostap_enable_hostapd(PSDevice pDevice, int rtnl_locked)
|
||||
{
|
||||
struct net_device *dev = pDevice->dev;
|
||||
int ret;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: Enabling hostapd mode\n", dev->name);
|
||||
|
||||
pDevice->apdev = (struct net_device *)kmalloc(sizeof(struct net_device), GFP_KERNEL);
|
||||
if (pDevice->apdev == NULL)
|
||||
return -ENOMEM;
|
||||
memset(pDevice->apdev, 0, sizeof(struct net_device));
|
||||
|
||||
pDevice->apdev->priv = pDevice;
|
||||
memcpy(pDevice->apdev->dev_addr, dev->dev_addr, ETH_ALEN);
|
||||
pDevice->apdev->hard_start_xmit = pDevice->tx_80211;
|
||||
pDevice->apdev->type = ARPHRD_IEEE80211;
|
||||
|
||||
pDevice->apdev->base_addr = dev->base_addr;
|
||||
pDevice->apdev->irq = dev->irq;
|
||||
pDevice->apdev->mem_start = dev->mem_start;
|
||||
pDevice->apdev->mem_end = dev->mem_end;
|
||||
sprintf(pDevice->apdev->name, "%sap", dev->name);
|
||||
if (rtnl_locked)
|
||||
ret = register_netdevice(pDevice->apdev);
|
||||
else
|
||||
ret = register_netdev(pDevice->apdev);
|
||||
if (ret) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: register_netdevice(AP) failed!\n",
|
||||
dev->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: Registered netdevice %s for AP management\n",
|
||||
dev->name, pDevice->apdev->name);
|
||||
|
||||
KeyvInitTable(pDevice,&pDevice->sKey);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* unregister net_device(AP)
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* rtnl_locked -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
|
||||
static int hostap_disable_hostapd(PSDevice pDevice, int rtnl_locked)
|
||||
{
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: disabling hostapd mode\n", pDevice->dev->name);
|
||||
|
||||
if (pDevice->apdev && pDevice->apdev->name && pDevice->apdev->name[0]) {
|
||||
if (rtnl_locked)
|
||||
unregister_netdevice(pDevice->apdev);
|
||||
else
|
||||
unregister_netdev(pDevice->apdev);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: Netdevice %s unregistered\n",
|
||||
pDevice->dev->name, pDevice->apdev->name);
|
||||
}
|
||||
kfree(pDevice->apdev);
|
||||
pDevice->apdev = NULL;
|
||||
pDevice->bEnable8021x = FALSE;
|
||||
pDevice->bEnableHostWEP = FALSE;
|
||||
pDevice->bEncryptionEnable = FALSE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Set enable/disable hostapd mode
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* rtnl_locked -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
|
||||
int hostap_set_hostapd(PSDevice pDevice, int val, int rtnl_locked)
|
||||
{
|
||||
if (val < 0 || val > 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (pDevice->bEnableHostapd == val)
|
||||
return 0;
|
||||
|
||||
pDevice->bEnableHostapd = val;
|
||||
|
||||
if (val)
|
||||
return hostap_enable_hostapd(pDevice, rtnl_locked);
|
||||
else
|
||||
return hostap_disable_hostapd(pDevice, rtnl_locked);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* remove station function supported for hostap deamon
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* param -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
static int hostap_remove_sta(PSDevice pDevice,
|
||||
struct viawget_hostapd_param *param)
|
||||
{
|
||||
UINT uNodeIndex;
|
||||
|
||||
|
||||
if (BSSbIsSTAInNodeDB(pDevice, param->sta_addr, &uNodeIndex)) {
|
||||
BSSvRemoveOneNode(pDevice, uNodeIndex);
|
||||
}
|
||||
else {
|
||||
return -ENOENT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* add a station from hostap deamon
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* param -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
static int hostap_add_sta(PSDevice pDevice,
|
||||
struct viawget_hostapd_param *param)
|
||||
{
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
UINT uNodeIndex;
|
||||
|
||||
|
||||
if (!BSSbIsSTAInNodeDB(pDevice, param->sta_addr, &uNodeIndex)) {
|
||||
BSSvCreateOneNode((PSDevice)pDevice, &uNodeIndex);
|
||||
}
|
||||
memcpy(pMgmt->sNodeDBTable[uNodeIndex].abyMACAddr, param->sta_addr, WLAN_ADDR_LEN);
|
||||
pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC;
|
||||
pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = param->u.add_sta.capability;
|
||||
// TODO listenInterval
|
||||
// pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = 1;
|
||||
pMgmt->sNodeDBTable[uNodeIndex].bPSEnable = FALSE;
|
||||
pMgmt->sNodeDBTable[uNodeIndex].bySuppRate = param->u.add_sta.tx_supp_rates;
|
||||
|
||||
// set max tx rate
|
||||
pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate =
|
||||
pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
|
||||
// set max basic rate
|
||||
pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate = RATE_2M;
|
||||
// Todo: check sta preamble, if ap can't support, set status code
|
||||
pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble =
|
||||
WLAN_GET_CAP_INFO_SHORTPREAMBLE(pMgmt->sNodeDBTable[uNodeIndex].wCapInfo);
|
||||
|
||||
pMgmt->sNodeDBTable[uNodeIndex].wAID = (WORD)param->u.add_sta.aid;
|
||||
|
||||
pMgmt->sNodeDBTable[uNodeIndex].ulLastRxJiffer = jiffies;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Add STA AID= %d \n", pMgmt->sNodeDBTable[uNodeIndex].wAID);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n",
|
||||
param->sta_addr[0],
|
||||
param->sta_addr[1],
|
||||
param->sta_addr[2],
|
||||
param->sta_addr[3],
|
||||
param->sta_addr[4],
|
||||
param->sta_addr[5]
|
||||
) ;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Max Support rate = %d \n",
|
||||
pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* get station info
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* param -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
|
||||
static int hostap_get_info_sta(PSDevice pDevice,
|
||||
struct viawget_hostapd_param *param)
|
||||
{
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
UINT uNodeIndex;
|
||||
|
||||
if (BSSbIsSTAInNodeDB(pDevice, param->sta_addr, &uNodeIndex)) {
|
||||
param->u.get_info_sta.inactive_sec =
|
||||
(jiffies - pMgmt->sNodeDBTable[uNodeIndex].ulLastRxJiffer) / HZ;
|
||||
|
||||
//param->u.get_info_sta.txexc = pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts;
|
||||
}
|
||||
else {
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* reset txexec
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* param -
|
||||
* Out:
|
||||
* TURE, FALSE
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
/*
|
||||
static int hostap_reset_txexc_sta(PSDevice pDevice,
|
||||
struct viawget_hostapd_param *param)
|
||||
{
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
UINT uNodeIndex;
|
||||
|
||||
if (BSSbIsSTAInNodeDB(pDevice, param->sta_addr, &uNodeIndex)) {
|
||||
pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts = 0;
|
||||
}
|
||||
else {
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* set station flag
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* param -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
static int hostap_set_flags_sta(PSDevice pDevice,
|
||||
struct viawget_hostapd_param *param)
|
||||
{
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
UINT uNodeIndex;
|
||||
|
||||
if (BSSbIsSTAInNodeDB(pDevice, param->sta_addr, &uNodeIndex)) {
|
||||
pMgmt->sNodeDBTable[uNodeIndex].dwFlags |= param->u.set_flags_sta.flags_or;
|
||||
pMgmt->sNodeDBTable[uNodeIndex].dwFlags &= param->u.set_flags_sta.flags_and;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " dwFlags = %x \n",
|
||||
(UINT)pMgmt->sNodeDBTable[uNodeIndex].dwFlags);
|
||||
}
|
||||
else {
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* set generic element (wpa ie)
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* param -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
static int hostap_set_generic_element(PSDevice pDevice,
|
||||
struct viawget_hostapd_param *param)
|
||||
{
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
|
||||
|
||||
|
||||
memcpy( pMgmt->abyWPAIE,
|
||||
param->u.generic_elem.data,
|
||||
param->u.generic_elem.len
|
||||
);
|
||||
|
||||
pMgmt->wWPAIELen = param->u.generic_elem.len;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pMgmt->wWPAIELen = %d\n", pMgmt->wWPAIELen);
|
||||
|
||||
// disable wpa
|
||||
if (pMgmt->wWPAIELen == 0) {
|
||||
pMgmt->eAuthenMode = WMAC_AUTH_OPEN;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " No WPAIE, Disable WPA \n");
|
||||
} else {
|
||||
// enable wpa
|
||||
if ((pMgmt->abyWPAIE[0] == WLAN_EID_RSN_WPA) ||
|
||||
(pMgmt->abyWPAIE[0] == WLAN_EID_RSN)) {
|
||||
pMgmt->eAuthenMode = WMAC_AUTH_WPANONE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set WPAIE enable WPA\n");
|
||||
} else
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* flush station nodes table.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
|
||||
static void hostap_flush_sta(PSDevice pDevice)
|
||||
{
|
||||
// reserved node index =0 for multicast node.
|
||||
BSSvClearNodeDBTable(pDevice, 1);
|
||||
pDevice->uAssocCount = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* set each stations encryption key
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* param -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
static int hostap_set_encryption(PSDevice pDevice,
|
||||
struct viawget_hostapd_param *param,
|
||||
int param_len)
|
||||
{
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
DWORD dwKeyIndex = 0;
|
||||
BYTE abyKey[MAX_KEY_LEN];
|
||||
BYTE abySeq[MAX_KEY_LEN];
|
||||
NDIS_802_11_KEY_RSC KeyRSC;
|
||||
BYTE byKeyDecMode = KEY_CTL_WEP;
|
||||
int ret = 0;
|
||||
int iNodeIndex = -1;
|
||||
int ii;
|
||||
BOOL bKeyTableFull = FALSE;
|
||||
WORD wKeyCtl = 0;
|
||||
|
||||
|
||||
param->u.crypt.err = 0;
|
||||
/*
|
||||
if (param_len !=
|
||||
(int) ((char *) param->u.crypt.key - (char *) param) +
|
||||
param->u.crypt.key_len)
|
||||
return -EINVAL;
|
||||
*/
|
||||
|
||||
if (param->u.crypt.alg > WPA_ALG_CCMP)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
if ((param->u.crypt.idx > 3) || (param->u.crypt.key_len > MAX_KEY_LEN)) {
|
||||
param->u.crypt.err = HOSTAP_CRYPT_ERR_KEY_SET_FAILED;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " HOSTAP_CRYPT_ERR_KEY_SET_FAILED\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
|
||||
param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
|
||||
param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) {
|
||||
if (param->u.crypt.idx >= MAX_GROUP_KEY)
|
||||
return -EINVAL;
|
||||
iNodeIndex = 0;
|
||||
|
||||
} else {
|
||||
if (BSSbIsSTAInNodeDB(pDevice, param->sta_addr, &iNodeIndex) == FALSE) {
|
||||
param->u.crypt.err = HOSTAP_CRYPT_ERR_UNKNOWN_ADDR;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " HOSTAP_CRYPT_ERR_UNKNOWN_ADDR\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " hostap_set_encryption: sta_index %d \n", iNodeIndex);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " hostap_set_encryption: alg %d \n", param->u.crypt.alg);
|
||||
|
||||
if (param->u.crypt.alg == WPA_ALG_NONE) {
|
||||
|
||||
if (pMgmt->sNodeDBTable[iNodeIndex].bOnFly == TRUE) {
|
||||
if (KeybRemoveKey( pDevice,
|
||||
&(pDevice->sKey),
|
||||
param->sta_addr,
|
||||
pMgmt->sNodeDBTable[iNodeIndex].dwKeyIndex
|
||||
) == FALSE) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "KeybRemoveKey fail \n");
|
||||
}
|
||||
pMgmt->sNodeDBTable[iNodeIndex].bOnFly = FALSE;
|
||||
}
|
||||
pMgmt->sNodeDBTable[iNodeIndex].byKeyIndex = 0;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].dwKeyIndex = 0;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].uWepKeyLength = 0;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].KeyRSC = 0;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].dwTSC47_16 = 0;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].wTSC15_0 = 0;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].byCipherSuite = 0;
|
||||
memset(&pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[0],
|
||||
0,
|
||||
MAX_KEY_LEN
|
||||
);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
memcpy(abyKey, param->u.crypt.key, param->u.crypt.key_len);
|
||||
// copy to node key tbl
|
||||
pMgmt->sNodeDBTable[iNodeIndex].byKeyIndex = param->u.crypt.idx;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].uWepKeyLength = param->u.crypt.key_len;
|
||||
memcpy(&pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[0],
|
||||
param->u.crypt.key,
|
||||
param->u.crypt.key_len
|
||||
);
|
||||
|
||||
dwKeyIndex = (DWORD)(param->u.crypt.idx);
|
||||
if (param->u.crypt.flags & HOSTAP_CRYPT_FLAG_SET_TX_KEY) {
|
||||
pDevice->byKeyIndex = (BYTE)dwKeyIndex;
|
||||
pDevice->bTransmitKey = TRUE;
|
||||
dwKeyIndex |= (1 << 31);
|
||||
}
|
||||
|
||||
if (param->u.crypt.alg == WPA_ALG_WEP) {
|
||||
|
||||
if ((pDevice->bEnable8021x == FALSE) || (iNodeIndex == 0)) {
|
||||
KeybSetDefaultKey( pDevice,
|
||||
&(pDevice->sKey),
|
||||
dwKeyIndex & ~(BIT30 | USE_KEYRSC),
|
||||
param->u.crypt.key_len,
|
||||
NULL,
|
||||
abyKey,
|
||||
KEY_CTL_WEP
|
||||
);
|
||||
|
||||
} else {
|
||||
// 8021x enable, individual key
|
||||
dwKeyIndex |= (1 << 30); // set pairwise key
|
||||
if (KeybSetKey(pDevice,
|
||||
&(pDevice->sKey),
|
||||
¶m->sta_addr[0],
|
||||
dwKeyIndex & ~(USE_KEYRSC),
|
||||
param->u.crypt.key_len,
|
||||
(PQWORD) &(KeyRSC),
|
||||
(PBYTE)abyKey,
|
||||
KEY_CTL_WEP
|
||||
) == TRUE) {
|
||||
|
||||
|
||||
pMgmt->sNodeDBTable[iNodeIndex].bOnFly = TRUE;
|
||||
|
||||
} else {
|
||||
// Key Table Full
|
||||
pMgmt->sNodeDBTable[iNodeIndex].bOnFly = FALSE;
|
||||
bKeyTableFull = TRUE;
|
||||
}
|
||||
}
|
||||
pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
|
||||
pDevice->bEncryptionEnable = TRUE;
|
||||
pMgmt->byCSSPK = KEY_CTL_WEP;
|
||||
pMgmt->byCSSGK = KEY_CTL_WEP;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].byCipherSuite = KEY_CTL_WEP;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].dwKeyIndex = dwKeyIndex;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (param->u.crypt.seq) {
|
||||
memcpy(&abySeq, param->u.crypt.seq, 8);
|
||||
for (ii = 0 ; ii < 8 ; ii++) {
|
||||
KeyRSC |= (abySeq[ii] << (ii * 8));
|
||||
}
|
||||
dwKeyIndex |= 1 << 29;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].KeyRSC = KeyRSC;
|
||||
}
|
||||
|
||||
if (param->u.crypt.alg == WPA_ALG_TKIP) {
|
||||
if (param->u.crypt.key_len != MAX_KEY_LEN)
|
||||
return -EINVAL;
|
||||
pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled;
|
||||
byKeyDecMode = KEY_CTL_TKIP;
|
||||
pMgmt->byCSSPK = KEY_CTL_TKIP;
|
||||
pMgmt->byCSSGK = KEY_CTL_TKIP;
|
||||
}
|
||||
|
||||
if (param->u.crypt.alg == WPA_ALG_CCMP) {
|
||||
if ((param->u.crypt.key_len != AES_KEY_LEN) ||
|
||||
(pDevice->byLocalID <= REV_ID_VT3253_A1))
|
||||
return -EINVAL;
|
||||
pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled;
|
||||
byKeyDecMode = KEY_CTL_CCMP;
|
||||
pMgmt->byCSSPK = KEY_CTL_CCMP;
|
||||
pMgmt->byCSSGK = KEY_CTL_CCMP;
|
||||
}
|
||||
|
||||
|
||||
if (iNodeIndex == 0) {
|
||||
KeybSetDefaultKey( pDevice,
|
||||
&(pDevice->sKey),
|
||||
dwKeyIndex,
|
||||
param->u.crypt.key_len,
|
||||
(PQWORD) &(KeyRSC),
|
||||
abyKey,
|
||||
byKeyDecMode
|
||||
);
|
||||
pMgmt->sNodeDBTable[iNodeIndex].bOnFly = TRUE;
|
||||
|
||||
} else {
|
||||
dwKeyIndex |= (1 << 30); // set pairwise key
|
||||
if (KeybSetKey(pDevice,
|
||||
&(pDevice->sKey),
|
||||
¶m->sta_addr[0],
|
||||
dwKeyIndex,
|
||||
param->u.crypt.key_len,
|
||||
(PQWORD) &(KeyRSC),
|
||||
(PBYTE)abyKey,
|
||||
byKeyDecMode
|
||||
) == TRUE) {
|
||||
|
||||
pMgmt->sNodeDBTable[iNodeIndex].bOnFly = TRUE;
|
||||
|
||||
} else {
|
||||
// Key Table Full
|
||||
pMgmt->sNodeDBTable[iNodeIndex].bOnFly = FALSE;
|
||||
bKeyTableFull = TRUE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Key Table Full\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (bKeyTableFull == TRUE) {
|
||||
wKeyCtl &= 0x7F00; // clear all key control filed
|
||||
wKeyCtl |= (byKeyDecMode << 4);
|
||||
wKeyCtl |= (byKeyDecMode);
|
||||
wKeyCtl |= 0x0044; // use group key for all address
|
||||
wKeyCtl |= 0x4000; // disable KeyTable[MAX_KEY_TABLE-1] on-fly to genernate rx int
|
||||
// Todo.. xxxxxx
|
||||
//MACvSetDefaultKeyCtl(pDevice->PortOffset, wKeyCtl, MAX_KEY_TABLE-1, pDevice->byLocalID);
|
||||
}
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Set key sta_index= %d \n", iNodeIndex);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " tx_index=%d len=%d \n", param->u.crypt.idx,
|
||||
param->u.crypt.key_len );
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " key=%x-%x-%x-%x-%x-xxxxx \n",
|
||||
pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[0],
|
||||
pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[1],
|
||||
pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[2],
|
||||
pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[3],
|
||||
pMgmt->sNodeDBTable[iNodeIndex].abyWepKey[4]
|
||||
);
|
||||
|
||||
// set wep key
|
||||
pDevice->bEncryptionEnable = TRUE;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].byCipherSuite = byKeyDecMode;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].dwKeyIndex = dwKeyIndex;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].dwTSC47_16 = 0;
|
||||
pMgmt->sNodeDBTable[iNodeIndex].wTSC15_0 = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* get each stations encryption key
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* param -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
static int hostap_get_encryption(PSDevice pDevice,
|
||||
struct viawget_hostapd_param *param,
|
||||
int param_len)
|
||||
{
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
int ret = 0;
|
||||
int ii;
|
||||
int iNodeIndex =0;
|
||||
|
||||
|
||||
param->u.crypt.err = 0;
|
||||
|
||||
if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
|
||||
param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
|
||||
param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) {
|
||||
iNodeIndex = 0;
|
||||
} else {
|
||||
if (BSSbIsSTAInNodeDB(pDevice, param->sta_addr, &iNodeIndex) == FALSE) {
|
||||
param->u.crypt.err = HOSTAP_CRYPT_ERR_UNKNOWN_ADDR;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "hostap_get_encryption: HOSTAP_CRYPT_ERR_UNKNOWN_ADDR\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "hostap_get_encryption: %d\n", iNodeIndex);
|
||||
memset(param->u.crypt.seq, 0, 8);
|
||||
for (ii = 0 ; ii < 8 ; ii++) {
|
||||
param->u.crypt.seq[ii] = (BYTE)pMgmt->sNodeDBTable[iNodeIndex].KeyRSC >> (ii * 8);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* hostap_ioctl main function supported for hostap deamon.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice -
|
||||
* iw_point -
|
||||
* Out:
|
||||
*
|
||||
* Return Value:
|
||||
*
|
||||
*/
|
||||
|
||||
int hostap_ioctl(PSDevice pDevice, struct iw_point *p)
|
||||
{
|
||||
struct viawget_hostapd_param *param;
|
||||
int ret = 0;
|
||||
int ap_ioctl = 0;
|
||||
|
||||
if (p->length < sizeof(struct viawget_hostapd_param) ||
|
||||
p->length > VIAWGET_HOSTAPD_MAX_BUF_SIZE || !p->pointer)
|
||||
return -EINVAL;
|
||||
|
||||
param = (struct viawget_hostapd_param *) kmalloc((int)p->length, (int)GFP_KERNEL);
|
||||
if (param == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (copy_from_user(param, p->pointer, p->length)) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (param->cmd) {
|
||||
case VIAWGET_HOSTAPD_SET_ENCRYPTION:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_SET_ENCRYPTION \n");
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
ret = hostap_set_encryption(pDevice, param, p->length);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
break;
|
||||
case VIAWGET_HOSTAPD_GET_ENCRYPTION:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_GET_ENCRYPTION \n");
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
ret = hostap_get_encryption(pDevice, param, p->length);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
break;
|
||||
case VIAWGET_HOSTAPD_SET_ASSOC_AP_ADDR:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_SET_ASSOC_AP_ADDR \n");
|
||||
return -EOPNOTSUPP;
|
||||
break;
|
||||
case VIAWGET_HOSTAPD_FLUSH:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_FLUSH \n");
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
hostap_flush_sta(pDevice);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
break;
|
||||
case VIAWGET_HOSTAPD_ADD_STA:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_ADD_STA \n");
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
ret = hostap_add_sta(pDevice, param);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
break;
|
||||
case VIAWGET_HOSTAPD_REMOVE_STA:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_REMOVE_STA \n");
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
ret = hostap_remove_sta(pDevice, param);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
break;
|
||||
case VIAWGET_HOSTAPD_GET_INFO_STA:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_GET_INFO_STA \n");
|
||||
ret = hostap_get_info_sta(pDevice, param);
|
||||
ap_ioctl = 1;
|
||||
break;
|
||||
/*
|
||||
case VIAWGET_HOSTAPD_RESET_TXEXC_STA:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_RESET_TXEXC_STA \n");
|
||||
ret = hostap_reset_txexc_sta(pDevice, param);
|
||||
break;
|
||||
*/
|
||||
case VIAWGET_HOSTAPD_SET_FLAGS_STA:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_SET_FLAGS_STA \n");
|
||||
ret = hostap_set_flags_sta(pDevice, param);
|
||||
break;
|
||||
|
||||
case VIAWGET_HOSTAPD_MLME:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_MLME \n");
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
case VIAWGET_HOSTAPD_SET_GENERIC_ELEMENT:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_SET_GENERIC_ELEMENT \n");
|
||||
ret = hostap_set_generic_element(pDevice, param);
|
||||
break;
|
||||
|
||||
case VIAWGET_HOSTAPD_SCAN_REQ:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_SCAN_REQ \n");
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
case VIAWGET_HOSTAPD_STA_CLEAR_STATS:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "VIAWGET_HOSTAPD_STA_CLEAR_STATS \n");
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
default:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "hostap_ioctl: unknown cmd=%d\n",
|
||||
(int)param->cmd);
|
||||
return -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if ((ret == 0) && ap_ioctl) {
|
||||
if (copy_to_user(p->pointer, param, p->length)) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (param != NULL)
|
||||
kfree(param);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: hostap.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: May 21, 2003
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __HOSTAP_H__
|
||||
#define __HOSTAP_H__
|
||||
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
#if WIRELESS_EXT < 9
|
||||
struct iw_point {
|
||||
caddr_t pointer;
|
||||
__u16 length;
|
||||
__u16 flags;
|
||||
};
|
||||
#endif /* WIRELESS_EXT < 9 */
|
||||
|
||||
#define WLAN_RATE_1M BIT0
|
||||
#define WLAN_RATE_2M BIT1
|
||||
#define WLAN_RATE_5M5 BIT2
|
||||
#define WLAN_RATE_11M BIT3
|
||||
#define WLAN_RATE_6M BIT4
|
||||
#define WLAN_RATE_9M BIT5
|
||||
#define WLAN_RATE_12M BIT6
|
||||
#define WLAN_RATE_18M BIT7
|
||||
#define WLAN_RATE_24M BIT8
|
||||
#define WLAN_RATE_36M BIT9
|
||||
#define WLAN_RATE_48M BIT10
|
||||
#define WLAN_RATE_54M BIT11
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#ifndef ETH_P_PAE
|
||||
#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
|
||||
#endif /* ETH_P_PAE */
|
||||
|
||||
#ifndef ARPHRD_IEEE80211
|
||||
#define ARPHRD_IEEE80211 801
|
||||
#endif
|
||||
|
||||
int hostap_set_hostapd(PSDevice pDevice, int val, int rtnl_locked);
|
||||
int hostap_ioctl(PSDevice pDevice, struct iw_point *p);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __HOSTAP_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,214 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: int.c
|
||||
*
|
||||
* Purpose: Handle USB interrupt endpoint
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Apr. 2, 2004
|
||||
*
|
||||
* Functions:
|
||||
*
|
||||
* Revision History:
|
||||
* 04-02-2004 Jerry Chen: Initial release
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__INT_H__)
|
||||
#include "int.h"
|
||||
#endif
|
||||
#if !defined(__MIB_H__)
|
||||
#include "mib.h"
|
||||
#endif
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
#if !defined(__MAC_H__)
|
||||
#include "mac.h"
|
||||
#endif
|
||||
#if !defined(__POWER_H__)
|
||||
#include "power.h"
|
||||
#endif
|
||||
#if !defined(__BSSDB_H__)
|
||||
#include "bssdb.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__USBPIPE_H__)
|
||||
#include "usbpipe.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Function: InterruptPollingThread
|
||||
*
|
||||
* Synopsis: Thread running at IRQL PASSIVE_LEVEL.
|
||||
*
|
||||
* Arguments: Device Extension
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
* Algorithm: Call USBD for input data;
|
||||
*
|
||||
* History: dd-mm-yyyy Author Comment
|
||||
*
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* USB reads are by nature 'Blocking', and when in a read, the device looks like it's
|
||||
* in a 'stall' condition, so we deliberately time out every second if we've gotten no data
|
||||
*
|
||||
-*/
|
||||
VOID
|
||||
INTvWorkItem(
|
||||
PVOID Context
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) Context;
|
||||
NTSTATUS ntStatus;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Interrupt Polling Thread\n");
|
||||
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
if (pDevice->fKillEventPollingThread != TRUE) {
|
||||
ntStatus = PIPEnsInterruptRead(pDevice);
|
||||
}
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
INTnsProcessData(
|
||||
IN PSDevice pDevice
|
||||
)
|
||||
{
|
||||
NTSTATUS status = STATUS_SUCCESS;
|
||||
PSINTData pINTData;
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
struct net_device_stats* pStats = &pDevice->stats;
|
||||
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsInterruptProcessData\n");
|
||||
|
||||
pINTData = (PSINTData) pDevice->intBuf.pDataBuf;
|
||||
if (BITbIsBitOn(pINTData->byTSR0, TSR_VALID)) {
|
||||
STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt0 & 0x0F), (BYTE) (pINTData->byPkt0>>4), pINTData->byTSR0);
|
||||
BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR0, pINTData->byPkt0);
|
||||
//DBG_PRN_GRP01(("TSR0 %02x\n", pINTData->byTSR0));
|
||||
}
|
||||
if (BITbIsBitOn(pINTData->byTSR1, TSR_VALID)) {
|
||||
STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt1 & 0x0F), (BYTE) (pINTData->byPkt1>>4), pINTData->byTSR1);
|
||||
BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR1, pINTData->byPkt1);
|
||||
//DBG_PRN_GRP01(("TSR1 %02x\n", pINTData->byTSR1));
|
||||
}
|
||||
if (BITbIsBitOn(pINTData->byTSR2, TSR_VALID)) {
|
||||
STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt2 & 0x0F), (BYTE) (pINTData->byPkt2>>4), pINTData->byTSR2);
|
||||
BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR2, pINTData->byPkt2);
|
||||
//DBG_PRN_GRP01(("TSR2 %02x\n", pINTData->byTSR2));
|
||||
}
|
||||
if (BITbIsBitOn(pINTData->byTSR3, TSR_VALID)) {
|
||||
STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt3 & 0x0F), (BYTE) (pINTData->byPkt3>>4), pINTData->byTSR3);
|
||||
BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR3, pINTData->byPkt3);
|
||||
//DBG_PRN_GRP01(("TSR3 %02x\n", pINTData->byTSR3));
|
||||
}
|
||||
if ( pINTData->byISR0 != 0 ) {
|
||||
if ( BITbIsBitOn(pINTData->byISR0, ISR_BNTX) ) {
|
||||
|
||||
if (pDevice->eOPMode == OP_MODE_AP) {
|
||||
if(pMgmt->byDTIMCount > 0) {
|
||||
pMgmt->byDTIMCount --;
|
||||
pMgmt->sNodeDBTable[0].bRxPSPoll = FALSE;
|
||||
} else if(pMgmt->byDTIMCount == 0) {
|
||||
// check if mutltcast tx bufferring
|
||||
pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
|
||||
pMgmt->sNodeDBTable[0].bRxPSPoll = TRUE;
|
||||
if (pMgmt->sNodeDBTable[0].bPSEnable) {
|
||||
bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
|
||||
}
|
||||
}
|
||||
bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BECON_SEND, NULL);
|
||||
} // if (pDevice->eOPMode == OP_MODE_AP)
|
||||
|
||||
pDevice->bBeaconSent = TRUE;
|
||||
} else {
|
||||
pDevice->bBeaconSent = FALSE;
|
||||
}
|
||||
if ( BITbIsBitOn(pINTData->byISR0, ISR_TBTT) ) {
|
||||
if ( pDevice->bEnablePSMode ) {
|
||||
bScheduleCommand((HANDLE) pDevice, WLAN_CMD_TBTT_WAKEUP, NULL);
|
||||
}
|
||||
if ( pDevice->bChannelSwitch ) {
|
||||
pDevice->byChannelSwitchCount--;
|
||||
if ( pDevice->byChannelSwitchCount == 0 ) {
|
||||
bScheduleCommand((HANDLE) pDevice, WLAN_CMD_11H_CHSW, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
LODWORD(pDevice->qwCurrTSF) = pINTData->dwLoTSF;
|
||||
HIDWORD(pDevice->qwCurrTSF) = pINTData->dwHiTSF;
|
||||
//DBG_PRN_GRP01(("ISR0 = %02x ,LoTsf = %08x,HiTsf = %08x\n", pINTData->byISR0, pINTData->dwLoTSF,pINTData->dwHiTSF));
|
||||
|
||||
STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic, pINTData->byRTSSuccess,
|
||||
pINTData->byRTSFail, pINTData->byACKFail, pINTData->byFCSErr );
|
||||
STAvUpdateIsrStatCounter(&pDevice->scStatistic, pINTData->byISR0, pINTData->byISR1);
|
||||
|
||||
}
|
||||
|
||||
if ( pINTData->byISR1 != 0 ) {
|
||||
if ( BITbIsBitOn(pINTData->byISR1, ISR_GPIO3) ) {
|
||||
bScheduleCommand((HANDLE) pDevice, WLAN_CMD_RADIO, NULL);
|
||||
}
|
||||
}
|
||||
pDevice->intBuf.uDataLen = 0;
|
||||
pDevice->intBuf.bInUse = FALSE;
|
||||
|
||||
pStats->tx_packets = pDevice->scStatistic.ullTsrOK;
|
||||
pStats->tx_bytes = pDevice->scStatistic.ullTxDirectedBytes +
|
||||
pDevice->scStatistic.ullTxMulticastBytes +
|
||||
pDevice->scStatistic.ullTxBroadcastBytes;
|
||||
pStats->tx_errors = pDevice->scStatistic.dwTsrErr;
|
||||
pStats->tx_dropped = pDevice->scStatistic.dwTsrErr;
|
||||
|
||||
return status;
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: int.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Apr. 2, 2004
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __INT_H__
|
||||
#define __INT_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
#pragma pack(1)
|
||||
typedef struct tagSINTData {
|
||||
BYTE byTSR0;
|
||||
BYTE byPkt0;
|
||||
WORD wTime0;
|
||||
BYTE byTSR1;
|
||||
BYTE byPkt1;
|
||||
WORD wTime1;
|
||||
BYTE byTSR2;
|
||||
BYTE byPkt2;
|
||||
WORD wTime2;
|
||||
BYTE byTSR3;
|
||||
BYTE byPkt3;
|
||||
WORD wTime3;
|
||||
DWORD dwLoTSF;
|
||||
DWORD dwHiTSF;
|
||||
BYTE byISR0;
|
||||
BYTE byISR1;
|
||||
BYTE byRTSSuccess;
|
||||
BYTE byRTSFail;
|
||||
BYTE byACKFail;
|
||||
BYTE byFCSErr;
|
||||
BYTE abySW[2];
|
||||
}__attribute__ ((__packed__))
|
||||
SINTData, DEF* PSINTData;
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
VOID
|
||||
INTvWorkItem(
|
||||
PVOID Context
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
INTnsProcessData(
|
||||
IN PSDevice pDevice
|
||||
);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __INT_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,724 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: ioctl.c
|
||||
*
|
||||
* Purpose: private ioctl functions
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: Auguest 20, 2003
|
||||
*
|
||||
* Functions:
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__IOCTL_H__)
|
||||
#include "ioctl.h"
|
||||
#endif
|
||||
#if !defined(__IOCMD_H__)
|
||||
#include "iocmd.h"
|
||||
#endif
|
||||
#if !defined(__MAC_H__)
|
||||
#include "mac.h"
|
||||
#endif
|
||||
#if !defined(__CARD_H__)
|
||||
#include "card.h"
|
||||
#endif
|
||||
#if !defined(__HOSTAP_H__)
|
||||
#include "hostap.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__WPACTL_H__)
|
||||
#include "wpactl.h"
|
||||
#endif
|
||||
#if !defined(__CONTROL_H__)
|
||||
#include "control.h"
|
||||
#endif
|
||||
#if !defined(__RNDIS_H__)
|
||||
#include "rndis.h"
|
||||
#endif
|
||||
#if !defined(__RF_H__)
|
||||
#include "rf.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
|
||||
#ifdef WPA_SM_Transtatus
|
||||
SWPAResult wpa_Result;
|
||||
#endif
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
int private_ioctl(PSDevice pDevice, struct ifreq *rq) {
|
||||
|
||||
PSCmdRequest pReq = (PSCmdRequest)rq;
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
int result = 0;
|
||||
PWLAN_IE_SSID pItemSSID;
|
||||
SCmdBSSJoin sJoinCmd;
|
||||
SCmdZoneTypeSet sZoneTypeCmd;
|
||||
SCmdScan sScanCmd;
|
||||
SCmdStartAP sStartAPCmd;
|
||||
SCmdSetWEP sWEPCmd;
|
||||
SCmdValue sValue;
|
||||
SBSSIDList sList;
|
||||
SNodeList sNodeList;
|
||||
PSBSSIDList pList;
|
||||
PSNodeList pNodeList;
|
||||
UINT cbListCount;
|
||||
PKnownBSS pBSS;
|
||||
PKnownNodeDB pNode;
|
||||
UINT ii, jj;
|
||||
SCmdLinkStatus sLinkStatus;
|
||||
BYTE abySuppRates[] = {WLAN_EID_SUPP_RATES, 4, 0x02, 0x04, 0x0B, 0x16};
|
||||
BYTE abyNullAddr[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
DWORD dwKeyIndex= 0;
|
||||
BYTE abyScanSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
|
||||
LONG ldBm;
|
||||
|
||||
pReq->wResult = 0;
|
||||
|
||||
switch(pReq->wCmdCode) {
|
||||
|
||||
case WLAN_CMD_BSS_SCAN:
|
||||
|
||||
if (copy_from_user(&sScanCmd, pReq->data, sizeof(SCmdScan))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
|
||||
pItemSSID = (PWLAN_IE_SSID)sScanCmd.ssid;
|
||||
if (pItemSSID->len != 0) {
|
||||
memset(abyScanSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
|
||||
memcpy(abyScanSSID, pItemSSID, pItemSSID->len + WLAN_IEHDR_LEN);
|
||||
}
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
if (memcmp(pMgmt->abyCurrBSSID, &abyNullAddr[0], 6) == 0)
|
||||
BSSvClearBSSList((HANDLE)pDevice, FALSE);
|
||||
else
|
||||
BSSvClearBSSList((HANDLE)pDevice, pDevice->bLinkPass);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_BSS_SCAN..begin \n");
|
||||
|
||||
if (pItemSSID->len != 0)
|
||||
bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, abyScanSSID);
|
||||
else
|
||||
bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
break;
|
||||
|
||||
case WLAN_CMD_ZONETYPE_SET:
|
||||
//mike add :cann't support.
|
||||
result=-EOPNOTSUPP;
|
||||
break;
|
||||
|
||||
if (copy_from_user(&sZoneTypeCmd, pReq->data, sizeof(SCmdZoneTypeSet))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
|
||||
if(sZoneTypeCmd.bWrite==TRUE) {
|
||||
//////write zonetype
|
||||
if(sZoneTypeCmd.ZoneType == ZoneType_USA) {
|
||||
//set to USA
|
||||
printk("set_ZoneType:USA\n");
|
||||
}
|
||||
else if(sZoneTypeCmd.ZoneType == ZoneType_Japan) {
|
||||
//set to Japan
|
||||
printk("set_ZoneType:Japan\n");
|
||||
}
|
||||
else if(sZoneTypeCmd.ZoneType == ZoneType_Europe) {
|
||||
//set to Europe
|
||||
printk("set_ZoneType:Europe\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
///////read zonetype
|
||||
BYTE zonetype=0;
|
||||
|
||||
|
||||
if(zonetype == 0x00) { //USA
|
||||
sZoneTypeCmd.ZoneType = ZoneType_USA;
|
||||
}
|
||||
else if(zonetype == 0x01) { //Japan
|
||||
sZoneTypeCmd.ZoneType = ZoneType_Japan;
|
||||
}
|
||||
else if(zonetype == 0x02) { //Europe
|
||||
sZoneTypeCmd.ZoneType = ZoneType_Europe;
|
||||
}
|
||||
else { //Unknow ZoneType
|
||||
printk("Error:ZoneType[%x] Unknown ???\n",zonetype);
|
||||
result = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if (copy_to_user(pReq->data, &sZoneTypeCmd, sizeof(SCmdZoneTypeSet))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case WLAN_CMD_BSS_JOIN:
|
||||
|
||||
if (copy_from_user(&sJoinCmd, pReq->data, sizeof(SCmdBSSJoin))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
|
||||
pItemSSID = (PWLAN_IE_SSID)sJoinCmd.ssid;
|
||||
memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
|
||||
memcpy(pMgmt->abyDesireSSID, pItemSSID, pItemSSID->len + WLAN_IEHDR_LEN);
|
||||
if (sJoinCmd.wBSSType == ADHOC) {
|
||||
pMgmt->eConfigMode = WMAC_CONFIG_IBSS_STA;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "ioct set to adhoc mode\n");
|
||||
}
|
||||
else {
|
||||
pMgmt->eConfigMode = WMAC_CONFIG_ESS_STA;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "ioct set to STA mode\n");
|
||||
}
|
||||
if (sJoinCmd.bPSEnable == TRUE) {
|
||||
pDevice->ePSMode = WMAC_POWER_FAST;
|
||||
// pDevice->ePSMode = WMAC_POWER_MAX;
|
||||
pMgmt->wListenInterval = 2;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Power Saving On\n");
|
||||
}
|
||||
else {
|
||||
pDevice->ePSMode = WMAC_POWER_CAM;
|
||||
pMgmt->wListenInterval = 1;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Power Saving Off \n");
|
||||
}
|
||||
|
||||
if (sJoinCmd.bShareKeyAuth == TRUE){
|
||||
pMgmt->bShareKeyAlgorithm = TRUE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Share Key \n");
|
||||
}
|
||||
else {
|
||||
pMgmt->bShareKeyAlgorithm = FALSE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Open System \n");
|
||||
}
|
||||
pDevice->uChannel = sJoinCmd.uChannel;
|
||||
netif_stop_queue(pDevice->dev);
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
pMgmt->eCurrState = WMAC_STATE_IDLE;
|
||||
bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
|
||||
bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
break;
|
||||
|
||||
case WLAN_CMD_SET_WEP:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_SET_WEP Key. \n");
|
||||
memset(&sWEPCmd, 0 ,sizeof(SCmdSetWEP));
|
||||
if (copy_from_user(&sWEPCmd, pReq->data, sizeof(SCmdSetWEP))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
if (sWEPCmd.bEnableWep != TRUE) {
|
||||
int uu;
|
||||
|
||||
pDevice->bEncryptionEnable = FALSE;
|
||||
pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
for(uu=0;uu<MAX_KEY_TABLE;uu++)
|
||||
MACvDisableKeyEntry(pDevice,uu);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WEP function disable. \n");
|
||||
break;
|
||||
}
|
||||
|
||||
for (ii = 0; ii < WLAN_WEP_NKEYS; ii ++) {
|
||||
if (sWEPCmd.bWepKeyAvailable[ii]) {
|
||||
if (ii == sWEPCmd.byKeyIndex)
|
||||
//2006-1207-01<Modify>by Einsn Liu
|
||||
// dwKeyIndex|= (1 << 31);
|
||||
dwKeyIndex=ii|(1 << 31);
|
||||
else
|
||||
dwKeyIndex = ii;
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
KeybSetDefaultKey( pDevice,
|
||||
&(pDevice->sKey),
|
||||
dwKeyIndex,
|
||||
sWEPCmd.auWepKeyLength[ii],
|
||||
NULL,
|
||||
(PBYTE)&sWEPCmd.abyWepKey[ii][0],
|
||||
KEY_CTL_WEP
|
||||
);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
|
||||
}
|
||||
}
|
||||
pDevice->byKeyIndex = sWEPCmd.byKeyIndex;
|
||||
pDevice->bTransmitKey = TRUE;
|
||||
pDevice->bEncryptionEnable = TRUE;
|
||||
pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
|
||||
|
||||
break;
|
||||
|
||||
case WLAN_CMD_GET_LINK:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_GET_LINK status. \n");
|
||||
|
||||
memset(sLinkStatus.abySSID, 0 , WLAN_SSID_MAXLEN + 1);
|
||||
|
||||
if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)
|
||||
sLinkStatus.wBSSType = ADHOC;
|
||||
else
|
||||
sLinkStatus.wBSSType = INFRA;
|
||||
|
||||
if (pMgmt->eCurrState == WMAC_STATE_JOINTED)
|
||||
sLinkStatus.byState = ADHOC_JOINTED;
|
||||
else
|
||||
sLinkStatus.byState = ADHOC_STARTED;
|
||||
|
||||
sLinkStatus.uChannel = pMgmt->uCurrChannel;
|
||||
if (pDevice->bLinkPass == TRUE) {
|
||||
sLinkStatus.bLink = TRUE;
|
||||
pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
|
||||
memcpy(sLinkStatus.abySSID, pItemSSID->abySSID, pItemSSID->len);
|
||||
memcpy(sLinkStatus.abyBSSID, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
|
||||
sLinkStatus.uLinkRate = pMgmt->sNodeDBTable[0].wTxDataRate;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Link Success ! \n");
|
||||
}
|
||||
else {
|
||||
sLinkStatus.bLink = FALSE;
|
||||
}
|
||||
if (copy_to_user(pReq->data, &sLinkStatus, sizeof(SCmdLinkStatus))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case WLAN_CMD_GET_LISTLEN:
|
||||
cbListCount = 0;
|
||||
pBSS = &(pMgmt->sBSSList[0]);
|
||||
for (ii = 0; ii < MAX_BSS_NUM; ii++) {
|
||||
pBSS = &(pMgmt->sBSSList[ii]);
|
||||
if (!pBSS->bActive)
|
||||
continue;
|
||||
cbListCount++;
|
||||
};
|
||||
sList.uItem = cbListCount;
|
||||
if (copy_to_user(pReq->data, &sList, sizeof(SBSSIDList))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
pReq->wResult = 0;
|
||||
break;
|
||||
|
||||
case WLAN_CMD_GET_LIST:
|
||||
if (copy_from_user(&sList, pReq->data, sizeof(SBSSIDList))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
pList = (PSBSSIDList)kmalloc(sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)), (int)GFP_ATOMIC);
|
||||
if (pList == NULL) {
|
||||
result = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
pList->uItem = sList.uItem;
|
||||
pBSS = &(pMgmt->sBSSList[0]);
|
||||
for (ii = 0, jj = 0; jj < MAX_BSS_NUM ; jj++) {
|
||||
pBSS = &(pMgmt->sBSSList[jj]);
|
||||
if (pBSS->bActive) {
|
||||
pList->sBSSIDList[ii].uChannel = pBSS->uChannel;
|
||||
pList->sBSSIDList[ii].wBeaconInterval = pBSS->wBeaconInterval;
|
||||
pList->sBSSIDList[ii].wCapInfo = pBSS->wCapInfo;
|
||||
RFvRSSITodBm(pDevice, (BYTE)(pBSS->uRSSI), &ldBm);
|
||||
pList->sBSSIDList[ii].uRSSI = (UINT)ldBm;
|
||||
// pList->sBSSIDList[ii].uRSSI = pBSS->uRSSI;
|
||||
memcpy(pList->sBSSIDList[ii].abyBSSID, pBSS->abyBSSID, WLAN_BSSID_LEN);
|
||||
pItemSSID = (PWLAN_IE_SSID)pBSS->abySSID;
|
||||
memset(pList->sBSSIDList[ii].abySSID, 0, WLAN_SSID_MAXLEN + 1);
|
||||
memcpy(pList->sBSSIDList[ii].abySSID, pItemSSID->abySSID, pItemSSID->len);
|
||||
if (WLAN_GET_CAP_INFO_ESS(pBSS->wCapInfo)) {
|
||||
pList->sBSSIDList[ii].byNetType = INFRA;
|
||||
}
|
||||
else {
|
||||
pList->sBSSIDList[ii].byNetType = ADHOC;
|
||||
}
|
||||
if (WLAN_GET_CAP_INFO_PRIVACY(pBSS->wCapInfo)) {
|
||||
pList->sBSSIDList[ii].bWEPOn = TRUE;
|
||||
}
|
||||
else {
|
||||
pList->sBSSIDList[ii].bWEPOn = FALSE;
|
||||
}
|
||||
ii ++;
|
||||
if (ii >= pList->uItem)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (copy_to_user(pReq->data, pList, sizeof(SBSSIDList) + (sList.uItem * sizeof(SBSSIDItem)))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
kfree(pList);
|
||||
pReq->wResult = 0;
|
||||
break;
|
||||
|
||||
case WLAN_CMD_GET_MIB:
|
||||
if (copy_to_user(pReq->data, &(pDevice->s802_11Counter), sizeof(SDot11MIBCount))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
break;
|
||||
|
||||
case WLAN_CMD_GET_STAT:
|
||||
if (copy_to_user(pReq->data, &(pDevice->scStatistic), sizeof(SStatCounter))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
break;
|
||||
case WLAN_CMD_STOP_MAC:
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_STOP_MAC\n");
|
||||
// Todo xxxxxx
|
||||
netif_stop_queue(pDevice->dev);
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
if (pDevice->bRadioOff == FALSE) {
|
||||
CARDbRadioPowerOff(pDevice);
|
||||
}
|
||||
pDevice->bLinkPass = FALSE;
|
||||
ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
|
||||
memset(pMgmt->abyCurrBSSID, 0, 6);
|
||||
pMgmt->eCurrState = WMAC_STATE_IDLE;
|
||||
// del_timer(&pDevice->sTimerCommand);
|
||||
// del_timer(&pMgmt->sTimerSecondCallback);
|
||||
pDevice->bCmdRunning = FALSE;
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
|
||||
break;
|
||||
|
||||
case WLAN_CMD_START_MAC:
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_START_MAC\n");
|
||||
// Todo xxxxxxx
|
||||
if (pDevice->bRadioOff == TRUE)
|
||||
CARDbRadioPowerOn(pDevice);
|
||||
break;
|
||||
|
||||
case WLAN_CMD_SET_HOSTAPD:
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_SET_HOSTAPD\n");
|
||||
|
||||
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
if (sValue.dwValue == 1) {
|
||||
if (hostap_set_hostapd(pDevice, 1, 1) == 0){
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enable HOSTAP\n");
|
||||
}
|
||||
else {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
hostap_set_hostapd(pDevice, 0, 1);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Disable HOSTAP\n");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case WLAN_CMD_SET_HOSTAPD_STA:
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_SET_HOSTAPD_STA\n");
|
||||
|
||||
break;
|
||||
case WLAN_CMD_SET_802_1X:
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_SET_802_1X\n");
|
||||
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
|
||||
if (sValue.dwValue == 1) {
|
||||
pDevice->bEnable8021x = TRUE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enable 802.1x\n");
|
||||
}
|
||||
else {
|
||||
pDevice->bEnable8021x = FALSE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Disable 802.1x\n");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case WLAN_CMD_SET_HOST_WEP:
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_SET_HOST_WEP\n");
|
||||
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
|
||||
if (sValue.dwValue == 1) {
|
||||
pDevice->bEnableHostWEP = TRUE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enable HostWEP\n");
|
||||
}
|
||||
else {
|
||||
pDevice->bEnableHostWEP = FALSE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Disable HostWEP\n");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case WLAN_CMD_SET_WPA:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_SET_WPA\n");
|
||||
|
||||
if (copy_from_user(&sValue, pReq->data, sizeof(SCmdValue))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
if (sValue.dwValue == 1) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "up wpadev\n");
|
||||
memcpy(pDevice->wpadev->dev_addr, pDevice->dev->dev_addr, U_ETHER_ADDR_LEN);
|
||||
pDevice->bWPADEVUp = TRUE;
|
||||
}
|
||||
else {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "close wpadev\n");
|
||||
pDevice->bWPADEVUp = FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case WLAN_CMD_AP_START:
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "WLAN_CMD_AP_START\n");
|
||||
if (pDevice->bRadioOff == TRUE) {
|
||||
CARDbRadioPowerOn(pDevice);
|
||||
add_timer(&pMgmt->sTimerSecondCallback);
|
||||
}
|
||||
if (copy_from_user(&sStartAPCmd, pReq->data, sizeof(SCmdStartAP))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
|
||||
if (sStartAPCmd.wBSSType == AP) {
|
||||
pMgmt->eConfigMode = WMAC_CONFIG_AP;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "ioct set to AP mode\n");
|
||||
}
|
||||
else {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "ioct BSS type not set to AP mode\n");
|
||||
result = -EFAULT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (sStartAPCmd.wBBPType == PHY80211g) {
|
||||
pMgmt->byAPBBType = PHY_TYPE_11G;
|
||||
}
|
||||
else if (sStartAPCmd.wBBPType == PHY80211a) {
|
||||
pMgmt->byAPBBType = PHY_TYPE_11A;
|
||||
}
|
||||
else {
|
||||
pMgmt->byAPBBType = PHY_TYPE_11B;
|
||||
}
|
||||
|
||||
pItemSSID = (PWLAN_IE_SSID)sStartAPCmd.ssid;
|
||||
memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
|
||||
memcpy(pMgmt->abyDesireSSID, pItemSSID, pItemSSID->len + WLAN_IEHDR_LEN);
|
||||
|
||||
if ((sStartAPCmd.uChannel > 0)&&(sStartAPCmd.uChannel <= 14))
|
||||
pDevice->uChannel = sStartAPCmd.uChannel;
|
||||
|
||||
if ((sStartAPCmd.uBeaconInt >= 20) && (sStartAPCmd.uBeaconInt <= 1000))
|
||||
pMgmt->wIBSSBeaconPeriod = sStartAPCmd.uBeaconInt;
|
||||
else
|
||||
pMgmt->wIBSSBeaconPeriod = 100;
|
||||
|
||||
if (sStartAPCmd.bShareKeyAuth == TRUE){
|
||||
pMgmt->bShareKeyAlgorithm = TRUE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Share Key \n");
|
||||
}
|
||||
else {
|
||||
pMgmt->bShareKeyAlgorithm = FALSE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Open System \n");
|
||||
}
|
||||
memcpy(pMgmt->abyIBSSSuppRates, abySuppRates, 6);
|
||||
|
||||
if (sStartAPCmd.byBasicRate & BIT3) {
|
||||
pMgmt->abyIBSSSuppRates[2] |= BIT7;
|
||||
pMgmt->abyIBSSSuppRates[3] |= BIT7;
|
||||
pMgmt->abyIBSSSuppRates[4] |= BIT7;
|
||||
pMgmt->abyIBSSSuppRates[5] |= BIT7;
|
||||
}else if (sStartAPCmd.byBasicRate & BIT2) {
|
||||
pMgmt->abyIBSSSuppRates[2] |= BIT7;
|
||||
pMgmt->abyIBSSSuppRates[3] |= BIT7;
|
||||
pMgmt->abyIBSSSuppRates[4] |= BIT7;
|
||||
}else if (sStartAPCmd.byBasicRate & BIT1) {
|
||||
pMgmt->abyIBSSSuppRates[2] |= BIT7;
|
||||
pMgmt->abyIBSSSuppRates[3] |= BIT7;
|
||||
}else if (sStartAPCmd.byBasicRate & BIT1) {
|
||||
pMgmt->abyIBSSSuppRates[2] |= BIT7;
|
||||
}else {
|
||||
//default 1,2M
|
||||
pMgmt->abyIBSSSuppRates[2] |= BIT7;
|
||||
pMgmt->abyIBSSSuppRates[3] |= BIT7;
|
||||
}
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Support Rate= %x %x %x %x\n",
|
||||
pMgmt->abyIBSSSuppRates[2],
|
||||
pMgmt->abyIBSSSuppRates[3],
|
||||
pMgmt->abyIBSSSuppRates[4],
|
||||
pMgmt->abyIBSSSuppRates[5]
|
||||
);
|
||||
|
||||
netif_stop_queue(pDevice->dev);
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
break;
|
||||
|
||||
case WLAN_CMD_GET_NODE_CNT:
|
||||
|
||||
cbListCount = 0;
|
||||
pNode = &(pMgmt->sNodeDBTable[0]);
|
||||
for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) {
|
||||
pNode = &(pMgmt->sNodeDBTable[ii]);
|
||||
if (!pNode->bActive)
|
||||
continue;
|
||||
cbListCount++;
|
||||
};
|
||||
|
||||
sNodeList.uItem = cbListCount;
|
||||
if (copy_to_user(pReq->data, &sNodeList, sizeof(SNodeList))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
pReq->wResult = 0;
|
||||
break;
|
||||
|
||||
case WLAN_CMD_GET_NODE_LIST:
|
||||
|
||||
if (copy_from_user(&sNodeList, pReq->data, sizeof(SNodeList))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
pNodeList = (PSNodeList)kmalloc(sizeof(SNodeList) + (sNodeList.uItem * sizeof(SNodeItem)), (int)GFP_ATOMIC);
|
||||
if (pNodeList == NULL) {
|
||||
result = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
pNodeList->uItem = sNodeList.uItem;
|
||||
pNode = &(pMgmt->sNodeDBTable[0]);
|
||||
for (ii = 0, jj = 0; ii < (MAX_NODE_NUM + 1); ii++) {
|
||||
pNode = &(pMgmt->sNodeDBTable[ii]);
|
||||
if (pNode->bActive) {
|
||||
pNodeList->sNodeList[jj].wAID = pNode->wAID;
|
||||
memcpy(pNodeList->sNodeList[jj].abyMACAddr, pNode->abyMACAddr, WLAN_ADDR_LEN);
|
||||
pNodeList->sNodeList[jj].wTxDataRate = pNode->wTxDataRate;
|
||||
pNodeList->sNodeList[jj].wInActiveCount = (WORD)pNode->uInActiveCount;
|
||||
pNodeList->sNodeList[jj].wEnQueueCnt = (WORD)pNode->wEnQueueCnt;
|
||||
pNodeList->sNodeList[jj].wFlags = (WORD)pNode->dwFlags;
|
||||
pNodeList->sNodeList[jj].bPWBitOn = pNode->bPSEnable;
|
||||
pNodeList->sNodeList[jj].byKeyIndex = pNode->byKeyIndex;
|
||||
pNodeList->sNodeList[jj].wWepKeyLength = pNode->uWepKeyLength;
|
||||
memcpy(&(pNodeList->sNodeList[jj].abyWepKey[0]), &(pNode->abyWepKey[0]), WEP_KEYMAXLEN);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "key= %2.2X:%2.2X:%2.2X:%2.2X:%2.2X\n",
|
||||
pNodeList->sNodeList[jj].abyWepKey[0],
|
||||
pNodeList->sNodeList[jj].abyWepKey[1],
|
||||
pNodeList->sNodeList[jj].abyWepKey[2],
|
||||
pNodeList->sNodeList[jj].abyWepKey[3],
|
||||
pNodeList->sNodeList[jj].abyWepKey[4]
|
||||
);
|
||||
pNodeList->sNodeList[jj].bIsInFallback = pNode->bIsInFallback;
|
||||
pNodeList->sNodeList[jj].uTxFailures = pNode->uTxFailures;
|
||||
pNodeList->sNodeList[jj].uTxAttempts = pNode->uTxAttempts;
|
||||
pNodeList->sNodeList[jj].wFailureRatio = (WORD)pNode->uFailureRatio;
|
||||
jj ++;
|
||||
if (jj >= pNodeList->uItem)
|
||||
break;
|
||||
}
|
||||
};
|
||||
if (copy_to_user(pReq->data, pNodeList, sizeof(SNodeList) + (sNodeList.uItem * sizeof(SNodeItem)))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
};
|
||||
kfree(pNodeList);
|
||||
pReq->wResult = 0;
|
||||
break;
|
||||
|
||||
#ifdef WPA_SM_Transtatus
|
||||
case 0xFF:
|
||||
memset(wpa_Result.ifname,0,sizeof(wpa_Result.ifname));
|
||||
wpa_Result.proto = 0;
|
||||
wpa_Result.key_mgmt = 0;
|
||||
wpa_Result.eap_type = 0;
|
||||
wpa_Result.authenticated = FALSE;
|
||||
pDevice->fWPA_Authened = FALSE;
|
||||
if (copy_from_user(&wpa_Result, pReq->data, sizeof(wpa_Result))) {
|
||||
result = -EFAULT;
|
||||
break;
|
||||
}
|
||||
//DavidWang for some AP maybe good authenticate
|
||||
if(wpa_Result.key_mgmt==0x20)
|
||||
pMgmt->Cisco_cckm =1;
|
||||
else
|
||||
pMgmt->Cisco_cckm =0;
|
||||
//DavidWang
|
||||
|
||||
if(wpa_Result.authenticated==TRUE) {
|
||||
#ifdef SndEvt_ToAPI
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
|
||||
pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
|
||||
|
||||
memset(&wrqu, 0, sizeof(wrqu));
|
||||
wrqu.data.flags = RT_WPACONNECTED_EVENT_FLAG;
|
||||
wrqu.data.length =pItemSSID->len;
|
||||
wireless_send_event(pDevice->dev, IWEVCUSTOM, &wrqu, pItemSSID->abySSID);
|
||||
}
|
||||
#endif
|
||||
pDevice->fWPA_Authened = TRUE; //is sucessful peer to wpa_Result.authenticated?
|
||||
}
|
||||
|
||||
//printk("get private wpa_supplicant announce WPA SM\n");
|
||||
//printk("wpa-->ifname=%s\n",wpa_Result.ifname);
|
||||
//printk("wpa-->proto=%d\n",wpa_Result.proto);
|
||||
//printk("wpa-->key-mgmt=%d\n",wpa_Result.key_mgmt);
|
||||
//printk("wpa-->eap_type=%d\n",wpa_Result.eap_type);
|
||||
//printk("wpa-->authenticated is %s\n",(wpa_Result.authenticated==TRUE)?"TRUE":"FALSE");
|
||||
|
||||
pReq->wResult = 0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Private command not support..\n");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: hostap.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: May 21, 2003
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __IOCTL_H__
|
||||
#define __IOCTL_H__
|
||||
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
int private_ioctl(PSDevice pDevice, struct ifreq *rq);
|
||||
|
||||
/*
|
||||
VOID vConfigWEPKey (
|
||||
IN PSDevice pDevice,
|
||||
IN DWORD dwKeyIndex,
|
||||
IN PBYTE pbyKey,
|
||||
IN ULONG uKeyLength
|
||||
);
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __IOCTL_H__
|
||||
|
||||
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,332 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: iwctl.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: May 21, 2004
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __IWCTL_H__
|
||||
#define __IWCTL_H__
|
||||
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#if WIRELESS_EXT < 18
|
||||
|
||||
|
||||
#define SIOCSIWMLME 0x8B16
|
||||
#define SIOCSIWGENIE 0x8B30
|
||||
|
||||
// WPA : Authentication mode parameters
|
||||
#define SIOCSIWAUTH 0x8B32
|
||||
#define SIOCGIWAUTH 0x8B33
|
||||
|
||||
// WPA : Extended version of encoding configuration
|
||||
#define SIOCSIWENCODEEXT 0x8B34
|
||||
#define SIOCGIWENCODEEXT 0x8B35
|
||||
|
||||
#define IW_AUTH_WPA_VERSION 0
|
||||
#define IW_AUTH_CIPHER_PAIRWISE 1
|
||||
#define IW_AUTH_CIPHER_GROUP 2
|
||||
#define IW_AUTH_KEY_MGMT 3
|
||||
#define IW_AUTH_TKIP_COUNTERMEASURES 4
|
||||
#define IW_AUTH_DROP_UNENCRYPTED 5
|
||||
#define IW_AUTH_80211_AUTH_ALG 6
|
||||
#define IW_AUTH_WPA_ENABLED 7
|
||||
#define IW_AUTH_RX_UNENCRYPTED_EAPOL 8
|
||||
#define IW_AUTH_ROAMING_CONTROL 9
|
||||
#define IW_AUTH_PRIVACY_INVOKED 10
|
||||
|
||||
#define IW_AUTH_WPA_VERSION_DISABLED 0x00000001
|
||||
#define IW_AUTH_WPA_VERSION_WPA 0x00000002
|
||||
#define IW_AUTH_WPA_VERSION_WPA2 0x00000004
|
||||
|
||||
#define IW_AUTH_CIPHER_NONE 0x00000001
|
||||
#define IW_AUTH_CIPHER_WEP40 0x00000002
|
||||
#define IW_AUTH_CIPHER_TKIP 0x00000004
|
||||
#define IW_AUTH_CIPHER_CCMP 0x00000008
|
||||
#define IW_AUTH_CIPHER_WEP104 0x00000010
|
||||
|
||||
#define IW_AUTH_KEY_MGMT_802_1X 1
|
||||
#define IW_AUTH_KEY_MGMT_PSK 2
|
||||
|
||||
#define IW_AUTH_ALG_OPEN_SYSTEM 0x00000001
|
||||
#define IW_AUTH_ALG_SHARED_KEY 0x00000002
|
||||
#define IW_AUTH_ALG_LEAP 0x00000004
|
||||
|
||||
#define IW_AUTH_ROAMING_ENABLE 0
|
||||
#define IW_AUTH_ROAMING_DISABLE 1
|
||||
|
||||
#define IW_ENCODE_SEQ_MAX_SIZE 8
|
||||
|
||||
#define IW_ENCODE_ALG_NONE 0
|
||||
#define IW_ENCODE_ALG_WEP 1
|
||||
#define IW_ENCODE_ALG_TKIP 2
|
||||
#define IW_ENCODE_ALG_CCMP 3
|
||||
|
||||
|
||||
struct iw_encode_ext
|
||||
{
|
||||
__u32 ext_flags; // IW_ENCODE_EXT_*
|
||||
__u8 tx_seq[IW_ENCODE_SEQ_MAX_SIZE]; // LSB first
|
||||
__u8 rx_seq[IW_ENCODE_SEQ_MAX_SIZE]; // LSB first
|
||||
struct sockaddr addr; // ff:ff:ff:ff:ff:ff for broadcast/multicast
|
||||
// (group) keys or unicast address for
|
||||
// individual keys
|
||||
__u16 alg; // IW_ENCODE_ALG_*
|
||||
__u16 key_len;
|
||||
__u8 key[0];
|
||||
};
|
||||
|
||||
|
||||
struct iw_mlme
|
||||
{
|
||||
__u16 cmd; /* IW_MLME_* */
|
||||
__u16 reason_code;
|
||||
struct sockaddr addr;
|
||||
};
|
||||
|
||||
#endif // WIRELESS_EXT < 18
|
||||
|
||||
|
||||
|
||||
#ifdef WIRELESS_EXT
|
||||
|
||||
struct iw_statistics *iwctl_get_wireless_stats (struct net_device *dev);
|
||||
|
||||
|
||||
int iwctl_siwap(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct sockaddr *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwrange(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
|
||||
int iwctl_giwmode(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
__u32 *wmode,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwmode(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
__u32 *wmode,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwfreq(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_freq *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwfreq(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_freq *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwname(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
char *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwnwid(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra) ;
|
||||
|
||||
int iwctl_giwsens(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwap(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct sockaddr *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwaplist(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwessid(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwessid(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwrate(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwrate(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwrts(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
|
||||
int iwctl_giwrts(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwfrag(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwfrag(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwretry(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwretry(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwencode(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwencode(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwpower(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwpower(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwscan(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwscan(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
//2008-0409-07, <Add> by Einsn Liu
|
||||
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
|
||||
int iwctl_siwauth(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwauth(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwgenie(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwgenie(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwencodeext(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_giwencodeext(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
|
||||
int iwctl_siwmlme(struct net_device *dev,
|
||||
struct iw_request_info * info,
|
||||
struct iw_point *wrq,
|
||||
char *extra);
|
||||
#endif // #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
|
||||
#endif
|
||||
//End Add -- //2008-0409-07, <Add> by Einsn Liu
|
||||
|
||||
|
||||
#if WIRELESS_EXT > 12
|
||||
extern const struct iw_handler_def iwctl_handler_def;
|
||||
extern const struct iw_priv_args iwctl_private_args;
|
||||
#else
|
||||
struct iw_request_info {};
|
||||
#endif //WIRELESS_EXT > 12
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __IWCTL_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,315 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: kcompat.h
|
||||
*
|
||||
* Purpose: define kernel compatibility header
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: Apr 8, 2002
|
||||
*
|
||||
*/
|
||||
#ifndef _KCOMPAT_H
|
||||
#define _KCOMPAT_H
|
||||
|
||||
#include <linux/version.h>
|
||||
|
||||
#ifndef __init
|
||||
#define __init
|
||||
#endif
|
||||
|
||||
#ifndef __exit
|
||||
#define __exit
|
||||
#endif
|
||||
|
||||
#ifndef __devexit
|
||||
#define __devexit
|
||||
#endif
|
||||
|
||||
#ifndef __devinitdata
|
||||
#define __devinitdata
|
||||
#endif
|
||||
|
||||
#ifndef MODULE_LICENSE
|
||||
#define MODULE_LICENSE(license)
|
||||
#endif
|
||||
|
||||
#ifndef MOD_INC_USE_COUNT
|
||||
#define MOD_INC_USE_COUNT do {} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef MOD_DEC_USE_COUNT
|
||||
#define MOD_DEC_USE_COUNT do {} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_NETDEV_PRIV
|
||||
#define netdev_priv(dev) (dev->priv)
|
||||
#endif
|
||||
|
||||
#ifndef IRQ_RETVAL
|
||||
typedef void irqreturn_t;
|
||||
|
||||
|
||||
#define IRQ_RETVAL(x)
|
||||
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
|
||||
#define vntwusb_submit_urb(val) usb_submit_urb(val, GFP_ATOMIC)
|
||||
#define vntwusb_alloc_urb(val) usb_alloc_urb(val, GFP_ATOMIC)
|
||||
#else
|
||||
#define vntwusb_alloc_urb(val) usb_alloc_urb(val)
|
||||
#define vntwusb_submit_urb(val) usb_submit_urb(val)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
|
||||
|
||||
#define vntwusb_unlink_urb(val) usb_kill_urb(val)
|
||||
|
||||
#else
|
||||
#define vntwusb_unlink_urb(val) usb_unlink_urb(val)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,2,18)
|
||||
|
||||
typedef unsigned long dma_addr_t;
|
||||
typedef struct wait_queue *wait_queue_head_t;
|
||||
#define init_waitqueue_head(x) *(x)=NULL
|
||||
#define set_current_state(status) { current->state = (status); mb(); }
|
||||
|
||||
#ifdef MODULE
|
||||
|
||||
#define module_init(fn) int init_module (void) { return fn(); }
|
||||
#define module_exit(fn) void cleanup_module(void) { return fn(); }
|
||||
|
||||
#else /* MODULE */
|
||||
|
||||
#define module_init(fn) int e100_probe (void) { return fn(); }
|
||||
#define module_exit(fn) /* NOTHING */
|
||||
|
||||
#endif /* MODULE */
|
||||
|
||||
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,2,18) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
|
||||
|
||||
#ifdef MODVERSIONS
|
||||
#include <linux/modversions.h>
|
||||
#endif
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#define pci_resource_start(dev, bar) \
|
||||
(((dev)->base_address[(bar)] & PCI_BASE_ADDRESS_SPACE_IO) ? \
|
||||
((dev)->base_address[(bar)] & PCI_BASE_ADDRESS_IO_MASK) : \
|
||||
((dev)->base_address[(bar)] & PCI_BASE_ADDRESS_MEM_MASK))
|
||||
|
||||
static inline int pci_enable_device(struct pci_dev *dev) { return 0; }
|
||||
#define __constant_cpu_to_le32 cpu_to_le32
|
||||
#define __constant_cpu_to_le16 cpu_to_le16
|
||||
|
||||
#define PCI_DMA_TODEVICE 1
|
||||
#define PCI_DMA_FROMDEVICE 2
|
||||
|
||||
extern inline void *pci_alloc_consistent (struct pci_dev *dev,
|
||||
size_t size,
|
||||
dma_addr_t *dma_handle) {
|
||||
void *vaddr = kmalloc(size, GFP_ATOMIC);
|
||||
if(vaddr != NULL) {
|
||||
*dma_handle = virt_to_bus(vaddr);
|
||||
}
|
||||
return vaddr;
|
||||
}
|
||||
|
||||
#define pci_dma_sync_single(dev,dma_handle,size,direction) do{} while(0)
|
||||
#define pci_dma_supported(dev, addr_mask) (1)
|
||||
#define pci_free_consistent(dev, size, cpu_addr, dma_handle) kfree(cpu_addr)
|
||||
#define pci_map_single(dev, addr, size, direction) virt_to_bus(addr)
|
||||
#define pci_unmap_single(dev, dma_handle, size, direction) do{} while(0)
|
||||
|
||||
|
||||
#define spin_lock_bh spin_lock_irq
|
||||
#define spin_unlock_bh spin_unlock_irq
|
||||
#define del_timer_sync(timer) del_timer(timer)
|
||||
#define net_device device
|
||||
|
||||
#define netif_start_queue(dev) ( clear_bit(0, &(dev)->tbusy))
|
||||
#define netif_stop_queue(dev) ( set_bit(0, &(dev)->tbusy))
|
||||
#define netif_wake_queue(dev) { clear_bit(0, &(dev)->tbusy); \
|
||||
mark_bh(NET_BH); }
|
||||
#define netif_running(dev) ( test_bit(0, &(dev)->start))
|
||||
#define netif_queue_stopped(dev) ( test_bit(0, &(dev)->tbusy))
|
||||
|
||||
#define netif_device_attach(dev) \
|
||||
do{ (dev)->start = 1; netif_start_queue(dev); } while (0)
|
||||
#define netif_device_detach(dev) \
|
||||
do{ (dev)->start = 0; netif_stop_queue(dev); } while (0)
|
||||
|
||||
#define dev_kfree_skb_irq(skb) dev_kfree_skb(skb)
|
||||
|
||||
#define netif_carrier_on(dev) do {} while (0)
|
||||
#define netif_carrier_off(dev) do {} while (0)
|
||||
|
||||
|
||||
#define PCI_ANY_ID (~0U)
|
||||
|
||||
struct pci_device_id {
|
||||
unsigned int vendor, device;
|
||||
unsigned int subvendor, subdevice;
|
||||
unsigned int class, classmask;
|
||||
unsigned long driver_data;
|
||||
};
|
||||
|
||||
#define MODULE_DEVICE_TABLE(bus, dev_table)
|
||||
#define PCI_MAX_NUM_NICS 256
|
||||
|
||||
struct pci_driver {
|
||||
char *name;
|
||||
struct pci_device_id *id_table;
|
||||
int (*probe)(struct pci_dev *dev, const struct pci_device_id *id);
|
||||
void (*remove)(struct pci_dev *dev);
|
||||
void (*suspend)(struct pci_dev *dev);
|
||||
void (*resume)(struct pci_dev *dev);
|
||||
struct pci_dev *pcimap[PCI_MAX_NUM_NICS];
|
||||
};
|
||||
|
||||
static inline int pci_module_init(struct pci_driver *drv)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
struct pci_device_id *pcid;
|
||||
uint16_t subvendor, subdevice;
|
||||
int board_count = 0;
|
||||
|
||||
/* walk the global pci device list looking for matches */
|
||||
for (pdev = pci_devices; pdev && (board_count < PCI_MAX_NUM_NICS); pdev = pdev->next) {
|
||||
|
||||
pcid = &drv->id_table[0];
|
||||
pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &subvendor);
|
||||
pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &subdevice);
|
||||
|
||||
while (pcid->vendor != 0) {
|
||||
if (((pcid->vendor == pdev->vendor) || (pcid->vendor == PCI_ANY_ID)) &&
|
||||
((pcid->device == pdev->device) || (pcid->device == PCI_ANY_ID)) &&
|
||||
((pcid->subvendor == subvendor) || (pcid->subvendor == PCI_ANY_ID)) &&
|
||||
((pcid->subdevice == subdevice) || (pcid->subdevice == PCI_ANY_ID))) {
|
||||
|
||||
if (drv->probe(pdev, pcid) == 0) {
|
||||
drv->pcimap[board_count] = pdev;
|
||||
board_count++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
pcid++;
|
||||
}
|
||||
}
|
||||
|
||||
if (board_count < PCI_MAX_NUM_NICS) {
|
||||
drv->pcimap[board_count] = NULL;
|
||||
}
|
||||
|
||||
return (board_count > 0) ? 0 : -ENODEV;
|
||||
}
|
||||
|
||||
static inline void pci_unregister_driver(struct pci_driver *drv)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_MAX_NUM_NICS; i++) {
|
||||
if (!drv->pcimap[i])
|
||||
break;
|
||||
|
||||
drv->remove(drv->pcimap[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define pci_set_drvdata(pcid, data)
|
||||
|
||||
#define pci_get_drvdata(pcid) ({ \
|
||||
PSDevice pInfo; \
|
||||
for (pInfo = pDevice_Infos; \
|
||||
pInfo; pInfo = pInfo->next) { \
|
||||
if (pInfo->pcid == pcid) \
|
||||
break; \
|
||||
} \
|
||||
pInfo; })
|
||||
|
||||
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) */
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5)
|
||||
|
||||
#define skb_linearize(skb, gfp_mask) ({ \
|
||||
struct sk_buff *tmp_skb; \
|
||||
tmp_skb = skb; \
|
||||
skb = skb_copy(tmp_skb, gfp_mask); \
|
||||
dev_kfree_skb_irq(tmp_skb); })
|
||||
|
||||
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,5) */
|
||||
|
||||
#ifndef MODULE_LICESEN
|
||||
#define MODULE_LICESEN(x)
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6)
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,2)
|
||||
static inline int pci_set_power_state(struct pci_dev* pcid, int state) { return 0; }
|
||||
#endif
|
||||
|
||||
#define PMCSR 0xe0
|
||||
#define PM_ENABLE_BIT 0x0100
|
||||
#define PM_CLEAR_BIT 0x8000
|
||||
#define PM_STATE_MASK 0xFFFC
|
||||
#define PM_STATE_D1 0x0001
|
||||
|
||||
static inline int
|
||||
pci_enable_wake(struct pci_dev *dev, u32 state, int enable)
|
||||
{
|
||||
u16 p_state;
|
||||
|
||||
pci_read_config_word(dev, PMCSR, &p_state);
|
||||
pci_write_config_word(dev, PMCSR, p_state | PM_CLEAR_BIT);
|
||||
|
||||
if (enable == 0) {
|
||||
p_state &= ~PM_ENABLE_BIT;
|
||||
} else {
|
||||
p_state |= PM_ENABLE_BIT;
|
||||
}
|
||||
p_state &= PM_STATE_MASK;
|
||||
p_state |= state;
|
||||
|
||||
pci_write_config_word(dev, PMCSR, p_state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,4,6) */
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,886 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: key.c
|
||||
*
|
||||
* Purpose: Implement functions for 802.11i Key management
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: May 29, 2003
|
||||
*
|
||||
* Functions:
|
||||
* KeyvInitTable - Init Key management table
|
||||
* KeybGetKey - Get Key from table
|
||||
* KeybSetKey - Set Key to table
|
||||
* KeybRemoveKey - Remove Key from table
|
||||
* KeybGetTransmitKey - Get Transmit Key from table
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__KEY_H__)
|
||||
#include "key.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__MAC_H__)
|
||||
#include "mac.h"
|
||||
#endif
|
||||
#if !defined(__RNDIS_H__)
|
||||
#include "rndis.h"
|
||||
#endif
|
||||
#if !defined(__CONTROL_H__)
|
||||
#include "control.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
static VOID
|
||||
s_vCheckKeyTableValid (PVOID pDeviceHandler, PSKeyManagement pTable)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
int i;
|
||||
WORD wLength = 0;
|
||||
BYTE pbyData[MAX_KEY_TABLE];
|
||||
|
||||
for (i=0;i<MAX_KEY_TABLE;i++) {
|
||||
if ((pTable->KeyTable[i].bInUse == TRUE) &&
|
||||
(pTable->KeyTable[i].PairwiseKey.bKeyValid == FALSE) &&
|
||||
(pTable->KeyTable[i].GroupKey[0].bKeyValid == FALSE) &&
|
||||
(pTable->KeyTable[i].GroupKey[1].bKeyValid == FALSE) &&
|
||||
(pTable->KeyTable[i].GroupKey[2].bKeyValid == FALSE) &&
|
||||
(pTable->KeyTable[i].GroupKey[3].bKeyValid == FALSE)
|
||||
) {
|
||||
|
||||
pTable->KeyTable[i].bInUse = FALSE;
|
||||
pTable->KeyTable[i].wKeyCtl = 0;
|
||||
pTable->KeyTable[i].bSoftWEP = FALSE;
|
||||
pbyData[wLength++] = (BYTE) i;
|
||||
//MACvDisableKeyEntry(pDevice, i);
|
||||
}
|
||||
}
|
||||
if ( wLength != 0 ) {
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_CLRKEYENTRY,
|
||||
0,
|
||||
0,
|
||||
wLength,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
/*
|
||||
* Description: Init Key management table
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
VOID KeyvInitTable(PVOID pDeviceHandler, PSKeyManagement pTable)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
int i;
|
||||
int jj;
|
||||
BYTE pbyData[MAX_KEY_TABLE+1];
|
||||
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
for (i=0;i<MAX_KEY_TABLE;i++) {
|
||||
pTable->KeyTable[i].bInUse = FALSE;
|
||||
pTable->KeyTable[i].PairwiseKey.bKeyValid = FALSE;
|
||||
pTable->KeyTable[i].PairwiseKey.pvKeyTable = (PVOID)&pTable->KeyTable[i];
|
||||
for (jj=0; jj < MAX_GROUP_KEY; jj++) {
|
||||
pTable->KeyTable[i].GroupKey[jj].bKeyValid = FALSE;
|
||||
pTable->KeyTable[i].GroupKey[jj].pvKeyTable = (PVOID) &(pTable->KeyTable[i]);
|
||||
}
|
||||
pTable->KeyTable[i].wKeyCtl = 0;
|
||||
pTable->KeyTable[i].dwGTKeyIndex = 0;
|
||||
pTable->KeyTable[i].bSoftWEP = FALSE;
|
||||
pbyData[i] = (BYTE) i;
|
||||
}
|
||||
pbyData[i] = (BYTE) i;
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_CLRKEYENTRY,
|
||||
0,
|
||||
0,
|
||||
11,
|
||||
pbyData
|
||||
);
|
||||
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Get Key from table
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* pbyBSSID - BSSID of Key
|
||||
* dwKeyIndex - Key Index (0xFFFFFFFF means pairwise key)
|
||||
* Out:
|
||||
* pKey - Key return
|
||||
*
|
||||
* Return Value: TRUE if found otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL KeybGetKey (
|
||||
IN PSKeyManagement pTable,
|
||||
IN PBYTE pbyBSSID,
|
||||
IN DWORD dwKeyIndex,
|
||||
OUT PSKeyItem *pKey
|
||||
)
|
||||
{
|
||||
int i;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybGetKey() \n");
|
||||
|
||||
*pKey = NULL;
|
||||
for (i=0;i<MAX_KEY_TABLE;i++) {
|
||||
if ((pTable->KeyTable[i].bInUse == TRUE) &&
|
||||
IS_ETH_ADDRESS_EQUAL(pTable->KeyTable[i].abyBSSID,pbyBSSID)) {
|
||||
if (dwKeyIndex == 0xFFFFFFFF) {
|
||||
if (pTable->KeyTable[i].PairwiseKey.bKeyValid == TRUE) {
|
||||
*pKey = &(pTable->KeyTable[i].PairwiseKey);
|
||||
return (TRUE);
|
||||
}
|
||||
else {
|
||||
return (FALSE);
|
||||
}
|
||||
} else if (dwKeyIndex < MAX_GROUP_KEY) {
|
||||
if (pTable->KeyTable[i].GroupKey[dwKeyIndex].bKeyValid == TRUE) {
|
||||
*pKey = &(pTable->KeyTable[i].GroupKey[dwKeyIndex]);
|
||||
return (TRUE);
|
||||
}
|
||||
else {
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Set Key to table
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* pbyBSSID - BSSID of Key
|
||||
* dwKeyIndex - Key index (reference to NDIS DDK)
|
||||
* uKeyLength - Key length
|
||||
* KeyRSC - Key RSC
|
||||
* pbyKey - Pointer to key
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if success otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL KeybSetKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
PBYTE pbyBSSID,
|
||||
DWORD dwKeyIndex,
|
||||
ULONG uKeyLength,
|
||||
PQWORD pKeyRSC,
|
||||
PBYTE pbyKey,
|
||||
BYTE byKeyDecMode
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
int i,j;
|
||||
UINT ii;
|
||||
PSKeyItem pKey;
|
||||
UINT uKeyIdx;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetKey: %lX\n", dwKeyIndex);
|
||||
|
||||
j = (MAX_KEY_TABLE-1);
|
||||
for (i=0;i<(MAX_KEY_TABLE-1);i++) {
|
||||
if ((pTable->KeyTable[i].bInUse == FALSE) &&
|
||||
(j == (MAX_KEY_TABLE-1))) {
|
||||
// found empty table
|
||||
j = i;
|
||||
}
|
||||
if ((pTable->KeyTable[i].bInUse == TRUE) &&
|
||||
IS_ETH_ADDRESS_EQUAL(pTable->KeyTable[i].abyBSSID,pbyBSSID)) {
|
||||
// found table already exist
|
||||
if ((dwKeyIndex & PAIRWISE_KEY) != 0) {
|
||||
// Pairwise key
|
||||
pKey = &(pTable->KeyTable[i].PairwiseKey);
|
||||
pTable->KeyTable[i].wKeyCtl &= 0xFFF0; // clear pairwise key control filed
|
||||
pTable->KeyTable[i].wKeyCtl |= byKeyDecMode;
|
||||
uKeyIdx = 4; // use HW key entry 4 for pairwise key
|
||||
} else {
|
||||
// Group key
|
||||
if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY)
|
||||
return (FALSE);
|
||||
pKey = &(pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF]);
|
||||
if ((dwKeyIndex & TRANSMIT_KEY) != 0) {
|
||||
// Group transmit key
|
||||
pTable->KeyTable[i].dwGTKeyIndex = dwKeyIndex;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[i].dwGTKeyIndex, i);
|
||||
}
|
||||
pTable->KeyTable[i].wKeyCtl &= 0xFF0F; // clear group key control filed
|
||||
pTable->KeyTable[i].wKeyCtl |= (byKeyDecMode << 4);
|
||||
pTable->KeyTable[i].wKeyCtl |= 0x0040; // use group key for group address
|
||||
uKeyIdx = (dwKeyIndex & 0x000000FF);
|
||||
}
|
||||
pTable->KeyTable[i].wKeyCtl |= 0x8000; // enable on-fly
|
||||
|
||||
pKey->bKeyValid = TRUE;
|
||||
pKey->uKeyLength = uKeyLength;
|
||||
pKey->dwKeyIndex = dwKeyIndex;
|
||||
pKey->byCipherSuite = byKeyDecMode;
|
||||
MEMvCopy(pKey->abyKey, pbyKey, uKeyLength);
|
||||
if (byKeyDecMode == KEY_CTL_WEP) {
|
||||
if (uKeyLength == WLAN_WEP40_KEYLEN)
|
||||
pKey->abyKey[15] &= 0x7F;
|
||||
if (uKeyLength == WLAN_WEP104_KEYLEN)
|
||||
pKey->abyKey[15] |= 0x80;
|
||||
}
|
||||
MACvSetKeyEntry(pDevice, pTable->KeyTable[i].wKeyCtl, i, uKeyIdx, pbyBSSID, (PDWORD)pKey->abyKey);
|
||||
|
||||
if ((dwKeyIndex & USE_KEYRSC) == 0) {
|
||||
// RSC set by NIC
|
||||
ZERO_MEMORY(&(pKey->KeyRSC), sizeof(QWORD));
|
||||
}
|
||||
else {
|
||||
MEMvCopy(&(pKey->KeyRSC), pKeyRSC, sizeof(QWORD));
|
||||
}
|
||||
pKey->dwTSC47_16 = 0;
|
||||
pKey->wTSC15_0 = 0;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(R): \n");
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n ", pKey->bKeyValid);
|
||||
//DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n ", pKey->uKeyLength);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: ");
|
||||
for (ii = 0; ii < pKey->uKeyLength; ii++) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", pKey->abyKey[ii]);
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n ", pKey->dwTSC47_16);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", pKey->wTSC15_0);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n ", pKey->dwKeyIndex);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
}
|
||||
if (j < (MAX_KEY_TABLE-1)) {
|
||||
MEMvCopy(pTable->KeyTable[j].abyBSSID,pbyBSSID,U_ETHER_ADDR_LEN);
|
||||
pTable->KeyTable[j].bInUse = TRUE;
|
||||
if ((dwKeyIndex & PAIRWISE_KEY) != 0) {
|
||||
// Pairwise key
|
||||
pKey = &(pTable->KeyTable[j].PairwiseKey);
|
||||
pTable->KeyTable[j].wKeyCtl &= 0xFFF0; // clear pairwise key control filed
|
||||
pTable->KeyTable[j].wKeyCtl |= byKeyDecMode;
|
||||
uKeyIdx = 4; // use HW key entry 4 for pairwise key
|
||||
} else {
|
||||
// Group key
|
||||
if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY)
|
||||
return (FALSE);
|
||||
pKey = &(pTable->KeyTable[j].GroupKey[dwKeyIndex & 0x000000FF]);
|
||||
if ((dwKeyIndex & TRANSMIT_KEY) != 0) {
|
||||
// Group transmit key
|
||||
pTable->KeyTable[j].dwGTKeyIndex = dwKeyIndex;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(N)[%lX]: %d\n", pTable->KeyTable[j].dwGTKeyIndex, j);
|
||||
}
|
||||
pTable->KeyTable[j].wKeyCtl &= 0xFF0F; // clear group key control filed
|
||||
pTable->KeyTable[j].wKeyCtl |= (byKeyDecMode << 4);
|
||||
pTable->KeyTable[j].wKeyCtl |= 0x0040; // use group key for group address
|
||||
uKeyIdx = (dwKeyIndex & 0x000000FF);
|
||||
}
|
||||
pTable->KeyTable[j].wKeyCtl |= 0x8000; // enable on-fly
|
||||
|
||||
pKey->bKeyValid = TRUE;
|
||||
pKey->uKeyLength = uKeyLength;
|
||||
pKey->dwKeyIndex = dwKeyIndex;
|
||||
pKey->byCipherSuite = byKeyDecMode;
|
||||
MEMvCopy(pKey->abyKey, pbyKey, uKeyLength);
|
||||
if (byKeyDecMode == KEY_CTL_WEP) {
|
||||
if (uKeyLength == WLAN_WEP40_KEYLEN)
|
||||
pKey->abyKey[15] &= 0x7F;
|
||||
if (uKeyLength == WLAN_WEP104_KEYLEN)
|
||||
pKey->abyKey[15] |= 0x80;
|
||||
}
|
||||
MACvSetKeyEntry(pDevice, pTable->KeyTable[j].wKeyCtl, j, uKeyIdx, pbyBSSID, (PDWORD)pKey->abyKey);
|
||||
|
||||
if ((dwKeyIndex & USE_KEYRSC) == 0) {
|
||||
// RSC set by NIC
|
||||
ZERO_MEMORY(&(pKey->KeyRSC), sizeof(QWORD));
|
||||
}
|
||||
else {
|
||||
MEMvCopy(&(pKey->KeyRSC), pKeyRSC, sizeof(QWORD));
|
||||
}
|
||||
pKey->dwTSC47_16 = 0;
|
||||
pKey->wTSC15_0 = 0;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(N): \n");
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n ", pKey->bKeyValid);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n ", (int)pKey->uKeyLength);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: ");
|
||||
for (ii = 0; ii < pKey->uKeyLength; ii++) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", pKey->abyKey[ii]);
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n ", pKey->dwTSC47_16);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", pKey->wTSC15_0);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n ", pKey->dwKeyIndex);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Remove Key from table
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* pbyBSSID - BSSID of Key
|
||||
* dwKeyIndex - Key Index (reference to NDIS DDK)
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if success otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL KeybRemoveKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
PBYTE pbyBSSID,
|
||||
DWORD dwKeyIndex
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
int i;
|
||||
BOOL bReturnValue = FALSE;
|
||||
|
||||
if (IS_BROADCAST_ADDRESS(pbyBSSID)) {
|
||||
// dealte all key
|
||||
if ((dwKeyIndex & PAIRWISE_KEY) != 0) {
|
||||
for (i=0;i<MAX_KEY_TABLE;i++) {
|
||||
pTable->KeyTable[i].PairwiseKey.bKeyValid = FALSE;
|
||||
}
|
||||
bReturnValue = TRUE;
|
||||
}
|
||||
else if ((dwKeyIndex & 0x000000FF) < MAX_GROUP_KEY) {
|
||||
for (i=0;i<MAX_KEY_TABLE;i++) {
|
||||
pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF].bKeyValid = FALSE;
|
||||
if ((dwKeyIndex & 0x7FFFFFFF) == (pTable->KeyTable[i].dwGTKeyIndex & 0x7FFFFFFF)) {
|
||||
// remove Group transmit key
|
||||
pTable->KeyTable[i].dwGTKeyIndex = 0;
|
||||
}
|
||||
}
|
||||
bReturnValue = TRUE;
|
||||
}
|
||||
else {
|
||||
bReturnValue = FALSE;
|
||||
}
|
||||
|
||||
} else {
|
||||
for (i=0;i<MAX_KEY_TABLE;i++) {
|
||||
if ( (pTable->KeyTable[i].bInUse == TRUE) &&
|
||||
IS_ETH_ADDRESS_EQUAL(pTable->KeyTable[i].abyBSSID,pbyBSSID)) {
|
||||
|
||||
if ((dwKeyIndex & PAIRWISE_KEY) != 0) {
|
||||
pTable->KeyTable[i].PairwiseKey.bKeyValid = FALSE;
|
||||
bReturnValue = TRUE;
|
||||
break;
|
||||
}
|
||||
else if ((dwKeyIndex & 0x000000FF) < MAX_GROUP_KEY) {
|
||||
pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF].bKeyValid = FALSE;
|
||||
if ((dwKeyIndex & 0x7FFFFFFF) == (pTable->KeyTable[i].dwGTKeyIndex & 0x7FFFFFFF)) {
|
||||
// remove Group transmit key
|
||||
pTable->KeyTable[i].dwGTKeyIndex = 0;
|
||||
}
|
||||
bReturnValue = TRUE;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
bReturnValue = FALSE;
|
||||
break;
|
||||
}
|
||||
} //pTable->KeyTable[i].bInUse == TRUE
|
||||
} //for
|
||||
bReturnValue = TRUE;
|
||||
}
|
||||
|
||||
s_vCheckKeyTableValid(pDevice,pTable);
|
||||
return bReturnValue;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Remove Key from table
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* pbyBSSID - BSSID of Key
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if success otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL KeybRemoveAllKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
PBYTE pbyBSSID
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
int i,u;
|
||||
|
||||
for (i=0;i<MAX_KEY_TABLE;i++) {
|
||||
if ((pTable->KeyTable[i].bInUse == TRUE) &&
|
||||
IS_ETH_ADDRESS_EQUAL(pTable->KeyTable[i].abyBSSID,pbyBSSID)) {
|
||||
pTable->KeyTable[i].PairwiseKey.bKeyValid = FALSE;
|
||||
for(u=0;u<MAX_GROUP_KEY;u++) {
|
||||
pTable->KeyTable[i].GroupKey[u].bKeyValid = FALSE;
|
||||
}
|
||||
pTable->KeyTable[i].dwGTKeyIndex = 0;
|
||||
s_vCheckKeyTableValid(pDevice, pTable);
|
||||
return (TRUE);
|
||||
}
|
||||
}
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Description: Remove WEP Key from table
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if success otherwise FALSE
|
||||
*
|
||||
*/
|
||||
VOID KeyvRemoveWEPKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
DWORD dwKeyIndex
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
|
||||
if ((dwKeyIndex & 0x000000FF) < MAX_GROUP_KEY) {
|
||||
if (pTable->KeyTable[MAX_KEY_TABLE-1].bInUse == TRUE) {
|
||||
if (pTable->KeyTable[MAX_KEY_TABLE-1].GroupKey[dwKeyIndex & 0x000000FF].byCipherSuite == KEY_CTL_WEP) {
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].GroupKey[dwKeyIndex & 0x000000FF].bKeyValid = FALSE;
|
||||
if ((dwKeyIndex & 0x7FFFFFFF) == (pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex & 0x7FFFFFFF)) {
|
||||
// remove Group transmit key
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
s_vCheckKeyTableValid(pDevice, pTable);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
VOID KeyvRemoveAllWEPKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
|
||||
int i;
|
||||
|
||||
for(i=0;i<MAX_GROUP_KEY;i++) {
|
||||
KeyvRemoveWEPKey(pDevice,pTable, i);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Description: Get Transmit Key from table
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* pbyBSSID - BSSID of Key
|
||||
* Out:
|
||||
* pKey - Key return
|
||||
*
|
||||
* Return Value: TRUE if found otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL KeybGetTransmitKey (
|
||||
IN PSKeyManagement pTable,
|
||||
IN PBYTE pbyBSSID,
|
||||
IN DWORD dwKeyType,
|
||||
OUT PSKeyItem *pKey
|
||||
)
|
||||
{
|
||||
int i, ii;
|
||||
|
||||
*pKey = NULL;
|
||||
for (i=0;i<MAX_KEY_TABLE;i++) {
|
||||
if ((pTable->KeyTable[i].bInUse == TRUE) &&
|
||||
IS_ETH_ADDRESS_EQUAL(pTable->KeyTable[i].abyBSSID,pbyBSSID)) {
|
||||
|
||||
if (dwKeyType == PAIRWISE_KEY) {
|
||||
|
||||
if (pTable->KeyTable[i].PairwiseKey.bKeyValid == TRUE) {
|
||||
*pKey = &(pTable->KeyTable[i].PairwiseKey);
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybGetTransmitKey:");
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"PAIRWISE_KEY: KeyTable.abyBSSID: ");
|
||||
for (ii = 0; ii < 6; ii++) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%x ", pTable->KeyTable[i].abyBSSID[ii]);
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
|
||||
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
else {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"PairwiseKey.bKeyValid == FALSE\n");
|
||||
return (FALSE);
|
||||
}
|
||||
} // End of Type == PAIRWISE
|
||||
else {
|
||||
if (pTable->KeyTable[i].dwGTKeyIndex == 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ERROR: dwGTKeyIndex == 0 !!!\n");
|
||||
return FALSE;
|
||||
}
|
||||
if (pTable->KeyTable[i].GroupKey[(pTable->KeyTable[i].dwGTKeyIndex&0x000000FF)].bKeyValid == TRUE) {
|
||||
*pKey = &(pTable->KeyTable[i].GroupKey[(pTable->KeyTable[i].dwGTKeyIndex&0x000000FF)]);
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybGetTransmitKey:");
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GROUP_KEY: KeyTable.abyBSSID\n");
|
||||
for (ii = 0; ii < 6; ii++) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%x ", pTable->KeyTable[i].abyBSSID[ii]);
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"dwGTKeyIndex: %lX\n", pTable->KeyTable[i].dwGTKeyIndex);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
else {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GroupKey.bKeyValid == FALSE\n");
|
||||
return (FALSE);
|
||||
}
|
||||
} // End of Type = GROUP
|
||||
} // BSSID match
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ERROR: NO Match BSSID !!! ");
|
||||
for (ii = 0; ii < 6; ii++) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *(pbyBSSID+ii));
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Check Pairewise Key
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if found otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL KeybCheckPairewiseKey (
|
||||
IN PSKeyManagement pTable,
|
||||
OUT PSKeyItem *pKey
|
||||
)
|
||||
{
|
||||
int i;
|
||||
|
||||
*pKey = NULL;
|
||||
for (i=0;i<MAX_KEY_TABLE;i++) {
|
||||
if ((pTable->KeyTable[i].bInUse == TRUE) &&
|
||||
(pTable->KeyTable[i].PairwiseKey.bKeyValid == TRUE)) {
|
||||
*pKey = &(pTable->KeyTable[i].PairwiseKey);
|
||||
return (TRUE);
|
||||
}
|
||||
}
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Description: Set Key to table
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* dwKeyIndex - Key index (reference to NDIS DDK)
|
||||
* uKeyLength - Key length
|
||||
* KeyRSC - Key RSC
|
||||
* pbyKey - Pointer to key
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if success otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL KeybSetDefaultKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
DWORD dwKeyIndex,
|
||||
ULONG uKeyLength,
|
||||
PQWORD pKeyRSC,
|
||||
PBYTE pbyKey,
|
||||
BYTE byKeyDecMode
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
UINT ii;
|
||||
PSKeyItem pKey;
|
||||
UINT uKeyIdx;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetDefaultKey: %1x, %d \n", (int)dwKeyIndex, (int)uKeyLength);
|
||||
|
||||
|
||||
if ((dwKeyIndex & PAIRWISE_KEY) != 0) { // Pairwise key
|
||||
return (FALSE);
|
||||
} else if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].bInUse = TRUE;
|
||||
for(ii=0;ii<U_ETHER_ADDR_LEN;ii++)
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].abyBSSID[ii] = 0xFF;
|
||||
|
||||
// Group key
|
||||
pKey = &(pTable->KeyTable[MAX_KEY_TABLE-1].GroupKey[dwKeyIndex & 0x000000FF]);
|
||||
if ((dwKeyIndex & TRANSMIT_KEY) != 0) {
|
||||
// Group transmit key
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex = dwKeyIndex;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex, MAX_KEY_TABLE-1);
|
||||
|
||||
}
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl &= 0x7F00; // clear all key control filed
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= (byKeyDecMode << 4);
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= (byKeyDecMode);
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= 0x0044; // use group key for all address
|
||||
uKeyIdx = (dwKeyIndex & 0x000000FF);
|
||||
|
||||
if ((uKeyLength == WLAN_WEP232_KEYLEN) &&
|
||||
(byKeyDecMode == KEY_CTL_WEP)) {
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= 0x4000; // disable on-fly disable address match
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].bSoftWEP = TRUE;
|
||||
} else {
|
||||
if (pTable->KeyTable[MAX_KEY_TABLE-1].bSoftWEP == FALSE)
|
||||
pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= 0xC000; // enable on-fly disable address match
|
||||
}
|
||||
|
||||
pKey->bKeyValid = TRUE;
|
||||
pKey->uKeyLength = uKeyLength;
|
||||
pKey->dwKeyIndex = dwKeyIndex;
|
||||
pKey->byCipherSuite = byKeyDecMode;
|
||||
MEMvCopy(pKey->abyKey, pbyKey, uKeyLength);
|
||||
if (byKeyDecMode == KEY_CTL_WEP) {
|
||||
if (uKeyLength == WLAN_WEP40_KEYLEN)
|
||||
pKey->abyKey[15] &= 0x7F;
|
||||
if (uKeyLength == WLAN_WEP104_KEYLEN)
|
||||
pKey->abyKey[15] |= 0x80;
|
||||
}
|
||||
|
||||
MACvSetKeyEntry(pDevice, pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl, MAX_KEY_TABLE-1, uKeyIdx, pTable->KeyTable[MAX_KEY_TABLE-1].abyBSSID, (PDWORD) pKey->abyKey);
|
||||
|
||||
if ((dwKeyIndex & USE_KEYRSC) == 0) {
|
||||
// RSC set by NIC
|
||||
ZERO_MEMORY(&(pKey->KeyRSC), sizeof(QWORD));
|
||||
} else {
|
||||
MEMvCopy(&(pKey->KeyRSC), pKeyRSC, sizeof(QWORD));
|
||||
}
|
||||
pKey->dwTSC47_16 = 0;
|
||||
pKey->wTSC15_0 = 0;
|
||||
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(R): \n");
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n", pKey->bKeyValid);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n", (int)pKey->uKeyLength);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: \n");
|
||||
for (ii = 0; ii < pKey->uKeyLength; ii++) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%x", pKey->abyKey[ii]);
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n", pKey->dwTSC47_16);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n", pKey->wTSC15_0);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n", pKey->dwKeyIndex);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Set Key to table
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pTable - Pointer to Key table
|
||||
* dwKeyIndex - Key index (reference to NDIS DDK)
|
||||
* uKeyLength - Key length
|
||||
* KeyRSC - Key RSC
|
||||
* pbyKey - Pointer to key
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if success otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL KeybSetAllGroupKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
DWORD dwKeyIndex,
|
||||
ULONG uKeyLength,
|
||||
PQWORD pKeyRSC,
|
||||
PBYTE pbyKey,
|
||||
BYTE byKeyDecMode
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice) pDeviceHandler;
|
||||
int i;
|
||||
UINT ii;
|
||||
PSKeyItem pKey;
|
||||
UINT uKeyIdx;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetAllGroupKey: %lX\n", dwKeyIndex);
|
||||
|
||||
|
||||
if ((dwKeyIndex & PAIRWISE_KEY) != 0) { // Pairwise key
|
||||
return (FALSE);
|
||||
} else if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
for (i=0; i < MAX_KEY_TABLE-1; i++) {
|
||||
if (pTable->KeyTable[i].bInUse == TRUE) {
|
||||
// found table already exist
|
||||
// Group key
|
||||
pKey = &(pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF]);
|
||||
if ((dwKeyIndex & TRANSMIT_KEY) != 0) {
|
||||
// Group transmit key
|
||||
pTable->KeyTable[i].dwGTKeyIndex = dwKeyIndex;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[i].dwGTKeyIndex, i);
|
||||
|
||||
}
|
||||
pTable->KeyTable[i].wKeyCtl &= 0xFF0F; // clear group key control filed
|
||||
pTable->KeyTable[i].wKeyCtl |= (byKeyDecMode << 4);
|
||||
pTable->KeyTable[i].wKeyCtl |= 0x0040; // use group key for group address
|
||||
uKeyIdx = (dwKeyIndex & 0x000000FF);
|
||||
|
||||
pTable->KeyTable[i].wKeyCtl |= 0x8000; // enable on-fly
|
||||
|
||||
pKey->bKeyValid = TRUE;
|
||||
pKey->uKeyLength = uKeyLength;
|
||||
pKey->dwKeyIndex = dwKeyIndex;
|
||||
pKey->byCipherSuite = byKeyDecMode;
|
||||
MEMvCopy(pKey->abyKey, pbyKey, uKeyLength);
|
||||
if (byKeyDecMode == KEY_CTL_WEP) {
|
||||
if (uKeyLength == WLAN_WEP40_KEYLEN)
|
||||
pKey->abyKey[15] &= 0x7F;
|
||||
if (uKeyLength == WLAN_WEP104_KEYLEN)
|
||||
pKey->abyKey[15] |= 0x80;
|
||||
}
|
||||
|
||||
MACvSetKeyEntry(pDevice, pTable->KeyTable[i].wKeyCtl, i, uKeyIdx, pTable->KeyTable[i].abyBSSID, (PDWORD) pKey->abyKey);
|
||||
|
||||
if ((dwKeyIndex & USE_KEYRSC) == 0) {
|
||||
// RSC set by NIC
|
||||
ZERO_MEMORY(&(pKey->KeyRSC), sizeof(QWORD));
|
||||
}
|
||||
else {
|
||||
MEMvCopy(&(pKey->KeyRSC), pKeyRSC, sizeof(QWORD));
|
||||
}
|
||||
pKey->dwTSC47_16 = 0;
|
||||
pKey->wTSC15_0 = 0;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(R): \n");
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n ", pKey->bKeyValid);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n ", (int)pKey->uKeyLength);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: ");
|
||||
for (ii = 0; ii < pKey->uKeyLength; ii++) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", pKey->abyKey[ii]);
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n");
|
||||
|
||||
//DBG_PRN_GRP12(("pKey->dwTSC47_16: %lX\n ", pKey->dwTSC47_16));
|
||||
//DBG_PRN_GRP12(("pKey->wTSC15_0: %X\n ", pKey->wTSC15_0));
|
||||
//DBG_PRN_GRP12(("pKey->dwKeyIndex: %lX\n ", pKey->dwKeyIndex));
|
||||
|
||||
} // (pTable->KeyTable[i].bInUse == TRUE)
|
||||
}
|
||||
return (TRUE);
|
||||
}
|
|
@ -0,0 +1,196 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: key.h
|
||||
*
|
||||
* Purpose: Implement functions for 802.11i Key management
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: May 29, 2003
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __KEY_H__
|
||||
#define __KEY_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
|
||||
#if !defined(__80211MGR_H__)
|
||||
#include "80211mgr.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
#define MAX_GROUP_KEY 4
|
||||
#define MAX_KEY_TABLE 11
|
||||
#define MAX_KEY_LEN 32
|
||||
#define AES_KEY_LEN 16
|
||||
|
||||
|
||||
#define AUTHENTICATOR_KEY 0x10000000
|
||||
#define USE_KEYRSC 0x20000000
|
||||
#define PAIRWISE_KEY 0x40000000
|
||||
#define TRANSMIT_KEY 0x80000000
|
||||
|
||||
#define GROUP_KEY 0x00000000
|
||||
|
||||
#define KEY_CTL_WEP 0x00
|
||||
#define KEY_CTL_NONE 0x01
|
||||
#define KEY_CTL_TKIP 0x02
|
||||
#define KEY_CTL_CCMP 0x03
|
||||
#define KEY_CTL_INVALID 0xFF
|
||||
|
||||
|
||||
typedef struct tagSKeyItem
|
||||
{
|
||||
BOOL bKeyValid;
|
||||
ULONG uKeyLength;
|
||||
BYTE abyKey[MAX_KEY_LEN];
|
||||
QWORD KeyRSC;
|
||||
DWORD dwTSC47_16;
|
||||
WORD wTSC15_0;
|
||||
BYTE byCipherSuite;
|
||||
BYTE byReserved0;
|
||||
DWORD dwKeyIndex;
|
||||
PVOID pvKeyTable;
|
||||
} SKeyItem, DEF* PSKeyItem; //64
|
||||
|
||||
typedef struct tagSKeyTable
|
||||
{
|
||||
BYTE abyBSSID[U_ETHER_ADDR_LEN]; //6
|
||||
BYTE byReserved0[2]; //8
|
||||
SKeyItem PairwiseKey;
|
||||
SKeyItem GroupKey[MAX_GROUP_KEY]; //64*5 = 320, 320+8=328
|
||||
DWORD dwGTKeyIndex; // GroupTransmitKey Index
|
||||
BOOL bInUse;
|
||||
WORD wKeyCtl;
|
||||
BOOL bSoftWEP;
|
||||
BYTE byReserved1[6];
|
||||
} SKeyTable, DEF* PSKeyTable; //352
|
||||
|
||||
typedef struct tagSKeyManagement
|
||||
{
|
||||
SKeyTable KeyTable[MAX_KEY_TABLE];
|
||||
} SKeyManagement, DEF* PSKeyManagement;
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
VOID KeyvInitTable(PVOID pDeviceHandler, PSKeyManagement pTable);
|
||||
|
||||
BOOL KeybGetKey(
|
||||
IN PSKeyManagement pTable,
|
||||
IN PBYTE pbyBSSID,
|
||||
IN DWORD dwKeyIndex,
|
||||
OUT PSKeyItem *pKey
|
||||
);
|
||||
|
||||
BOOL KeybSetKey(
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
PBYTE pbyBSSID,
|
||||
DWORD dwKeyIndex,
|
||||
ULONG uKeyLength,
|
||||
PQWORD pKeyRSC,
|
||||
PBYTE pbyKey,
|
||||
BYTE byKeyDecMode
|
||||
);
|
||||
|
||||
BOOL KeybRemoveKey(
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
PBYTE pbyBSSID,
|
||||
DWORD dwKeyIndex
|
||||
);
|
||||
|
||||
BOOL KeybRemoveAllKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
PBYTE pbyBSSID
|
||||
);
|
||||
|
||||
VOID KeyvRemoveWEPKey(
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
DWORD dwKeyIndex
|
||||
);
|
||||
|
||||
VOID KeyvRemoveAllWEPKey(
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable
|
||||
);
|
||||
|
||||
BOOL KeybGetTransmitKey(
|
||||
IN PSKeyManagement pTable,
|
||||
IN PBYTE pbyBSSID,
|
||||
IN DWORD dwKeyType,
|
||||
OUT PSKeyItem *pKey
|
||||
);
|
||||
|
||||
BOOL KeybCheckPairewiseKey(
|
||||
IN PSKeyManagement pTable,
|
||||
OUT PSKeyItem *pKey
|
||||
);
|
||||
|
||||
BOOL KeybSetDefaultKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
DWORD dwKeyIndex,
|
||||
ULONG uKeyLength,
|
||||
PQWORD pKeyRSC,
|
||||
PBYTE pbyKey,
|
||||
BYTE byKeyDecMode
|
||||
);
|
||||
|
||||
BOOL KeybSetAllGroupKey (
|
||||
PVOID pDeviceHandler,
|
||||
PSKeyManagement pTable,
|
||||
DWORD dwKeyIndex,
|
||||
ULONG uKeyLength,
|
||||
PQWORD pKeyRSC,
|
||||
PBYTE pbyKey,
|
||||
BYTE byKeyDecMode
|
||||
);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif // __KEY_H__
|
||||
|
|
@ -0,0 +1,500 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: mac.c
|
||||
*
|
||||
* Purpose: MAC routines
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
* Functions:
|
||||
*
|
||||
* Revision History:
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
#if !defined(__DESC_H__)
|
||||
#include "desc.h"
|
||||
#endif
|
||||
#if !defined(__MAC_H__)
|
||||
#include "mac.h"
|
||||
#endif
|
||||
#if !defined(__80211hdr_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
#if !defined(__RNDIS_H__)
|
||||
#include "rndis.h"
|
||||
#endif
|
||||
#if !defined(__CONTROL_H__)
|
||||
#include "control.h"
|
||||
#endif
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Set this hash index into multicast address register bit
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* byHashIdx - Hash index to set
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx)
|
||||
{
|
||||
UINT uByteIdx;
|
||||
BYTE byBitMask;
|
||||
BYTE pbyData[2];
|
||||
|
||||
|
||||
// calculate byte position
|
||||
uByteIdx = byHashIdx / 8;
|
||||
|
||||
// calculate bit position
|
||||
byBitMask = 1;
|
||||
byBitMask <<= (byHashIdx % 8);
|
||||
// turn on the bit
|
||||
|
||||
pbyData[0] = byBitMask;
|
||||
pbyData[1] = byBitMask;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MASK,
|
||||
(WORD) (MAC_REG_MAR0 + uByteIdx),
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Write MAC Multicast Address Mask
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* uByteidx - Index of Mask
|
||||
* byData - Mask Value to write
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
VOID MACvWriteMultiAddr (PSDevice pDevice, UINT uByteIdx, BYTE byData)
|
||||
{
|
||||
BYTE byData1;
|
||||
|
||||
byData1 = byData;
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE,
|
||||
(WORD) (MAC_REG_MAR0 + uByteIdx),
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
1,
|
||||
&byData1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Shut Down MAC
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if success; otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL MACbShutdown (PSDevice pDevice)
|
||||
{
|
||||
CONTROLnsRequestOutAsyn(pDevice,
|
||||
MESSAGE_TYPE_MACSHUTDOWN,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
NULL
|
||||
);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void MACvSetBBType(PSDevice pDevice,BYTE byType)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
|
||||
pbyData[0] = byType;
|
||||
pbyData[1] = EnCFG_BBType_MASK;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MASK,
|
||||
MAC_REG_ENCFG0,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData)
|
||||
{
|
||||
BYTE pbyData[4];
|
||||
|
||||
if (wOffset > 273)
|
||||
return;
|
||||
pbyData[0] = (BYTE)dwData;
|
||||
pbyData[1] = (BYTE)(dwData>>8);
|
||||
pbyData[2] = (BYTE)(dwData>>16);
|
||||
pbyData[3] = (BYTE)(dwData>>24);
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MISCFF,
|
||||
wOffset,
|
||||
0,
|
||||
4,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Disable the Key Entry by MISCFIFO
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* dwIoBase - Base Address for MAC
|
||||
*
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
void MACvDisableKeyEntry (PSDevice pDevice, UINT uEntryIdx)
|
||||
{
|
||||
WORD wOffset;
|
||||
BYTE byData;
|
||||
|
||||
|
||||
byData = (BYTE) uEntryIdx;
|
||||
|
||||
wOffset = MISCFIFO_KEYETRY0;
|
||||
wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
|
||||
|
||||
//VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
|
||||
//VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
|
||||
//VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
|
||||
|
||||
//issue write misc fifo command to device
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_CLRKEYENTRY,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
&byData
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Set the Key by MISCFIFO
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* dwIoBase - Base Address for MAC
|
||||
*
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
void MACvSetKeyEntry (PSDevice pDevice, WORD wKeyCtl, UINT uEntryIdx, UINT uKeyIdx, PBYTE pbyAddr, PDWORD pdwKey)
|
||||
{
|
||||
PBYTE pbyKey;
|
||||
WORD wOffset;
|
||||
DWORD dwData1,dwData2;
|
||||
int ii;
|
||||
BYTE pbyData[24];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if ( pDevice->byLocalID <= MAC_REVISION_A1 ) {
|
||||
if ( pDevice->sMgmtObj.byCSSPK == KEY_CTL_CCMP )
|
||||
return;
|
||||
}
|
||||
|
||||
wOffset = MISCFIFO_KEYETRY0;
|
||||
wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
|
||||
|
||||
dwData1 = 0;
|
||||
dwData1 |= wKeyCtl;
|
||||
dwData1 <<= 16;
|
||||
dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
|
||||
|
||||
//VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
|
||||
//VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
|
||||
//VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
|
||||
|
||||
//wOffset++;
|
||||
|
||||
dwData2 = 0;
|
||||
dwData2 |= *(pbyAddr+3);
|
||||
dwData2 <<= 8;
|
||||
dwData2 |= *(pbyAddr+2);
|
||||
dwData2 <<= 8;
|
||||
dwData2 |= *(pbyAddr+1);
|
||||
dwData2 <<= 8;
|
||||
dwData2 |= *(pbyAddr+0);
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2);
|
||||
|
||||
//VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
|
||||
//VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
|
||||
//VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
|
||||
|
||||
//wOffset++;
|
||||
|
||||
//wOffset += (uKeyIdx * 4);
|
||||
/* for (ii=0;ii<4;ii++) {
|
||||
// alway push 128 bits
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey);
|
||||
VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
|
||||
VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
|
||||
VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
|
||||
}
|
||||
*/
|
||||
pbyKey = (PBYTE)pdwKey;
|
||||
|
||||
pbyData[0] = (BYTE)dwData1;
|
||||
pbyData[1] = (BYTE)(dwData1>>8);
|
||||
pbyData[2] = (BYTE)(dwData1>>16);
|
||||
pbyData[3] = (BYTE)(dwData1>>24);
|
||||
pbyData[4] = (BYTE)dwData2;
|
||||
pbyData[5] = (BYTE)(dwData2>>8);
|
||||
pbyData[6] = (BYTE)(dwData2>>16);
|
||||
pbyData[7] = (BYTE)(dwData2>>24);
|
||||
for(ii=8;ii<24;ii++)
|
||||
pbyData[ii] = *pbyKey++;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_SETKEY,
|
||||
wOffset,
|
||||
(WORD)uKeyIdx,
|
||||
24,
|
||||
pbyData
|
||||
);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
pbyData[0] = 0;
|
||||
pbyData[1] = byBits;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MASK,
|
||||
byRegOfs,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
|
||||
pbyData[0] = byBits;
|
||||
pbyData[1] = byBits;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MASK,
|
||||
byRegOfs,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
|
||||
pbyData[0] = (BYTE)(wData & 0xff);
|
||||
pbyData[1] = (BYTE)(wData >> 8);
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE,
|
||||
byRegOfs,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr)
|
||||
{
|
||||
BYTE pbyData[6];
|
||||
|
||||
|
||||
pbyData[0] = *((PBYTE)pbyEtherAddr);
|
||||
pbyData[1] = *((PBYTE)pbyEtherAddr+1);
|
||||
pbyData[2] = *((PBYTE)pbyEtherAddr+2);
|
||||
pbyData[3] = *((PBYTE)pbyEtherAddr+3);
|
||||
pbyData[4] = *((PBYTE)pbyEtherAddr+4);
|
||||
pbyData[5] = *((PBYTE)pbyEtherAddr+5);
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE,
|
||||
MAC_REG_BSSID0,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
6,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
void MACvEnableProtectMD(PSDevice pDevice)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
|
||||
pbyData[0] = EnCFG_ProtectMd;
|
||||
pbyData[1] = EnCFG_ProtectMd;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MASK,
|
||||
MAC_REG_ENCFG0,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
void MACvDisableProtectMD(PSDevice pDevice)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
|
||||
pbyData[0] = 0;
|
||||
pbyData[1] = EnCFG_ProtectMd;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MASK,
|
||||
MAC_REG_ENCFG0,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
void MACvEnableBarkerPreambleMd(PSDevice pDevice)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
|
||||
pbyData[0] = EnCFG_BarkerPream;
|
||||
pbyData[1] = EnCFG_BarkerPream;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MASK,
|
||||
MAC_REG_ENCFG2,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
void MACvDisableBarkerPreambleMd(PSDevice pDevice)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
|
||||
pbyData[0] = 0;
|
||||
pbyData[1] = EnCFG_BarkerPream;
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE_MASK,
|
||||
MAC_REG_ENCFG2,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval)
|
||||
{
|
||||
BYTE pbyData[2];
|
||||
|
||||
pbyData[0] = (BYTE) (wInterval & 0xff);
|
||||
pbyData[1] = (BYTE) (wInterval >> 8);
|
||||
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_WRITE,
|
||||
MAC_REG_BI,
|
||||
MESSAGE_REQUEST_MACREG,
|
||||
2,
|
||||
pbyData
|
||||
);
|
||||
}
|
|
@ -0,0 +1,458 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: mac.h
|
||||
*
|
||||
* Purpose: MAC routines
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
* Revision History:
|
||||
* 07-01-2003 Bryan YC Fan: Re-write codes to support VT3253 spec.
|
||||
* 08-25-2003 Kyle Hsu: Porting MAC functions from sim53.
|
||||
* 09-03-2003 Bryan YC Fan: Add MACvDisableProtectMD & MACvEnableProtectMD
|
||||
*/
|
||||
|
||||
#ifndef __MAC_H__
|
||||
#define __MAC_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
#define REV_ID_VT3253_A0 0x00
|
||||
#define REV_ID_VT3253_A1 0x01
|
||||
#define REV_ID_VT3253_B0 0x08
|
||||
#define REV_ID_VT3253_B1 0x09
|
||||
|
||||
//
|
||||
// Registers in the MAC
|
||||
//
|
||||
#define MAC_REG_BISTCMD 0x04
|
||||
#define MAC_REG_BISTSR0 0x05
|
||||
#define MAC_REG_BISTSR1 0x06
|
||||
#define MAC_REG_BISTSR2 0x07
|
||||
#define MAC_REG_I2MCSR 0x08
|
||||
#define MAC_REG_I2MTGID 0x09
|
||||
#define MAC_REG_I2MTGAD 0x0A
|
||||
#define MAC_REG_I2MCFG 0x0B
|
||||
#define MAC_REG_I2MDIPT 0x0C
|
||||
#define MAC_REG_I2MDOPT 0x0E
|
||||
#define MAC_REG_USBSUS 0x0F
|
||||
|
||||
#define MAC_REG_LOCALID 0x14
|
||||
#define MAC_REG_TESTCFG 0x15
|
||||
#define MAC_REG_JUMPER0 0x16
|
||||
#define MAC_REG_JUMPER1 0x17
|
||||
#define MAC_REG_TMCTL 0x18
|
||||
#define MAC_REG_TMDATA0 0x1C
|
||||
#define MAC_REG_TMDATA1 0x1D
|
||||
#define MAC_REG_TMDATA2 0x1E
|
||||
#define MAC_REG_TMDATA3 0x1F
|
||||
|
||||
// MAC Parameter related
|
||||
#define MAC_REG_LRT 0x20 //
|
||||
#define MAC_REG_SRT 0x21 //
|
||||
#define MAC_REG_SIFS 0x22 //
|
||||
#define MAC_REG_DIFS 0x23 //
|
||||
#define MAC_REG_EIFS 0x24 //
|
||||
#define MAC_REG_SLOT 0x25 //
|
||||
#define MAC_REG_BI 0x26 //
|
||||
#define MAC_REG_CWMAXMIN0 0x28 //
|
||||
#define MAC_REG_LINKOFFTOTM 0x2A
|
||||
#define MAC_REG_SWTMOT 0x2B
|
||||
#define MAC_REG_RTSOKCNT 0x2C
|
||||
#define MAC_REG_RTSFAILCNT 0x2D
|
||||
#define MAC_REG_ACKFAILCNT 0x2E
|
||||
#define MAC_REG_FCSERRCNT 0x2F
|
||||
// TSF Related
|
||||
#define MAC_REG_TSFCNTR 0x30 //
|
||||
#define MAC_REG_NEXTTBTT 0x38 //
|
||||
#define MAC_REG_TSFOFST 0x40 //
|
||||
#define MAC_REG_TFTCTL 0x48 //
|
||||
// WMAC Control/Status Related
|
||||
#define MAC_REG_ENCFG0 0x4C //
|
||||
#define MAC_REG_ENCFG1 0x4D //
|
||||
#define MAC_REG_ENCFG2 0x4E //
|
||||
|
||||
#define MAC_REG_CFG 0x50 //
|
||||
#define MAC_REG_TEST 0x52 //
|
||||
#define MAC_REG_HOSTCR 0x54 //
|
||||
#define MAC_REG_MACCR 0x55 //
|
||||
#define MAC_REG_RCR 0x56 //
|
||||
#define MAC_REG_TCR 0x57 //
|
||||
#define MAC_REG_IMR 0x58 //
|
||||
#define MAC_REG_ISR 0x5C
|
||||
#define MAC_REG_ISR1 0x5D
|
||||
// Power Saving Related
|
||||
#define MAC_REG_PSCFG 0x60 //
|
||||
#define MAC_REG_PSCTL 0x61 //
|
||||
#define MAC_REG_PSPWRSIG 0x62 //
|
||||
#define MAC_REG_BBCR13 0x63
|
||||
#define MAC_REG_AIDATIM 0x64
|
||||
#define MAC_REG_PWBT 0x66
|
||||
#define MAC_REG_WAKEOKTMR 0x68
|
||||
#define MAC_REG_CALTMR 0x69
|
||||
#define MAC_REG_SYNSPACCNT 0x6A
|
||||
#define MAC_REG_WAKSYNOPT 0x6B
|
||||
// Baseband/IF Control Group
|
||||
#define MAC_REG_BBREGCTL 0x6C //
|
||||
#define MAC_REG_CHANNEL 0x6D
|
||||
#define MAC_REG_BBREGADR 0x6E
|
||||
#define MAC_REG_BBREGDATA 0x6F
|
||||
#define MAC_REG_IFREGCTL 0x70 //
|
||||
#define MAC_REG_IFDATA 0x71 //
|
||||
#define MAC_REG_ITRTMSET 0x74 //
|
||||
#define MAC_REG_PAPEDELAY 0x77
|
||||
#define MAC_REG_SOFTPWRCTL 0x78 //
|
||||
#define MAC_REG_SOFTPWRCTL2 0x79 //
|
||||
#define MAC_REG_GPIOCTL0 0x7A //
|
||||
#define MAC_REG_GPIOCTL1 0x7B //
|
||||
|
||||
// MiscFF PIO related
|
||||
#define MAC_REG_MISCFFNDEX 0xBC
|
||||
#define MAC_REG_MISCFFCTL 0xBE
|
||||
#define MAC_REG_MISCFFDATA 0xC0
|
||||
|
||||
// MAC Configuration Group
|
||||
#define MAC_REG_PAR0 0xC4
|
||||
#define MAC_REG_PAR4 0xC8
|
||||
#define MAC_REG_BSSID0 0xCC
|
||||
#define MAC_REG_BSSID4 0xD0
|
||||
#define MAC_REG_MAR0 0xD4
|
||||
#define MAC_REG_MAR4 0xD8
|
||||
// MAC RSPPKT INFO Group
|
||||
#define MAC_REG_RSPINF_B_1 0xDC
|
||||
#define MAC_REG_RSPINF_B_2 0xE0
|
||||
#define MAC_REG_RSPINF_B_5 0xE4
|
||||
#define MAC_REG_RSPINF_B_11 0xE8
|
||||
#define MAC_REG_RSPINF_A_6 0xEC
|
||||
#define MAC_REG_RSPINF_A_9 0xEE
|
||||
#define MAC_REG_RSPINF_A_12 0xF0
|
||||
#define MAC_REG_RSPINF_A_18 0xF2
|
||||
#define MAC_REG_RSPINF_A_24 0xF4
|
||||
#define MAC_REG_RSPINF_A_36 0xF6
|
||||
#define MAC_REG_RSPINF_A_48 0xF8
|
||||
#define MAC_REG_RSPINF_A_54 0xFA
|
||||
#define MAC_REG_RSPINF_A_72 0xFC
|
||||
|
||||
|
||||
//
|
||||
// Bits in the I2MCFG EEPROM register
|
||||
//
|
||||
#define I2MCFG_BOUNDCTL 0x80
|
||||
#define I2MCFG_WAITCTL 0x20
|
||||
#define I2MCFG_SCLOECTL 0x10
|
||||
#define I2MCFG_WBUSYCTL 0x08
|
||||
#define I2MCFG_NORETRY 0x04
|
||||
#define I2MCFG_I2MLDSEQ 0x02
|
||||
#define I2MCFG_I2CMFAST 0x01
|
||||
|
||||
//
|
||||
// Bits in the I2MCSR EEPROM register
|
||||
//
|
||||
#define I2MCSR_EEMW 0x80
|
||||
#define I2MCSR_EEMR 0x40
|
||||
#define I2MCSR_AUTOLD 0x08
|
||||
#define I2MCSR_NACK 0x02
|
||||
#define I2MCSR_DONE 0x01
|
||||
|
||||
//
|
||||
// Bits in the TMCTL register
|
||||
//
|
||||
#define TMCTL_TSUSP 0x04
|
||||
#define TMCTL_TMD 0x02
|
||||
#define TMCTL_TE 0x01
|
||||
|
||||
//
|
||||
// Bits in the TFTCTL register
|
||||
//
|
||||
#define TFTCTL_HWUTSF 0x80 //
|
||||
#define TFTCTL_TBTTSYNC 0x40
|
||||
#define TFTCTL_HWUTSFEN 0x20
|
||||
#define TFTCTL_TSFCNTRRD 0x10 //
|
||||
#define TFTCTL_TBTTSYNCEN 0x08 //
|
||||
#define TFTCTL_TSFSYNCEN 0x04 //
|
||||
#define TFTCTL_TSFCNTRST 0x02 //
|
||||
#define TFTCTL_TSFCNTREN 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the EnhanceCFG_0 register
|
||||
//
|
||||
#define EnCFG_BBType_a 0x00
|
||||
#define EnCFG_BBType_b 0x01
|
||||
#define EnCFG_BBType_g 0x02
|
||||
#define EnCFG_BBType_MASK 0x03
|
||||
#define EnCFG_ProtectMd 0x20
|
||||
|
||||
//
|
||||
// Bits in the EnhanceCFG_1 register
|
||||
//
|
||||
#define EnCFG_BcnSusInd 0x01
|
||||
#define EnCFG_BcnSusClr 0x02
|
||||
|
||||
//
|
||||
// Bits in the EnhanceCFG_2 register
|
||||
//
|
||||
#define EnCFG_NXTBTTCFPSTR 0x01
|
||||
#define EnCFG_BarkerPream 0x02
|
||||
#define EnCFG_PktBurstMode 0x04
|
||||
|
||||
//
|
||||
// Bits in the CFG register
|
||||
//
|
||||
#define CFG_TKIPOPT 0x80
|
||||
#define CFG_RXDMAOPT 0x40
|
||||
#define CFG_TMOT_SW 0x20
|
||||
#define CFG_TMOT_HWLONG 0x10
|
||||
#define CFG_TMOT_HW 0x00
|
||||
#define CFG_CFPENDOPT 0x08
|
||||
#define CFG_BCNSUSEN 0x04
|
||||
#define CFG_NOTXTIMEOUT 0x02
|
||||
#define CFG_NOBUFOPT 0x01
|
||||
|
||||
//
|
||||
// Bits in the TEST register
|
||||
//
|
||||
#define TEST_LBEXT 0x80 //
|
||||
#define TEST_LBINT 0x40 //
|
||||
#define TEST_LBNONE 0x00 //
|
||||
#define TEST_SOFTINT 0x20 //
|
||||
#define TEST_CONTTX 0x10 //
|
||||
#define TEST_TXPE 0x08 //
|
||||
#define TEST_NAVDIS 0x04 //
|
||||
#define TEST_NOCTS 0x02 //
|
||||
#define TEST_NOACK 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the HOSTCR register
|
||||
//
|
||||
#define HOSTCR_TXONST 0x80 //
|
||||
#define HOSTCR_RXONST 0x40 //
|
||||
#define HOSTCR_ADHOC 0x20 // Network Type 1 = Ad-hoc
|
||||
#define HOSTCR_AP 0x10 // Port Type 1 = AP
|
||||
#define HOSTCR_TXON 0x08 //0000 1000
|
||||
#define HOSTCR_RXON 0x04 //0000 0100
|
||||
#define HOSTCR_MACEN 0x02 //0000 0010
|
||||
#define HOSTCR_SOFTRST 0x01 //0000 0001
|
||||
|
||||
//
|
||||
// Bits in the MACCR register
|
||||
//
|
||||
#define MACCR_SYNCFLUSHOK 0x04 //
|
||||
#define MACCR_SYNCFLUSH 0x02 //
|
||||
#define MACCR_CLRNAV 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the RCR register
|
||||
//
|
||||
#define RCR_SSID 0x80
|
||||
#define RCR_RXALLTYPE 0x40 //
|
||||
#define RCR_UNICAST 0x20 //
|
||||
#define RCR_BROADCAST 0x10 //
|
||||
#define RCR_MULTICAST 0x08 //
|
||||
#define RCR_WPAERR 0x04 //
|
||||
#define RCR_ERRCRC 0x02 //
|
||||
#define RCR_BSSID 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the TCR register
|
||||
//
|
||||
#define TCR_SYNCDCFOPT 0x02 //
|
||||
#define TCR_AUTOBCNTX 0x01 // Beacon automatically transmit enable
|
||||
|
||||
|
||||
//ISR1
|
||||
#define ISR_GPIO3 0x40
|
||||
#define ISR_RXNOBUF 0x08
|
||||
#define ISR_MIBNEARFULL 0x04
|
||||
#define ISR_SOFTINT 0x02
|
||||
#define ISR_FETALERR 0x01
|
||||
|
||||
#define LEDSTS_STS 0x06
|
||||
#define LEDSTS_TMLEN 0x78
|
||||
#define LEDSTS_OFF 0x00
|
||||
#define LEDSTS_ON 0x02
|
||||
#define LEDSTS_SLOW 0x04
|
||||
#define LEDSTS_INTER 0x06
|
||||
|
||||
//ISR0
|
||||
#define ISR_WATCHDOG 0x80
|
||||
#define ISR_SOFTTIMER 0x40
|
||||
#define ISR_GPIO0 0x20
|
||||
#define ISR_TBTT 0x10
|
||||
#define ISR_RXDMA0 0x08
|
||||
#define ISR_BNTX 0x04
|
||||
#define ISR_ACTX 0x01
|
||||
|
||||
//
|
||||
// Bits in the PSCFG register
|
||||
//
|
||||
#define PSCFG_PHILIPMD 0x40 //
|
||||
#define PSCFG_WAKECALEN 0x20 //
|
||||
#define PSCFG_WAKETMREN 0x10 //
|
||||
#define PSCFG_BBPSPROG 0x08 //
|
||||
#define PSCFG_WAKESYN 0x04 //
|
||||
#define PSCFG_SLEEPSYN 0x02 //
|
||||
#define PSCFG_AUTOSLEEP 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the PSCTL register
|
||||
//
|
||||
#define PSCTL_WAKEDONE 0x20 //
|
||||
#define PSCTL_PS 0x10 //
|
||||
#define PSCTL_GO2DOZE 0x08 //
|
||||
#define PSCTL_LNBCN 0x04 //
|
||||
#define PSCTL_ALBCN 0x02 //
|
||||
#define PSCTL_PSEN 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the PSPWSIG register
|
||||
//
|
||||
#define PSSIG_WPE3 0x80 //
|
||||
#define PSSIG_WPE2 0x40 //
|
||||
#define PSSIG_WPE1 0x20 //
|
||||
#define PSSIG_WRADIOPE 0x10 //
|
||||
#define PSSIG_SPE3 0x08 //
|
||||
#define PSSIG_SPE2 0x04 //
|
||||
#define PSSIG_SPE1 0x02 //
|
||||
#define PSSIG_SRADIOPE 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the BBREGCTL register
|
||||
//
|
||||
#define BBREGCTL_DONE 0x04 //
|
||||
#define BBREGCTL_REGR 0x02 //
|
||||
#define BBREGCTL_REGW 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the IFREGCTL register
|
||||
//
|
||||
#define IFREGCTL_DONE 0x04 //
|
||||
#define IFREGCTL_IFRF 0x02 //
|
||||
#define IFREGCTL_REGW 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the SOFTPWRCTL register
|
||||
//
|
||||
#define SOFTPWRCTL_RFLEOPT 0x08 //
|
||||
#define SOFTPWRCTL_TXPEINV 0x02 //
|
||||
#define SOFTPWRCTL_SWPECTI 0x01 //
|
||||
#define SOFTPWRCTL_SWPAPE 0x20 //
|
||||
#define SOFTPWRCTL_SWCALEN 0x10 //
|
||||
#define SOFTPWRCTL_SWRADIO_PE 0x08 //
|
||||
#define SOFTPWRCTL_SWPE2 0x04 //
|
||||
#define SOFTPWRCTL_SWPE1 0x02 //
|
||||
#define SOFTPWRCTL_SWPE3 0x01 //
|
||||
|
||||
//
|
||||
// Bits in the GPIOCTL1 register
|
||||
//
|
||||
#define GPIO3_MD 0x20 //
|
||||
#define GPIO3_DATA 0x40 //
|
||||
#define GPIO3_INTMD 0x80 //
|
||||
|
||||
//
|
||||
// Bits in the MISCFFCTL register
|
||||
//
|
||||
#define MISCFFCTL_WRITE 0x0001 //
|
||||
|
||||
|
||||
// Loopback mode
|
||||
#define MAC_LB_EXT 0x02 //
|
||||
#define MAC_LB_INTERNAL 0x01 //
|
||||
#define MAC_LB_NONE 0x00 //
|
||||
|
||||
// Ethernet address filter type
|
||||
#define PKT_TYPE_NONE 0x00 // turn off receiver
|
||||
#define PKT_TYPE_ALL_MULTICAST 0x80
|
||||
#define PKT_TYPE_PROMISCUOUS 0x40
|
||||
#define PKT_TYPE_DIRECTED 0x20 // obselete, directed address is always accepted
|
||||
#define PKT_TYPE_BROADCAST 0x10
|
||||
#define PKT_TYPE_MULTICAST 0x08
|
||||
#define PKT_TYPE_ERROR_WPA 0x04
|
||||
#define PKT_TYPE_ERROR_CRC 0x02
|
||||
#define PKT_TYPE_BSSID 0x01
|
||||
|
||||
#define Default_BI 0x200
|
||||
|
||||
// MiscFIFO Offset
|
||||
#define MISCFIFO_KEYETRY0 32
|
||||
#define MISCFIFO_KEYENTRYSIZE 22
|
||||
|
||||
// max time out delay time
|
||||
#define W_MAX_TIMEOUT 0xFFF0U //
|
||||
|
||||
// wait time within loop
|
||||
#define CB_DELAY_LOOP_WAIT 10 // 10ms
|
||||
|
||||
#define MAC_REVISION_A0 0x00
|
||||
#define MAC_REVISION_A1 0x01
|
||||
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx);
|
||||
VOID MACvWriteMultiAddr (PSDevice pDevice, UINT uByteIdx, BYTE byData);
|
||||
BOOL MACbShutdown(PSDevice pDevice);;
|
||||
void MACvSetBBType(PSDevice pDevice,BYTE byType);
|
||||
void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData);
|
||||
void MACvDisableKeyEntry(PSDevice pDevice, UINT uEntryIdx);
|
||||
void MACvSetKeyEntry(PSDevice pDevice, WORD wKeyCtl, UINT uEntryIdx, UINT uKeyIdx, PBYTE pbyAddr, PDWORD pdwKey);
|
||||
|
||||
void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits);
|
||||
void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits);
|
||||
void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData);
|
||||
|
||||
void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr);
|
||||
void MACvEnableProtectMD(PSDevice pDevice);
|
||||
void MACvDisableProtectMD(PSDevice pDevice);
|
||||
void MACvEnableBarkerPreambleMd(PSDevice pDevice);
|
||||
void MACvDisableBarkerPreambleMd(PSDevice pDevice);
|
||||
void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif // __MAC_H__
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,592 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: mib.c
|
||||
*
|
||||
* Purpose: Implement MIB Data Structure
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
* Functions:
|
||||
* STAvClearAllCounter - Clear All MIB Counter
|
||||
* STAvUpdateIstStatCounter - Update ISR statistic counter
|
||||
* STAvUpdateRDStatCounter - Update Rx statistic counter
|
||||
* STAvUpdateRDStatCounterEx - Update Rx statistic counter and copy rcv data
|
||||
* STAvUpdateTDStatCounter - Update Tx statistic counter
|
||||
* STAvUpdateTDStatCounterEx - Update Tx statistic counter and copy tx data
|
||||
* STAvUpdate802_11Counter - Update 802.11 mib counter
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__UPC_H__)
|
||||
#include "upc.h"
|
||||
#endif
|
||||
#if !defined(__MAC_H__)
|
||||
#include "mac.h"
|
||||
#endif
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
#if !defined(__MIB_H__)
|
||||
#include "mib.h"
|
||||
#endif
|
||||
#if !defined(__WCTL_H__)
|
||||
#include "wctl.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__BASEBAND_H__)
|
||||
#include "baseband.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description: Clear All Statistic Counter
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pStatistic - Pointer to Statistic Counter Data Structure
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
void STAvClearAllCounter (PSStatCounter pStatistic)
|
||||
{
|
||||
// set memory to zero
|
||||
ZERO_MEMORY(pStatistic, sizeof(SStatCounter));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Update Isr Statistic Counter
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pStatistic - Pointer to Statistic Counter Data Structure
|
||||
* wisr - Interrupt status
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
void STAvUpdateIsrStatCounter (PSStatCounter pStatistic, BYTE byIsr0, BYTE byIsr1)
|
||||
{
|
||||
/**********************/
|
||||
/* ABNORMAL interrupt */
|
||||
/**********************/
|
||||
// not any IMR bit invoke irq
|
||||
if (byIsr0 == 0) {
|
||||
pStatistic->ISRStat.dwIsrUnknown++;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (BITbIsBitOn(byIsr0, ISR_ACTX)) // ISR, bit0
|
||||
pStatistic->ISRStat.dwIsrTx0OK++; // TXDMA0 successful
|
||||
|
||||
if (BITbIsBitOn(byIsr0, ISR_BNTX)) // ISR, bit2
|
||||
pStatistic->ISRStat.dwIsrBeaconTxOK++; // BeaconTx successful
|
||||
|
||||
if (BITbIsBitOn(byIsr0, ISR_RXDMA0)) // ISR, bit3
|
||||
pStatistic->ISRStat.dwIsrRx0OK++; // Rx0 successful
|
||||
|
||||
if (BITbIsBitOn(byIsr0, ISR_TBTT)) // ISR, bit4
|
||||
pStatistic->ISRStat.dwIsrTBTTInt++; // TBTT successful
|
||||
|
||||
if (BITbIsBitOn(byIsr0, ISR_SOFTTIMER)) // ISR, bit6
|
||||
pStatistic->ISRStat.dwIsrSTIMERInt++;
|
||||
|
||||
if (BITbIsBitOn(byIsr0, ISR_WATCHDOG)) // ISR, bit7
|
||||
pStatistic->ISRStat.dwIsrWatchDog++;
|
||||
|
||||
|
||||
if (BITbIsBitOn(byIsr1, ISR_FETALERR)) // ISR, bit8
|
||||
pStatistic->ISRStat.dwIsrUnrecoverableError++;
|
||||
|
||||
if (BITbIsBitOn(byIsr1, ISR_SOFTINT)) // ISR, bit9
|
||||
pStatistic->ISRStat.dwIsrSoftInterrupt++; // software interrupt
|
||||
|
||||
if (BITbIsBitOn(byIsr1, ISR_MIBNEARFULL)) // ISR, bit10
|
||||
pStatistic->ISRStat.dwIsrMIBNearfull++;
|
||||
|
||||
if (BITbIsBitOn(byIsr1, ISR_RXNOBUF)) // ISR, bit11
|
||||
pStatistic->ISRStat.dwIsrRxNoBuf++; // Rx No Buff
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Update Rx Statistic Counter
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pStatistic - Pointer to Statistic Counter Data Structure
|
||||
* byRSR - Rx Status
|
||||
* byNewRSR - Rx Status
|
||||
* pbyBuffer - Rx Buffer
|
||||
* cbFrameLength - Rx Length
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
void STAvUpdateRDStatCounter (PSStatCounter pStatistic,
|
||||
BYTE byRSR, BYTE byNewRSR, BYTE byRxSts, BYTE byRxRate,
|
||||
PBYTE pbyBuffer, UINT cbFrameLength)
|
||||
{
|
||||
//need change
|
||||
PS802_11Header pHeader = (PS802_11Header)pbyBuffer;
|
||||
|
||||
if (BITbIsBitOn(byRSR, RSR_ADDROK))
|
||||
pStatistic->dwRsrADDROk++;
|
||||
if (BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->dwRsrCRCOk++;
|
||||
|
||||
pStatistic->ullRsrOK++;
|
||||
|
||||
if (cbFrameLength >= U_ETHER_ADDR_LEN) {
|
||||
// update counters in case that successful transmit
|
||||
if (BITbIsBitOn(byRSR, RSR_ADDRBROAD)) {
|
||||
pStatistic->ullRxBroadcastFrames++;
|
||||
pStatistic->ullRxBroadcastBytes += (ULONGLONG)cbFrameLength;
|
||||
}
|
||||
else if (BITbIsBitOn(byRSR, RSR_ADDRMULTI)) {
|
||||
pStatistic->ullRxMulticastFrames++;
|
||||
pStatistic->ullRxMulticastBytes += (ULONGLONG)cbFrameLength;
|
||||
}
|
||||
else {
|
||||
pStatistic->ullRxDirectedFrames++;
|
||||
pStatistic->ullRxDirectedBytes += (ULONGLONG)cbFrameLength;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(byRxRate==22) {
|
||||
pStatistic->CustomStat.ullRsr11M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr11MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"11M: ALL[%d], OK[%d]:[%02x]\n", (INT)pStatistic->CustomStat.ullRsr11M, (INT)pStatistic->CustomStat.ullRsr11MCRCOk, byRSR);
|
||||
}
|
||||
else if(byRxRate==11) {
|
||||
pStatistic->CustomStat.ullRsr5M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr5MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 5M: ALL[%d], OK[%d]:[%02x]\n", (INT)pStatistic->CustomStat.ullRsr5M, (INT)pStatistic->CustomStat.ullRsr5MCRCOk, byRSR);
|
||||
}
|
||||
else if(byRxRate==4) {
|
||||
pStatistic->CustomStat.ullRsr2M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr2MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 2M: ALL[%d], OK[%d]:[%02x]\n", (INT)pStatistic->CustomStat.ullRsr2M, (INT)pStatistic->CustomStat.ullRsr2MCRCOk, byRSR);
|
||||
}
|
||||
else if(byRxRate==2){
|
||||
pStatistic->CustomStat.ullRsr1M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr1MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 1M: ALL[%d], OK[%d]:[%02x]\n", (INT)pStatistic->CustomStat.ullRsr1M, (INT)pStatistic->CustomStat.ullRsr1MCRCOk, byRSR);
|
||||
}
|
||||
else if(byRxRate==12){
|
||||
pStatistic->CustomStat.ullRsr6M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr6MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 6M: ALL[%d], OK[%d]\n", (INT)pStatistic->CustomStat.ullRsr6M, (INT)pStatistic->CustomStat.ullRsr6MCRCOk);
|
||||
}
|
||||
else if(byRxRate==18){
|
||||
pStatistic->CustomStat.ullRsr9M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr9MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" 9M: ALL[%d], OK[%d]\n", (INT)pStatistic->CustomStat.ullRsr9M, (INT)pStatistic->CustomStat.ullRsr9MCRCOk);
|
||||
}
|
||||
else if(byRxRate==24){
|
||||
pStatistic->CustomStat.ullRsr12M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr12MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"12M: ALL[%d], OK[%d]\n", (INT)pStatistic->CustomStat.ullRsr12M, (INT)pStatistic->CustomStat.ullRsr12MCRCOk);
|
||||
}
|
||||
else if(byRxRate==36){
|
||||
pStatistic->CustomStat.ullRsr18M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr18MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"18M: ALL[%d], OK[%d]\n", (INT)pStatistic->CustomStat.ullRsr18M, (INT)pStatistic->CustomStat.ullRsr18MCRCOk);
|
||||
}
|
||||
else if(byRxRate==48){
|
||||
pStatistic->CustomStat.ullRsr24M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr24MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"24M: ALL[%d], OK[%d]\n", (INT)pStatistic->CustomStat.ullRsr24M, (INT)pStatistic->CustomStat.ullRsr24MCRCOk);
|
||||
}
|
||||
else if(byRxRate==72){
|
||||
pStatistic->CustomStat.ullRsr36M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr36MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"36M: ALL[%d], OK[%d]\n", (INT)pStatistic->CustomStat.ullRsr36M, (INT)pStatistic->CustomStat.ullRsr36MCRCOk);
|
||||
}
|
||||
else if(byRxRate==96){
|
||||
pStatistic->CustomStat.ullRsr48M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr48MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"48M: ALL[%d], OK[%d]\n", (INT)pStatistic->CustomStat.ullRsr48M, (INT)pStatistic->CustomStat.ullRsr48MCRCOk);
|
||||
}
|
||||
else if(byRxRate==108){
|
||||
pStatistic->CustomStat.ullRsr54M++;
|
||||
if(BITbIsBitOn(byRSR, RSR_CRCOK)) {
|
||||
pStatistic->CustomStat.ullRsr54MCRCOk++;
|
||||
}
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"54M: ALL[%d], OK[%d]\n", (INT)pStatistic->CustomStat.ullRsr54M, (INT)pStatistic->CustomStat.ullRsr54MCRCOk);
|
||||
}
|
||||
else {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Unknown: Total[%d], CRCOK[%d]\n", (INT)pStatistic->dwRsrRxPacket+1, (INT)pStatistic->dwRsrCRCOk);
|
||||
}
|
||||
|
||||
if (BITbIsBitOn(byRSR, RSR_BSSIDOK))
|
||||
pStatistic->dwRsrBSSIDOk++;
|
||||
|
||||
if (BITbIsBitOn(byRSR, RSR_BCNSSIDOK))
|
||||
pStatistic->dwRsrBCNSSIDOk++;
|
||||
if (BITbIsBitOn(byRSR, RSR_IVLDLEN)) //invalid len (> 2312 byte)
|
||||
pStatistic->dwRsrLENErr++;
|
||||
if (BITbIsBitOn(byRSR, RSR_IVLDTYP)) //invalid packet type
|
||||
pStatistic->dwRsrTYPErr++;
|
||||
if (BITbIsBitOn(byRSR, (RSR_IVLDTYP | RSR_IVLDLEN)) || BITbIsBitOff(byRSR, RSR_CRCOK))
|
||||
pStatistic->dwRsrErr++;
|
||||
|
||||
if (BITbIsBitOn(byNewRSR, NEWRSR_DECRYPTOK))
|
||||
pStatistic->dwNewRsrDECRYPTOK++;
|
||||
if (BITbIsBitOn(byNewRSR, NEWRSR_CFPIND))
|
||||
pStatistic->dwNewRsrCFP++;
|
||||
if (BITbIsBitOn(byNewRSR, NEWRSR_HWUTSF))
|
||||
pStatistic->dwNewRsrUTSF++;
|
||||
if (BITbIsBitOn(byNewRSR, NEWRSR_BCNHITAID))
|
||||
pStatistic->dwNewRsrHITAID++;
|
||||
if (BITbIsBitOn(byNewRSR, NEWRSR_BCNHITAID0))
|
||||
pStatistic->dwNewRsrHITAID0++;
|
||||
|
||||
// increase rx packet count
|
||||
pStatistic->dwRsrRxPacket++;
|
||||
pStatistic->dwRsrRxOctet += cbFrameLength;
|
||||
|
||||
|
||||
if (IS_TYPE_DATA(pbyBuffer)) {
|
||||
pStatistic->dwRsrRxData++;
|
||||
} else if (IS_TYPE_MGMT(pbyBuffer)){
|
||||
pStatistic->dwRsrRxManage++;
|
||||
} else if (IS_TYPE_CONTROL(pbyBuffer)){
|
||||
pStatistic->dwRsrRxControl++;
|
||||
}
|
||||
|
||||
if (BITbIsBitOn(byRSR, RSR_ADDRBROAD))
|
||||
pStatistic->dwRsrBroadcast++;
|
||||
else if (BITbIsBitOn(byRSR, RSR_ADDRMULTI))
|
||||
pStatistic->dwRsrMulticast++;
|
||||
else
|
||||
pStatistic->dwRsrDirected++;
|
||||
|
||||
if (WLAN_GET_FC_MOREFRAG(pHeader->wFrameCtl))
|
||||
pStatistic->dwRsrRxFragment++;
|
||||
|
||||
if (cbFrameLength < MIN_PACKET_LEN + 4) {
|
||||
pStatistic->dwRsrRunt++;
|
||||
}
|
||||
else if (cbFrameLength == MIN_PACKET_LEN + 4) {
|
||||
pStatistic->dwRsrRxFrmLen64++;
|
||||
}
|
||||
else if ((65 <= cbFrameLength) && (cbFrameLength <= 127)) {
|
||||
pStatistic->dwRsrRxFrmLen65_127++;
|
||||
}
|
||||
else if ((128 <= cbFrameLength) && (cbFrameLength <= 255)) {
|
||||
pStatistic->dwRsrRxFrmLen128_255++;
|
||||
}
|
||||
else if ((256 <= cbFrameLength) && (cbFrameLength <= 511)) {
|
||||
pStatistic->dwRsrRxFrmLen256_511++;
|
||||
}
|
||||
else if ((512 <= cbFrameLength) && (cbFrameLength <= 1023)) {
|
||||
pStatistic->dwRsrRxFrmLen512_1023++;
|
||||
}
|
||||
else if ((1024 <= cbFrameLength) && (cbFrameLength <= MAX_PACKET_LEN + 4)) {
|
||||
pStatistic->dwRsrRxFrmLen1024_1518++;
|
||||
} else if (cbFrameLength > MAX_PACKET_LEN + 4) {
|
||||
pStatistic->dwRsrLong++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description: Update Rx Statistic Counter and copy Rx buffer
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pStatistic - Pointer to Statistic Counter Data Structure
|
||||
* byRSR - Rx Status
|
||||
* byNewRSR - Rx Status
|
||||
* pbyBuffer - Rx Buffer
|
||||
* cbFrameLength - Rx Length
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
STAvUpdateRDStatCounterEx (
|
||||
PSStatCounter pStatistic,
|
||||
BYTE byRSR,
|
||||
BYTE byNewRSR,
|
||||
BYTE byRxSts,
|
||||
BYTE byRxRate,
|
||||
PBYTE pbyBuffer,
|
||||
UINT cbFrameLength
|
||||
)
|
||||
{
|
||||
STAvUpdateRDStatCounter(
|
||||
pStatistic,
|
||||
byRSR,
|
||||
byNewRSR,
|
||||
byRxSts,
|
||||
byRxRate,
|
||||
pbyBuffer,
|
||||
cbFrameLength
|
||||
);
|
||||
|
||||
// rx length
|
||||
pStatistic->dwCntRxFrmLength = cbFrameLength;
|
||||
// rx pattern, we just see 10 bytes for sample
|
||||
MEMvCopy(pStatistic->abyCntRxPattern, (PBYTE)pbyBuffer, 10);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Update Tx Statistic Counter
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pStatistic - Pointer to Statistic Counter Data Structure
|
||||
* byTSR0 - Tx Status
|
||||
* byTSR1 - Tx Status
|
||||
* pbyBuffer - Tx Buffer
|
||||
* cbFrameLength - Tx Length
|
||||
* uIdx - Index of Tx DMA
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
void
|
||||
STAvUpdateTDStatCounter (
|
||||
PSStatCounter pStatistic,
|
||||
BYTE byPktNum,
|
||||
BYTE byRate,
|
||||
BYTE byTSR
|
||||
)
|
||||
{
|
||||
BYTE byRetyCnt;
|
||||
// increase tx packet count
|
||||
pStatistic->dwTsrTxPacket++;
|
||||
|
||||
byRetyCnt = (byTSR & 0xF0) >> 4;
|
||||
if (byRetyCnt != 0) {
|
||||
pStatistic->dwTsrRetry++;
|
||||
pStatistic->dwTsrTotalRetry += byRetyCnt;
|
||||
pStatistic->dwTxFail[byRate]+= byRetyCnt;
|
||||
pStatistic->dwTxFail[MAX_RATE] += byRetyCnt;
|
||||
|
||||
if ( byRetyCnt == 0x1)
|
||||
pStatistic->dwTsrOnceRetry++;
|
||||
else
|
||||
pStatistic->dwTsrMoreThanOnceRetry++;
|
||||
|
||||
if (byRetyCnt <= 8)
|
||||
pStatistic->dwTxRetryCount[byRetyCnt-1]++;
|
||||
|
||||
}
|
||||
if (BITbIsAllBitsOff(byTSR, (TSR_TMO | TSR_RETRYTMO))) {
|
||||
|
||||
#ifdef Calcu_LinkQual
|
||||
if (byRetyCnt < 2)
|
||||
pStatistic->TxNoRetryOkCount ++;
|
||||
else
|
||||
pStatistic->TxRetryOkCount ++;
|
||||
#endif
|
||||
|
||||
pStatistic->ullTsrOK++;
|
||||
pStatistic->CustomStat.ullTsrAllOK++;
|
||||
// update counters in case that successful transmit
|
||||
pStatistic->dwTxOk[byRate]++;
|
||||
pStatistic->dwTxOk[MAX_RATE]++;
|
||||
|
||||
if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_BROAD ) {
|
||||
pStatistic->ullTxBroadcastFrames++;
|
||||
pStatistic->ullTxBroadcastBytes += pStatistic->abyTxPktInfo[byPktNum].wLength;
|
||||
} else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_MULTI ) {
|
||||
pStatistic->ullTxMulticastFrames++;
|
||||
pStatistic->ullTxMulticastBytes += pStatistic->abyTxPktInfo[byPktNum].wLength;
|
||||
} else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_UNI ) {
|
||||
pStatistic->ullTxDirectedFrames++;
|
||||
pStatistic->ullTxDirectedBytes += pStatistic->abyTxPktInfo[byPktNum].wLength;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
#ifdef Calcu_LinkQual
|
||||
pStatistic->TxFailCount ++;
|
||||
#endif
|
||||
|
||||
pStatistic->dwTsrErr++;
|
||||
if (BITbIsBitOn(byTSR, TSR_RETRYTMO))
|
||||
pStatistic->dwTsrRetryTimeout++;
|
||||
if (BITbIsBitOn(byTSR, TSR_TMO))
|
||||
pStatistic->dwTsrTransmitTimeout++;
|
||||
}
|
||||
|
||||
if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_BROAD ) {
|
||||
pStatistic->dwTsrBroadcast++;
|
||||
} else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_MULTI ) {
|
||||
pStatistic->dwTsrMulticast++;
|
||||
} else if ( pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni == TX_PKT_UNI ) {
|
||||
pStatistic->dwTsrDirected++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description: Update 802.11 mib counter
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* p802_11Counter - Pointer to 802.11 mib counter
|
||||
* pStatistic - Pointer to Statistic Counter Data Structure
|
||||
* dwCounter - hardware counter for 802.11 mib
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
void
|
||||
STAvUpdate802_11Counter(
|
||||
PSDot11Counters p802_11Counter,
|
||||
PSStatCounter pStatistic,
|
||||
BYTE byRTSSuccess,
|
||||
BYTE byRTSFail,
|
||||
BYTE byACKFail,
|
||||
BYTE byFCSErr
|
||||
)
|
||||
{
|
||||
//p802_11Counter->TransmittedFragmentCount
|
||||
p802_11Counter->MulticastTransmittedFrameCount = (ULONGLONG) (pStatistic->dwTsrBroadcast +
|
||||
pStatistic->dwTsrMulticast);
|
||||
p802_11Counter->FailedCount = (ULONGLONG) (pStatistic->dwTsrErr);
|
||||
p802_11Counter->RetryCount = (ULONGLONG) (pStatistic->dwTsrRetry);
|
||||
p802_11Counter->MultipleRetryCount = (ULONGLONG) (pStatistic->dwTsrMoreThanOnceRetry);
|
||||
//p802_11Counter->FrameDuplicateCount
|
||||
p802_11Counter->RTSSuccessCount += (ULONGLONG) byRTSSuccess;
|
||||
p802_11Counter->RTSFailureCount += (ULONGLONG) byRTSFail;
|
||||
p802_11Counter->ACKFailureCount += (ULONGLONG) byACKFail;
|
||||
p802_11Counter->FCSErrorCount += (ULONGLONG) byFCSErr;
|
||||
//p802_11Counter->ReceivedFragmentCount
|
||||
p802_11Counter->MulticastReceivedFrameCount = (ULONGLONG) (pStatistic->dwRsrBroadcast +
|
||||
pStatistic->dwRsrMulticast);
|
||||
}
|
||||
|
||||
/*
|
||||
* Description: Clear 802.11 mib counter
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* p802_11Counter - Pointer to 802.11 mib counter
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
void
|
||||
STAvClear802_11Counter(PSDot11Counters p802_11Counter)
|
||||
{
|
||||
// set memory to zero
|
||||
ZERO_MEMORY(p802_11Counter, sizeof(SDot11Counters));
|
||||
}
|
||||
|
||||
/*
|
||||
* Description: Clear 802.11 mib counter
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pUsbCounter - Pointer to USB mib counter
|
||||
* ntStatus - URB status
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
STAvUpdateUSBCounter(PSUSBCounter pUsbCounter,
|
||||
NTSTATUS ntStatus
|
||||
)
|
||||
{
|
||||
|
||||
// if ( ntStatus == USBD_STATUS_CRC ) {
|
||||
pUsbCounter->dwCrc++;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,445 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: mib.h
|
||||
*
|
||||
* Purpose: Implement MIB Data Structure
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __MIB_H__
|
||||
#define __MIB_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
#if !defined(__DESC_H__)
|
||||
#include "desc.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
//#define ULONGLONG ULONG
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
//
|
||||
// USB counter
|
||||
//
|
||||
typedef struct tagSUSBCounter {
|
||||
DWORD dwCrc;
|
||||
|
||||
} SUSBCounter, DEF* PSUSBCounter;
|
||||
|
||||
|
||||
|
||||
//
|
||||
// 802.11 counter
|
||||
//
|
||||
|
||||
|
||||
typedef struct tagSDot11Counters {
|
||||
// ULONG Length; // Length of structure
|
||||
ULONGLONG TransmittedFragmentCount;
|
||||
ULONGLONG MulticastTransmittedFrameCount;
|
||||
ULONGLONG FailedCount;
|
||||
ULONGLONG RetryCount;
|
||||
ULONGLONG MultipleRetryCount;
|
||||
ULONGLONG RTSSuccessCount;
|
||||
ULONGLONG RTSFailureCount;
|
||||
ULONGLONG ACKFailureCount;
|
||||
ULONGLONG FrameDuplicateCount;
|
||||
ULONGLONG ReceivedFragmentCount;
|
||||
ULONGLONG MulticastReceivedFrameCount;
|
||||
ULONGLONG FCSErrorCount;
|
||||
ULONGLONG TKIPLocalMICFailures;
|
||||
ULONGLONG TKIPRemoteMICFailures;
|
||||
ULONGLONG TKIPICVErrors;
|
||||
ULONGLONG TKIPCounterMeasuresInvoked;
|
||||
ULONGLONG TKIPReplays;
|
||||
ULONGLONG CCMPFormatErrors;
|
||||
ULONGLONG CCMPReplays;
|
||||
ULONGLONG CCMPDecryptErrors;
|
||||
ULONGLONG FourWayHandshakeFailures;
|
||||
// ULONGLONG WEPUndecryptableCount;
|
||||
// ULONGLONG WEPICVErrorCount;
|
||||
// ULONGLONG DecryptSuccessCount;
|
||||
// ULONGLONG DecryptFailureCount;
|
||||
} SDot11Counters, DEF* PSDot11Counters;
|
||||
|
||||
|
||||
//
|
||||
// MIB2 counter
|
||||
//
|
||||
typedef struct tagSMib2Counter {
|
||||
LONG ifIndex;
|
||||
TCHAR ifDescr[256]; // max size 255 plus zero ending
|
||||
// e.g. "interface 1"
|
||||
LONG ifType;
|
||||
LONG ifMtu;
|
||||
DWORD ifSpeed;
|
||||
BYTE ifPhysAddress[U_ETHER_ADDR_LEN];
|
||||
LONG ifAdminStatus;
|
||||
LONG ifOperStatus;
|
||||
DWORD ifLastChange;
|
||||
DWORD ifInOctets;
|
||||
DWORD ifInUcastPkts;
|
||||
DWORD ifInNUcastPkts;
|
||||
DWORD ifInDiscards;
|
||||
DWORD ifInErrors;
|
||||
DWORD ifInUnknownProtos;
|
||||
DWORD ifOutOctets;
|
||||
DWORD ifOutUcastPkts;
|
||||
DWORD ifOutNUcastPkts;
|
||||
DWORD ifOutDiscards;
|
||||
DWORD ifOutErrors;
|
||||
DWORD ifOutQLen;
|
||||
DWORD ifSpecific;
|
||||
} SMib2Counter, DEF* PSMib2Counter;
|
||||
|
||||
// Value in the ifType entry
|
||||
//#define ETHERNETCSMACD 6 //
|
||||
#define WIRELESSLANIEEE80211b 6 //
|
||||
|
||||
// Value in the ifAdminStatus/ifOperStatus entry
|
||||
#define UP 1 //
|
||||
#define DOWN 2 //
|
||||
#define TESTING 3 //
|
||||
|
||||
|
||||
//
|
||||
// RMON counter
|
||||
//
|
||||
typedef struct tagSRmonCounter {
|
||||
LONG etherStatsIndex;
|
||||
DWORD etherStatsDataSource;
|
||||
DWORD etherStatsDropEvents;
|
||||
DWORD etherStatsOctets;
|
||||
DWORD etherStatsPkts;
|
||||
DWORD etherStatsBroadcastPkts;
|
||||
DWORD etherStatsMulticastPkts;
|
||||
DWORD etherStatsCRCAlignErrors;
|
||||
DWORD etherStatsUndersizePkts;
|
||||
DWORD etherStatsOversizePkts;
|
||||
DWORD etherStatsFragments;
|
||||
DWORD etherStatsJabbers;
|
||||
DWORD etherStatsCollisions;
|
||||
DWORD etherStatsPkt64Octets;
|
||||
DWORD etherStatsPkt65to127Octets;
|
||||
DWORD etherStatsPkt128to255Octets;
|
||||
DWORD etherStatsPkt256to511Octets;
|
||||
DWORD etherStatsPkt512to1023Octets;
|
||||
DWORD etherStatsPkt1024to1518Octets;
|
||||
DWORD etherStatsOwners;
|
||||
DWORD etherStatsStatus;
|
||||
} SRmonCounter, DEF* PSRmonCounter;
|
||||
|
||||
//
|
||||
// Custom counter
|
||||
//
|
||||
typedef struct tagSCustomCounters {
|
||||
ULONG Length;
|
||||
|
||||
ULONGLONG ullTsrAllOK;
|
||||
|
||||
ULONGLONG ullRsr11M;
|
||||
ULONGLONG ullRsr5M;
|
||||
ULONGLONG ullRsr2M;
|
||||
ULONGLONG ullRsr1M;
|
||||
|
||||
ULONGLONG ullRsr11MCRCOk;
|
||||
ULONGLONG ullRsr5MCRCOk;
|
||||
ULONGLONG ullRsr2MCRCOk;
|
||||
ULONGLONG ullRsr1MCRCOk;
|
||||
|
||||
ULONGLONG ullRsr54M;
|
||||
ULONGLONG ullRsr48M;
|
||||
ULONGLONG ullRsr36M;
|
||||
ULONGLONG ullRsr24M;
|
||||
ULONGLONG ullRsr18M;
|
||||
ULONGLONG ullRsr12M;
|
||||
ULONGLONG ullRsr9M;
|
||||
ULONGLONG ullRsr6M;
|
||||
|
||||
ULONGLONG ullRsr54MCRCOk;
|
||||
ULONGLONG ullRsr48MCRCOk;
|
||||
ULONGLONG ullRsr36MCRCOk;
|
||||
ULONGLONG ullRsr24MCRCOk;
|
||||
ULONGLONG ullRsr18MCRCOk;
|
||||
ULONGLONG ullRsr12MCRCOk;
|
||||
ULONGLONG ullRsr9MCRCOk;
|
||||
ULONGLONG ullRsr6MCRCOk;
|
||||
|
||||
} SCustomCounters, DEF* PSCustomCounters;
|
||||
|
||||
|
||||
//
|
||||
// Custom counter
|
||||
//
|
||||
typedef struct tagSISRCounters {
|
||||
ULONG Length;
|
||||
|
||||
DWORD dwIsrTx0OK;
|
||||
DWORD dwIsrAC0TxOK;
|
||||
DWORD dwIsrBeaconTxOK;
|
||||
DWORD dwIsrRx0OK;
|
||||
DWORD dwIsrTBTTInt;
|
||||
DWORD dwIsrSTIMERInt;
|
||||
DWORD dwIsrWatchDog;
|
||||
DWORD dwIsrUnrecoverableError;
|
||||
DWORD dwIsrSoftInterrupt;
|
||||
DWORD dwIsrMIBNearfull;
|
||||
DWORD dwIsrRxNoBuf;
|
||||
|
||||
DWORD dwIsrUnknown; // unknown interrupt count
|
||||
|
||||
DWORD dwIsrRx1OK;
|
||||
DWORD dwIsrATIMTxOK;
|
||||
DWORD dwIsrSYNCTxOK;
|
||||
DWORD dwIsrCFPEnd;
|
||||
DWORD dwIsrATIMEnd;
|
||||
DWORD dwIsrSYNCFlushOK;
|
||||
DWORD dwIsrSTIMER1Int;
|
||||
/////////////////////////////////////
|
||||
} SISRCounters, DEF* PSISRCounters;
|
||||
|
||||
|
||||
// Value in the etherStatsStatus entry
|
||||
#define VALID 1 //
|
||||
#define CREATE_REQUEST 2 //
|
||||
#define UNDER_CREATION 3 //
|
||||
#define INVALID 4 //
|
||||
|
||||
|
||||
//
|
||||
// Tx packet information
|
||||
//
|
||||
typedef struct tagSTxPktInfo {
|
||||
BYTE byBroadMultiUni;
|
||||
WORD wLength;
|
||||
WORD wFIFOCtl;
|
||||
BYTE abyDestAddr[U_ETHER_ADDR_LEN];
|
||||
} STxPktInfo, DEF* PSTxPktInfo;
|
||||
|
||||
|
||||
#define MAX_RATE 12
|
||||
//
|
||||
// statistic counter
|
||||
//
|
||||
typedef struct tagSStatCounter {
|
||||
//
|
||||
// ISR status count
|
||||
//
|
||||
|
||||
SISRCounters ISRStat;
|
||||
|
||||
// RSR status count
|
||||
//
|
||||
DWORD dwRsrFrmAlgnErr;
|
||||
DWORD dwRsrErr;
|
||||
DWORD dwRsrCRCErr;
|
||||
DWORD dwRsrCRCOk;
|
||||
DWORD dwRsrBSSIDOk;
|
||||
DWORD dwRsrADDROk;
|
||||
DWORD dwRsrBCNSSIDOk;
|
||||
DWORD dwRsrLENErr;
|
||||
DWORD dwRsrTYPErr;
|
||||
|
||||
DWORD dwNewRsrDECRYPTOK;
|
||||
DWORD dwNewRsrCFP;
|
||||
DWORD dwNewRsrUTSF;
|
||||
DWORD dwNewRsrHITAID;
|
||||
DWORD dwNewRsrHITAID0;
|
||||
|
||||
DWORD dwRsrLong;
|
||||
DWORD dwRsrRunt;
|
||||
|
||||
DWORD dwRsrRxControl;
|
||||
DWORD dwRsrRxData;
|
||||
DWORD dwRsrRxManage;
|
||||
|
||||
DWORD dwRsrRxPacket;
|
||||
DWORD dwRsrRxOctet;
|
||||
DWORD dwRsrBroadcast;
|
||||
DWORD dwRsrMulticast;
|
||||
DWORD dwRsrDirected;
|
||||
// 64-bit OID
|
||||
ULONGLONG ullRsrOK;
|
||||
|
||||
// for some optional OIDs (64 bits) and DMI support
|
||||
ULONGLONG ullRxBroadcastBytes;
|
||||
ULONGLONG ullRxMulticastBytes;
|
||||
ULONGLONG ullRxDirectedBytes;
|
||||
ULONGLONG ullRxBroadcastFrames;
|
||||
ULONGLONG ullRxMulticastFrames;
|
||||
ULONGLONG ullRxDirectedFrames;
|
||||
|
||||
DWORD dwRsrRxFragment;
|
||||
DWORD dwRsrRxFrmLen64;
|
||||
DWORD dwRsrRxFrmLen65_127;
|
||||
DWORD dwRsrRxFrmLen128_255;
|
||||
DWORD dwRsrRxFrmLen256_511;
|
||||
DWORD dwRsrRxFrmLen512_1023;
|
||||
DWORD dwRsrRxFrmLen1024_1518;
|
||||
|
||||
// TSR status count
|
||||
//
|
||||
DWORD dwTsrTotalRetry; // total collision retry count
|
||||
DWORD dwTsrOnceRetry; // this packet only occur one collision
|
||||
DWORD dwTsrMoreThanOnceRetry; // this packet occur more than one collision
|
||||
DWORD dwTsrRetry; // this packet has ever occur collision,
|
||||
// that is (dwTsrOnceCollision0 + dwTsrMoreThanOnceCollision0)
|
||||
DWORD dwTsrACKData;
|
||||
DWORD dwTsrErr;
|
||||
DWORD dwAllTsrOK;
|
||||
DWORD dwTsrRetryTimeout;
|
||||
DWORD dwTsrTransmitTimeout;
|
||||
|
||||
DWORD dwTsrTxPacket;
|
||||
DWORD dwTsrTxOctet;
|
||||
DWORD dwTsrBroadcast;
|
||||
DWORD dwTsrMulticast;
|
||||
DWORD dwTsrDirected;
|
||||
|
||||
// RD/TD count
|
||||
DWORD dwCntRxFrmLength;
|
||||
DWORD dwCntTxBufLength;
|
||||
|
||||
BYTE abyCntRxPattern[16];
|
||||
BYTE abyCntTxPattern[16];
|
||||
|
||||
|
||||
|
||||
// Software check....
|
||||
DWORD dwCntRxDataErr; // rx buffer data software compare CRC err count
|
||||
DWORD dwCntDecryptErr; // rx buffer data software compare CRC err count
|
||||
DWORD dwCntRxICVErr; // rx buffer data software compare CRC err count
|
||||
|
||||
|
||||
// 64-bit OID
|
||||
ULONGLONG ullTsrOK;
|
||||
|
||||
// for some optional OIDs (64 bits) and DMI support
|
||||
ULONGLONG ullTxBroadcastFrames;
|
||||
ULONGLONG ullTxMulticastFrames;
|
||||
ULONGLONG ullTxDirectedFrames;
|
||||
ULONGLONG ullTxBroadcastBytes;
|
||||
ULONGLONG ullTxMulticastBytes;
|
||||
ULONGLONG ullTxDirectedBytes;
|
||||
|
||||
// for autorate
|
||||
DWORD dwTxOk[MAX_RATE+1];
|
||||
DWORD dwTxFail[MAX_RATE+1];
|
||||
DWORD dwTxRetryCount[8];
|
||||
|
||||
STxPktInfo abyTxPktInfo[16];
|
||||
|
||||
SUSBCounter USB_EP0Stat;
|
||||
SUSBCounter USB_BulkInStat;
|
||||
SUSBCounter USB_BulkOutStat;
|
||||
SUSBCounter USB_InterruptStat;
|
||||
|
||||
SCustomCounters CustomStat;
|
||||
|
||||
#ifdef Calcu_LinkQual
|
||||
//Tx count:
|
||||
ULONG TxNoRetryOkCount; //success tx no retry !
|
||||
ULONG TxRetryOkCount; //sucess tx but retry !
|
||||
ULONG TxFailCount; //fail tx ?
|
||||
//Rx count:
|
||||
ULONG RxOkCnt; //sucess rx !
|
||||
ULONG RxFcsErrCnt; //fail rx ?
|
||||
//statistic
|
||||
ULONG SignalStren;
|
||||
ULONG LinkQuality;
|
||||
#endif
|
||||
|
||||
} SStatCounter, DEF* PSStatCounter;
|
||||
|
||||
#define NTSTATUS int
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
void STAvClearAllCounter(PSStatCounter pStatistic);
|
||||
|
||||
void STAvUpdateIsrStatCounter (PSStatCounter pStatistic, BYTE byIsr0, BYTE byIsr1);
|
||||
|
||||
void STAvUpdateRDStatCounter(PSStatCounter pStatistic,
|
||||
BYTE byRSR, BYTE byNewRSR, BYTE byRxSts, BYTE byRxRate,
|
||||
PBYTE pbyBuffer, UINT cbFrameLength);
|
||||
|
||||
void STAvUpdateRDStatCounterEx(PSStatCounter pStatistic,
|
||||
BYTE byRSR, BYTE byNewRSR, BYTE byRxSts, BYTE byRxRate,
|
||||
PBYTE pbyBuffer, UINT cbFrameLength);
|
||||
|
||||
|
||||
void
|
||||
STAvUpdateTDStatCounter (
|
||||
PSStatCounter pStatistic,
|
||||
BYTE byPktNum,
|
||||
BYTE byRate,
|
||||
BYTE byTSR
|
||||
);
|
||||
|
||||
|
||||
void
|
||||
STAvUpdate802_11Counter(
|
||||
PSDot11Counters p802_11Counter,
|
||||
PSStatCounter pStatistic,
|
||||
BYTE byRTSSuccess,
|
||||
BYTE byRTSFail,
|
||||
BYTE byACKFail,
|
||||
BYTE byFCSErr
|
||||
);
|
||||
|
||||
void STAvClear802_11Counter(PSDot11Counters p802_11Counter);
|
||||
|
||||
void
|
||||
STAvUpdateUSBCounter(
|
||||
PSUSBCounter pUsbCounter,
|
||||
NTSTATUS ntStatus
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __MIB_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: michael.cpp
|
||||
*
|
||||
* Purpose: The implementation of LIST data structure.
|
||||
*
|
||||
* Author: Kyle Hsu
|
||||
*
|
||||
* Date: Sep 4, 2002
|
||||
*
|
||||
* Functions:
|
||||
* s_dwGetUINT32 - Convert from BYTE[] to DWORD in a portable way
|
||||
* s_vPutUINT32 - Convert from DWORD to BYTE[] in a portable way
|
||||
* s_vClear - Reset the state to the empty message.
|
||||
* s_vSetKey - Set the key.
|
||||
* MIC_vInit - Set the key.
|
||||
* s_vAppendByte - Append the byte to our word-sized buffer.
|
||||
* MIC_vAppend - call s_vAppendByte.
|
||||
* MIC_vGetMIC - Append the minimum padding and call s_vAppendByte.
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__MICHAEL_H__)
|
||||
#include "michael.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
/*
|
||||
static DWORD s_dwGetUINT32(BYTE * p); // Get DWORD from 4 bytes LSByte first
|
||||
static VOID s_vPutUINT32(BYTE* p, DWORD val); // Put DWORD into 4 bytes LSByte first
|
||||
*/
|
||||
static VOID s_vClear(void); // Clear the internal message,
|
||||
// resets the object to the state just after construction.
|
||||
static VOID s_vSetKey(DWORD dwK0, DWORD dwK1);
|
||||
static VOID s_vAppendByte(BYTE b); // Add a single byte to the internal message
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
static DWORD L, R; // Current state
|
||||
|
||||
static DWORD K0, K1; // Key
|
||||
static DWORD M; // Message accumulator (single word)
|
||||
static UINT nBytesInM; // # bytes in M
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
/*
|
||||
static DWORD s_dwGetUINT32 (BYTE * p)
|
||||
// Convert from BYTE[] to DWORD in a portable way
|
||||
{
|
||||
DWORD res = 0;
|
||||
UINT i;
|
||||
for(i=0; i<4; i++ )
|
||||
{
|
||||
res |= (*p++) << (8*i);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static VOID s_vPutUINT32 (BYTE* p, DWORD val)
|
||||
// Convert from DWORD to BYTE[] in a portable way
|
||||
{
|
||||
UINT i;
|
||||
for(i=0; i<4; i++ )
|
||||
{
|
||||
*p++ = (BYTE) (val & 0xff);
|
||||
val >>= 8;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
static VOID s_vClear (void)
|
||||
{
|
||||
// Reset the state to the empty message.
|
||||
L = K0;
|
||||
R = K1;
|
||||
nBytesInM = 0;
|
||||
M = 0;
|
||||
}
|
||||
|
||||
static VOID s_vSetKey (DWORD dwK0, DWORD dwK1)
|
||||
{
|
||||
// Set the key
|
||||
K0 = dwK0;
|
||||
K1 = dwK1;
|
||||
// and reset the message
|
||||
s_vClear();
|
||||
}
|
||||
|
||||
static VOID s_vAppendByte (BYTE b)
|
||||
{
|
||||
// Append the byte to our word-sized buffer
|
||||
M |= b << (8*nBytesInM);
|
||||
nBytesInM++;
|
||||
// Process the word if it is full.
|
||||
if( nBytesInM >= 4 )
|
||||
{
|
||||
L ^= M;
|
||||
R ^= ROL32( L, 17 );
|
||||
L += R;
|
||||
R ^= ((L & 0xff00ff00) >> 8) | ((L & 0x00ff00ff) << 8);
|
||||
L += R;
|
||||
R ^= ROL32( L, 3 );
|
||||
L += R;
|
||||
R ^= ROR32( L, 2 );
|
||||
L += R;
|
||||
// Clear the buffer
|
||||
M = 0;
|
||||
nBytesInM = 0;
|
||||
}
|
||||
}
|
||||
|
||||
VOID MIC_vInit (DWORD dwK0, DWORD dwK1)
|
||||
{
|
||||
// Set the key
|
||||
s_vSetKey(dwK0, dwK1);
|
||||
}
|
||||
|
||||
|
||||
VOID MIC_vUnInit (void)
|
||||
{
|
||||
// Wipe the key material
|
||||
K0 = 0;
|
||||
K1 = 0;
|
||||
|
||||
// And the other fields as well.
|
||||
//Note that this sets (L,R) to (K0,K1) which is just fine.
|
||||
s_vClear();
|
||||
}
|
||||
|
||||
VOID MIC_vAppend (PBYTE src, UINT nBytes)
|
||||
{
|
||||
// This is simple
|
||||
while (nBytes > 0)
|
||||
{
|
||||
s_vAppendByte(*src++);
|
||||
nBytes--;
|
||||
}
|
||||
}
|
||||
|
||||
VOID MIC_vGetMIC (PDWORD pdwL, PDWORD pdwR)
|
||||
{
|
||||
// Append the minimum padding
|
||||
s_vAppendByte(0x5a);
|
||||
s_vAppendByte(0);
|
||||
s_vAppendByte(0);
|
||||
s_vAppendByte(0);
|
||||
s_vAppendByte(0);
|
||||
// and then zeroes until the length is a multiple of 4
|
||||
while( nBytesInM != 0 )
|
||||
{
|
||||
s_vAppendByte(0);
|
||||
}
|
||||
// The s_vAppendByte function has already computed the result.
|
||||
*pdwL = L;
|
||||
*pdwR = R;
|
||||
// Reset to the empty message.
|
||||
s_vClear();
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: Michael.h
|
||||
*
|
||||
* Purpose: Reference implementation for Michael
|
||||
* written by Niels Ferguson
|
||||
*
|
||||
* Author: Kyle Hsu
|
||||
*
|
||||
* Date: Jan 2, 2003
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __MICHAEL_H__
|
||||
#define __MICHAEL_H__
|
||||
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
VOID MIC_vInit(DWORD dwK0, DWORD dwK1);
|
||||
|
||||
VOID MIC_vUnInit(void);
|
||||
|
||||
// Append bytes to the message to be MICed
|
||||
VOID MIC_vAppend(PBYTE src, UINT nBytes);
|
||||
|
||||
// Get the MIC result. Destination should accept 8 bytes of result.
|
||||
// This also resets the message to empty.
|
||||
VOID MIC_vGetMIC(PDWORD pdwL, PDWORD pdwR);
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
// Rotation functions on 32 bit values
|
||||
#define ROL32( A, n ) \
|
||||
( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) )
|
||||
#define ROR32( A, n ) ROL32( (A), 32-(n) )
|
||||
|
||||
#endif //__MICHAEL_H__
|
||||
|
||||
|
|
@ -0,0 +1,458 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: power.c
|
||||
*
|
||||
* Purpose: Handles 802.11 power managment functions
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: July 17, 2002
|
||||
*
|
||||
* Functions:
|
||||
* PSvEnablePowerSaving - Enable Power Saving Mode
|
||||
* PSvDiasblePowerSaving - Disable Power Saving Mode
|
||||
* PSbConsiderPowerDown - Decide if we can Power Down
|
||||
* PSvSendPSPOLL - Send PS-POLL packet
|
||||
* PSbSendNullPacket - Send Null packet
|
||||
* PSbIsNextTBTTWakeUp - Decide if we need to wake up at next Beacon
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__MAC_H__)
|
||||
#include "mac.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__WMGR_H__)
|
||||
#include "wmgr.h"
|
||||
#endif
|
||||
#if !defined(__POWER_H__)
|
||||
#include "power.h"
|
||||
#endif
|
||||
#if !defined(__WCMD_H__)
|
||||
#include "wcmd.h"
|
||||
#endif
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__RXTX_H__)
|
||||
#include "rxtx.h"
|
||||
#endif
|
||||
#if !defined(__CARD_H__)
|
||||
#include "card.h"
|
||||
#endif
|
||||
#if !defined(__CONTROL_H__)
|
||||
#include "control.h"
|
||||
#endif
|
||||
#if !defined(__RNDIS_H__)
|
||||
#include "rndis.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
/*+
|
||||
*
|
||||
* Routine Description:
|
||||
* Enable hw power saving functions
|
||||
*
|
||||
* Return Value:
|
||||
* None.
|
||||
*
|
||||
-*/
|
||||
|
||||
|
||||
VOID
|
||||
PSvEnablePowerSaving(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN WORD wListenInterval
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice)hDeviceContext;
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
WORD wAID = pMgmt->wCurrAID | BIT14 | BIT15;
|
||||
|
||||
// set period of power up before TBTT
|
||||
MACvWriteWord(pDevice, MAC_REG_PWBT, C_PWBT);
|
||||
|
||||
if (pDevice->eOPMode != OP_MODE_ADHOC) {
|
||||
// set AID
|
||||
MACvWriteWord(pDevice, MAC_REG_AIDATIM, wAID);
|
||||
} else {
|
||||
// set ATIM Window
|
||||
//MACvWriteATIMW(pDevice->PortOffset, pMgmt->wCurrATIMWindow);
|
||||
}
|
||||
|
||||
//Warren:06-18-2004,the sequence must follow PSEN->AUTOSLEEP->GO2DOZE
|
||||
// enable power saving hw function
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_PSEN);
|
||||
// Set AutoSleep
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCFG, PSCFG_AUTOSLEEP);
|
||||
|
||||
//Warren:MUST turn on this once before turn on AUTOSLEEP ,or the AUTOSLEEP doesn't work
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_GO2DOZE);
|
||||
|
||||
|
||||
if (wListenInterval >= 2) {
|
||||
|
||||
// clear always listen beacon
|
||||
MACvRegBitsOff(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN);
|
||||
// first time set listen next beacon
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN);
|
||||
|
||||
pMgmt->wCountToWakeUp = wListenInterval;
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
// always listen beacon
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN);
|
||||
pMgmt->wCountToWakeUp = 0;
|
||||
|
||||
}
|
||||
|
||||
pDevice->bEnablePSMode = TRUE;
|
||||
|
||||
if (pDevice->eOPMode == OP_MODE_ADHOC) {
|
||||
// bMgrPrepareBeaconToSend((HANDLE)pDevice, pMgmt);
|
||||
}
|
||||
// We don't send null pkt in ad hoc mode since beacon will handle this.
|
||||
else if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) {
|
||||
PSbSendNullPacket(pDevice);
|
||||
}
|
||||
pDevice->bPWBitOn = TRUE;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "PS:Power Saving Mode Enable... \n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Routine Description:
|
||||
* Disable hw power saving functions
|
||||
*
|
||||
* Return Value:
|
||||
* None.
|
||||
*
|
||||
-*/
|
||||
|
||||
VOID
|
||||
PSvDisablePowerSaving(
|
||||
IN HANDLE hDeviceContext
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice)hDeviceContext;
|
||||
// PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
|
||||
|
||||
// disable power saving hw function
|
||||
CONTROLnsRequestOut(pDevice,
|
||||
MESSAGE_TYPE_DISABLE_PS,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
NULL
|
||||
);
|
||||
|
||||
//clear AutoSleep
|
||||
MACvRegBitsOff(pDevice, MAC_REG_PSCFG, PSCFG_AUTOSLEEP);
|
||||
|
||||
// set always listen beacon
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN);
|
||||
|
||||
pDevice->bEnablePSMode = FALSE;
|
||||
|
||||
if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) {
|
||||
PSbSendNullPacket(pDevice);
|
||||
}
|
||||
pDevice->bPWBitOn = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Routine Description:
|
||||
* Consider to power down when no more packets to tx or rx.
|
||||
*
|
||||
* Return Value:
|
||||
* TRUE, if power down success
|
||||
* FALSE, if fail
|
||||
-*/
|
||||
|
||||
|
||||
BOOL
|
||||
PSbConsiderPowerDown(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN BOOL bCheckRxDMA,
|
||||
IN BOOL bCheckCountToWakeUp
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice)hDeviceContext;
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
BYTE byData;
|
||||
|
||||
|
||||
// check if already in Doze mode
|
||||
ControlvReadByte(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_PSCTL, &byData);
|
||||
if ( (byData & PSCTL_PS) != 0 )
|
||||
return TRUE;;
|
||||
|
||||
if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) {
|
||||
// check if in TIM wake period
|
||||
if (pMgmt->bInTIMWake)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// check scan state
|
||||
if (pDevice->bCmdRunning)
|
||||
return FALSE;
|
||||
|
||||
//Tx Burst
|
||||
if ( pDevice->bPSModeTxBurst )
|
||||
return FALSE;
|
||||
|
||||
// Froce PSEN on
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_PSEN);
|
||||
|
||||
if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) {
|
||||
if (bCheckCountToWakeUp &&
|
||||
(pMgmt->wCountToWakeUp == 0 || pMgmt->wCountToWakeUp == 1)) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
pDevice->bPSRxBeacon = TRUE;
|
||||
// no Tx, no Rx isr, now go to Doze
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_GO2DOZE);
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Go to Doze ZZZZZZZZZZZZZZZ\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Routine Description:
|
||||
* Send PS-POLL packet
|
||||
*
|
||||
* Return Value:
|
||||
* None.
|
||||
*
|
||||
-*/
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
PSvSendPSPOLL(
|
||||
IN HANDLE hDeviceContext
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice)hDeviceContext;
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
PSTxMgmtPacket pTxPacket = NULL;
|
||||
|
||||
|
||||
memset(pMgmt->pbyPSPacketPool, 0, sizeof(STxMgmtPacket) + WLAN_HDR_ADDR2_LEN);
|
||||
pTxPacket = (PSTxMgmtPacket)pMgmt->pbyPSPacketPool;
|
||||
pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
|
||||
pTxPacket->p80211Header->sA2.wFrameCtl = cpu_to_le16(
|
||||
(
|
||||
WLAN_SET_FC_FTYPE(WLAN_TYPE_CTL) |
|
||||
WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PSPOLL) |
|
||||
WLAN_SET_FC_PWRMGT(0)
|
||||
));
|
||||
pTxPacket->p80211Header->sA2.wDurationID = pMgmt->wCurrAID | BIT14 | BIT15;
|
||||
memcpy(pTxPacket->p80211Header->sA2.abyAddr1, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
|
||||
memcpy(pTxPacket->p80211Header->sA2.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
|
||||
pTxPacket->cbMPDULen = WLAN_HDR_ADDR2_LEN;
|
||||
pTxPacket->cbPayloadLen = 0;
|
||||
// send the frame
|
||||
if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Send PS-Poll packet failed..\n");
|
||||
}
|
||||
else {
|
||||
// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Send PS-Poll packet success..\n");
|
||||
};
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Routine Description:
|
||||
* Send NULL packet to AP for notification power state of STA
|
||||
*
|
||||
* Return Value:
|
||||
* None.
|
||||
*
|
||||
-*/
|
||||
BOOL
|
||||
PSbSendNullPacket(
|
||||
IN HANDLE hDeviceContext
|
||||
)
|
||||
{
|
||||
PSDevice pDevice = (PSDevice)hDeviceContext;
|
||||
PSTxMgmtPacket pTxPacket = NULL;
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
|
||||
|
||||
|
||||
if (pDevice->bLinkPass == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//2007-0115-03<Add>by MikeLiu
|
||||
#ifdef TxInSleep
|
||||
if ((pDevice->bEnablePSMode == FALSE) &&
|
||||
(pDevice->fTxDataInSleep == FALSE)){
|
||||
return FALSE;
|
||||
}
|
||||
#else
|
||||
if (pDevice->bEnablePSMode == FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
memset(pMgmt->pbyPSPacketPool, 0, sizeof(STxMgmtPacket) + WLAN_NULLDATA_FR_MAXLEN);
|
||||
pTxPacket = (PSTxMgmtPacket)pMgmt->pbyPSPacketPool;
|
||||
pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
|
||||
|
||||
if (pDevice->bEnablePSMode) {
|
||||
|
||||
pTxPacket->p80211Header->sA3.wFrameCtl = cpu_to_le16(
|
||||
(
|
||||
WLAN_SET_FC_FTYPE(WLAN_TYPE_DATA) |
|
||||
WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_NULL) |
|
||||
WLAN_SET_FC_PWRMGT(1)
|
||||
));
|
||||
}
|
||||
else {
|
||||
pTxPacket->p80211Header->sA3.wFrameCtl = cpu_to_le16(
|
||||
(
|
||||
WLAN_SET_FC_FTYPE(WLAN_TYPE_DATA) |
|
||||
WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_NULL) |
|
||||
WLAN_SET_FC_PWRMGT(0)
|
||||
));
|
||||
}
|
||||
|
||||
if(pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) {
|
||||
pTxPacket->p80211Header->sA3.wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_TODS(1));
|
||||
}
|
||||
|
||||
memcpy(pTxPacket->p80211Header->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
|
||||
memcpy(pTxPacket->p80211Header->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
|
||||
memcpy(pTxPacket->p80211Header->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
|
||||
pTxPacket->cbMPDULen = WLAN_HDR_ADDR3_LEN;
|
||||
pTxPacket->cbPayloadLen = 0;
|
||||
// send the frame
|
||||
if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Send Null Packet failed !\n");
|
||||
return FALSE;
|
||||
}
|
||||
else {
|
||||
// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Send Null Packet success....\n");
|
||||
}
|
||||
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
/*+
|
||||
*
|
||||
* Routine Description:
|
||||
* Check if Next TBTT must wake up
|
||||
*
|
||||
* Return Value:
|
||||
* None.
|
||||
*
|
||||
-*/
|
||||
|
||||
BOOL
|
||||
PSbIsNextTBTTWakeUp(
|
||||
IN HANDLE hDeviceContext
|
||||
)
|
||||
{
|
||||
|
||||
PSDevice pDevice = (PSDevice)hDeviceContext;
|
||||
PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
|
||||
BOOL bWakeUp = FALSE;
|
||||
|
||||
if (pMgmt->wListenInterval >= 2) {
|
||||
if (pMgmt->wCountToWakeUp == 0) {
|
||||
pMgmt->wCountToWakeUp = pMgmt->wListenInterval;
|
||||
}
|
||||
|
||||
pMgmt->wCountToWakeUp --;
|
||||
|
||||
if (pMgmt->wCountToWakeUp == 1) {
|
||||
|
||||
// Turn on wake up to listen next beacon
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN);
|
||||
pDevice->bPSRxBeacon = FALSE;
|
||||
bWakeUp = TRUE;
|
||||
|
||||
} else if ( !pDevice->bPSRxBeacon ) {
|
||||
//Listen until RxBeacon
|
||||
MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return bWakeUp;
|
||||
}
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: power.h
|
||||
*
|
||||
* Purpose: Handles 802.11 power managment functions
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: July 17, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __POWER_H__
|
||||
#define __POWER_H__
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
#define C_PWBT 1000 // micro sec. power up before TBTT
|
||||
#define PS_FAST_INTERVAL 1 // Fast power saving listen interval
|
||||
#define PS_MAX_INTERVAL 4 // MAX power saving listen interval
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
// IN PSDevice pDevice
|
||||
// IN PSDevice hDeviceContext
|
||||
|
||||
BOOL
|
||||
PSbConsiderPowerDown(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN BOOL bCheckRxDMA,
|
||||
IN BOOL bCheckCountToWakeUp
|
||||
);
|
||||
|
||||
VOID
|
||||
PSvDisablePowerSaving(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
VOID
|
||||
PSvEnablePowerSaving(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN WORD wListenInterval
|
||||
);
|
||||
|
||||
VOID
|
||||
PSvSendPSPOLL(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
BOOL
|
||||
PSbSendNullPacket(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
BOOL
|
||||
PSbIsNextTBTTWakeUp(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
#endif //__POWER_H__
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: rc4.c
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Functions:
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
* Author: Kyle Hsu
|
||||
*
|
||||
* Date: Sep 4, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(__RC4_H__)
|
||||
#include "rc4.h"
|
||||
#endif
|
||||
|
||||
VOID rc4_init(PRC4Ext pRC4, PBYTE pbyKey, UINT cbKey_len)
|
||||
{
|
||||
UINT ust1, ust2;
|
||||
UINT keyindex;
|
||||
UINT stateindex;
|
||||
PBYTE pbyst;
|
||||
UINT idx;
|
||||
|
||||
pbyst = pRC4->abystate;
|
||||
pRC4->ux = 0;
|
||||
pRC4->uy = 0;
|
||||
for (idx = 0; idx < 256; idx++)
|
||||
pbyst[idx] = (BYTE)idx;
|
||||
keyindex = 0;
|
||||
stateindex = 0;
|
||||
for (idx = 0; idx < 256; idx++) {
|
||||
ust1 = pbyst[idx];
|
||||
stateindex = (stateindex + pbyKey[keyindex] + ust1) & 0xff;
|
||||
ust2 = pbyst[stateindex];
|
||||
pbyst[stateindex] = (BYTE)ust1;
|
||||
pbyst[idx] = (BYTE)ust2;
|
||||
if (++keyindex >= cbKey_len)
|
||||
keyindex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
UINT rc4_byte(PRC4Ext pRC4)
|
||||
{
|
||||
UINT ux;
|
||||
UINT uy;
|
||||
UINT ustx, usty;
|
||||
PBYTE pbyst;
|
||||
|
||||
pbyst = pRC4->abystate;
|
||||
ux = (pRC4->ux + 1) & 0xff;
|
||||
ustx = pbyst[ux];
|
||||
uy = (ustx + pRC4->uy) & 0xff;
|
||||
usty = pbyst[uy];
|
||||
pRC4->ux = ux;
|
||||
pRC4->uy = uy;
|
||||
pbyst[uy] = (BYTE)ustx;
|
||||
pbyst[ux] = (BYTE)usty;
|
||||
|
||||
return pbyst[(ustx + usty) & 0xff];
|
||||
}
|
||||
|
||||
VOID rc4_encrypt(PRC4Ext pRC4, PBYTE pbyDest,
|
||||
PBYTE pbySrc, UINT cbData_len)
|
||||
{
|
||||
UINT ii;
|
||||
for (ii = 0; ii < cbData_len; ii++)
|
||||
pbyDest[ii] = (BYTE)(pbySrc[ii] ^ rc4_byte(pRC4));
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* File: rc4.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Functions:
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
* Author: Kyle Hsu
|
||||
*
|
||||
* Date: Sep 4, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __RC4_H__
|
||||
#define __RC4_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
typedef struct {
|
||||
UINT ux;
|
||||
UINT uy;
|
||||
BYTE abystate[256];
|
||||
} RC4Ext, DEF* PRC4Ext;
|
||||
|
||||
VOID rc4_init(PRC4Ext pRC4, PBYTE pbyKey, UINT cbKey_len);
|
||||
UINT rc4_byte(PRC4Ext pRC4);
|
||||
void rc4_encrypt(PRC4Ext pRC4, PBYTE pbyDest, PBYTE pbySrc, UINT cbData_len);
|
||||
|
||||
#endif //__RC4_H__
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: rf.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Feb. 19, 2004
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __RF_H__
|
||||
#define __RF_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
//
|
||||
// Baseband RF pair definition in eeprom (Bits 6..0)
|
||||
//
|
||||
#define RF_RFMD2959 0x01
|
||||
#define RF_MAXIMAG 0x02
|
||||
#define RF_AL2230 0x03
|
||||
#define RF_GCT5103 0x04
|
||||
#define RF_UW2451 0x05
|
||||
#define RF_MAXIMG 0x06
|
||||
#define RF_MAXIM2829 0x07
|
||||
#define RF_UW2452 0x08
|
||||
#define RF_VT3226 0x09
|
||||
#define RF_AIROHA7230 0x0a
|
||||
#define RF_UW2453 0x0b
|
||||
#define RF_VT3226D0 0x0c //RobertYu:20051114
|
||||
#define RF_VT3342A0 0x0d //RobertYu:20060609
|
||||
#define RF_AL2230S 0x0e
|
||||
|
||||
#define RF_EMU 0x80
|
||||
#define RF_MASK 0x7F
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
extern const BYTE RFaby11aChannelIndex[200];
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
BOOL IFRFbWriteEmbeded(PSDevice pDevice, DWORD dwData);
|
||||
BOOL RFbSetPower (
|
||||
IN PSDevice pDevice,
|
||||
IN UINT uRATE,
|
||||
IN UINT uCH
|
||||
);
|
||||
|
||||
BOOL RFbRawSetPower(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byPwr,
|
||||
IN UINT uRATE
|
||||
);
|
||||
|
||||
VOID
|
||||
RFvRSSITodBm (
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byCurrRSSI,
|
||||
OUT PLONG pldBm
|
||||
);
|
||||
|
||||
VOID
|
||||
RFbRFTableDownload (
|
||||
IN PSDevice pDevice
|
||||
);
|
||||
|
||||
BOOL s_bVT3226D0_11bLoCurrentAdjust(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byChannel,
|
||||
IN BOOL b11bMode
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif // __RF_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,162 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: rndis.h
|
||||
*
|
||||
* Purpose: Interface between firmware and driver
|
||||
*
|
||||
* Author: Warren Hsu
|
||||
*
|
||||
* Date: Nov 24, 2004
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __RNDIS_H__
|
||||
#define __RNDIS_H__
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
#define MESSAGE_TYPE_READ 0x01
|
||||
#define MESSAGE_TYPE_WRITE 0x00
|
||||
#define MESSAGE_TYPE_LOCK_OR 0x02
|
||||
#define MESSAGE_TYPE_LOCK_AND 0x03
|
||||
#define MESSAGE_TYPE_WRITE_MASK 0x04
|
||||
#define MESSAGE_TYPE_CARDINIT 0x05
|
||||
#define MESSAGE_TYPE_INIT_RSP 0x06
|
||||
#define MESSAGE_TYPE_MACSHUTDOWN 0x07
|
||||
#define MESSAGE_TYPE_SETKEY 0x08
|
||||
#define MESSAGE_TYPE_CLRKEYENTRY 0x09
|
||||
#define MESSAGE_TYPE_WRITE_MISCFF 0x0A
|
||||
#define MESSAGE_TYPE_SET_ANTMD 0x0B
|
||||
#define MESSAGE_TYPE_SELECT_CHANNLE 0x0C
|
||||
#define MESSAGE_TYPE_SET_TSFTBTT 0x0D
|
||||
#define MESSAGE_TYPE_SET_SSTIFS 0x0E
|
||||
#define MESSAGE_TYPE_CHANGE_BBTYPE 0x0F
|
||||
#define MESSAGE_TYPE_DISABLE_PS 0x10
|
||||
#define MESSAGE_TYPE_WRITE_IFRF 0x11
|
||||
|
||||
//used for read/write(index)
|
||||
#define MESSAGE_REQUEST_MEM 0x01
|
||||
#define MESSAGE_REQUEST_BBREG 0x02
|
||||
#define MESSAGE_REQUEST_MACREG 0x03
|
||||
#define MESSAGE_REQUEST_EEPROM 0x04
|
||||
#define MESSAGE_REQUEST_TSF 0x05
|
||||
#define MESSAGE_REQUEST_TBTT 0x06
|
||||
#define MESSAGE_REQUEST_BBAGC 0x07
|
||||
#define MESSAGE_REQUEST_VERSION 0x08
|
||||
#define MESSAGE_REQUEST_RF_INIT 0x09
|
||||
#define MESSAGE_REQUEST_RF_INIT2 0x0A
|
||||
#define MESSAGE_REQUEST_RF_CH0 0x0B
|
||||
#define MESSAGE_REQUEST_RF_CH1 0x0C
|
||||
#define MESSAGE_REQUEST_RF_CH2 0x0D
|
||||
|
||||
|
||||
#define VIAUSB20_PACKET_HEADER 0x04
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
typedef struct _CMD_MESSAGE
|
||||
{
|
||||
BYTE byData[256];
|
||||
} CMD_MESSAGE, *PCMD_MESSAGE;
|
||||
|
||||
typedef struct _CMD_WRITE_MASK
|
||||
{
|
||||
BYTE byData;
|
||||
BYTE byMask;
|
||||
} CMD_WRITE_MASK, *PCMD_WRITE_MASK;
|
||||
|
||||
typedef struct _CMD_CARD_INIT
|
||||
{
|
||||
BYTE byInitClass;
|
||||
BYTE bExistSWNetAddr;
|
||||
BYTE bySWNetAddr[6];
|
||||
BYTE byShortRetryLimit;
|
||||
BYTE byLongRetryLimit;
|
||||
} CMD_CARD_INIT, *PCMD_CARD_INIT;
|
||||
|
||||
typedef struct _RSP_CARD_INIT
|
||||
{
|
||||
BYTE byStatus;
|
||||
BYTE byNetAddr[6];
|
||||
BYTE byRFType;
|
||||
BYTE byMinChannel;
|
||||
BYTE byMaxChannel;
|
||||
} RSP_CARD_INIT, *PRSP_CARD_INIT;
|
||||
|
||||
typedef struct _CMD_SET_KEY
|
||||
{
|
||||
WORD wKCTL;
|
||||
BYTE abyMacAddr[6];
|
||||
BYTE abyKey[16];
|
||||
} CMD_SET_KEY, *PCMD_SET_KEY;
|
||||
|
||||
typedef struct _CMD_CLRKEY_ENTRY
|
||||
{
|
||||
BYTE abyKeyEntry[11];
|
||||
} CMD_CLRKEY_ENTRY, *PCMD_CLRKEY_ENTRY;
|
||||
|
||||
typedef struct _CMD_WRITE_MISCFF
|
||||
{
|
||||
DWORD adwMiscFFData[22][4]; //a key entry has only 22 dwords
|
||||
} CMD_WRITE_MISCFF, *PCMD_WRITE_MISCFF;
|
||||
|
||||
typedef struct _CMD_SET_TSFTBTT
|
||||
{
|
||||
BYTE abyTSF_TBTT[8];
|
||||
} CMD_SET_TSFTBTT, *PCMD_SET_TSFTBTT;
|
||||
|
||||
typedef struct _CMD_SET_SSTIFS
|
||||
{
|
||||
BYTE bySIFS;
|
||||
BYTE byDIFS;
|
||||
BYTE byEIFS;
|
||||
BYTE bySlotTime;
|
||||
BYTE byCwMax_Min;
|
||||
BYTE byBBCR10;
|
||||
} CMD_SET_SSTIFS, *PCMD_SET_SSTIFS;
|
||||
|
||||
typedef struct _CMD_CHANGE_BBTYPE
|
||||
{
|
||||
BYTE bySIFS;
|
||||
BYTE byDIFS;
|
||||
BYTE byEIFS;
|
||||
BYTE bySlotTime;
|
||||
BYTE byCwMax_Min;
|
||||
BYTE byBBCR10;
|
||||
BYTE byBB_BBType; //CR88
|
||||
BYTE byMAC_BBType;
|
||||
DWORD dwRSPINF_b_1;
|
||||
DWORD dwRSPINF_b_2;
|
||||
DWORD dwRSPINF_b_55;
|
||||
DWORD dwRSPINF_b_11;
|
||||
WORD wRSPINF_a[9];
|
||||
} CMD_CHANGE_BBTYPE, *PCMD_CHANGE_BBTYPE;
|
||||
|
||||
/*--------------------- Export Macros -------------------------*/
|
||||
|
||||
#define EXCH_WORD(w) ( (WORD)((WORD)(w)<<8) | (WORD)((WORD)(w)>>8) )
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
#endif // _RNDIS_H_
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,716 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: rxtx.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Jun. 27, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __RXTX_H__
|
||||
#define __RXTX_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__WCMD_H__)
|
||||
#include "wcmd.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
//
|
||||
// RTS buffer header
|
||||
//
|
||||
typedef struct tagSRTSDataF {
|
||||
WORD wFrameControl;
|
||||
WORD wDurationID;
|
||||
BYTE abyRA[U_ETHER_ADDR_LEN];
|
||||
BYTE abyTA[U_ETHER_ADDR_LEN];
|
||||
} SRTSDataF, DEF* PSRTSDataF;
|
||||
|
||||
//
|
||||
// CTS buffer header
|
||||
//
|
||||
typedef struct tagSCTSDataF {
|
||||
WORD wFrameControl;
|
||||
WORD wDurationID;
|
||||
BYTE abyRA[U_ETHER_ADDR_LEN];
|
||||
WORD wReserved;
|
||||
} SCTSDataF, DEF* PSCTSDataF;
|
||||
|
||||
//
|
||||
// MICHDR data header
|
||||
//
|
||||
typedef struct tagSMICHDR {
|
||||
DWORD adwHDR0[4];
|
||||
DWORD adwHDR1[4];
|
||||
DWORD adwHDR2[4];
|
||||
} SMICHDR, DEF* PSMICHDR;
|
||||
|
||||
|
||||
typedef struct tagSTX_NAF_G_RTS
|
||||
{
|
||||
//RsvTime
|
||||
WORD wRTSTxRrvTime_ba;
|
||||
WORD wRTSTxRrvTime_aa;
|
||||
WORD wRTSTxRrvTime_bb;
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
//RTS
|
||||
BYTE byRTSSignalField_b;
|
||||
BYTE byRTSServiceField_b;
|
||||
WORD wRTSTransmitLength_b;
|
||||
BYTE byRTSSignalField_a;
|
||||
BYTE byRTSServiceField_a;
|
||||
WORD wRTSTransmitLength_a;
|
||||
WORD wRTSDuration_ba;
|
||||
WORD wRTSDuration_aa;
|
||||
WORD wRTSDuration_bb;
|
||||
WORD wReserved3;
|
||||
SRTSDataF sRTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
|
||||
} TX_NAF_G_RTS, DEF* PTX_NAF_G_RTS;
|
||||
|
||||
typedef struct tagSTX_NAF_G_RTS_MIC
|
||||
{
|
||||
//RsvTime
|
||||
WORD wRTSTxRrvTime_ba;
|
||||
WORD wRTSTxRrvTime_aa;
|
||||
WORD wRTSTxRrvTime_bb;
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
SMICHDR sMICHDR;
|
||||
|
||||
//RTS
|
||||
BYTE byRTSSignalField_b;
|
||||
BYTE byRTSServiceField_b;
|
||||
WORD wRTSTransmitLength_b;
|
||||
BYTE byRTSSignalField_a;
|
||||
BYTE byRTSServiceField_a;
|
||||
WORD wRTSTransmitLength_a;
|
||||
WORD wRTSDuration_ba;
|
||||
WORD wRTSDuration_aa;
|
||||
WORD wRTSDuration_bb;
|
||||
WORD wReserved3;
|
||||
SRTSDataF sRTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
|
||||
} TX_NAF_G_RTS_MIC, DEF* PTX_NAF_G_RTS_MIC;
|
||||
|
||||
typedef struct tagSTX_NAF_G_CTS
|
||||
{
|
||||
//RsvTime
|
||||
WORD wCTSTxRrvTime_ba;
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
//CTS
|
||||
BYTE byCTSSignalField_b;
|
||||
BYTE byCTSServiceField_b;
|
||||
WORD wCTSTransmitLength_b;
|
||||
WORD wCTSDuration_ba;
|
||||
WORD wReserved3;
|
||||
SCTSDataF sCTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
|
||||
} TX_NAF_G_CTS, DEF* PTX_NAF_G_CTS;
|
||||
|
||||
|
||||
typedef struct tagSTX_NAF_G_CTS_MIC
|
||||
{
|
||||
//RsvTime
|
||||
WORD wCTSTxRrvTime_ba;
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
|
||||
SMICHDR sMICHDR;
|
||||
|
||||
//CTS
|
||||
BYTE byCTSSignalField_b;
|
||||
BYTE byCTSServiceField_b;
|
||||
WORD wCTSTransmitLength_b;
|
||||
WORD wCTSDuration_ba;
|
||||
WORD wReserved3;
|
||||
SCTSDataF sCTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
|
||||
} TX_NAF_G_CTS_MIC, DEF* PTX_NAF_G_CTS_MIC;
|
||||
|
||||
|
||||
typedef struct tagSTX_NAF_G_BEACON
|
||||
{
|
||||
WORD wFIFOCtl;
|
||||
WORD wTimeStamp;
|
||||
|
||||
//CTS
|
||||
BYTE byCTSSignalField_b;
|
||||
BYTE byCTSServiceField_b;
|
||||
WORD wCTSTransmitLength_b;
|
||||
WORD wCTSDuration_ba;
|
||||
WORD wReserved1;
|
||||
SCTSDataF sCTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_a;
|
||||
|
||||
|
||||
} TX_NAF_G_BEACON, DEF* PTX_NAF_G_BEACON;
|
||||
|
||||
|
||||
typedef struct tagSTX_NAF_AB_RTS
|
||||
{
|
||||
//RsvTime
|
||||
WORD wRTSTxRrvTime_ab;
|
||||
WORD wTxRrvTime_ab;
|
||||
|
||||
//RTS
|
||||
BYTE byRTSSignalField_ab;
|
||||
BYTE byRTSServiceField_ab;
|
||||
WORD wRTSTransmitLength_ab;
|
||||
WORD wRTSDuration_ab;
|
||||
WORD wReserved2;
|
||||
SRTSDataF sRTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_ab;
|
||||
BYTE byServiceField_ab;
|
||||
WORD wTransmitLength_ab;
|
||||
WORD wDuration_ab;
|
||||
WORD wTimeStampOff_ab;
|
||||
|
||||
|
||||
} TX_NAF_AB_RTS, DEF* PTX_NAF_AB_RTS;
|
||||
|
||||
|
||||
typedef struct tagSTX_NAF_AB_RTS_MIC
|
||||
{
|
||||
//RsvTime
|
||||
WORD wRTSTxRrvTime_ab;
|
||||
WORD wTxRrvTime_ab;
|
||||
|
||||
SMICHDR sMICHDR;
|
||||
|
||||
//RTS
|
||||
BYTE byRTSSignalField_ab;
|
||||
BYTE byRTSServiceField_ab;
|
||||
WORD wRTSTransmitLength_ab;
|
||||
WORD wRTSDuration_ab;
|
||||
WORD wReserved2;
|
||||
SRTSDataF sRTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_ab;
|
||||
BYTE byServiceField_ab;
|
||||
WORD wTransmitLength_ab;
|
||||
WORD wDuration_ab;
|
||||
WORD wTimeStampOff_ab;
|
||||
|
||||
|
||||
} TX_NAF_AB_RTS_MIC, DEF* PTX_NAF_AB_RTS_MIC;
|
||||
|
||||
|
||||
|
||||
typedef struct tagSTX_NAF_AB_CTS
|
||||
{
|
||||
//RsvTime
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_ab;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_ab;
|
||||
BYTE byServiceField_ab;
|
||||
WORD wTransmitLength_ab;
|
||||
WORD wDuration_ab;
|
||||
WORD wTimeStampOff_ab;
|
||||
|
||||
} TX_NAF_AB_CTS, DEF* PTX_NAF_AB_CTS;
|
||||
|
||||
typedef struct tagSTX_NAF_AB_CTS_MIC
|
||||
{
|
||||
//RsvTime
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_ab;
|
||||
|
||||
SMICHDR sMICHDR;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_ab;
|
||||
BYTE byServiceField_ab;
|
||||
WORD wTransmitLength_ab;
|
||||
WORD wDuration_ab;
|
||||
WORD wTimeStampOff_ab;
|
||||
|
||||
} TX_NAF_AB_CTS_MIC, DEF* PTX_NAF_AB_CTS_MIC;
|
||||
|
||||
|
||||
typedef struct tagSTX_NAF_AB_BEACON
|
||||
{
|
||||
WORD wFIFOCtl;
|
||||
WORD wTimeStamp;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_ab;
|
||||
BYTE byServiceField_ab;
|
||||
WORD wTransmitLength_ab;
|
||||
WORD wDuration_ab;
|
||||
WORD wTimeStampOff_ab;
|
||||
|
||||
} TX_NAF_AB_BEACON, DEF* PTX_NAF_AB_BEACON;
|
||||
|
||||
typedef struct tagSTX_AF_G_RTS
|
||||
{
|
||||
//RsvTime
|
||||
WORD wRTSTxRrvTime_ba;
|
||||
WORD wRTSTxRrvTime_aa;
|
||||
WORD wRTSTxRrvTime_bb;
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
//RTS
|
||||
BYTE byRTSSignalField_b;
|
||||
BYTE byRTSServiceField_b;
|
||||
WORD wRTSTransmitLength_b;
|
||||
BYTE byRTSSignalField_a;
|
||||
BYTE byRTSServiceField_a;
|
||||
WORD wRTSTransmitLength_a;
|
||||
WORD wRTSDuration_ba;
|
||||
WORD wRTSDuration_aa;
|
||||
WORD wRTSDuration_bb;
|
||||
WORD wReserved3;
|
||||
WORD wRTSDuration_ba_f0;
|
||||
WORD wRTSDuration_aa_f0;
|
||||
WORD wRTSDuration_ba_f1;
|
||||
WORD wRTSDuration_aa_f1;
|
||||
SRTSDataF sRTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wDuration_a_f0;
|
||||
WORD wDuration_a_f1;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
|
||||
} TX_AF_G_RTS, DEF* PTX_AF_G_RTS;
|
||||
|
||||
|
||||
typedef struct tagSTX_AF_G_RTS_MIC
|
||||
{
|
||||
//RsvTime
|
||||
WORD wRTSTxRrvTime_ba;
|
||||
WORD wRTSTxRrvTime_aa;
|
||||
WORD wRTSTxRrvTime_bb;
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
SMICHDR sMICHDR;
|
||||
|
||||
//RTS
|
||||
BYTE byRTSSignalField_b;
|
||||
BYTE byRTSServiceField_b;
|
||||
WORD wRTSTransmitLength_b;
|
||||
BYTE byRTSSignalField_a;
|
||||
BYTE byRTSServiceField_a;
|
||||
WORD wRTSTransmitLength_a;
|
||||
WORD wRTSDuration_ba;
|
||||
WORD wRTSDuration_aa;
|
||||
WORD wRTSDuration_bb;
|
||||
WORD wReserved3;
|
||||
WORD wRTSDuration_ba_f0;
|
||||
WORD wRTSDuration_aa_f0;
|
||||
WORD wRTSDuration_ba_f1;
|
||||
WORD wRTSDuration_aa_f1;
|
||||
SRTSDataF sRTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wDuration_a_f0;
|
||||
WORD wDuration_a_f1;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
|
||||
} TX_AF_G_RTS_MIC, DEF* PTX_AF_G_RTS_MIC;
|
||||
|
||||
|
||||
|
||||
typedef struct tagSTX_AF_G_CTS
|
||||
{
|
||||
//RsvTime
|
||||
WORD wCTSTxRrvTime_ba;
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
//CTS
|
||||
BYTE byCTSSignalField_b;
|
||||
BYTE byCTSServiceField_b;
|
||||
WORD wCTSTransmitLength_b;
|
||||
WORD wCTSDuration_ba;
|
||||
WORD wReserved3;
|
||||
WORD wCTSDuration_ba_f0;
|
||||
WORD wCTSDuration_ba_f1;
|
||||
SCTSDataF sCTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wDuration_a_f0;
|
||||
WORD wDuration_a_f1;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
|
||||
} TX_AF_G_CTS, DEF* PTX_AF_G_CTS;
|
||||
|
||||
|
||||
typedef struct tagSTX_AF_G_CTS_MIC
|
||||
{
|
||||
//RsvTime
|
||||
WORD wCTSTxRrvTime_ba;
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_b;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
|
||||
SMICHDR sMICHDR;
|
||||
|
||||
//CTS
|
||||
BYTE byCTSSignalField_b;
|
||||
BYTE byCTSServiceField_b;
|
||||
WORD wCTSTransmitLength_b;
|
||||
WORD wCTSDuration_ba;
|
||||
WORD wReserved3;
|
||||
WORD wCTSDuration_ba_f0;
|
||||
WORD wCTSDuration_ba_f1;
|
||||
SCTSDataF sCTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_b;
|
||||
BYTE byServiceField_b;
|
||||
WORD wTransmitLength_b;
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_b;
|
||||
WORD wDuration_a;
|
||||
WORD wDuration_a_f0;
|
||||
WORD wDuration_a_f1;
|
||||
WORD wTimeStampOff_b;
|
||||
WORD wTimeStampOff_a;
|
||||
|
||||
} TX_AF_G_CTS_MIC, DEF* PTX_AF_G_CTS_MIC;
|
||||
|
||||
|
||||
|
||||
typedef struct tagSTX_AF_A_RTS
|
||||
{
|
||||
//RsvTime
|
||||
WORD wRTSTxRrvTime_a;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
//RTS
|
||||
BYTE byRTSSignalField_a;
|
||||
BYTE byRTSServiceField_a;
|
||||
WORD wRTSTransmitLength_a;
|
||||
WORD wRTSDuration_a;
|
||||
WORD wReserved2;
|
||||
WORD wRTSDuration_a_f0;
|
||||
WORD wRTSDuration_a_f1;
|
||||
SRTSDataF sRTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_a;
|
||||
WORD wDuration_a_f0;
|
||||
WORD wDuration_a_f1;
|
||||
|
||||
} TX_AF_A_RTS, DEF* PTX_AF_A_RTS;
|
||||
|
||||
|
||||
typedef struct tagSTX_AF_A_RTS_MIC
|
||||
{
|
||||
//RsvTime
|
||||
WORD wRTSTxRrvTime_a;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
SMICHDR sMICHDR;
|
||||
|
||||
//RTS
|
||||
BYTE byRTSSignalField_a;
|
||||
BYTE byRTSServiceField_a;
|
||||
WORD wRTSTransmitLength_a;
|
||||
WORD wRTSDuration_a;
|
||||
WORD wReserved2;
|
||||
WORD wRTSDuration_a_f0;
|
||||
WORD wRTSDuration_a_f1;
|
||||
SRTSDataF sRTS;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_a;
|
||||
WORD wDuration_a_f0;
|
||||
WORD wDuration_a_f1;
|
||||
|
||||
} TX_AF_A_RTS_MIC, DEF* PTX_AF_A_RTS_MIC;
|
||||
|
||||
|
||||
|
||||
typedef struct tagSTX_AF_A_CTS
|
||||
{
|
||||
//RsvTime
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_a;
|
||||
WORD wDuration_a_f0;
|
||||
WORD wDuration_a_f1;
|
||||
|
||||
} TX_AF_A_CTS, DEF* PTX_AF_A_CTS;
|
||||
|
||||
|
||||
typedef struct tagSTX_AF_A_CTS_MIC
|
||||
{
|
||||
//RsvTime
|
||||
WORD wReserved2;
|
||||
WORD wTxRrvTime_a;
|
||||
|
||||
SMICHDR sMICHDR;
|
||||
|
||||
//Data
|
||||
BYTE bySignalField_a;
|
||||
BYTE byServiceField_a;
|
||||
WORD wTransmitLength_a;
|
||||
WORD wDuration_a;
|
||||
WORD wTimeStampOff_a;
|
||||
WORD wDuration_a_f0;
|
||||
WORD wDuration_a_f1;
|
||||
|
||||
} TX_AF_A_CTS_MIC, DEF* PTX_AF_A_CTS_MIC;
|
||||
|
||||
|
||||
//
|
||||
// union with all of the TX Buffer Type
|
||||
//
|
||||
typedef union tagUTX_BUFFER_CONTAINER
|
||||
{
|
||||
TX_NAF_G_RTS RTS_G;
|
||||
TX_NAF_G_RTS_MIC RTS_G_MIC;
|
||||
TX_NAF_G_CTS CTS_G;
|
||||
TX_NAF_G_CTS_MIC CTS_G_MIC;
|
||||
//TX_NAF_G_BEACON Beacon_G;
|
||||
TX_NAF_AB_RTS RTS_AB;
|
||||
TX_NAF_AB_RTS_MIC RTS_AB_MIC;
|
||||
TX_NAF_AB_CTS CTS_AB;
|
||||
TX_NAF_AB_CTS_MIC CTS_AB_MIC;
|
||||
//TX_NAF_AB_BEACON Beacon_AB;
|
||||
TX_AF_G_RTS RTS_G_AutoFB;
|
||||
TX_AF_G_RTS_MIC RTS_G_AutoFB_MIC;
|
||||
TX_AF_G_CTS CTS_G_AutoFB;
|
||||
TX_AF_G_CTS_MIC CTS_G_AutoFB_MIC;
|
||||
TX_AF_A_RTS RTS_A_AutoFB;
|
||||
TX_AF_A_RTS_MIC RTS_A_AutoFB_MIC;
|
||||
TX_AF_A_CTS CTS_A_AutoFB;
|
||||
TX_AF_A_CTS_MIC CTS_A_AutoFB_MIC;
|
||||
|
||||
} TX_BUFFER_CONTAINER, DEF* PTX_BUFFER_CONTAINER;
|
||||
|
||||
|
||||
//
|
||||
// Remote NDIS message format
|
||||
//
|
||||
typedef struct tagSTX_BUFFER
|
||||
{
|
||||
BYTE byType;
|
||||
BYTE byPKTNO;
|
||||
WORD wTxByteCount;
|
||||
|
||||
DWORD adwTxKey[4];
|
||||
WORD wFIFOCtl;
|
||||
WORD wTimeStamp;
|
||||
WORD wFragCtl;
|
||||
WORD wReserved;
|
||||
|
||||
|
||||
// Actual message
|
||||
TX_BUFFER_CONTAINER BufferHeader;
|
||||
|
||||
} TX_BUFFER, DEF* PTX_BUFFER;
|
||||
|
||||
|
||||
//
|
||||
// Remote NDIS message format
|
||||
//
|
||||
typedef struct tagSBEACON_BUFFER
|
||||
{
|
||||
BYTE byType;
|
||||
BYTE byPKTNO;
|
||||
WORD wTxByteCount;
|
||||
|
||||
WORD wFIFOCtl;
|
||||
WORD wTimeStamp;
|
||||
|
||||
// Actual message
|
||||
TX_BUFFER_CONTAINER BufferHeader;
|
||||
|
||||
} BEACON_BUFFER, DEF* PBEACON_BUFFER;
|
||||
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
BOOL
|
||||
bPacketToWirelessUsb(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byPktType,
|
||||
IN PBYTE usbPacketBuf,
|
||||
IN BOOL bNeedEncrypt,
|
||||
IN UINT cbPayloadSize,
|
||||
IN UINT uDMAIdx,
|
||||
IN PSEthernetHeader psEthHeader,
|
||||
IN PBYTE pPacket,
|
||||
IN PSKeyItem pTransmitKey,
|
||||
IN UINT uNodeIndex,
|
||||
IN WORD wCurrentRate,
|
||||
OUT UINT *pcbHeaderLen,
|
||||
OUT UINT *pcbTotalLen
|
||||
);
|
||||
|
||||
VOID vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb);
|
||||
NTSTATUS nsDMA_tx_packet(PSDevice pDevice, UINT uDMAIdx, struct sk_buff *skb);
|
||||
CMD_STATUS csMgmt_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket);
|
||||
CMD_STATUS csBeacon_xmit(PSDevice pDevice, PSTxMgmtPacket pPacket);
|
||||
BOOL bRelayPacketSend(PSDevice pDevice, PBYTE pbySkbData, UINT uDataLen, UINT uNodeIndex);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __RXTX_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: srom.h
|
||||
*
|
||||
* Purpose: Implement functions to access eeprom
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Jan 29, 2003
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __SROM_H__
|
||||
#define __SROM_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
#define EEP_MAX_CONTEXT_SIZE 256
|
||||
|
||||
#define CB_EEPROM_READBYTE_WAIT 900 //us
|
||||
|
||||
#define W_MAX_I2CRETRY 0x0fff
|
||||
|
||||
//
|
||||
// Contents in the EEPROM
|
||||
//
|
||||
#define EEP_OFS_PAR 0x00 // physical address
|
||||
#define EEP_OFS_ANTENNA 0x17
|
||||
#define EEP_OFS_RADIOCTL 0x18
|
||||
#define EEP_OFS_RFTYPE 0x1B // for select RF
|
||||
#define EEP_OFS_MINCHANNEL 0x1C // Min Channel #
|
||||
#define EEP_OFS_MAXCHANNEL 0x1D // Max Channel #
|
||||
#define EEP_OFS_SIGNATURE 0x1E //
|
||||
#define EEP_OFS_ZONETYPE 0x1F //
|
||||
#define EEP_OFS_RFTABLE 0x20 // RF POWER TABLE
|
||||
#define EEP_OFS_PWR_CCK 0x20
|
||||
#define EEP_OFS_SETPT_CCK 0x21
|
||||
#define EEP_OFS_PWR_OFDMG 0x23
|
||||
|
||||
|
||||
#define EEP_OFS_CALIB_TX_IQ 0x24
|
||||
#define EEP_OFS_CALIB_TX_DC 0x25
|
||||
#define EEP_OFS_CALIB_RX_IQ 0x26
|
||||
|
||||
#define EEP_OFS_MAJOR_VER 0x2E
|
||||
#define EEP_OFS_MINOR_VER 0x2F
|
||||
|
||||
#define EEP_OFS_CCK_PWR_TBL 0x30
|
||||
#define EEP_OFS_OFDM_PWR_TBL 0x40
|
||||
#define EEP_OFS_OFDMA_PWR_TBL 0x50
|
||||
|
||||
//
|
||||
// Bits in EEP_OFS_ANTENNA
|
||||
//
|
||||
#define EEP_ANTENNA_MAIN 0x01
|
||||
#define EEP_ANTENNA_AUX 0x02
|
||||
#define EEP_ANTINV 0x04
|
||||
|
||||
//
|
||||
// Bits in EEP_OFS_RADIOCTL
|
||||
//
|
||||
#define EEP_RADIOCTL_ENABLE 0x80
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
// AT24C02 eeprom contents
|
||||
// 2048 bits = 256 bytes = 128 words
|
||||
//
|
||||
typedef struct tagSSromReg {
|
||||
BYTE abyPAR[6]; // 0x00 (WORD)
|
||||
|
||||
WORD wSUB_VID; // 0x03 (WORD)
|
||||
WORD wSUB_SID;
|
||||
|
||||
BYTE byBCFG0; // 0x05 (WORD)
|
||||
BYTE byBCFG1;
|
||||
|
||||
BYTE byFCR0; // 0x06 (WORD)
|
||||
BYTE byFCR1;
|
||||
BYTE byPMC0; // 0x07 (WORD)
|
||||
BYTE byPMC1;
|
||||
BYTE byMAXLAT; // 0x08 (WORD)
|
||||
BYTE byMINGNT;
|
||||
BYTE byCFG0; // 0x09 (WORD)
|
||||
BYTE byCFG1;
|
||||
WORD wCISPTR; // 0x0A (WORD)
|
||||
WORD wRsv0; // 0x0B (WORD)
|
||||
WORD wRsv1; // 0x0C (WORD)
|
||||
BYTE byBBPAIR; // 0x0D (WORD)
|
||||
BYTE byRFTYPE;
|
||||
BYTE byMinChannel; // 0x0E (WORD)
|
||||
BYTE byMaxChannel;
|
||||
BYTE bySignature; // 0x0F (WORD)
|
||||
BYTE byCheckSum;
|
||||
|
||||
BYTE abyReserved0[96]; // 0x10 (WORD)
|
||||
BYTE abyCIS[128]; // 0x80 (WORD)
|
||||
} SSromReg, DEF* PSSromReg;
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __EEPROM_H__
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: tbit.h
|
||||
*
|
||||
* Purpose: Bit routines
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __TBIT_H__
|
||||
#define __TBIT_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
// test single bit on
|
||||
#define BITbIsBitOn(tData, tTestBit) \
|
||||
(((tData) & (tTestBit)) != 0)
|
||||
|
||||
// test single bit off
|
||||
#define BITbIsBitOff(tData, tTestBit) \
|
||||
(((tData) & (tTestBit)) == 0)
|
||||
|
||||
|
||||
#define BITbIsAllBitsOn(tData, tTestBit) \
|
||||
(((tData) & (tTestBit)) == (tTestBit))
|
||||
|
||||
#define BITbIsAllBitsOff(tData, tTestBit) \
|
||||
(((tData) & (tTestBit)) == 0)
|
||||
|
||||
#define BITbIsAnyBitsOn(tData, tTestBit) \
|
||||
(((tData) & (tTestBit)) != 0)
|
||||
|
||||
#define BITbIsAnyBitsOff(tData, tTestBit) \
|
||||
(((tData) & (tTestBit)) != (tTestBit))
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
#endif // __TBIT_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,207 @@
|
|||
/*
|
||||
* Copyright (c) 2003 VIA Networking, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: tcrc.c
|
||||
*
|
||||
* Purpose: Implement functions to caculate CRC
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
* Functions:
|
||||
* CRCdwCrc32 -
|
||||
* CRCdwGetCrc32 -
|
||||
* CRCdwGetCrc32Ex -
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__TCRC_H__)
|
||||
#include "tcrc.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
// 32-bit CRC table
|
||||
static const DWORD s_adwCrc32Table[256] = {
|
||||
0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
|
||||
0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
|
||||
0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
|
||||
0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
|
||||
0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
|
||||
0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
|
||||
0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
|
||||
0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
|
||||
0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
|
||||
0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
|
||||
0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
|
||||
0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
|
||||
0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
|
||||
0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
|
||||
0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
|
||||
0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
|
||||
0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
|
||||
0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
|
||||
0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
|
||||
0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
|
||||
0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
|
||||
0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
|
||||
0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
|
||||
0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
|
||||
0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
|
||||
0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
|
||||
0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
|
||||
0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
|
||||
0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
|
||||
0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
|
||||
0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
|
||||
0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
|
||||
0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
|
||||
0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
|
||||
0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
|
||||
0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
|
||||
0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
|
||||
0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
|
||||
0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
|
||||
0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
|
||||
0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
|
||||
0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
|
||||
0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
|
||||
0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
|
||||
0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
|
||||
0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
|
||||
0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
|
||||
0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
|
||||
0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
|
||||
0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
|
||||
0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
|
||||
0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
|
||||
0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
|
||||
0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
|
||||
0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
|
||||
0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
|
||||
0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
|
||||
0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
|
||||
0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
|
||||
0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
|
||||
0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
|
||||
0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
|
||||
0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
|
||||
0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL
|
||||
};
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Generate a CRC-32 from the data stream
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pbyData - the data stream
|
||||
* cbByte - the length of the stream
|
||||
* dwCrcSeed - Seed for CRC32
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: CRC-32
|
||||
*
|
||||
-*/
|
||||
DWORD CRCdwCrc32 (PBYTE pbyData, UINT cbByte, DWORD dwCrcSeed)
|
||||
{
|
||||
DWORD dwCrc;
|
||||
|
||||
dwCrc = dwCrcSeed;
|
||||
while (cbByte--) {
|
||||
dwCrc = s_adwCrc32Table[(BYTE)((dwCrc ^ (*pbyData)) & 0xFF)] ^ (dwCrc >> 8);
|
||||
pbyData++;
|
||||
}
|
||||
|
||||
return dwCrc;
|
||||
}
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* To test CRC generator, input 8 bytes packet
|
||||
* -- 0xff 0xff 0xff 0xff 0x00 0x00 0x00 0x00
|
||||
* the generated CRC should be
|
||||
* -- 0xff 0xff 0xff 0xff
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pbyData - the data stream
|
||||
* cbByte - the length of the stream
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: CRC-32
|
||||
*
|
||||
-*/
|
||||
DWORD CRCdwGetCrc32 (PBYTE pbyData, UINT cbByte)
|
||||
{
|
||||
return ~CRCdwCrc32(pbyData, cbByte, 0xFFFFFFFFL);
|
||||
}
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* NOTE.... Because CRCdwGetCrc32Ex() is an iteration function,
|
||||
* this means we will use the output of CRCdwGetCrc32Ex()
|
||||
* to be a new argument to do next CRCdwGetCrc32Ex() calculation.
|
||||
* Thus, the final result must be inverted to be the
|
||||
* correct answer.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pbyData - the data stream
|
||||
* cbByte - the length of the stream
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: CRC-32
|
||||
*
|
||||
-*/
|
||||
DWORD CRCdwGetCrc32Ex(PBYTE pbyData, UINT cbByte, DWORD dwPreCRC)
|
||||
{
|
||||
return CRCdwCrc32(pbyData, cbByte, dwPreCRC);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* Copyright (c) 2003 VIA Networking, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: tcrc.h
|
||||
*
|
||||
* Purpose: Implement functions to caculate CRC
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: Jan. 28, 1997
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __TCRC_H__
|
||||
#define __TCRC_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
DWORD CRCdwCrc32(PBYTE pbyData, UINT cbByte, DWORD dwCrcSeed);
|
||||
DWORD CRCdwGetCrc32(PBYTE pbyData, UINT cbByte);
|
||||
DWORD CRCdwGetCrc32Ex(PBYTE pbyData, UINT cbByte, DWORD dwPreCRC);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __TCRC_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* Copyright (c) 2003 VIA Networking, Inc. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: tether.c
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
* Functions:
|
||||
* ETHbyGetHashIndexByCrc32 - Caculate multicast hash value by CRC32
|
||||
* ETHbIsBufferCrc32Ok - Check CRC value of the buffer if Ok or not
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__TCRC_H__)
|
||||
#include "tcrc.h"
|
||||
#endif
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description: Caculate multicast hash value by CRC32
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pbyMultiAddr - Multicast Address
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: Hash value
|
||||
*
|
||||
*/
|
||||
BYTE ETHbyGetHashIndexByCrc32 (PBYTE pbyMultiAddr)
|
||||
{
|
||||
int ii;
|
||||
BYTE byTmpHash;
|
||||
BYTE byHash = 0;
|
||||
|
||||
// get the least 6-bits from CRC generator
|
||||
byTmpHash = (BYTE)(CRCdwCrc32(pbyMultiAddr, U_ETHER_ADDR_LEN,
|
||||
0xFFFFFFFFL) & 0x3F);
|
||||
// reverse most bit to least bit
|
||||
for (ii = 0; ii < (sizeof(byTmpHash) * 8); ii++) {
|
||||
byHash <<= 1;
|
||||
if (BITbIsBitOn(byTmpHash, 0x01))
|
||||
byHash |= 1;
|
||||
byTmpHash >>= 1;
|
||||
}
|
||||
|
||||
// adjust 6-bits to the right most
|
||||
return (byHash >> 2);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Check CRC value of the buffer if Ok or not
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pbyBuffer - pointer of buffer (normally is rx buffer)
|
||||
* cbFrameLength - length of buffer, including CRC portion
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if ok; FALSE if error.
|
||||
*
|
||||
*/
|
||||
BOOL ETHbIsBufferCrc32Ok (PBYTE pbyBuffer, UINT cbFrameLength)
|
||||
{
|
||||
DWORD dwCRC;
|
||||
|
||||
dwCRC = CRCdwGetCrc32(pbyBuffer, cbFrameLength - 4);
|
||||
if (cpu_to_le32(*((PDWORD)(pbyBuffer + cbFrameLength - 4))) != dwCRC) {
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -0,0 +1,256 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: tether.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: Jan. 28, 1997
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef __TETHER_H__
|
||||
#define __TETHER_H__
|
||||
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
//
|
||||
// constants
|
||||
//
|
||||
#define U_ETHER_ADDR_LEN 6 // Ethernet address length
|
||||
#define U_TYPE_LEN 2 //
|
||||
#define U_CRC_LEN 4 //
|
||||
#define U_HEADER_LEN (U_ETHER_ADDR_LEN * 2 + U_TYPE_LEN)
|
||||
#define U_ETHER_ADDR_STR_LEN (U_ETHER_ADDR_LEN * 2 + 1)
|
||||
// Ethernet address string length
|
||||
|
||||
#define MIN_DATA_LEN 46 // min data length
|
||||
#define MAX_DATA_LEN 1500 // max data length
|
||||
|
||||
#define MIN_PACKET_LEN (MIN_DATA_LEN + U_HEADER_LEN)
|
||||
// 60
|
||||
// min total packet length (tx)
|
||||
#define MAX_PACKET_LEN (MAX_DATA_LEN + U_HEADER_LEN)
|
||||
// 1514
|
||||
// max total packet length (tx)
|
||||
|
||||
#define MAX_LOOKAHEAD_SIZE MAX_PACKET_LEN
|
||||
|
||||
#define U_MULTI_ADDR_LEN 8 // multicast address length
|
||||
|
||||
|
||||
#ifdef __BIG_ENDIAN
|
||||
|
||||
#define TYPE_PKT_IP 0x0800 //
|
||||
#define TYPE_PKT_ARP 0x0806 //
|
||||
#define TYPE_PKT_RARP 0x8035 //
|
||||
#define TYPE_PKT_IPX 0x8137 //
|
||||
#define TYPE_PKT_802_1x 0x888e
|
||||
#define TYPE_PKT_PreAuth 0x88C7
|
||||
|
||||
#define TYPE_PKT_PING_M_REQ 0x8011 // master reguest
|
||||
#define TYPE_PKT_PING_S_GNT 0x8022 // slave grant
|
||||
#define TYPE_PKT_PING_M 0x8077 // pingpong master packet
|
||||
#define TYPE_PKT_PING_S 0x8088 // pingpong slave packet
|
||||
#define TYPE_PKT_WOL_M_REQ 0x8033 // WOL waker request
|
||||
#define TYPE_PKT_WOL_S_GNT 0x8044 // WOL sleeper grant
|
||||
#define TYPE_MGMT_PROBE_RSP 0x5000
|
||||
#define TYPE_PKT_VNT_DIAG 0x8011 // Diag Pkt
|
||||
#define TYPE_PKT_VNT_PER 0x8888 // Diag PER Pkt
|
||||
//
|
||||
// wFrameCtl field in the S802_11Header
|
||||
//
|
||||
// NOTE....
|
||||
// in network byte order, high byte is going first
|
||||
#define FC_TODS 0x0001
|
||||
#define FC_FROMDS 0x0002
|
||||
#define FC_MOREFRAG 0x0004
|
||||
#define FC_RETRY 0x0008
|
||||
#define FC_POWERMGT 0x0010
|
||||
#define FC_MOREDATA 0x0020
|
||||
#define FC_WEP 0x0040
|
||||
#define TYPE_802_11_ATIM 0x9000
|
||||
|
||||
#define TYPE_802_11_DATA 0x0800
|
||||
#define TYPE_802_11_CTL 0x0400
|
||||
#define TYPE_802_11_MGMT 0x0000
|
||||
#define TYPE_802_11_MASK 0x0C00
|
||||
#define TYPE_SUBTYPE_MASK 0xFC00
|
||||
#define TYPE_802_11_NODATA 0x4000
|
||||
#define TYPE_DATE_NULL 0x4800
|
||||
|
||||
#define TYPE_CTL_PSPOLL 0xa400
|
||||
#define TYPE_CTL_RTS 0xb400
|
||||
#define TYPE_CTL_CTS 0xc400
|
||||
#define TYPE_CTL_ACK 0xd400
|
||||
|
||||
|
||||
//#define WEP_IV_MASK 0xFFFFFF00
|
||||
|
||||
#else //if LITTLE_ENDIAN
|
||||
//
|
||||
// wType field in the SEthernetHeader
|
||||
//
|
||||
// NOTE....
|
||||
// in network byte order, high byte is going first
|
||||
#define TYPE_PKT_IP 0x0008 //
|
||||
#define TYPE_PKT_ARP 0x0608 //
|
||||
#define TYPE_PKT_RARP 0x3580 //
|
||||
#define TYPE_PKT_IPX 0x3781 //
|
||||
|
||||
#define TYPE_PKT_802_1x 0x8e88
|
||||
#define TYPE_PKT_PreAuth 0xC788
|
||||
|
||||
#define TYPE_PKT_PING_M_REQ 0x1180 // master reguest
|
||||
#define TYPE_PKT_PING_S_GNT 0x2280 // slave grant
|
||||
#define TYPE_PKT_PING_M 0x7780 // pingpong master packet
|
||||
#define TYPE_PKT_PING_S 0x8880 // pingpong slave packet
|
||||
#define TYPE_PKT_WOL_M_REQ 0x3380 // WOL waker request
|
||||
#define TYPE_PKT_WOL_S_GNT 0x4480 // WOL sleeper grant
|
||||
#define TYPE_MGMT_PROBE_RSP 0x0050
|
||||
#define TYPE_PKT_VNT_DIAG 0x1180 // Diag Pkt
|
||||
#define TYPE_PKT_VNT_PER 0x8888 // Diag PER Pkt
|
||||
//
|
||||
// wFrameCtl field in the S802_11Header
|
||||
//
|
||||
// NOTE....
|
||||
// in network byte order, high byte is going first
|
||||
#define FC_TODS 0x0100
|
||||
#define FC_FROMDS 0x0200
|
||||
#define FC_MOREFRAG 0x0400
|
||||
#define FC_RETRY 0x0800
|
||||
#define FC_POWERMGT 0x1000
|
||||
#define FC_MOREDATA 0x2000
|
||||
#define FC_WEP 0x4000
|
||||
#define TYPE_802_11_ATIM 0x0090
|
||||
|
||||
#define TYPE_802_11_DATA 0x0008
|
||||
#define TYPE_802_11_CTL 0x0004
|
||||
#define TYPE_802_11_MGMT 0x0000
|
||||
#define TYPE_802_11_MASK 0x000C
|
||||
#define TYPE_SUBTYPE_MASK 0x00FC
|
||||
#define TYPE_802_11_NODATA 0x0040
|
||||
#define TYPE_DATE_NULL 0x0048
|
||||
|
||||
#define TYPE_CTL_PSPOLL 0x00a4
|
||||
#define TYPE_CTL_RTS 0x00b4
|
||||
#define TYPE_CTL_CTS 0x00c4
|
||||
#define TYPE_CTL_ACK 0x00d4
|
||||
|
||||
|
||||
//#define WEP_IV_MASK 0x00FFFFFF
|
||||
|
||||
#endif //#ifdef __BIG_ENDIAN
|
||||
|
||||
#define WEP_IV_MASK 0x00FFFFFF
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
//
|
||||
// Ethernet packet
|
||||
//
|
||||
typedef struct tagSEthernetHeader {
|
||||
BYTE abyDstAddr[U_ETHER_ADDR_LEN];
|
||||
BYTE abySrcAddr[U_ETHER_ADDR_LEN];
|
||||
WORD wType;
|
||||
}__attribute__ ((__packed__))
|
||||
SEthernetHeader, DEF* PSEthernetHeader;
|
||||
|
||||
|
||||
//
|
||||
// 802_3 packet
|
||||
//
|
||||
typedef struct tagS802_3Header {
|
||||
BYTE abyDstAddr[U_ETHER_ADDR_LEN];
|
||||
BYTE abySrcAddr[U_ETHER_ADDR_LEN];
|
||||
WORD wLen;
|
||||
}__attribute__ ((__packed__))
|
||||
S802_3Header, DEF* PS802_3Header;
|
||||
|
||||
//
|
||||
// 802_11 packet
|
||||
//
|
||||
typedef struct tagS802_11Header {
|
||||
WORD wFrameCtl;
|
||||
WORD wDurationID;
|
||||
BYTE abyAddr1[U_ETHER_ADDR_LEN];
|
||||
BYTE abyAddr2[U_ETHER_ADDR_LEN];
|
||||
BYTE abyAddr3[U_ETHER_ADDR_LEN];
|
||||
WORD wSeqCtl;
|
||||
BYTE abyAddr4[U_ETHER_ADDR_LEN];
|
||||
}__attribute__ ((__packed__))
|
||||
S802_11Header, DEF* PS802_11Header;
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
// Frame type macro
|
||||
|
||||
#define IS_MULTICAST_ADDRESS(pbyEtherAddr) \
|
||||
((*(PBYTE)(pbyEtherAddr) & 0x01) == 1)
|
||||
|
||||
#define IS_BROADCAST_ADDRESS(pbyEtherAddr) ( \
|
||||
(*(PDWORD)(pbyEtherAddr) == 0xFFFFFFFFL) && \
|
||||
(*(PWORD)((PBYTE)(pbyEtherAddr) + 4) == 0xFFFF) \
|
||||
)
|
||||
|
||||
#define IS_NULL_ADDRESS(pbyEtherAddr) ( \
|
||||
(*(PDWORD)(pbyEtherAddr) == 0L) && \
|
||||
(*(PWORD)((PBYTE)(pbyEtherAddr) + 4) == 0) \
|
||||
)
|
||||
|
||||
#define IS_ETH_ADDRESS_EQUAL(pbyAddr1, pbyAddr2) ( \
|
||||
(*(PDWORD)(pbyAddr1) == *(PDWORD)(pbyAddr2)) && \
|
||||
(*(PWORD)((PBYTE)(pbyAddr1) + 4) == \
|
||||
*(PWORD)((PBYTE)(pbyAddr2) + 4)) \
|
||||
)
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
BYTE ETHbyGetHashIndexByCrc32(PBYTE pbyMultiAddr);
|
||||
//BYTE ETHbyGetHashIndexByCrc(PBYTE pbyMultiAddr);
|
||||
BOOL ETHbIsBufferCrc32Ok(PBYTE pbyBuffer, UINT cbFrameLength);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __TETHER_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,284 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: tkip.c
|
||||
*
|
||||
* Purpose: Implement functions for 802.11i TKIP
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Mar. 11, 2003
|
||||
*
|
||||
* Functions:
|
||||
* TKIPvMixKey - Get TKIP RC4 Key from TK,TA, and TSC
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
#if !defined(__TBIT_H__)
|
||||
#include "tbit.h"
|
||||
#endif
|
||||
#if !defined(__TKIP_H__)
|
||||
#include "tkip.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/* The Sbox is reduced to 2 16-bit wide tables, each with 256 entries. */
|
||||
/* The 2nd table is the same as the 1st but with the upper and lower */
|
||||
/* bytes swapped. To allow an endian tolerant implementation, the byte */
|
||||
/* halves have been expressed independently here. */
|
||||
const BYTE TKIP_Sbox_Lower[256] = {
|
||||
0xA5,0x84,0x99,0x8D,0x0D,0xBD,0xB1,0x54,
|
||||
0x50,0x03,0xA9,0x7D,0x19,0x62,0xE6,0x9A,
|
||||
0x45,0x9D,0x40,0x87,0x15,0xEB,0xC9,0x0B,
|
||||
0xEC,0x67,0xFD,0xEA,0xBF,0xF7,0x96,0x5B,
|
||||
0xC2,0x1C,0xAE,0x6A,0x5A,0x41,0x02,0x4F,
|
||||
0x5C,0xF4,0x34,0x08,0x93,0x73,0x53,0x3F,
|
||||
0x0C,0x52,0x65,0x5E,0x28,0xA1,0x0F,0xB5,
|
||||
0x09,0x36,0x9B,0x3D,0x26,0x69,0xCD,0x9F,
|
||||
0x1B,0x9E,0x74,0x2E,0x2D,0xB2,0xEE,0xFB,
|
||||
0xF6,0x4D,0x61,0xCE,0x7B,0x3E,0x71,0x97,
|
||||
0xF5,0x68,0x00,0x2C,0x60,0x1F,0xC8,0xED,
|
||||
0xBE,0x46,0xD9,0x4B,0xDE,0xD4,0xE8,0x4A,
|
||||
0x6B,0x2A,0xE5,0x16,0xC5,0xD7,0x55,0x94,
|
||||
0xCF,0x10,0x06,0x81,0xF0,0x44,0xBA,0xE3,
|
||||
0xF3,0xFE,0xC0,0x8A,0xAD,0xBC,0x48,0x04,
|
||||
0xDF,0xC1,0x75,0x63,0x30,0x1A,0x0E,0x6D,
|
||||
0x4C,0x14,0x35,0x2F,0xE1,0xA2,0xCC,0x39,
|
||||
0x57,0xF2,0x82,0x47,0xAC,0xE7,0x2B,0x95,
|
||||
0xA0,0x98,0xD1,0x7F,0x66,0x7E,0xAB,0x83,
|
||||
0xCA,0x29,0xD3,0x3C,0x79,0xE2,0x1D,0x76,
|
||||
0x3B,0x56,0x4E,0x1E,0xDB,0x0A,0x6C,0xE4,
|
||||
0x5D,0x6E,0xEF,0xA6,0xA8,0xA4,0x37,0x8B,
|
||||
0x32,0x43,0x59,0xB7,0x8C,0x64,0xD2,0xE0,
|
||||
0xB4,0xFA,0x07,0x25,0xAF,0x8E,0xE9,0x18,
|
||||
0xD5,0x88,0x6F,0x72,0x24,0xF1,0xC7,0x51,
|
||||
0x23,0x7C,0x9C,0x21,0xDD,0xDC,0x86,0x85,
|
||||
0x90,0x42,0xC4,0xAA,0xD8,0x05,0x01,0x12,
|
||||
0xA3,0x5F,0xF9,0xD0,0x91,0x58,0x27,0xB9,
|
||||
0x38,0x13,0xB3,0x33,0xBB,0x70,0x89,0xA7,
|
||||
0xB6,0x22,0x92,0x20,0x49,0xFF,0x78,0x7A,
|
||||
0x8F,0xF8,0x80,0x17,0xDA,0x31,0xC6,0xB8,
|
||||
0xC3,0xB0,0x77,0x11,0xCB,0xFC,0xD6,0x3A
|
||||
};
|
||||
|
||||
const BYTE TKIP_Sbox_Upper[256] = {
|
||||
0xC6,0xF8,0xEE,0xF6,0xFF,0xD6,0xDE,0x91,
|
||||
0x60,0x02,0xCE,0x56,0xE7,0xB5,0x4D,0xEC,
|
||||
0x8F,0x1F,0x89,0xFA,0xEF,0xB2,0x8E,0xFB,
|
||||
0x41,0xB3,0x5F,0x45,0x23,0x53,0xE4,0x9B,
|
||||
0x75,0xE1,0x3D,0x4C,0x6C,0x7E,0xF5,0x83,
|
||||
0x68,0x51,0xD1,0xF9,0xE2,0xAB,0x62,0x2A,
|
||||
0x08,0x95,0x46,0x9D,0x30,0x37,0x0A,0x2F,
|
||||
0x0E,0x24,0x1B,0xDF,0xCD,0x4E,0x7F,0xEA,
|
||||
0x12,0x1D,0x58,0x34,0x36,0xDC,0xB4,0x5B,
|
||||
0xA4,0x76,0xB7,0x7D,0x52,0xDD,0x5E,0x13,
|
||||
0xA6,0xB9,0x00,0xC1,0x40,0xE3,0x79,0xB6,
|
||||
0xD4,0x8D,0x67,0x72,0x94,0x98,0xB0,0x85,
|
||||
0xBB,0xC5,0x4F,0xED,0x86,0x9A,0x66,0x11,
|
||||
0x8A,0xE9,0x04,0xFE,0xA0,0x78,0x25,0x4B,
|
||||
0xA2,0x5D,0x80,0x05,0x3F,0x21,0x70,0xF1,
|
||||
0x63,0x77,0xAF,0x42,0x20,0xE5,0xFD,0xBF,
|
||||
0x81,0x18,0x26,0xC3,0xBE,0x35,0x88,0x2E,
|
||||
0x93,0x55,0xFC,0x7A,0xC8,0xBA,0x32,0xE6,
|
||||
0xC0,0x19,0x9E,0xA3,0x44,0x54,0x3B,0x0B,
|
||||
0x8C,0xC7,0x6B,0x28,0xA7,0xBC,0x16,0xAD,
|
||||
0xDB,0x64,0x74,0x14,0x92,0x0C,0x48,0xB8,
|
||||
0x9F,0xBD,0x43,0xC4,0x39,0x31,0xD3,0xF2,
|
||||
0xD5,0x8B,0x6E,0xDA,0x01,0xB1,0x9C,0x49,
|
||||
0xD8,0xAC,0xF3,0xCF,0xCA,0xF4,0x47,0x10,
|
||||
0x6F,0xF0,0x4A,0x5C,0x38,0x57,0x73,0x97,
|
||||
0xCB,0xA1,0xE8,0x3E,0x96,0x61,0x0D,0x0F,
|
||||
0xE0,0x7C,0x71,0xCC,0x90,0x06,0xF7,0x1C,
|
||||
0xC2,0x6A,0xAE,0x69,0x17,0x99,0x3A,0x27,
|
||||
0xD9,0xEB,0x2B,0x22,0xD2,0xA9,0x07,0x33,
|
||||
0x2D,0x3C,0x15,0xC9,0x87,0xAA,0x50,0xA5,
|
||||
0x03,0x59,0x09,0x1A,0x65,0xD7,0x84,0xD0,
|
||||
0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C
|
||||
};
|
||||
|
||||
|
||||
//STKIPKeyManagement sTKIPKeyTable[MAX_TKIP_KEY];
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
unsigned int tkip_sbox(unsigned int index);
|
||||
unsigned int rotr1(unsigned int a);
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/************************************************************/
|
||||
/* tkip_sbox() */
|
||||
/* Returns a 16 bit value from a 64K entry table. The Table */
|
||||
/* is synthesized from two 256 entry byte wide tables. */
|
||||
/************************************************************/
|
||||
unsigned int tkip_sbox(unsigned int index)
|
||||
{
|
||||
unsigned int index_low;
|
||||
unsigned int index_high;
|
||||
unsigned int left, right;
|
||||
|
||||
index_low = (index % 256);
|
||||
index_high = ((index >> 8) % 256);
|
||||
|
||||
left = TKIP_Sbox_Lower[index_low] + (TKIP_Sbox_Upper[index_low] * 256);
|
||||
right = TKIP_Sbox_Upper[index_high] + (TKIP_Sbox_Lower[index_high] * 256);
|
||||
|
||||
return (left ^ right);
|
||||
};
|
||||
|
||||
|
||||
unsigned int rotr1(unsigned int a)
|
||||
{
|
||||
unsigned int b;
|
||||
|
||||
if ((a & 0x01) == 0x01) {
|
||||
b = (a >> 1) | 0x8000;
|
||||
} else {
|
||||
b = (a >> 1) & 0x7fff;
|
||||
}
|
||||
b = b % 65536;
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description: Caculate RC4Key fom TK, TA, and TSC
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pbyTKey - TKey
|
||||
* pbyTA - TA
|
||||
* dwTSC - TSC
|
||||
* Out:
|
||||
* pbyRC4Key - RC4Key
|
||||
*
|
||||
* Return Value: none
|
||||
*
|
||||
*/
|
||||
VOID TKIPvMixKey(
|
||||
PBYTE pbyTKey,
|
||||
PBYTE pbyTA,
|
||||
WORD wTSC15_0,
|
||||
DWORD dwTSC47_16,
|
||||
PBYTE pbyRC4Key
|
||||
)
|
||||
{
|
||||
unsigned int p1k[5];
|
||||
// unsigned int ttak0, ttak1, ttak2, ttak3, ttak4;
|
||||
unsigned int tsc0, tsc1, tsc2;
|
||||
unsigned int ppk0, ppk1, ppk2, ppk3, ppk4, ppk5;
|
||||
unsigned long int pnl,pnh;
|
||||
|
||||
int i, j;
|
||||
|
||||
pnl = wTSC15_0;
|
||||
pnh = dwTSC47_16;
|
||||
|
||||
tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */
|
||||
tsc1 = (unsigned int)(pnh % 65536);
|
||||
tsc2 = (unsigned int)(pnl % 65536); /* lsb */
|
||||
|
||||
/* Phase 1, step 1 */
|
||||
p1k[0] = tsc1;
|
||||
p1k[1] = tsc0;
|
||||
p1k[2] = (unsigned int)(pbyTA[0] + (pbyTA[1]*256));
|
||||
p1k[3] = (unsigned int)(pbyTA[2] + (pbyTA[3]*256));
|
||||
p1k[4] = (unsigned int)(pbyTA[4] + (pbyTA[5]*256));
|
||||
|
||||
/* Phase 1, step 2 */
|
||||
for (i=0; i<8; i++) {
|
||||
j = 2*(i & 1);
|
||||
p1k[0] = (p1k[0] + tkip_sbox( (p1k[4] ^ ((256*pbyTKey[1+j]) + pbyTKey[j])) % 65536 )) % 65536;
|
||||
p1k[1] = (p1k[1] + tkip_sbox( (p1k[0] ^ ((256*pbyTKey[5+j]) + pbyTKey[4+j])) % 65536 )) % 65536;
|
||||
p1k[2] = (p1k[2] + tkip_sbox( (p1k[1] ^ ((256*pbyTKey[9+j]) + pbyTKey[8+j])) % 65536 )) % 65536;
|
||||
p1k[3] = (p1k[3] + tkip_sbox( (p1k[2] ^ ((256*pbyTKey[13+j]) + pbyTKey[12+j])) % 65536 )) % 65536;
|
||||
p1k[4] = (p1k[4] + tkip_sbox( (p1k[3] ^ (((256*pbyTKey[1+j]) + pbyTKey[j]))) % 65536 )) % 65536;
|
||||
p1k[4] = (p1k[4] + i) % 65536;
|
||||
}
|
||||
/* Phase 2, Step 1 */
|
||||
ppk0 = p1k[0];
|
||||
ppk1 = p1k[1];
|
||||
ppk2 = p1k[2];
|
||||
ppk3 = p1k[3];
|
||||
ppk4 = p1k[4];
|
||||
ppk5 = (p1k[4] + tsc2) % 65536;
|
||||
|
||||
/* Phase2, Step 2 */
|
||||
ppk0 = ppk0 + tkip_sbox( (ppk5 ^ ((256*pbyTKey[1]) + pbyTKey[0])) % 65536);
|
||||
ppk1 = ppk1 + tkip_sbox( (ppk0 ^ ((256*pbyTKey[3]) + pbyTKey[2])) % 65536);
|
||||
ppk2 = ppk2 + tkip_sbox( (ppk1 ^ ((256*pbyTKey[5]) + pbyTKey[4])) % 65536);
|
||||
ppk3 = ppk3 + tkip_sbox( (ppk2 ^ ((256*pbyTKey[7]) + pbyTKey[6])) % 65536);
|
||||
ppk4 = ppk4 + tkip_sbox( (ppk3 ^ ((256*pbyTKey[9]) + pbyTKey[8])) % 65536);
|
||||
ppk5 = ppk5 + tkip_sbox( (ppk4 ^ ((256*pbyTKey[11]) + pbyTKey[10])) % 65536);
|
||||
|
||||
ppk0 = ppk0 + rotr1(ppk5 ^ ((256*pbyTKey[13]) + pbyTKey[12]));
|
||||
ppk1 = ppk1 + rotr1(ppk0 ^ ((256*pbyTKey[15]) + pbyTKey[14]));
|
||||
ppk2 = ppk2 + rotr1(ppk1);
|
||||
ppk3 = ppk3 + rotr1(ppk2);
|
||||
ppk4 = ppk4 + rotr1(ppk3);
|
||||
ppk5 = ppk5 + rotr1(ppk4);
|
||||
|
||||
/* Phase 2, Step 3 */
|
||||
pbyRC4Key[0] = (tsc2 >> 8) % 256;
|
||||
pbyRC4Key[1] = (((tsc2 >> 8) % 256) | 0x20) & 0x7f;
|
||||
pbyRC4Key[2] = tsc2 % 256;
|
||||
pbyRC4Key[3] = ((ppk5 ^ ((256*pbyTKey[1]) + pbyTKey[0])) >> 1) % 256;
|
||||
|
||||
pbyRC4Key[4] = ppk0 % 256;
|
||||
pbyRC4Key[5] = (ppk0 >> 8) % 256;
|
||||
|
||||
pbyRC4Key[6] = ppk1 % 256;
|
||||
pbyRC4Key[7] = (ppk1 >> 8) % 256;
|
||||
|
||||
pbyRC4Key[8] = ppk2 % 256;
|
||||
pbyRC4Key[9] = (ppk2 >> 8) % 256;
|
||||
|
||||
pbyRC4Key[10] = ppk3 % 256;
|
||||
pbyRC4Key[11] = (ppk3 >> 8) % 256;
|
||||
|
||||
pbyRC4Key[12] = ppk4 % 256;
|
||||
pbyRC4Key[13] = (ppk4 >> 8) % 256;
|
||||
|
||||
pbyRC4Key[14] = ppk5 % 256;
|
||||
pbyRC4Key[15] = (ppk5 >> 8) % 256;
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: tkip.h
|
||||
*
|
||||
* Purpose: Implement functions for 802.11i TKIP
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Mar. 11, 2003
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __TKIP_H__
|
||||
#define __TKIP_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
#define TKIP_KEY_LEN 16
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
VOID TKIPvMixKey(
|
||||
PBYTE pbyTKey,
|
||||
PBYTE pbyTA,
|
||||
WORD wTSC15_0,
|
||||
DWORD dwTSC47_16,
|
||||
PBYTE pbyRC4Key
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif // __TKIP_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,152 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: tmacro.h
|
||||
*
|
||||
* Purpose: define basic common types and macros
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __TMACRO_H__
|
||||
#define __TMACRO_H__
|
||||
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/****** Common helper macros ***********************************************/
|
||||
|
||||
#if !defined(LONIBBLE)
|
||||
#define LONIBBLE(b) ((BYTE)(b) & 0x0F)
|
||||
#endif
|
||||
#if !defined(HINIBBLE)
|
||||
#define HINIBBLE(b) ((BYTE)(((WORD)(b) >> 4) & 0x0F))
|
||||
#endif
|
||||
|
||||
#if !defined(LOBYTE)
|
||||
#define LOBYTE(w) ((BYTE)(w))
|
||||
#endif
|
||||
#if !defined(HIBYTE)
|
||||
#define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))
|
||||
#endif
|
||||
|
||||
#if !defined(LOWORD)
|
||||
#define LOWORD(d) ((WORD)(d))
|
||||
#endif
|
||||
#if !defined(HIWORD)
|
||||
#define HIWORD(d) ((WORD)((((DWORD)(d)) >> 16) & 0xFFFF))
|
||||
#endif
|
||||
|
||||
#define LODWORD(q) ((q).u.dwLowDword)
|
||||
#define HIDWORD(q) ((q).u.dwHighDword)
|
||||
|
||||
|
||||
|
||||
#if !defined(MAKEBYTE)
|
||||
#define MAKEBYTE(ln, hn) ((BYTE)(((BYTE)(ln) & 0x0F) | ((BYTE)(hn) << 4)))
|
||||
#endif
|
||||
#if !defined(MAKEWORD)
|
||||
#define MAKEWORD(lb, hb) ((WORD)(((BYTE)(lb)) | (((WORD)((BYTE)(hb))) << 8)))
|
||||
#endif
|
||||
#if !defined(MAKEDWORD)
|
||||
#define MAKEDWORD(lw, hw) ((DWORD)(((WORD)(lw)) | (((DWORD)((WORD)(hw))) << 16)))
|
||||
#endif
|
||||
#if !defined(MAKEQWORD)
|
||||
#define MAKEQWORD(ld, hd, pq) {pq->u.dwLowDword = ld; pq->u.dwHighDword = hd;}
|
||||
#endif
|
||||
|
||||
#if !defined(MAKELONG)
|
||||
#define MAKELONG(low, high) ((LONG)(((WORD)(low)) | (((DWORD)((WORD)(high))) << 16)))
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
// Bytes Reverse: big endian to little endian convert
|
||||
#if !defined(REVWORD)
|
||||
#define REVWORD(w) ((WORD)( ((WORD)(w) >> 8) | ((WORD)(w) << 8) ))
|
||||
#endif
|
||||
#if !defined(REVDWORD)
|
||||
#define REVDWORD(d) (MAKEDWORD(MAKEWORD(HIBYTE(HIWORD(d)),LOBYTE(HIWORD(d))),MAKEWORD(HIBYTE(LOWORD(d)),LOBYTE(LOWORD(d)))))
|
||||
#endif
|
||||
|
||||
/* map to known network names */
|
||||
/*
|
||||
#define ntohs(x) REVWORD(x)
|
||||
#define ntohl(x) REVDWORD(x)
|
||||
#define htons(x) REVWORD(x)
|
||||
#define htonl(x) REVDWORD(x)
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
#ifndef NOMINMAX
|
||||
#ifndef max
|
||||
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
#ifndef min
|
||||
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
#endif // NOMINMAX
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/****** Misc macros ********************************************************/
|
||||
|
||||
// get the field offset in the type(struct, class, ...)
|
||||
#define OFFSET(type, field) ((int)(&((type NEAR*)1)->field)-1)
|
||||
|
||||
|
||||
/* string equality shorthand */
|
||||
#define STR_EQ(x, y) (strcmp(x, y) == 0)
|
||||
#define STR_NE(x, y) (strcmp(x, y) != 0)
|
||||
|
||||
|
||||
// calculate element # of array
|
||||
#define ELEMENT_NUM(array) (sizeof(array) / sizeof(array[0]))
|
||||
//#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
|
||||
|
||||
|
||||
// null statement
|
||||
#define NULL_FUNC()
|
||||
|
||||
|
||||
/* Since not all compilers support structure assignment, the ASSIGN()
|
||||
* macro is used. This controls how it's actually implemented.
|
||||
*/
|
||||
#ifdef NOSTRUCTASSIGN /* Version for old compilers that don't support it */
|
||||
#define ASSIGN(a,b) memcpy((char *)&(a),(char *)&(b),sizeof(b);
|
||||
#else /* Version for compilers that do */
|
||||
#define ASSIGN(a,b) ((a) = (b))
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __TMACRO_H__
|
||||
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
*
|
||||
*
|
||||
* File: tpci.h
|
||||
*
|
||||
* Purpose: PCI routines
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __TPCI_H__
|
||||
#define __TPCI_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
#define MAX_PCI_BUS 4 // max. # of PCI bus that we support
|
||||
#define MAX_PCI_DEVICE 32 // max. # of PCI devices
|
||||
|
||||
|
||||
//
|
||||
// Registers in the PCI configuration space
|
||||
//
|
||||
#define PCI_REG_VENDOR_ID 0x00 //
|
||||
#define PCI_REG_DEVICE_ID 0x02 //
|
||||
#define PCI_REG_COMMAND 0x04 //
|
||||
#define PCI_REG_STATUS 0x06 //
|
||||
#define PCI_REG_REV_ID 0x08 //
|
||||
#define PCI_REG_CLASS_CODE 0x09 //
|
||||
#define PCI_REG_CACHELINE_SIZE 0x0C //
|
||||
#define PCI_REG_LAT_TIMER 0x0D //
|
||||
#define PCI_REG_HDR_TYPE 0x0E //
|
||||
#define PCI_REG_BIST 0x0F //
|
||||
|
||||
#define PCI_REG_BAR0 0x10 //
|
||||
#define PCI_REG_BAR1 0x14 //
|
||||
#define PCI_REG_BAR2 0x18 //
|
||||
#define PCI_REG_CARDBUS_CIS_PTR 0x28 //
|
||||
|
||||
#define PCI_REG_SUB_VEN_ID 0x2C //
|
||||
#define PCI_REG_SUB_SYS_ID 0x2E //
|
||||
#define PCI_REG_EXP_ROM_BAR 0x30 //
|
||||
#define PCI_REG_CAP 0x34 //
|
||||
|
||||
#define PCI_REG_INT_LINE 0x3C //
|
||||
#define PCI_REG_INT_PIN 0x3D //
|
||||
#define PCI_REG_MIN_GNT 0x3E //
|
||||
#define PCI_REG_MAX_LAT 0x3F //
|
||||
|
||||
#define PCI_REG_MAX_SIZE 0x100 // maximun total PCI registers
|
||||
|
||||
|
||||
//
|
||||
// Bits in the COMMAND register
|
||||
//
|
||||
#define COMMAND_BUSM 0x04 //
|
||||
#define COMMAND_WAIT 0x80 //
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
// macro MAKE Bus Dev Fun ID into WORD
|
||||
#define MAKE_BDF_TO_WORD(byBusId, byDevId, byFunId) \
|
||||
MAKEWORD( \
|
||||
((((BYTE)(byDevId)) & 0x1F) << 3) + \
|
||||
(((BYTE)(byFunId)) & 0x07), \
|
||||
(byBusId) \
|
||||
)
|
||||
|
||||
#define GET_BUSID(wBusDevFunId) \
|
||||
HIBYTE(wBusDevFunId)
|
||||
|
||||
#define GET_DEVID(wBusDevFunId) \
|
||||
(LOBYTE(wBusDevFunId) >> 3)
|
||||
|
||||
#define GET_FUNID(wBusDevFunId) \
|
||||
(LOBYTE(wBusDevFunId) & 0x07)
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __TPCI_H__
|
||||
|
||||
|
|
@ -0,0 +1,394 @@
|
|||
/*
|
||||
* File: ttype.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Purpose: define basic common types and macros
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: May 21, 1996
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __TTYPE_H__
|
||||
#define __TTYPE_H__
|
||||
|
||||
|
||||
/******* Common definitions and typedefs ***********************************/
|
||||
|
||||
#ifndef VOID
|
||||
#define VOID void
|
||||
#endif
|
||||
|
||||
#ifndef CONST
|
||||
#define CONST const
|
||||
#endif
|
||||
|
||||
#ifndef STATIC
|
||||
#define STATIC static
|
||||
#endif
|
||||
|
||||
#ifndef IN
|
||||
#define IN
|
||||
#endif
|
||||
|
||||
#ifndef OUT
|
||||
#define OUT
|
||||
#endif
|
||||
|
||||
//2007-0115-04<Add>by MikeLiu
|
||||
#ifndef TxInSleep
|
||||
#define TxInSleep
|
||||
#endif
|
||||
|
||||
|
||||
//2007-0814-01<Add>by MikeLiu
|
||||
#ifndef Safe_Close
|
||||
#define Safe_Close
|
||||
#endif
|
||||
|
||||
//2008-0131-01<Add>by MikeLiu
|
||||
#ifndef Adhoc_STA
|
||||
#define Adhoc_STA
|
||||
#endif
|
||||
|
||||
#if! defined(__CPU8051)
|
||||
typedef int BOOL;
|
||||
typedef int BOOLEAN;
|
||||
#else // __CPU8051
|
||||
#define BOOL int
|
||||
#endif // __CPU8051
|
||||
|
||||
#if !defined(TRUE)
|
||||
#define TRUE 1
|
||||
#endif
|
||||
#if !defined(FALSE)
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
|
||||
#if !defined(SUCCESS)
|
||||
#define SUCCESS 0
|
||||
#endif
|
||||
#if !defined(FAILED)
|
||||
#define FAILED -1
|
||||
#endif
|
||||
|
||||
//2007-0809-01<Add>by MikeLiu
|
||||
#ifndef update_BssList
|
||||
#define update_BssList
|
||||
#endif
|
||||
|
||||
#ifndef WPA_SM_Transtatus
|
||||
#define WPA_SM_Transtatus
|
||||
#endif
|
||||
|
||||
#ifndef Calcu_LinkQual
|
||||
#define Calcu_LinkQual
|
||||
#endif
|
||||
|
||||
/****** Simple typedefs ***************************************************/
|
||||
|
||||
#if! defined(__CPU8051)
|
||||
|
||||
/* These lines assume that your compiler's longs are 32 bits and
|
||||
* shorts are 16 bits. It is already assumed that chars are 8 bits,
|
||||
* but it doesn't matter if they're signed or unsigned.
|
||||
*/
|
||||
|
||||
typedef signed char I8; /* 8-bit signed integer */
|
||||
typedef signed short I16; /* 16-bit signed integer */
|
||||
typedef signed long I32; /* 32-bit signed integer */
|
||||
|
||||
typedef unsigned char U8; /* 8-bit unsigned integer */
|
||||
typedef unsigned short U16; /* 16-bit unsigned integer */
|
||||
typedef unsigned long U32; /* 32-bit unsigned integer */
|
||||
|
||||
|
||||
#if defined(__WIN32)
|
||||
typedef signed __int64 I64; /* 64-bit signed integer */
|
||||
typedef unsigned __int64 U64; /* 64-bit unsigned integer */
|
||||
#endif // __WIN32
|
||||
|
||||
|
||||
typedef char CHAR;
|
||||
typedef signed short SHORT;
|
||||
typedef signed int INT;
|
||||
typedef signed long LONG;
|
||||
|
||||
typedef unsigned char UCHAR;
|
||||
typedef unsigned short USHORT;
|
||||
typedef unsigned int UINT;
|
||||
typedef unsigned long ULONG;
|
||||
typedef unsigned long long ULONGLONG; //64 bit
|
||||
typedef unsigned long long ULONGULONG;
|
||||
|
||||
|
||||
|
||||
typedef unsigned char BYTE; // 8-bit
|
||||
typedef unsigned short WORD; // 16-bit
|
||||
typedef unsigned long DWORD; // 32-bit
|
||||
|
||||
// QWORD is for those situation that we want
|
||||
// an 8-byte-aligned 8 byte long structure
|
||||
// which is NOT really a floating point number.
|
||||
typedef union tagUQuadWord {
|
||||
struct {
|
||||
DWORD dwLowDword;
|
||||
DWORD dwHighDword;
|
||||
} u;
|
||||
double DoNotUseThisField;
|
||||
} UQuadWord;
|
||||
typedef UQuadWord QWORD; // 64-bit
|
||||
|
||||
|
||||
|
||||
#ifndef _TCHAR_DEFINED
|
||||
typedef char TCHAR;
|
||||
typedef char* PTCHAR;
|
||||
typedef unsigned char TBYTE;
|
||||
typedef unsigned char* PTBYTE;
|
||||
#define _TCHAR_DEFINED
|
||||
#endif
|
||||
|
||||
#else // __CPU8051
|
||||
|
||||
#define U8 unsigned char
|
||||
#define U16 unsigned short
|
||||
#define U32 unsigned long
|
||||
|
||||
#define USHORT unsigned short
|
||||
#define UINT unsigned int
|
||||
|
||||
#define BYTE unsigned char
|
||||
#define WORD unsigned short
|
||||
#define DWORD unsigned long
|
||||
|
||||
|
||||
#endif // __CPU8051
|
||||
|
||||
|
||||
// maybe this should be defined in <limits.h>
|
||||
#define U8_MAX 0xFFU
|
||||
#define U16_MAX 0xFFFFU
|
||||
#define U32_MAX 0xFFFFFFFFUL
|
||||
|
||||
#define BYTE_MAX 0xFFU
|
||||
#define WORD_MAX 0xFFFFU
|
||||
#define DWORD_MAX 0xFFFFFFFFUL
|
||||
|
||||
|
||||
|
||||
|
||||
/******* 32-bit vs. 16-bit definitions and typedefs ************************/
|
||||
|
||||
#if !defined(NULL)
|
||||
#ifdef __cplusplus
|
||||
#define NULL 0
|
||||
#else
|
||||
#define NULL ((void *)0)
|
||||
#endif // __cplusplus
|
||||
#endif // !NULL
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(__WIN32) || defined(__CPU8051)
|
||||
|
||||
#if !defined(FAR)
|
||||
#define FAR
|
||||
#endif
|
||||
#if !defined(NEAR)
|
||||
#define NEAR
|
||||
#endif
|
||||
#if !defined(DEF)
|
||||
#define DEF
|
||||
#endif
|
||||
#if !defined(CALLBACK)
|
||||
#define CALLBACK
|
||||
#endif
|
||||
|
||||
#else // !__WIN32__
|
||||
|
||||
#if !defined(FAR)
|
||||
#define FAR
|
||||
#endif
|
||||
#if !defined(NEAR)
|
||||
#define NEAR
|
||||
#endif
|
||||
#if !defined(DEF)
|
||||
// default pointer type is FAR, if you want near pointer just redefine it to NEAR
|
||||
#define DEF
|
||||
#endif
|
||||
#if !defined(CALLBACK)
|
||||
#define CALLBACK
|
||||
#endif
|
||||
|
||||
#endif // !__WIN32__
|
||||
|
||||
|
||||
|
||||
|
||||
/****** Common pointer types ***********************************************/
|
||||
|
||||
#if! defined(__CPU8051)
|
||||
|
||||
typedef signed char DEF* PI8;
|
||||
typedef signed short DEF* PI16;
|
||||
typedef signed long DEF* PI32;
|
||||
|
||||
typedef unsigned char DEF* PU8;
|
||||
typedef unsigned short DEF* PU16;
|
||||
typedef unsigned long DEF* PU32;
|
||||
|
||||
#if defined(__WIN32)
|
||||
typedef signed __int64 DEF* PI64;
|
||||
typedef unsigned __int64 DEF* PU64;
|
||||
#endif // __WIN32
|
||||
|
||||
#if !defined(_WIN64)
|
||||
typedef unsigned long ULONG_PTR; // 32-bit
|
||||
typedef unsigned long DWORD_PTR; // 32-bit
|
||||
#endif // _WIN64
|
||||
|
||||
|
||||
// boolean pointer
|
||||
typedef int DEF* PBOOL;
|
||||
typedef int NEAR* NPBOOL;
|
||||
typedef int FAR* LPBOOL;
|
||||
|
||||
typedef int DEF* PINT;
|
||||
typedef int NEAR* NPINT;
|
||||
typedef int FAR* LPINT;
|
||||
typedef const int DEF* PCINT;
|
||||
typedef const int NEAR* NPCINT;
|
||||
typedef const int FAR* LPCINT;
|
||||
|
||||
typedef unsigned int DEF* PUINT;
|
||||
typedef const unsigned int DEF* PCUINT;
|
||||
|
||||
typedef long DEF* PLONG;
|
||||
typedef long NEAR* NPLONG;
|
||||
typedef long FAR* LPLONG;
|
||||
//typedef const long DEF* PCLONG;
|
||||
typedef const long NEAR* NPCLONG;
|
||||
typedef const long FAR* LPCLONG;
|
||||
|
||||
typedef BYTE DEF* PBYTE;
|
||||
typedef BYTE NEAR* NPBYTE;
|
||||
typedef BYTE FAR* LPBYTE;
|
||||
typedef const BYTE DEF* PCBYTE;
|
||||
typedef const BYTE NEAR* NPCBYTE;
|
||||
typedef const BYTE FAR* LPCBYTE;
|
||||
|
||||
typedef WORD DEF* PWORD;
|
||||
typedef WORD NEAR* NPWORD;
|
||||
typedef WORD FAR* LPWORD;
|
||||
typedef const WORD DEF* PCWORD;
|
||||
typedef const WORD NEAR* NPCWORD;
|
||||
typedef const WORD FAR* LPCWORD;
|
||||
|
||||
typedef DWORD DEF* PDWORD;
|
||||
typedef DWORD NEAR* NPDWORD;
|
||||
typedef DWORD FAR* LPDWORD;
|
||||
typedef const DWORD DEF* PCDWORD;
|
||||
typedef const DWORD NEAR* NPCDWORD;
|
||||
typedef const DWORD FAR* LPCDWORD;
|
||||
|
||||
typedef QWORD DEF* PQWORD;
|
||||
typedef QWORD NEAR* NPQWORD;
|
||||
typedef QWORD FAR* LPQWORD;
|
||||
typedef const QWORD DEF* PCQWORD;
|
||||
typedef const QWORD NEAR* NPCQWORD;
|
||||
typedef const QWORD FAR* LPCQWORD;
|
||||
|
||||
typedef void DEF* PVOID;
|
||||
typedef void NEAR* NPVOID;
|
||||
typedef void FAR* LPVOID;
|
||||
|
||||
// handle declaration
|
||||
#ifdef STRICT
|
||||
typedef void *HANDLE;
|
||||
#else
|
||||
typedef PVOID HANDLE;
|
||||
#endif
|
||||
|
||||
//
|
||||
// ANSI (Single-byte Character) types
|
||||
//
|
||||
typedef char DEF* PCH;
|
||||
typedef char NEAR* NPCH;
|
||||
typedef char FAR* LPCH;
|
||||
typedef const char DEF* PCCH;
|
||||
typedef const char NEAR* NPCCH;
|
||||
typedef const char FAR* LPCCH;
|
||||
|
||||
typedef char DEF* PSTR;
|
||||
typedef char NEAR* NPSTR;
|
||||
typedef char FAR* LPSTR;
|
||||
typedef const char DEF* PCSTR;
|
||||
typedef const char NEAR* NPCSTR;
|
||||
typedef const char FAR* LPCSTR;
|
||||
|
||||
#endif // !__CPU8051
|
||||
|
||||
|
||||
|
||||
|
||||
/****** Misc definitions, types ********************************************/
|
||||
|
||||
// parameter prefix
|
||||
#ifndef IN
|
||||
#define IN
|
||||
#endif
|
||||
|
||||
#ifndef OUT
|
||||
#define OUT
|
||||
#endif
|
||||
|
||||
|
||||
// unreferenced parameter macro to avoid warning message in MS C
|
||||
#if defined(__TURBOC__)
|
||||
|
||||
//you should use "#pragma argsused" to avoid warning message in Borland C
|
||||
#ifndef UNREFERENCED_PARAMETER
|
||||
#define UNREFERENCED_PARAMETER(x)
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifndef UNREFERENCED_PARAMETER
|
||||
//#define UNREFERENCED_PARAMETER(x) x
|
||||
#define UNREFERENCED_PARAMETER(x)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
// in-line assembly prefix
|
||||
#if defined(__TURBOC__)
|
||||
#define ASM asm
|
||||
#else // !__TURBOC__
|
||||
#define ASM _asm
|
||||
#endif // !__TURBOC__
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __TTYPE_H__
|
||||
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: umem.h
|
||||
*
|
||||
* Purpose: Define Memory macros
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: Mar 17, 1997
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __UMEM_H__
|
||||
#define __UMEM_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
// 4-byte memory tag
|
||||
#define MEM_TAG 'mTEW'
|
||||
|
||||
// Macros used for memory allocation and deallocation.
|
||||
|
||||
|
||||
|
||||
#define ZERO_MEMORY(Destination,Length) { \
|
||||
memset((PVOID)(Destination), \
|
||||
0, \
|
||||
(ULONG)(Length) \
|
||||
); \
|
||||
}
|
||||
|
||||
#define MEMvCopy(pvDest, pvSource, uCount) { \
|
||||
memcpy((PVOID)(pvDest), \
|
||||
(PVOID)(pvSource), \
|
||||
(ULONG)(uCount) \
|
||||
); \
|
||||
}
|
||||
|
||||
|
||||
#define MEMEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __UMEM_H__
|
||||
|
||||
|
|
@ -0,0 +1,171 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: upc.h
|
||||
*
|
||||
* Purpose: Macros to access device
|
||||
*
|
||||
* Author: Tevin Chen
|
||||
*
|
||||
* Date: Mar 17, 1997
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __UPC_H__
|
||||
#define __UPC_H__
|
||||
|
||||
#if !defined(DEVICE_H)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
//
|
||||
// For IO mapped
|
||||
//
|
||||
|
||||
#ifdef IO_MAP
|
||||
|
||||
#define VNSvInPortB(dwIOAddress, pbyData) { \
|
||||
*(pbyData) = inb(dwIOAddress); \
|
||||
}
|
||||
|
||||
|
||||
#define VNSvInPortW(dwIOAddress, pwData) { \
|
||||
*(pwData) = inw(dwIOAddress); \
|
||||
}
|
||||
|
||||
#define VNSvInPortD(dwIOAddress, pdwData) { \
|
||||
*(pdwData) = inl(dwIOAddress); \
|
||||
}
|
||||
|
||||
|
||||
#define VNSvOutPortB(dwIOAddress, byData) { \
|
||||
outb(byData, dwIOAddress); \
|
||||
}
|
||||
|
||||
|
||||
#define VNSvOutPortW(dwIOAddress, wData) { \
|
||||
outw(wData, dwIOAddress); \
|
||||
}
|
||||
|
||||
#define VNSvOutPortD(dwIOAddress, dwData) { \
|
||||
outl(dwData, dwIOAddress); \
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
//
|
||||
// For memory mapped IO
|
||||
//
|
||||
|
||||
|
||||
#define VNSvInPortB(dwIOAddress, pbyData) { \
|
||||
volatile BYTE* pbyAddr = ((PBYTE)(dwIOAddress)); \
|
||||
*(pbyData) = readb(pbyAddr); \
|
||||
}
|
||||
|
||||
|
||||
#define VNSvInPortW(dwIOAddress, pwData) { \
|
||||
volatile WORD* pwAddr = ((PWORD)(dwIOAddress)); \
|
||||
*(pwData) = readw(pwAddr); \
|
||||
}
|
||||
|
||||
#define VNSvInPortD(dwIOAddress, pdwData) { \
|
||||
volatile DWORD* pdwAddr = ((PDWORD)(dwIOAddress)); \
|
||||
*(pdwData) = readl(pdwAddr); \
|
||||
}
|
||||
|
||||
|
||||
#define VNSvOutPortB(dwIOAddress, byData) { \
|
||||
volatile BYTE* pbyAddr = ((PBYTE)(dwIOAddress)); \
|
||||
writeb((BYTE)byData, pbyAddr); \
|
||||
}
|
||||
|
||||
|
||||
#define VNSvOutPortW(dwIOAddress, wData) { \
|
||||
volatile WORD* pwAddr = ((PWORD)(dwIOAddress)); \
|
||||
writew((WORD)wData, pwAddr); \
|
||||
}
|
||||
|
||||
#define VNSvOutPortD(dwIOAddress, dwData) { \
|
||||
volatile DWORD* pdwAddr = ((PDWORD)(dwIOAddress)); \
|
||||
writel((DWORD)dwData, pdwAddr); \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// ALWAYS IO-Mapped IO when in 16-bit/32-bit environment
|
||||
//
|
||||
#define PCBvInPortB(dwIOAddress, pbyData) { \
|
||||
*(pbyData) = inb(dwIOAddress); \
|
||||
}
|
||||
|
||||
#define PCBvInPortW(dwIOAddress, pwData) { \
|
||||
*(pwData) = inw(dwIOAddress); \
|
||||
}
|
||||
|
||||
#define PCBvInPortD(dwIOAddress, pdwData) { \
|
||||
*(pdwData) = inl(dwIOAddress); \
|
||||
}
|
||||
|
||||
#define PCBvOutPortB(dwIOAddress, byData) { \
|
||||
outb(byData, dwIOAddress); \
|
||||
}
|
||||
|
||||
#define PCBvOutPortW(dwIOAddress, wData) { \
|
||||
outw(wData, dwIOAddress); \
|
||||
}
|
||||
|
||||
#define PCBvOutPortD(dwIOAddress, dwData) { \
|
||||
outl(dwData, dwIOAddress); \
|
||||
}
|
||||
|
||||
|
||||
#define PCAvDelayByIO(uDelayUnit) { \
|
||||
BYTE byData; \
|
||||
ULONG ii; \
|
||||
\
|
||||
if (uDelayUnit <= 50) { \
|
||||
udelay(uDelayUnit); \
|
||||
} \
|
||||
else { \
|
||||
for (ii = 0; ii < (uDelayUnit); ii++) \
|
||||
byData = inb(0x61); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __UPC_H__
|
||||
|
|
@ -0,0 +1,989 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: usbpipe.c
|
||||
*
|
||||
* Purpose: Handle USB control endpoint
|
||||
*
|
||||
* Author: Warren Hsu
|
||||
*
|
||||
* Date: Mar. 29, 2005
|
||||
*
|
||||
* Functions:
|
||||
* CONTROLnsRequestOut - Write variable length bytes to MEM/BB/MAC/EEPROM
|
||||
* CONTROLnsRequestIn - Read variable length bytes from MEM/BB/MAC/EEPROM
|
||||
* ControlvWriteByte - Write one byte to MEM/BB/MAC/EEPROM
|
||||
* ControlvReadByte - Read one byte from MEM/BB/MAC/EEPROM
|
||||
* ControlvMaskByte - Read one byte from MEM/BB/MAC/EEPROM and clear/set some bits in the same address
|
||||
*
|
||||
* Revision History:
|
||||
* 04-05-2004 Jerry Chen: Initial release
|
||||
* 11-24-2004 Warren Hsu: Add ControlvWriteByte,ControlvReadByte,ControlvMaskByte
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__INT_H__)
|
||||
#include "int.h"
|
||||
#endif
|
||||
#if !defined(__RXTX_H__)
|
||||
#include "rxtx.h"
|
||||
#endif
|
||||
#if !defined(__DPC_H__)
|
||||
#include "dpc.h"
|
||||
#endif
|
||||
#if !defined(__CONTROL_H__)
|
||||
#include "control.h"
|
||||
#endif
|
||||
#if !defined(__DESC_H__)
|
||||
#include "desc.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
//endpoint def
|
||||
//endpoint 0: control
|
||||
//endpoint 1: interrupt
|
||||
//endpoint 2: read bulk
|
||||
//endpoint 3: write bulk
|
||||
|
||||
//RequestType:
|
||||
//#define REQUEST_OUT (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) // 0x40
|
||||
//#define REQUEST_IN (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE ) //0xc0
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
|
||||
|
||||
#define USB_CTL_WAIT 500 //ms
|
||||
|
||||
#ifndef URB_ASYNC_UNLINK
|
||||
#define URB_ASYNC_UNLINK 0
|
||||
#endif
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
//2007-0508-02<Add>by MikeLiu
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))&&(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsInterruptUsbIoCompleteRead(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
);
|
||||
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsBulkInUsbIoCompleteRead(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
);
|
||||
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsBulkOutIoCompleteWrite(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
);
|
||||
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsControlInUsbIoCompleteRead(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
);
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsControlInUsbIoCompleteWrite(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
);
|
||||
|
||||
#else
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsInterruptUsbIoCompleteRead(
|
||||
IN struct urb *urb
|
||||
);
|
||||
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsBulkInUsbIoCompleteRead(
|
||||
IN struct urb *urb
|
||||
);
|
||||
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsBulkOutIoCompleteWrite(
|
||||
IN struct urb *urb
|
||||
);
|
||||
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsControlInUsbIoCompleteRead(
|
||||
IN struct urb *urb
|
||||
);
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsControlInUsbIoCompleteWrite(
|
||||
IN struct urb *urb
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
|
||||
NTSTATUS
|
||||
PIPEnsControlOutAsyn(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byRequest,
|
||||
IN WORD wValue,
|
||||
IN WORD wIndex,
|
||||
IN WORD wLength,
|
||||
IN PBYTE pbyBuffer
|
||||
)
|
||||
{
|
||||
NTSTATUS ntStatus;
|
||||
|
||||
|
||||
if (MP_TEST_FLAG(pDevice, fMP_DISCONNECTED))
|
||||
return STATUS_FAILURE;
|
||||
|
||||
|
||||
if (MP_TEST_FLAG(pDevice, fMP_CONTROL_WRITES)) {
|
||||
return STATUS_FAILURE;
|
||||
}
|
||||
|
||||
if (in_interrupt()) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"in_interrupt return ..byRequest %x\n", byRequest);
|
||||
return STATUS_FAILURE;
|
||||
}
|
||||
|
||||
ntStatus = usb_control_msg(
|
||||
pDevice->usb,
|
||||
usb_sndctrlpipe(pDevice->usb , 0),
|
||||
byRequest,
|
||||
0x40, // RequestType
|
||||
wValue,
|
||||
wIndex,
|
||||
(PVOID) pbyBuffer,
|
||||
wLength,
|
||||
HZ
|
||||
);
|
||||
if (ntStatus >= 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"usb_sndctrlpipe ntStatus= %d\n", ntStatus);
|
||||
ntStatus = 0;
|
||||
} else {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"usb_sndctrlpipe fail, ntStatus= %d\n", ntStatus);
|
||||
}
|
||||
|
||||
return ntStatus;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
NTSTATUS
|
||||
PIPEnsControlOut(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byRequest,
|
||||
IN WORD wValue,
|
||||
IN WORD wIndex,
|
||||
IN WORD wLength,
|
||||
IN PBYTE pbyBuffer
|
||||
)
|
||||
{
|
||||
NTSTATUS ntStatus = 0;
|
||||
int ii;
|
||||
|
||||
|
||||
if (MP_TEST_FLAG(pDevice, fMP_DISCONNECTED))
|
||||
return STATUS_FAILURE;
|
||||
|
||||
if (MP_TEST_FLAG(pDevice, fMP_CONTROL_WRITES)) {
|
||||
return STATUS_FAILURE;
|
||||
}
|
||||
|
||||
pDevice->sUsbCtlRequest.bRequestType = 0x40;
|
||||
pDevice->sUsbCtlRequest.bRequest = byRequest;
|
||||
pDevice->sUsbCtlRequest.wValue = cpu_to_le16p(&wValue);
|
||||
pDevice->sUsbCtlRequest.wIndex = cpu_to_le16p(&wIndex);
|
||||
pDevice->sUsbCtlRequest.wLength = cpu_to_le16p(&wLength);
|
||||
pDevice->pControlURB->transfer_flags |= URB_ASYNC_UNLINK;
|
||||
pDevice->pControlURB->actual_length = 0;
|
||||
// Notice, pbyBuffer limited point to variable buffer, can't be constant.
|
||||
usb_fill_control_urb(pDevice->pControlURB, pDevice->usb,
|
||||
usb_sndctrlpipe(pDevice->usb , 0), (char *) &pDevice->sUsbCtlRequest,
|
||||
pbyBuffer, wLength, s_nsControlInUsbIoCompleteWrite, pDevice);
|
||||
|
||||
if ((ntStatus = vntwusb_submit_urb(pDevice->pControlURB) != 0)) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"control send request submission failed: %d\n", ntStatus);
|
||||
return STATUS_FAILURE;
|
||||
}
|
||||
else {
|
||||
MP_SET_FLAG(pDevice, fMP_CONTROL_WRITES);
|
||||
}
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
for (ii = 0; ii <= USB_CTL_WAIT; ii ++) {
|
||||
if (MP_TEST_FLAG(pDevice, fMP_CONTROL_WRITES))
|
||||
mdelay(1);
|
||||
else
|
||||
break;
|
||||
if (ii >= USB_CTL_WAIT) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"control send request submission timeout \n");
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
|
||||
return STATUS_FAILURE;
|
||||
}
|
||||
}
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
NTSTATUS
|
||||
PIPEnsControlIn(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byRequest,
|
||||
IN WORD wValue,
|
||||
IN WORD wIndex,
|
||||
IN WORD wLength,
|
||||
IN OUT PBYTE pbyBuffer
|
||||
)
|
||||
{
|
||||
NTSTATUS ntStatus = 0;
|
||||
int ii;
|
||||
|
||||
if (MP_TEST_FLAG(pDevice, fMP_DISCONNECTED))
|
||||
return STATUS_FAILURE;
|
||||
|
||||
if (MP_TEST_FLAG(pDevice, fMP_CONTROL_READS)) {
|
||||
return STATUS_FAILURE;
|
||||
}
|
||||
pDevice->sUsbCtlRequest.bRequestType = 0xC0;
|
||||
pDevice->sUsbCtlRequest.bRequest = byRequest;
|
||||
pDevice->sUsbCtlRequest.wValue = cpu_to_le16p(&wValue);
|
||||
pDevice->sUsbCtlRequest.wIndex = cpu_to_le16p(&wIndex);
|
||||
pDevice->sUsbCtlRequest.wLength = cpu_to_le16p(&wLength);
|
||||
pDevice->pControlURB->transfer_flags |= URB_ASYNC_UNLINK;
|
||||
pDevice->pControlURB->actual_length = 0;
|
||||
usb_fill_control_urb(pDevice->pControlURB, pDevice->usb,
|
||||
usb_rcvctrlpipe(pDevice->usb , 0), (char *) &pDevice->sUsbCtlRequest,
|
||||
pbyBuffer, wLength, s_nsControlInUsbIoCompleteRead, pDevice);
|
||||
|
||||
if ((ntStatus = vntwusb_submit_urb(pDevice->pControlURB) != 0)) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"control request submission failed: %d\n", ntStatus);
|
||||
}else {
|
||||
MP_SET_FLAG(pDevice, fMP_CONTROL_READS);
|
||||
}
|
||||
|
||||
spin_unlock_irq(&pDevice->lock);
|
||||
for (ii = 0; ii <= USB_CTL_WAIT; ii ++) {
|
||||
if (MP_TEST_FLAG(pDevice, fMP_CONTROL_READS))
|
||||
mdelay(1);
|
||||
else {
|
||||
break;
|
||||
}
|
||||
if (ii >= USB_CTL_WAIT) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"control rcv request submission timeout \n");
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
|
||||
return STATUS_FAILURE;
|
||||
}
|
||||
}
|
||||
spin_lock_irq(&pDevice->lock);
|
||||
|
||||
return ntStatus;
|
||||
}
|
||||
|
||||
//2007-0508-03<Add>by MikeLiu
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))&&(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsControlInUsbIoCompleteWrite(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
)
|
||||
#else
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsControlInUsbIoCompleteWrite(
|
||||
IN struct urb *urb
|
||||
)
|
||||
#endif
|
||||
{
|
||||
PSDevice pDevice;
|
||||
|
||||
pDevice = urb->context;
|
||||
switch (urb->status) {
|
||||
case 0:
|
||||
break;
|
||||
case -EINPROGRESS:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl write urb status EINPROGRESS%d\n", urb->status);
|
||||
break;
|
||||
case -ENOENT:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl write urb status ENOENT %d\n", urb->status);
|
||||
break;
|
||||
default:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl write urb status %d\n", urb->status);
|
||||
}
|
||||
|
||||
MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Complete function of usb Control callback
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to the adapter
|
||||
*
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver
|
||||
*
|
||||
*/
|
||||
|
||||
//2007-0508-04<Add>by MikeLiu
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))&&(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
|
||||
static
|
||||
VOID
|
||||
s_nsControlInUsbIoCompleteRead(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
)
|
||||
#else
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsControlInUsbIoCompleteRead(
|
||||
IN struct urb *urb
|
||||
)
|
||||
#endif
|
||||
{
|
||||
PSDevice pDevice;
|
||||
|
||||
pDevice = urb->context;
|
||||
switch (urb->status) {
|
||||
case 0:
|
||||
break;
|
||||
case -EINPROGRESS:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl read urb status EINPROGRESS%d\n", urb->status);
|
||||
break;
|
||||
case -ENOENT:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl read urb status = ENOENT %d\n", urb->status);
|
||||
break;
|
||||
default:
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ctrl read urb status %d\n", urb->status);
|
||||
}
|
||||
|
||||
MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Allocates an usb interrupt in irp and calls USBD.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to the adapter
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver
|
||||
*
|
||||
*/
|
||||
NTSTATUS
|
||||
PIPEnsInterruptRead(
|
||||
IN PSDevice pDevice
|
||||
)
|
||||
{
|
||||
NTSTATUS ntStatus = STATUS_FAILURE;
|
||||
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsStartInterruptUsbRead()\n");
|
||||
|
||||
if(pDevice->intBuf.bInUse == TRUE){
|
||||
return (STATUS_FAILURE);
|
||||
}
|
||||
pDevice->intBuf.bInUse = TRUE;
|
||||
// pDevice->bEventAvailable = FALSE;
|
||||
pDevice->ulIntInPosted++;
|
||||
|
||||
//
|
||||
// Now that we have created the urb, we will send a
|
||||
// request to the USB device object.
|
||||
//
|
||||
#if 0 //reserve int URB submit
|
||||
usb_fill_int_urb(pDevice->pInterruptURB,
|
||||
pDevice->usb,
|
||||
usb_rcvintpipe(pDevice->usb, 1),
|
||||
(PVOID) pDevice->intBuf.pDataBuf,
|
||||
MAX_INTERRUPT_SIZE,
|
||||
s_nsInterruptUsbIoCompleteRead,
|
||||
pDevice,
|
||||
pDevice->int_interval
|
||||
);
|
||||
#else //replace int URB submit by bulk transfer
|
||||
#ifndef Safe_Close
|
||||
usb_fill_int_urb(pDevice->pInterruptURB,
|
||||
pDevice->usb,
|
||||
usb_rcvintpipe(pDevice->usb, 1),
|
||||
(PVOID) pDevice->intBuf.pDataBuf,
|
||||
MAX_INTERRUPT_SIZE,
|
||||
s_nsInterruptUsbIoCompleteRead,
|
||||
pDevice,
|
||||
pDevice->int_interval
|
||||
);
|
||||
#else
|
||||
|
||||
//2008-0526-01<Add>by MikeLiu
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
|
||||
pDevice->pInterruptURB->interval = pDevice->int_interval;
|
||||
#endif
|
||||
|
||||
usb_fill_bulk_urb(pDevice->pInterruptURB,
|
||||
pDevice->usb,
|
||||
usb_rcvbulkpipe(pDevice->usb, 1),
|
||||
(PVOID) pDevice->intBuf.pDataBuf,
|
||||
MAX_INTERRUPT_SIZE,
|
||||
s_nsInterruptUsbIoCompleteRead,
|
||||
pDevice);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
if ((ntStatus = vntwusb_submit_urb(pDevice->pInterruptURB)) != 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit int URB failed %d\n", ntStatus);
|
||||
}
|
||||
|
||||
#else
|
||||
if (pDevice->bEventAvailable == FALSE) {
|
||||
if ((ntStatus = vntwusb_submit_urb(pDevice->pInterruptURB)) != 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit int URB failed %d\n", ntStatus);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----s_nsStartInterruptUsbRead Return(%x)\n",ntStatus);
|
||||
return ntStatus;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Complete function of usb interrupt in irp.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to the adapter
|
||||
*
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver
|
||||
*
|
||||
*/
|
||||
//2007-0508-05<Add>by MikeLiu
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))&&(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
|
||||
static
|
||||
VOID
|
||||
s_nsInterruptUsbIoCompleteRead(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
)
|
||||
#else
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsInterruptUsbIoCompleteRead(
|
||||
IN struct urb *urb
|
||||
)
|
||||
|
||||
#endif
|
||||
{
|
||||
PSDevice pDevice;
|
||||
NTSTATUS ntStatus;
|
||||
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsInterruptUsbIoCompleteRead\n");
|
||||
//
|
||||
// The context given to IoSetCompletionRoutine is the receive buffer object
|
||||
//
|
||||
pDevice = (PSDevice)urb->context;
|
||||
|
||||
//
|
||||
// We have a number of cases:
|
||||
// 1) The USB read timed out and we received no data.
|
||||
// 2) The USB read timed out and we received some data.
|
||||
// 3) The USB read was successful and fully filled our irp buffer.
|
||||
// 4) The irp was cancelled.
|
||||
// 5) Some other failure from the USB device object.
|
||||
//
|
||||
ntStatus = urb->status;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_nsInterruptUsbIoCompleteRead Status %d\n", ntStatus);
|
||||
|
||||
// if we were not successful, we need to free the int buffer for future use right here
|
||||
// otherwise interrupt data handler will free int buffer after it handle it.
|
||||
if (( ntStatus != STATUS_SUCCESS )) {
|
||||
pDevice->ulBulkInError++;
|
||||
pDevice->intBuf.bInUse = FALSE;
|
||||
|
||||
// if (ntStatus == USBD_STATUS_CRC) {
|
||||
// pDevice->ulIntInContCRCError++;
|
||||
// }
|
||||
|
||||
// if (ntStatus == STATUS_NOT_CONNECTED )
|
||||
// {
|
||||
pDevice->fKillEventPollingThread = TRUE;
|
||||
// }
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"IntUSBIoCompleteControl STATUS = %d\n", ntStatus );
|
||||
}
|
||||
else {
|
||||
pDevice->ulIntInBytesRead += (ULONG)urb->actual_length;
|
||||
pDevice->ulIntInContCRCError = 0;
|
||||
pDevice->bEventAvailable = TRUE;
|
||||
INTnsProcessData(pDevice);
|
||||
}
|
||||
|
||||
STAvUpdateUSBCounter(&pDevice->scStatistic.USB_InterruptStat, ntStatus);
|
||||
|
||||
|
||||
if (pDevice->fKillEventPollingThread != TRUE) {
|
||||
#if 0 //reserve int URB submit
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
if ((ntStatus = vntwusb_submit_urb(urb)) != 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Re-Submit int URB failed %d\n", ntStatus);
|
||||
}
|
||||
|
||||
#else
|
||||
if (pDevice->bEventAvailable == FALSE) {
|
||||
if ((ntStatus = vntwusb_submit_urb(urb)) != 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Re-Submit int URB failed %d\n", ntStatus);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#else //replace int URB submit by bulk transfer
|
||||
#ifdef Safe_Close
|
||||
usb_fill_bulk_urb(pDevice->pInterruptURB,
|
||||
pDevice->usb,
|
||||
usb_rcvbulkpipe(pDevice->usb, 1),
|
||||
(PVOID) pDevice->intBuf.pDataBuf,
|
||||
MAX_INTERRUPT_SIZE,
|
||||
s_nsInterruptUsbIoCompleteRead,
|
||||
pDevice);
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
if ((ntStatus = vntwusb_submit_urb(pDevice->pInterruptURB)) != 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit int URB failed %d\n", ntStatus);
|
||||
}
|
||||
|
||||
#else
|
||||
if (pDevice->bEventAvailable == FALSE) {
|
||||
if ((ntStatus = vntwusb_submit_urb(pDevice->pInterruptURB)) != 0) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit int URB failed %d\n", ntStatus);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
tasklet_schedule(&pDevice->EventWorkItem);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
//
|
||||
// We return STATUS_MORE_PROCESSING_REQUIRED so that the completion
|
||||
// routine (IofCompleteRequest) will stop working on the irp.
|
||||
//
|
||||
return ;
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Allocates an usb BulkIn irp and calls USBD.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to the adapter
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver
|
||||
*
|
||||
*/
|
||||
NTSTATUS
|
||||
PIPEnsBulkInUsbRead(
|
||||
IN PSDevice pDevice,
|
||||
IN PRCB pRCB
|
||||
)
|
||||
{
|
||||
NTSTATUS ntStatus= 0;
|
||||
struct urb *pUrb;
|
||||
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsStartBulkInUsbRead\n");
|
||||
|
||||
if (MP_TEST_FLAG(pDevice, fMP_DISCONNECTED))
|
||||
return STATUS_FAILURE;
|
||||
|
||||
pDevice->ulBulkInPosted++;
|
||||
|
||||
|
||||
pUrb = pRCB->pUrb;
|
||||
//
|
||||
// Now that we have created the urb, we will send a
|
||||
// request to the USB device object.
|
||||
//
|
||||
if (pRCB->skb == NULL) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pRCB->skb is null \n");
|
||||
return ntStatus;
|
||||
}
|
||||
|
||||
usb_fill_bulk_urb(pUrb,
|
||||
pDevice->usb,
|
||||
usb_rcvbulkpipe(pDevice->usb, 2),
|
||||
(PVOID) (pRCB->skb->data),
|
||||
MAX_TOTAL_SIZE_WITH_ALL_HEADERS,
|
||||
s_nsBulkInUsbIoCompleteRead,
|
||||
pRCB);
|
||||
|
||||
if((ntStatus = vntwusb_submit_urb(pUrb)!=0)){
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit Rx URB failed %d\n", ntStatus);
|
||||
return STATUS_FAILURE ;
|
||||
}
|
||||
pRCB->Ref = 1;
|
||||
pRCB->bBoolInUse= TRUE;
|
||||
|
||||
return ntStatus;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Complete function of usb BulkIn irp.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to the adapter
|
||||
*
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver
|
||||
*
|
||||
*/
|
||||
//2007-0508-06<Add>by MikeLiu
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))&&(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
|
||||
static
|
||||
VOID
|
||||
s_nsBulkInUsbIoCompleteRead(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
)
|
||||
#else
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsBulkInUsbIoCompleteRead(
|
||||
IN struct urb *urb
|
||||
)
|
||||
|
||||
#endif
|
||||
{
|
||||
PRCB pRCB = (PRCB)urb->context;
|
||||
PSDevice pDevice = (PSDevice)pRCB->pDevice;
|
||||
ULONG bytesRead;
|
||||
BOOLEAN bIndicateReceive = FALSE;
|
||||
BOOL bReAllocSkb = FALSE;
|
||||
NTSTATUS status;
|
||||
|
||||
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsBulkInUsbIoCompleteRead\n");
|
||||
status = urb->status;
|
||||
bytesRead = urb->actual_length;
|
||||
|
||||
if (status) {
|
||||
pDevice->ulBulkInError++;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BULK In failed %d\n", status);
|
||||
|
||||
#ifdef Calcu_LinkQual
|
||||
pDevice->scStatistic.RxFcsErrCnt ++;
|
||||
#endif
|
||||
//todo...xxxxxx
|
||||
// if (status == USBD_STATUS_CRC) {
|
||||
// pDevice->ulBulkInContCRCError++;
|
||||
// }
|
||||
// if (status == STATUS_DEVICE_NOT_CONNECTED )
|
||||
// {
|
||||
// MP_SET_FLAG(pDevice, fMP_DISCONNECTED);
|
||||
// }
|
||||
} else {
|
||||
bIndicateReceive = TRUE;
|
||||
pDevice->ulBulkInContCRCError = 0;
|
||||
pDevice->ulBulkInBytesRead += bytesRead;
|
||||
|
||||
#ifdef Calcu_LinkQual
|
||||
pDevice->scStatistic.RxOkCnt ++;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
STAvUpdateUSBCounter(&pDevice->scStatistic.USB_BulkInStat, status);
|
||||
|
||||
if (bIndicateReceive) {
|
||||
spin_lock(&pDevice->lock);
|
||||
if (RXbBulkInProcessData(pDevice, pRCB, bytesRead) == TRUE)
|
||||
bReAllocSkb = TRUE;
|
||||
spin_unlock(&pDevice->lock);
|
||||
}
|
||||
pRCB->Ref--;
|
||||
if (pRCB->Ref == 0)
|
||||
{
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeNormal %d \n",pDevice->NumRecvFreeList);
|
||||
spin_lock(&pDevice->lock);
|
||||
RXvFreeRCB(pRCB, bReAllocSkb);
|
||||
spin_unlock(&pDevice->lock);
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Allocates an usb BulkOut irp and calls USBD.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to the adapter
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver
|
||||
*
|
||||
*/
|
||||
NDIS_STATUS
|
||||
PIPEnsSendBulkOut(
|
||||
IN PSDevice pDevice,
|
||||
IN PUSB_SEND_CONTEXT pContext
|
||||
)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct urb *pUrb;
|
||||
|
||||
|
||||
|
||||
pDevice->bPWBitOn = FALSE;
|
||||
|
||||
/*
|
||||
if (pDevice->pPendingBulkOutContext != NULL) {
|
||||
pDevice->NumContextsQueued++;
|
||||
EnqueueContext(pDevice->FirstTxContextQueue, pDevice->LastTxContextQueue, pContext);
|
||||
status = STATUS_PENDING;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Send pending!\n");
|
||||
return status;
|
||||
}
|
||||
*/
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_nsSendBulkOut\n");
|
||||
|
||||
if(MP_IS_READY(pDevice) && MP_TEST_FLAG(pDevice, fMP_POST_WRITES)) {
|
||||
|
||||
pUrb = pContext->pUrb;
|
||||
pDevice->ulBulkOutPosted++;
|
||||
// pDevice->pPendingBulkOutContext = pContext;
|
||||
usb_fill_bulk_urb(
|
||||
pUrb,
|
||||
pDevice->usb,
|
||||
usb_sndbulkpipe(pDevice->usb, 3),
|
||||
(PVOID) &(pContext->Data[0]),
|
||||
pContext->uBufLen,
|
||||
s_nsBulkOutIoCompleteWrite,
|
||||
pContext);
|
||||
|
||||
if((status = vntwusb_submit_urb(pUrb))!=0)
|
||||
{
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Submit Tx URB failed %d\n", status);
|
||||
return STATUS_FAILURE;
|
||||
}
|
||||
return STATUS_PENDING;
|
||||
}
|
||||
else {
|
||||
pContext->bBoolInUse = FALSE;
|
||||
return STATUS_RESOURCES;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Description: s_nsBulkOutIoCompleteWrite
|
||||
* 1a) Indicate to the protocol the status of the write.
|
||||
* 1b) Return ownership of the packet to the protocol.
|
||||
*
|
||||
* 2) If any more packets are queue for sending, send another packet
|
||||
* to USBD.
|
||||
* If the attempt to send the packet to the driver fails,
|
||||
* return ownership of the packet to the protocol and
|
||||
* try another packet (until one succeeds).
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pdoUsbDevObj - pointer to the USB device object which
|
||||
* completed the irp
|
||||
* pIrp - the irp which was completed by the
|
||||
* device object
|
||||
* pContext - the context given to IoSetCompletionRoutine
|
||||
* before calling IoCallDriver on the irp
|
||||
* The pContext is a pointer to the USB device object.
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: STATUS_MORE_PROCESSING_REQUIRED - allows the completion routine
|
||||
* (IofCompleteRequest) to stop working on the irp.
|
||||
*
|
||||
*/
|
||||
//2007-0508-07<Add>by MikeLiu
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))&&(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
|
||||
static
|
||||
VOID
|
||||
s_nsBulkOutIoCompleteWrite(
|
||||
IN struct urb *urb,
|
||||
IN struct pt_regs *regs
|
||||
)
|
||||
#else
|
||||
|
||||
static
|
||||
VOID
|
||||
s_nsBulkOutIoCompleteWrite(
|
||||
IN struct urb *urb
|
||||
)
|
||||
#endif
|
||||
{
|
||||
PSDevice pDevice;
|
||||
NTSTATUS status;
|
||||
CONTEXT_TYPE ContextType;
|
||||
ULONG ulBufLen;
|
||||
PUSB_SEND_CONTEXT pContext;
|
||||
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsBulkOutIoCompleteWrite\n");
|
||||
//
|
||||
// The context given to IoSetCompletionRoutine is an USB_CONTEXT struct
|
||||
//
|
||||
pContext = (PUSB_SEND_CONTEXT) urb->context;
|
||||
ASSERT( NULL != pContext );
|
||||
|
||||
pDevice = pContext->pDevice;
|
||||
ContextType = pContext->Type;
|
||||
ulBufLen = pContext->uBufLen;
|
||||
|
||||
if (!netif_device_present(pDevice->dev))
|
||||
return;
|
||||
|
||||
//
|
||||
// Perform various IRP, URB, and buffer 'sanity checks'
|
||||
//
|
||||
|
||||
status = urb->status;
|
||||
//we should have failed, succeeded, or cancelled, but NOT be pending
|
||||
STAvUpdateUSBCounter(&pDevice->scStatistic.USB_BulkOutStat, status);
|
||||
|
||||
if(status == STATUS_SUCCESS) {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Write %d bytes\n",(int)ulBufLen);
|
||||
pDevice->ulBulkOutBytesWrite += ulBufLen;
|
||||
pDevice->ulBulkOutContCRCError = 0;
|
||||
//2007-0115-06<Add>by MikeLiu
|
||||
#ifdef TxInSleep
|
||||
pDevice->nTxDataTimeCout = 0;
|
||||
#endif
|
||||
|
||||
} else {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BULK Out failed %d\n", status);
|
||||
pDevice->ulBulkOutError++;
|
||||
}
|
||||
|
||||
// pDevice->ulCheckForHangCount = 0;
|
||||
// pDevice->pPendingBulkOutContext = NULL;
|
||||
|
||||
if ( CONTEXT_DATA_PACKET == ContextType ) {
|
||||
// Indicate to the protocol the status of the sent packet and return
|
||||
// ownership of the packet.
|
||||
if (pContext->pPacket != NULL) {
|
||||
dev_kfree_skb_irq(pContext->pPacket);
|
||||
pContext->pPacket = NULL;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"tx %d bytes\n",(int)ulBufLen);
|
||||
}
|
||||
|
||||
pDevice->dev->trans_start = jiffies;
|
||||
|
||||
|
||||
if (status == STATUS_SUCCESS) {
|
||||
pDevice->packetsSent++;
|
||||
}
|
||||
else {
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Send USB error! [%08xh]\n", status);
|
||||
pDevice->packetsSentDropped++;
|
||||
}
|
||||
|
||||
}
|
||||
if (pDevice->bLinkPass == TRUE) {
|
||||
if (netif_queue_stopped(pDevice->dev))
|
||||
netif_wake_queue(pDevice->dev);
|
||||
}
|
||||
pContext->bBoolInUse = FALSE;
|
||||
|
||||
return;
|
||||
}
|
|
@ -0,0 +1,116 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: usbpipe.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Warren Hsu
|
||||
*
|
||||
* Date: Mar. 30, 2005
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __USBPIPE_H__
|
||||
#define __USBPIPE_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
NTSTATUS
|
||||
PIPEnsControlOut(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byRequest,
|
||||
IN WORD wValue,
|
||||
IN WORD wIndex,
|
||||
IN WORD wLength,
|
||||
IN PBYTE pbyBuffer
|
||||
);
|
||||
|
||||
|
||||
|
||||
NTSTATUS
|
||||
PIPEnsControlOutAsyn(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byRequest,
|
||||
IN WORD wValue,
|
||||
IN WORD wIndex,
|
||||
IN WORD wLength,
|
||||
IN PBYTE pbyBuffer
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
PIPEnsControlIn(
|
||||
IN PSDevice pDevice,
|
||||
IN BYTE byRequest,
|
||||
IN WORD wValue,
|
||||
IN WORD wIndex,
|
||||
IN WORD wLength,
|
||||
IN OUT PBYTE pbyBuffer
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
NTSTATUS
|
||||
PIPEnsInterruptRead(
|
||||
IN PSDevice pDevice
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
PIPEnsBulkInUsbRead(
|
||||
IN PSDevice pDevice,
|
||||
IN PRCB pRCB
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
PIPEnsSendBulkOut(
|
||||
IN PSDevice pDevice,
|
||||
IN PUSB_SEND_CONTEXT pContext
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __USBPIPE_H__
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
#VNT Configuration
|
||||
[start]
|
||||
ZONETYPE=EUROPE
|
||||
AUTHENMODE=12
|
||||
ENCRYPTIONMODE=34
|
||||
[end]
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,156 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: wcmd.h
|
||||
*
|
||||
* Purpose: Handles the management command interface functions
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: May 8, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __WCMD_H__
|
||||
#define __WCMD_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__80211HDR_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
#if !defined(__80211MGR_H__)
|
||||
#include "80211mgr.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
|
||||
#define AUTHENTICATE_TIMEOUT 1000 //ms
|
||||
#define ASSOCIATE_TIMEOUT 1000 //ms
|
||||
|
||||
|
||||
// Command code
|
||||
typedef enum tagCMD_CODE {
|
||||
WLAN_CMD_BSSID_SCAN,
|
||||
WLAN_CMD_SSID,
|
||||
WLAN_CMD_DISASSOCIATE,
|
||||
WLAN_CMD_DEAUTH,
|
||||
WLAN_CMD_RX_PSPOLL,
|
||||
WLAN_CMD_RADIO,
|
||||
WLAN_CMD_CHANGE_BBSENSITIVITY,
|
||||
WLAN_CMD_SETPOWER,
|
||||
WLAN_CMD_TBTT_WAKEUP,
|
||||
WLAN_CMD_BECON_SEND,
|
||||
WLAN_CMD_CHANGE_ANTENNA,
|
||||
WLAN_CMD_REMOVE_ALLKEY,
|
||||
WLAN_CMD_MAC_DISPOWERSAVING,
|
||||
WLAN_CMD_11H_CHSW,
|
||||
WLAN_CMD_RUN_AP
|
||||
} CMD_CODE, DEF* PCMD_CODE;
|
||||
|
||||
#define CMD_Q_SIZE 32
|
||||
|
||||
typedef enum tagCMD_STATUS {
|
||||
|
||||
CMD_STATUS_SUCCESS = 0,
|
||||
CMD_STATUS_FAILURE,
|
||||
CMD_STATUS_RESOURCES,
|
||||
CMD_STATUS_TIMEOUT,
|
||||
CMD_STATUS_PENDING
|
||||
|
||||
} CMD_STATUS, DEF* PCMD_STATUS;
|
||||
|
||||
typedef struct tagCMD_ITEM {
|
||||
CMD_CODE eCmd;
|
||||
BYTE abyCmdDesireSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
|
||||
BOOL bNeedRadioOFF;
|
||||
BOOL bRadioCmd;
|
||||
BOOL bForceSCAN;
|
||||
WORD wDeAuthenReason;
|
||||
} CMD_ITEM, DEF* PCMD_ITEM;
|
||||
|
||||
// Command state
|
||||
typedef enum tagCMD_STATE {
|
||||
WLAN_CMD_SCAN_START,
|
||||
WLAN_CMD_SCAN_END,
|
||||
WLAN_CMD_DISASSOCIATE_START,
|
||||
WLAN_CMD_DEAUTHEN_START,
|
||||
WLAN_CMD_SSID_START,
|
||||
WLAN_AUTHENTICATE_WAIT,
|
||||
WLAN_ASSOCIATE_WAIT,
|
||||
WLAN_DISASSOCIATE_WAIT,
|
||||
WLAN_CMD_TX_PSPACKET_START,
|
||||
WLAN_CMD_RADIO_START,
|
||||
WLAN_CMD_CHANGE_BBSENSITIVITY_START,
|
||||
WLAN_CMD_SETPOWER_START,
|
||||
WLAN_CMD_AP_MODE_START,
|
||||
WLAN_CMD_TBTT_WAKEUP_START,
|
||||
WLAN_CMD_BECON_SEND_START,
|
||||
WLAN_CMD_CHANGE_ANTENNA_START,
|
||||
WLAN_CMD_REMOVE_ALLKEY_START,
|
||||
WLAN_CMD_MAC_DISPOWERSAVING_START,
|
||||
WLAN_CMD_11H_CHSW_START,
|
||||
WLAN_CMD_IDLE
|
||||
} CMD_STATE, DEF* PCMD_STATE;
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
VOID
|
||||
vResetCommandTimer(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
BOOL
|
||||
bScheduleCommand(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN CMD_CODE eCommand,
|
||||
IN PBYTE pbyItem0
|
||||
);
|
||||
|
||||
VOID
|
||||
vRunCommand(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
/*
|
||||
VOID
|
||||
WCMDvCommandThread(
|
||||
PVOID Context
|
||||
);
|
||||
*/
|
||||
|
||||
//2007-0115-09<Add>by MikeLiu
|
||||
#ifdef TxInSleep
|
||||
VOID
|
||||
BSSvSecondTxData(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
#endif
|
||||
|
||||
#endif //__WCMD_H__
|
|
@ -0,0 +1,263 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: wctl.c
|
||||
*
|
||||
* Purpose: handle WMAC duplicate filter & defragment
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Jun. 27, 2002
|
||||
*
|
||||
* Functions:
|
||||
* WCTLbIsDuplicate - Test if duplicate packet
|
||||
* WCTLuSearchDFCB - Search DeFragment Control Database
|
||||
* WCTLuInsertDFCB - Insert DeFragment Control Database
|
||||
* WCTLbHandleFragment - Handle received fragment packet
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__WCTL_H__)
|
||||
#include "wctl.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__CARD_H__)
|
||||
#include "card.h"
|
||||
#endif
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
// static int msglevel =MSG_LEVEL_INFO;
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Scan Rx cache. Return TRUE if packet is duplicate, else
|
||||
* inserts in receive cache and returns FALSE.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pCache - Receive packets history
|
||||
* pMACHeader - 802.11 MAC Header of received packet
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if packet duplicate; otherwise FALSE
|
||||
*
|
||||
*/
|
||||
|
||||
BOOL WCTLbIsDuplicate (PSCache pCache, PS802_11Header pMACHeader)
|
||||
{
|
||||
UINT uIndex;
|
||||
UINT ii;
|
||||
PSCacheEntry pCacheEntry;
|
||||
|
||||
if (IS_FC_RETRY(pMACHeader)) {
|
||||
|
||||
uIndex = pCache->uInPtr;
|
||||
for (ii = 0; ii < DUPLICATE_RX_CACHE_LENGTH; ii++) {
|
||||
pCacheEntry = &(pCache->asCacheEntry[uIndex]);
|
||||
if ((pCacheEntry->wFmSequence == pMACHeader->wSeqCtl) &&
|
||||
(IS_ETH_ADDRESS_EQUAL (&(pCacheEntry->abyAddr2[0]), &(pMACHeader->abyAddr2[0]))) &&
|
||||
(LOBYTE(pCacheEntry->wFrameCtl) == LOBYTE(pMACHeader->wFrameCtl))
|
||||
) {
|
||||
/* Duplicate match */
|
||||
return TRUE;
|
||||
}
|
||||
ADD_ONE_WITH_WRAP_AROUND(uIndex, DUPLICATE_RX_CACHE_LENGTH);
|
||||
}
|
||||
}
|
||||
/* Not fount in cache - insert */
|
||||
pCacheEntry = &pCache->asCacheEntry[pCache->uInPtr];
|
||||
pCacheEntry->wFmSequence = pMACHeader->wSeqCtl;
|
||||
memcpy(&(pCacheEntry->abyAddr2[0]), &(pMACHeader->abyAddr2[0]), U_ETHER_ADDR_LEN);
|
||||
pCacheEntry->wFrameCtl = pMACHeader->wFrameCtl;
|
||||
ADD_ONE_WITH_WRAP_AROUND(pCache->uInPtr, DUPLICATE_RX_CACHE_LENGTH);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Found if sequence number of received fragment packet in Defragment Database
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to adapter
|
||||
* pMACHeader - 802.11 MAC Header of received packet
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: index number in Defragment Database
|
||||
*
|
||||
*/
|
||||
UINT WCTLuSearchDFCB (PSDevice pDevice, PS802_11Header pMACHeader)
|
||||
{
|
||||
UINT ii;
|
||||
|
||||
for(ii=0;ii<pDevice->cbDFCB;ii++) {
|
||||
if ((pDevice->sRxDFCB[ii].bInUse == TRUE) &&
|
||||
(IS_ETH_ADDRESS_EQUAL (&(pDevice->sRxDFCB[ii].abyAddr2[0]), &(pMACHeader->abyAddr2[0])))
|
||||
) {
|
||||
//
|
||||
return(ii);
|
||||
}
|
||||
}
|
||||
return(pDevice->cbDFCB);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Insert received fragment packet in Defragment Database
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to adapter
|
||||
* pMACHeader - 802.11 MAC Header of received packet
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: index number in Defragment Database
|
||||
*
|
||||
*/
|
||||
UINT WCTLuInsertDFCB (PSDevice pDevice, PS802_11Header pMACHeader)
|
||||
{
|
||||
UINT ii;
|
||||
|
||||
if (pDevice->cbFreeDFCB == 0)
|
||||
return(pDevice->cbDFCB);
|
||||
for(ii=0;ii<pDevice->cbDFCB;ii++) {
|
||||
if (pDevice->sRxDFCB[ii].bInUse == FALSE) {
|
||||
pDevice->cbFreeDFCB--;
|
||||
pDevice->sRxDFCB[ii].uLifetime = pDevice->dwMaxReceiveLifetime;
|
||||
pDevice->sRxDFCB[ii].bInUse = TRUE;
|
||||
pDevice->sRxDFCB[ii].wSequence = (pMACHeader->wSeqCtl >> 4);
|
||||
pDevice->sRxDFCB[ii].wFragNum = (pMACHeader->wSeqCtl & 0x000F);
|
||||
memcpy(&(pDevice->sRxDFCB[ii].abyAddr2[0]), &(pMACHeader->abyAddr2[0]), U_ETHER_ADDR_LEN);
|
||||
return(ii);
|
||||
}
|
||||
}
|
||||
return(pDevice->cbDFCB);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Description:
|
||||
* Handle received fragment packet
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pDevice - Pointer to adapter
|
||||
* pMACHeader - 802.11 MAC Header of received packet
|
||||
* cbFrameLength - Frame length
|
||||
* bWEP - is WEP packet
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: TRUE if it is valid fragment packet and we have resource to defragment; otherwise FALSE
|
||||
*
|
||||
*/
|
||||
BOOL WCTLbHandleFragment (PSDevice pDevice, PS802_11Header pMACHeader, UINT cbFrameLength, BOOL bWEP, BOOL bExtIV)
|
||||
{
|
||||
UINT uHeaderSize;
|
||||
|
||||
|
||||
if (bWEP == TRUE) {
|
||||
uHeaderSize = 28;
|
||||
if (bExtIV)
|
||||
// ExtIV
|
||||
uHeaderSize +=4;
|
||||
}
|
||||
else {
|
||||
uHeaderSize = 24;
|
||||
}
|
||||
|
||||
if (IS_FIRST_FRAGMENT_PKT(pMACHeader)) {
|
||||
pDevice->uCurrentDFCBIdx = WCTLuSearchDFCB(pDevice, pMACHeader);
|
||||
if (pDevice->uCurrentDFCBIdx < pDevice->cbDFCB) {
|
||||
// duplicate, we must flush previous DCB
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].uLifetime = pDevice->dwMaxReceiveLifetime;
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wSequence = (pMACHeader->wSeqCtl >> 4);
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wFragNum = (pMACHeader->wSeqCtl & 0x000F);
|
||||
}
|
||||
else {
|
||||
pDevice->uCurrentDFCBIdx = WCTLuInsertDFCB(pDevice, pMACHeader);
|
||||
if (pDevice->uCurrentDFCBIdx == pDevice->cbDFCB) {
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
// reserve 8 byte to match MAC RX Buffer
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer = (PBYTE) (pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].skb->data + 8);
|
||||
// pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer = (PBYTE) (pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].skb->data + 4);
|
||||
memcpy(pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer, pMACHeader, cbFrameLength);
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].cbFrameLength = cbFrameLength;
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer += cbFrameLength;
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wFragNum++;
|
||||
//DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "First pDevice->uCurrentDFCBIdx= %d\n", pDevice->uCurrentDFCBIdx);
|
||||
return(FALSE);
|
||||
}
|
||||
else {
|
||||
pDevice->uCurrentDFCBIdx = WCTLuSearchDFCB(pDevice, pMACHeader);
|
||||
if (pDevice->uCurrentDFCBIdx != pDevice->cbDFCB) {
|
||||
if ((pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wSequence == (pMACHeader->wSeqCtl >> 4)) &&
|
||||
(pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wFragNum == (pMACHeader->wSeqCtl & 0x000F)) &&
|
||||
((pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].cbFrameLength + cbFrameLength - uHeaderSize) < 2346)) {
|
||||
|
||||
memcpy(pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer, ((PBYTE) (pMACHeader) + uHeaderSize), (cbFrameLength - uHeaderSize));
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].cbFrameLength += (cbFrameLength - uHeaderSize);
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer += (cbFrameLength - uHeaderSize);
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wFragNum++;
|
||||
//DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Second pDevice->uCurrentDFCBIdx= %d\n", pDevice->uCurrentDFCBIdx);
|
||||
}
|
||||
else {
|
||||
// seq error or frag # error flush DFCB
|
||||
pDevice->cbFreeDFCB++;
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].bInUse = FALSE;
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return(FALSE);
|
||||
}
|
||||
if (IS_LAST_FRAGMENT_PKT(pMACHeader)) {
|
||||
//enq defragcontrolblock
|
||||
pDevice->cbFreeDFCB++;
|
||||
pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].bInUse = FALSE;
|
||||
//DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Last pDevice->uCurrentDFCBIdx= %d\n", pDevice->uCurrentDFCBIdx);
|
||||
return(TRUE);
|
||||
}
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: wctl.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Jerry Chen
|
||||
*
|
||||
* Date: Jun. 27, 2002
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __WCTL_H__
|
||||
#define __WCTL_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
#define IS_TYPE_DATA(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wFrameCtl & TYPE_802_11_MASK) == TYPE_802_11_DATA)
|
||||
|
||||
#define IS_TYPE_MGMT(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wFrameCtl & TYPE_802_11_MASK) == TYPE_802_11_MGMT)
|
||||
|
||||
#define IS_TYPE_CONTROL(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wFrameCtl & TYPE_802_11_MASK) == TYPE_802_11_CTL)
|
||||
|
||||
#define IS_FC_MOREDATA(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wFrameCtl & FC_MOREDATA) == FC_MOREDATA)
|
||||
|
||||
#define IS_FC_POWERMGT(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wFrameCtl & FC_POWERMGT) == FC_POWERMGT)
|
||||
|
||||
#define IS_FC_RETRY(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wFrameCtl & FC_RETRY) == FC_RETRY)
|
||||
|
||||
#define IS_FC_WEP(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wFrameCtl & FC_WEP) == FC_WEP)
|
||||
|
||||
#ifdef __BIG_ENDIAN
|
||||
|
||||
#define IS_FRAGMENT_PKT(pMACHeader) \
|
||||
(((((PS802_11Header) pMACHeader)->wFrameCtl & FC_MOREFRAG) != 0) | \
|
||||
((((PS802_11Header) pMACHeader)->wSeqCtl & 0x0F00) != 0))
|
||||
|
||||
#define IS_FIRST_FRAGMENT_PKT(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wSeqCtl & 0x0F00) == 0)
|
||||
|
||||
#else
|
||||
|
||||
#define IS_FRAGMENT_PKT(pMACHeader) \
|
||||
(((((PS802_11Header) pMACHeader)->wFrameCtl & FC_MOREFRAG) != 0) | \
|
||||
((((PS802_11Header) pMACHeader)->wSeqCtl & 0x000F) != 0))
|
||||
|
||||
#define IS_FIRST_FRAGMENT_PKT(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wSeqCtl & 0x000F) == 0)
|
||||
|
||||
#endif//#ifdef __BIG_ENDIAN
|
||||
|
||||
#define IS_LAST_FRAGMENT_PKT(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wFrameCtl & FC_MOREFRAG) == 0)
|
||||
|
||||
#define IS_CTL_PSPOLL(pMACHeader) \
|
||||
((((PS802_11Header) pMACHeader)->wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL)
|
||||
|
||||
|
||||
#define ADD_ONE_WITH_WRAP_AROUND(uVar, uModulo) { \
|
||||
if ((uVar) >= ((uModulo) - 1)) \
|
||||
(uVar) = 0; \
|
||||
else \
|
||||
(uVar)++; \
|
||||
}
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
BOOL WCTLbIsDuplicate(PSCache pCache, PS802_11Header pMACHeader);
|
||||
BOOL WCTLbHandleFragment(PSDevice pDevice, PS802_11Header pMACHeader, UINT cbFrameLength, BOOL bWEP, BOOL bExtIV);
|
||||
UINT WCTLuSearchDFCB(PSDevice pDevice, PS802_11Header pMACHeader);
|
||||
UINT WCTLuInsertDFCB(PSDevice pDevice, PS802_11Header pMACHeader);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __WCTL_H__
|
||||
|
||||
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,519 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: wmgr.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: lyndon chen
|
||||
*
|
||||
* Date: Jan 2, 2003
|
||||
*
|
||||
* Functions:
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __WMGR_H__
|
||||
#define __WMGR_H__
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__80211MGR_H__)
|
||||
#include "80211mgr.h"
|
||||
#endif
|
||||
#if !defined(__80211HDR_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
#if !defined(__WCMD_H__)
|
||||
#include "wcmd.h"
|
||||
#endif
|
||||
#if !defined(__BSSDB_H__)
|
||||
#include "bssdb.h"
|
||||
#endif
|
||||
#if !defined(__WPA2_H__)
|
||||
#include "wpa2.h"
|
||||
#endif
|
||||
#if !defined(__CARD_H__)
|
||||
#include "card.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
|
||||
// Scan time
|
||||
#define PROBE_DELAY 100 // (us)
|
||||
#define SWITCH_CHANNEL_DELAY 200 // (us)
|
||||
#define WLAN_SCAN_MINITIME 25 // (ms)
|
||||
#define WLAN_SCAN_MAXTIME 100 // (ms)
|
||||
#define TRIVIAL_SYNC_DIFFERENCE 0 // (us)
|
||||
#define DEFAULT_IBSS_BI 100 // (ms)
|
||||
|
||||
#define WCMD_ACTIVE_SCAN_TIME 20 //(ms)
|
||||
#define WCMD_PASSIVE_SCAN_TIME 100 //(ms)
|
||||
|
||||
|
||||
#define DEFAULT_MSDU_LIFETIME 512 // ms
|
||||
#define DEFAULT_MSDU_LIFETIME_RES_64us 8000 // 64us
|
||||
|
||||
#define DEFAULT_MGN_LIFETIME 8 // ms
|
||||
#define DEFAULT_MGN_LIFETIME_RES_64us 125 // 64us
|
||||
|
||||
#define MAKE_BEACON_RESERVED 10 //(us)
|
||||
|
||||
|
||||
#define TIM_MULTICAST_MASK 0x01
|
||||
#define TIM_BITMAPOFFSET_MASK 0xFE
|
||||
#define DEFAULT_DTIM_PERIOD 1
|
||||
|
||||
#define AP_LONG_RETRY_LIMIT 4
|
||||
|
||||
#define DEFAULT_IBSS_CHANNEL 6 //2.4G
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
//mike define: make timer to expire after desired times
|
||||
#define timer_expire(timer,next_tick) mod_timer(&timer, RUN_AT(next_tick))
|
||||
|
||||
typedef void (*TimerFunction)(ULONG);
|
||||
|
||||
|
||||
//+++ NDIS related
|
||||
|
||||
typedef UCHAR NDIS_802_11_MAC_ADDRESS[6];
|
||||
typedef struct _NDIS_802_11_AI_REQFI
|
||||
{
|
||||
USHORT Capabilities;
|
||||
USHORT ListenInterval;
|
||||
NDIS_802_11_MAC_ADDRESS CurrentAPAddress;
|
||||
} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI;
|
||||
|
||||
typedef struct _NDIS_802_11_AI_RESFI
|
||||
{
|
||||
USHORT Capabilities;
|
||||
USHORT StatusCode;
|
||||
USHORT AssociationId;
|
||||
} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI;
|
||||
|
||||
typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION
|
||||
{
|
||||
ULONG Length;
|
||||
USHORT AvailableRequestFixedIEs;
|
||||
NDIS_802_11_AI_REQFI RequestFixedIEs;
|
||||
ULONG RequestIELength;
|
||||
ULONG OffsetRequestIEs;
|
||||
USHORT AvailableResponseFixedIEs;
|
||||
NDIS_802_11_AI_RESFI ResponseFixedIEs;
|
||||
ULONG ResponseIELength;
|
||||
ULONG OffsetResponseIEs;
|
||||
} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION;
|
||||
|
||||
|
||||
|
||||
typedef struct tagSAssocInfo {
|
||||
NDIS_802_11_ASSOCIATION_INFORMATION AssocInfo;
|
||||
BYTE abyIEs[WLAN_BEACON_FR_MAXLEN+WLAN_BEACON_FR_MAXLEN];
|
||||
// store ReqIEs set by OID_802_11_ASSOCIATION_INFORMATION
|
||||
ULONG RequestIELength;
|
||||
BYTE abyReqIEs[WLAN_BEACON_FR_MAXLEN];
|
||||
} SAssocInfo, DEF* PSAssocInfo;
|
||||
//---
|
||||
|
||||
|
||||
|
||||
typedef enum tagWMAC_AUTHENTICATION_MODE {
|
||||
|
||||
WMAC_AUTH_OPEN,
|
||||
WMAC_AUTH_SHAREKEY,
|
||||
WMAC_AUTH_AUTO,
|
||||
WMAC_AUTH_WPA,
|
||||
WMAC_AUTH_WPAPSK,
|
||||
WMAC_AUTH_WPANONE,
|
||||
WMAC_AUTH_WPA2,
|
||||
WMAC_AUTH_WPA2PSK,
|
||||
WMAC_AUTH_MAX // Not a real mode, defined as upper bound
|
||||
} WMAC_AUTHENTICATION_MODE, *PWMAC_AUTHENTICATION_MODE;
|
||||
|
||||
|
||||
|
||||
// Pre-configured Mode (from XP)
|
||||
|
||||
typedef enum tagWMAC_CONFIG_MODE {
|
||||
WMAC_CONFIG_ESS_STA,
|
||||
WMAC_CONFIG_IBSS_STA,
|
||||
WMAC_CONFIG_AUTO,
|
||||
WMAC_CONFIG_AP
|
||||
|
||||
} WMAC_CONFIG_MODE, *PWMAC_CONFIG_MODE;
|
||||
|
||||
|
||||
typedef enum tagWMAC_SCAN_TYPE {
|
||||
|
||||
WMAC_SCAN_ACTIVE,
|
||||
WMAC_SCAN_PASSIVE,
|
||||
WMAC_SCAN_HYBRID
|
||||
|
||||
} WMAC_SCAN_TYPE, *PWMAC_SCAN_TYPE;
|
||||
|
||||
|
||||
typedef enum tagWMAC_SCAN_STATE {
|
||||
|
||||
WMAC_NO_SCANNING,
|
||||
WMAC_IS_SCANNING,
|
||||
WMAC_IS_PROBEPENDING
|
||||
|
||||
} WMAC_SCAN_STATE, *PWMAC_SCAN_STATE;
|
||||
|
||||
|
||||
|
||||
// Notes:
|
||||
// Basic Service Set state explained as following:
|
||||
// WMAC_STATE_IDLE : no BSS is selected (Adhoc or Infra)
|
||||
// WMAC_STATE_STARTED : no BSS is selected, start own IBSS (Adhoc only)
|
||||
// WMAC_STATE_JOINTED : BSS is selected and synchronized (Adhoc or Infra)
|
||||
// WMAC_STATE_AUTHPENDING : Authentication pending (Infra)
|
||||
// WMAC_STATE_AUTH : Authenticated (Infra)
|
||||
// WMAC_STATE_ASSOCPENDING : Association pending (Infra)
|
||||
// WMAC_STATE_ASSOC : Associated (Infra)
|
||||
|
||||
typedef enum tagWMAC_BSS_STATE {
|
||||
|
||||
WMAC_STATE_IDLE,
|
||||
WMAC_STATE_STARTED,
|
||||
WMAC_STATE_JOINTED,
|
||||
WMAC_STATE_AUTHPENDING,
|
||||
WMAC_STATE_AUTH,
|
||||
WMAC_STATE_ASSOCPENDING,
|
||||
WMAC_STATE_ASSOC
|
||||
|
||||
} WMAC_BSS_STATE, *PWMAC_BSS_STATE;
|
||||
|
||||
// WMAC selected running mode
|
||||
typedef enum tagWMAC_CURRENT_MODE {
|
||||
|
||||
WMAC_MODE_STANDBY,
|
||||
WMAC_MODE_ESS_STA,
|
||||
WMAC_MODE_IBSS_STA,
|
||||
WMAC_MODE_ESS_AP
|
||||
|
||||
} WMAC_CURRENT_MODE, *PWMAC_CURRENT_MODE;
|
||||
|
||||
|
||||
typedef enum tagWMAC_POWER_MODE {
|
||||
|
||||
WMAC_POWER_CAM,
|
||||
WMAC_POWER_FAST,
|
||||
WMAC_POWER_MAX
|
||||
|
||||
} WMAC_POWER_MODE, *PWMAC_POWER_MODE;
|
||||
|
||||
|
||||
|
||||
// Tx Managment Packet descriptor
|
||||
typedef struct tagSTxMgmtPacket {
|
||||
|
||||
PUWLAN_80211HDR p80211Header;
|
||||
UINT cbMPDULen;
|
||||
UINT cbPayloadLen;
|
||||
|
||||
} STxMgmtPacket, DEF* PSTxMgmtPacket;
|
||||
|
||||
|
||||
// Rx Managment Packet descriptor
|
||||
typedef struct tagSRxMgmtPacket {
|
||||
|
||||
PUWLAN_80211HDR p80211Header;
|
||||
QWORD qwLocalTSF;
|
||||
UINT cbMPDULen;
|
||||
UINT cbPayloadLen;
|
||||
UINT uRSSI;
|
||||
BYTE bySQ;
|
||||
BYTE byRxRate;
|
||||
BYTE byRxChannel;
|
||||
|
||||
} SRxMgmtPacket, DEF* PSRxMgmtPacket;
|
||||
|
||||
|
||||
|
||||
typedef struct tagSMgmtObject
|
||||
{
|
||||
|
||||
PVOID pAdapter;
|
||||
// MAC address
|
||||
BYTE abyMACAddr[WLAN_ADDR_LEN];
|
||||
|
||||
// Configuration Mode
|
||||
WMAC_CONFIG_MODE eConfigMode; // MAC pre-configed mode
|
||||
|
||||
CARD_PHY_TYPE eCurrentPHYMode;
|
||||
|
||||
|
||||
// Operation state variables
|
||||
WMAC_CURRENT_MODE eCurrMode; // MAC current connection mode
|
||||
WMAC_BSS_STATE eCurrState; // MAC current BSS state
|
||||
#ifdef SndEvt_ToAPI
|
||||
WMAC_BSS_STATE eLastState; // MAC last BSS state
|
||||
#endif
|
||||
|
||||
PKnownBSS pCurrBSS;
|
||||
BYTE byCSSGK;
|
||||
BYTE byCSSPK;
|
||||
|
||||
// BYTE abyNewSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
|
||||
// BYTE abyNewExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
|
||||
BOOL bCurrBSSIDFilterOn;
|
||||
|
||||
// Current state vars
|
||||
UINT uCurrChannel;
|
||||
BYTE abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
|
||||
BYTE abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
|
||||
BYTE abyCurrSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
|
||||
BYTE abyCurrBSSID[WLAN_BSSID_LEN];
|
||||
WORD wCurrCapInfo;
|
||||
WORD wCurrAID;
|
||||
UINT uRSSITrigger;
|
||||
WORD wCurrATIMWindow;
|
||||
WORD wCurrBeaconPeriod;
|
||||
BOOL bIsDS;
|
||||
BYTE byERPContext;
|
||||
|
||||
CMD_STATE eCommandState;
|
||||
UINT uScanChannel;
|
||||
|
||||
// Desire joinning BSS vars
|
||||
BYTE abyDesireSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
|
||||
BYTE abyDesireBSSID[WLAN_BSSID_LEN];
|
||||
|
||||
//restore BSS info for Ad-Hoc mode
|
||||
//20080131-05,<Add> by Mike Liu
|
||||
#ifdef Adhoc_STA
|
||||
BYTE abyAdHocSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
|
||||
#endif
|
||||
|
||||
// Adhoc or AP configuration vars
|
||||
WORD wIBSSBeaconPeriod;
|
||||
WORD wIBSSATIMWindow;
|
||||
UINT uIBSSChannel;
|
||||
BYTE abyIBSSSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
|
||||
BYTE byAPBBType;
|
||||
BYTE abyWPAIE[MAX_WPA_IE_LEN];
|
||||
WORD wWPAIELen;
|
||||
|
||||
UINT uAssocCount;
|
||||
BOOL bMoreData;
|
||||
|
||||
// Scan state vars
|
||||
WMAC_SCAN_STATE eScanState;
|
||||
WMAC_SCAN_TYPE eScanType;
|
||||
UINT uScanStartCh;
|
||||
UINT uScanEndCh;
|
||||
WORD wScanSteps;
|
||||
UINT uScanBSSType;
|
||||
// Desire scannig vars
|
||||
BYTE abyScanSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
|
||||
BYTE abyScanBSSID[WLAN_BSSID_LEN];
|
||||
|
||||
// Privacy
|
||||
WMAC_AUTHENTICATION_MODE eAuthenMode;
|
||||
BOOL bShareKeyAlgorithm;
|
||||
BYTE abyChallenge[WLAN_CHALLENGE_LEN];
|
||||
BOOL bPrivacyInvoked;
|
||||
|
||||
// Received beacon state vars
|
||||
BOOL bInTIM;
|
||||
BOOL bMulticastTIM;
|
||||
BYTE byDTIMCount;
|
||||
BYTE byDTIMPeriod;
|
||||
|
||||
// Power saving state vars
|
||||
WMAC_POWER_MODE ePSMode;
|
||||
WORD wListenInterval;
|
||||
WORD wCountToWakeUp;
|
||||
BOOL bInTIMWake;
|
||||
PBYTE pbyPSPacketPool;
|
||||
BYTE byPSPacketPool[sizeof(STxMgmtPacket) + WLAN_NULLDATA_FR_MAXLEN];
|
||||
BOOL bRxBeaconInTBTTWake;
|
||||
BYTE abyPSTxMap[MAX_NODE_NUM + 1];
|
||||
|
||||
// managment command related
|
||||
UINT uCmdBusy;
|
||||
UINT uCmdHostAPBusy;
|
||||
|
||||
// managment packet pool
|
||||
PBYTE pbyMgmtPacketPool;
|
||||
BYTE byMgmtPacketPool[sizeof(STxMgmtPacket) + WLAN_A3FR_MAXLEN];
|
||||
|
||||
|
||||
// One second callback timer
|
||||
struct timer_list sTimerSecondCallback;
|
||||
|
||||
// Temporarily Rx Mgmt Packet Descriptor
|
||||
SRxMgmtPacket sRxPacket;
|
||||
|
||||
// link list of known bss's (scan results)
|
||||
KnownBSS sBSSList[MAX_BSS_NUM];
|
||||
//link list of same bss's //DavidWang
|
||||
KnownBSS pSameBSS[6] ;
|
||||
BOOL Cisco_cckm ;
|
||||
BYTE Roam_dbm;
|
||||
|
||||
// table list of known node
|
||||
// sNodeDBList[0] is reserved for AP under Infra mode
|
||||
// sNodeDBList[0] is reserved for Multicast under adhoc/AP mode
|
||||
KnownNodeDB sNodeDBTable[MAX_NODE_NUM + 1];
|
||||
|
||||
|
||||
|
||||
// WPA2 PMKID Cache
|
||||
SPMKIDCache gsPMKIDCache;
|
||||
BOOL bRoaming;
|
||||
|
||||
// rate fall back vars
|
||||
|
||||
|
||||
|
||||
// associate info
|
||||
SAssocInfo sAssocInfo;
|
||||
|
||||
|
||||
// for 802.11h
|
||||
BOOL b11hEnable;
|
||||
BOOL bSwitchChannel;
|
||||
BYTE byNewChannel;
|
||||
PWLAN_IE_MEASURE_REP pCurrMeasureEIDRep;
|
||||
UINT uLengthOfRepEIDs;
|
||||
BYTE abyCurrentMSRReq[sizeof(STxMgmtPacket) + WLAN_A3FR_MAXLEN];
|
||||
BYTE abyCurrentMSRRep[sizeof(STxMgmtPacket) + WLAN_A3FR_MAXLEN];
|
||||
BYTE abyIECountry[WLAN_A3FR_MAXLEN];
|
||||
BYTE abyIBSSDFSOwner[6];
|
||||
BYTE byIBSSDFSRecovery;
|
||||
|
||||
struct sk_buff skb;
|
||||
|
||||
} SMgmtObject, DEF *PSMgmtObject;
|
||||
|
||||
|
||||
/*--------------------- Export Macros ------------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
void
|
||||
vMgrObjectInit(
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
|
||||
void
|
||||
vMgrAssocBeginSta(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PSMgmtObject pMgmt,
|
||||
OUT PCMD_STATUS pStatus
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrReAssocBeginSta(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PSMgmtObject pMgmt,
|
||||
OUT PCMD_STATUS pStatus
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrDisassocBeginSta(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PSMgmtObject pMgmt,
|
||||
IN PBYTE abyDestAddress,
|
||||
IN WORD wReason,
|
||||
OUT PCMD_STATUS pStatus
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrAuthenBeginSta(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PSMgmtObject pMgmt,
|
||||
OUT PCMD_STATUS pStatus
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrCreateOwnIBSS(
|
||||
IN HANDLE hDeviceContext,
|
||||
OUT PCMD_STATUS pStatus
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrJoinBSSBegin(
|
||||
IN HANDLE hDeviceContext,
|
||||
OUT PCMD_STATUS pStatus
|
||||
);
|
||||
|
||||
VOID
|
||||
vMgrRxManagePacket(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PSMgmtObject pMgmt,
|
||||
IN PSRxMgmtPacket pRxPacket
|
||||
);
|
||||
|
||||
/*
|
||||
VOID
|
||||
vMgrScanBegin(
|
||||
IN HANDLE hDeviceContext,
|
||||
OUT PCMD_STATUS pStatus
|
||||
);
|
||||
*/
|
||||
|
||||
VOID
|
||||
vMgrDeAuthenBeginSta(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PSMgmtObject pMgmt,
|
||||
IN PBYTE abyDestAddress,
|
||||
IN WORD wReason,
|
||||
OUT PCMD_STATUS pStatus
|
||||
);
|
||||
|
||||
BOOL
|
||||
bMgrPrepareBeaconToSend(
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PSMgmtObject pMgmt
|
||||
);
|
||||
|
||||
|
||||
BOOL
|
||||
bAdd_PMKID_Candidate (
|
||||
IN HANDLE hDeviceContext,
|
||||
IN PBYTE pbyBSSID,
|
||||
IN PSRSNCapObject psRSNCapObj
|
||||
);
|
||||
|
||||
VOID
|
||||
vFlush_PMKID_Candidate (
|
||||
IN HANDLE hDeviceContext
|
||||
);
|
||||
|
||||
#endif // __WMGR_H__
|
|
@ -0,0 +1,339 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: wpa.c
|
||||
*
|
||||
* Purpose: Handles the Basic Service Set & Node Database functions
|
||||
*
|
||||
* Functions:
|
||||
* WPA_ParseRSN - Parse RSN IE.
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
* Author: Kyle Hsu
|
||||
*
|
||||
* Date: July 14, 2003
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__TMACRO_H__)
|
||||
#include "tmacro.h"
|
||||
#endif
|
||||
#if !defined(__TETHER_H__)
|
||||
#include "tether.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__80211HDR_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
#if !defined(__BSSDB_H__)
|
||||
#include "bssdb.h"
|
||||
#endif
|
||||
#if !defined(__WMGR_H__)
|
||||
#include "wmgr.h"
|
||||
#endif
|
||||
#if !defined(__WPA_H__)
|
||||
#include "wpa.h"
|
||||
#endif
|
||||
#if !defined(__80211MGR_H__)
|
||||
#include "80211mgr.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
|
||||
const BYTE abyOUI00[4] = { 0x00, 0x50, 0xf2, 0x00 };
|
||||
const BYTE abyOUI01[4] = { 0x00, 0x50, 0xf2, 0x01 };
|
||||
const BYTE abyOUI02[4] = { 0x00, 0x50, 0xf2, 0x02 };
|
||||
const BYTE abyOUI03[4] = { 0x00, 0x50, 0xf2, 0x03 };
|
||||
const BYTE abyOUI04[4] = { 0x00, 0x50, 0xf2, 0x04 };
|
||||
const BYTE abyOUI05[4] = { 0x00, 0x50, 0xf2, 0x05 };
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Clear RSN information in BSSList.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pBSSList - BSS list.
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none.
|
||||
*
|
||||
-*/
|
||||
|
||||
VOID
|
||||
WPA_ClearRSN (
|
||||
IN PKnownBSS pBSSList
|
||||
)
|
||||
{
|
||||
int ii;
|
||||
pBSSList->byGKType = WPA_TKIP;
|
||||
for (ii=0; ii < 4; ii ++)
|
||||
pBSSList->abyPKType[ii] = WPA_TKIP;
|
||||
pBSSList->wPKCount = 0;
|
||||
for (ii=0; ii < 4; ii ++)
|
||||
pBSSList->abyAuthType[ii] = WPA_AUTH_IEEE802_1X;
|
||||
pBSSList->wAuthCount = 0;
|
||||
pBSSList->byDefaultK_as_PK = 0;
|
||||
pBSSList->byReplayIdx = 0;
|
||||
pBSSList->sRSNCapObj.bRSNCapExist = FALSE;
|
||||
pBSSList->sRSNCapObj.wRSNCap = 0;
|
||||
pBSSList->bWPAValid = FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Parse RSN IE.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pBSSList - BSS list.
|
||||
* pRSN - Pointer to the RSN IE.
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none.
|
||||
*
|
||||
-*/
|
||||
VOID
|
||||
WPA_ParseRSN (
|
||||
IN PKnownBSS pBSSList,
|
||||
IN PWLAN_IE_RSN_EXT pRSN
|
||||
)
|
||||
{
|
||||
PWLAN_IE_RSN_AUTH pIE_RSN_Auth = NULL;
|
||||
int i, j, m, n = 0;
|
||||
PBYTE pbyCaps;
|
||||
|
||||
WPA_ClearRSN(pBSSList);
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"WPA_ParseRSN: [%d]\n", pRSN->len);
|
||||
|
||||
// information element header makes sense
|
||||
if ((pRSN->len >= 6) // oui1(4)+ver(2)
|
||||
&& (pRSN->byElementID == WLAN_EID_RSN_WPA) && MEMEqualMemory(pRSN->abyOUI, abyOUI01, 4)
|
||||
&& (pRSN->wVersion == 1)) {
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Legal RSN\n");
|
||||
// update each variable if pRSN is long enough to contain the variable
|
||||
if (pRSN->len >= 10) //oui1(4)+ver(2)+GKSuite(4)
|
||||
{
|
||||
if (MEMEqualMemory(pRSN->abyMulticast, abyOUI01, 4))
|
||||
pBSSList->byGKType = WPA_WEP40;
|
||||
else if (MEMEqualMemory(pRSN->abyMulticast, abyOUI02, 4))
|
||||
pBSSList->byGKType = WPA_TKIP;
|
||||
else if (MEMEqualMemory(pRSN->abyMulticast, abyOUI03, 4))
|
||||
pBSSList->byGKType = WPA_AESWRAP;
|
||||
else if (MEMEqualMemory(pRSN->abyMulticast, abyOUI04, 4))
|
||||
pBSSList->byGKType = WPA_AESCCMP;
|
||||
else if (MEMEqualMemory(pRSN->abyMulticast, abyOUI05, 4))
|
||||
pBSSList->byGKType = WPA_WEP104;
|
||||
else
|
||||
// any vendor checks here
|
||||
pBSSList->byGKType = WPA_NONE;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"byGKType: %x\n", pBSSList->byGKType);
|
||||
}
|
||||
|
||||
if (pRSN->len >= 12) //oui1(4)+ver(2)+GKS(4)+PKSCnt(2)
|
||||
{
|
||||
j = 0;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wPKCount: %d, sizeof(pBSSList->abyPKType): %d\n", pRSN->wPKCount, sizeof(pBSSList->abyPKType));
|
||||
for(i = 0; (i < pRSN->wPKCount) && (j < sizeof(pBSSList->abyPKType)/sizeof(BYTE)); i++) {
|
||||
if(pRSN->len >= 12+i*4+4) { //oui1(4)+ver(2)+GKS(4)+PKSCnt(2)+PKS(4*i)
|
||||
if (MEMEqualMemory(pRSN->PKSList[i].abyOUI, abyOUI00, 4))
|
||||
pBSSList->abyPKType[j++] = WPA_NONE;
|
||||
else if (MEMEqualMemory(pRSN->PKSList[i].abyOUI, abyOUI02, 4))
|
||||
pBSSList->abyPKType[j++] = WPA_TKIP;
|
||||
else if (MEMEqualMemory(pRSN->PKSList[i].abyOUI, abyOUI03, 4))
|
||||
pBSSList->abyPKType[j++] = WPA_AESWRAP;
|
||||
else if (MEMEqualMemory(pRSN->PKSList[i].abyOUI, abyOUI04, 4))
|
||||
pBSSList->abyPKType[j++] = WPA_AESCCMP;
|
||||
else
|
||||
// any vendor checks here
|
||||
;
|
||||
}
|
||||
else
|
||||
break;
|
||||
//DBG_PRN_GRP14(("abyPKType[%d]: %X\n", j-1, pBSSList->abyPKType[j-1]));
|
||||
} //for
|
||||
pBSSList->wPKCount = (WORD)j;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wPKCount: %d\n", pBSSList->wPKCount);
|
||||
}
|
||||
|
||||
m = pRSN->wPKCount;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"m: %d\n", m);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"14+m*4: %d\n", 14+m*4);
|
||||
|
||||
if (pRSN->len >= 14+m*4) { //oui1(4)+ver(2)+GKS(4)+PKSCnt(2)+PKS(4*m)+AKC(2)
|
||||
// overlay IE_RSN_Auth structure into correct place
|
||||
pIE_RSN_Auth = (PWLAN_IE_RSN_AUTH) pRSN->PKSList[m].abyOUI;
|
||||
j = 0;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wAuthCount: %d, sizeof(pBSSList->abyAuthType): %d\n",
|
||||
pIE_RSN_Auth->wAuthCount, sizeof(pBSSList->abyAuthType));
|
||||
for(i = 0; (i < pIE_RSN_Auth->wAuthCount) && (j < sizeof(pBSSList->abyAuthType)/sizeof(BYTE)); i++) {
|
||||
if(pRSN->len >= 14+4+(m+i)*4) { //oui1(4)+ver(2)+GKS(4)+PKSCnt(2)+PKS(4*m)+AKC(2)+AKS(4*i)
|
||||
if (MEMEqualMemory(pIE_RSN_Auth->AuthKSList[i].abyOUI, abyOUI01, 4))
|
||||
pBSSList->abyAuthType[j++] = WPA_AUTH_IEEE802_1X;
|
||||
else if (MEMEqualMemory(pIE_RSN_Auth->AuthKSList[i].abyOUI, abyOUI02, 4))
|
||||
pBSSList->abyAuthType[j++] = WPA_AUTH_PSK;
|
||||
else
|
||||
// any vendor checks here
|
||||
;
|
||||
}
|
||||
else
|
||||
break;
|
||||
//DBG_PRN_GRP14(("abyAuthType[%d]: %X\n", j-1, pBSSList->abyAuthType[j-1]));
|
||||
}
|
||||
if(j > 0)
|
||||
pBSSList->wAuthCount = (WORD)j;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wAuthCount: %d\n", pBSSList->wAuthCount);
|
||||
}
|
||||
|
||||
if (pIE_RSN_Auth != NULL) {
|
||||
|
||||
n = pIE_RSN_Auth->wAuthCount;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"n: %d\n", n);
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"14+4+(m+n)*4: %d\n", 14+4+(m+n)*4);
|
||||
|
||||
if(pRSN->len+2 >= 14+4+(m+n)*4) { //oui1(4)+ver(2)+GKS(4)+PKSCnt(2)+PKS(4*m)+AKC(2)+AKS(4*n)+Cap(2)
|
||||
pbyCaps = (PBYTE)pIE_RSN_Auth->AuthKSList[n].abyOUI;
|
||||
pBSSList->byDefaultK_as_PK = (*pbyCaps) & WPA_GROUPFLAG;
|
||||
pBSSList->byReplayIdx = 2 << ((*pbyCaps >> WPA_REPLAYBITSSHIFT) & WPA_REPLAYBITS);
|
||||
pBSSList->sRSNCapObj.bRSNCapExist = TRUE;
|
||||
pBSSList->sRSNCapObj.wRSNCap = *(PWORD)pbyCaps;
|
||||
//DBG_PRN_GRP14(("pbyCaps: %X\n", *pbyCaps));
|
||||
//DBG_PRN_GRP14(("byDefaultK_as_PK: %X\n", pBSSList->byDefaultK_as_PK));
|
||||
//DBG_PRN_GRP14(("byReplayIdx: %X\n", pBSSList->byReplayIdx));
|
||||
}
|
||||
}
|
||||
pBSSList->bWPAValid = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Search RSN information in BSSList.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* byCmd - Search type
|
||||
* byEncrypt- Encrcypt Type
|
||||
* pBSSList - BSS list
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none.
|
||||
*
|
||||
-*/
|
||||
BOOL
|
||||
WPA_SearchRSN (
|
||||
BYTE byCmd,
|
||||
BYTE byEncrypt,
|
||||
IN PKnownBSS pBSSList
|
||||
)
|
||||
{
|
||||
int ii;
|
||||
BYTE byPKType = WPA_NONE;
|
||||
|
||||
if (pBSSList->bWPAValid == FALSE)
|
||||
return FALSE;
|
||||
|
||||
switch(byCmd) {
|
||||
case 0:
|
||||
|
||||
if (byEncrypt != pBSSList->byGKType)
|
||||
return FALSE;
|
||||
|
||||
if (pBSSList->wPKCount > 0) {
|
||||
for (ii = 0; ii < pBSSList->wPKCount; ii ++) {
|
||||
if (pBSSList->abyPKType[ii] == WPA_AESCCMP)
|
||||
byPKType = WPA_AESCCMP;
|
||||
else if ((pBSSList->abyPKType[ii] == WPA_TKIP) && (byPKType != WPA_AESCCMP))
|
||||
byPKType = WPA_TKIP;
|
||||
else if ((pBSSList->abyPKType[ii] == WPA_WEP40) && (byPKType != WPA_AESCCMP) && (byPKType != WPA_TKIP))
|
||||
byPKType = WPA_WEP40;
|
||||
else if ((pBSSList->abyPKType[ii] == WPA_WEP104) && (byPKType != WPA_AESCCMP) && (byPKType != WPA_TKIP))
|
||||
byPKType = WPA_WEP104;
|
||||
}
|
||||
if (byEncrypt != byPKType)
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
// if (pBSSList->wAuthCount > 0)
|
||||
// for (ii=0; ii < pBSSList->wAuthCount; ii ++)
|
||||
// if (byAuth == pBSSList->abyAuthType[ii])
|
||||
// break;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Check if RSN IE makes sense.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pRSN - Pointer to the RSN IE.
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none.
|
||||
*
|
||||
-*/
|
||||
BOOL
|
||||
WPAb_Is_RSN (
|
||||
IN PWLAN_IE_RSN_EXT pRSN
|
||||
)
|
||||
{
|
||||
if (pRSN == NULL)
|
||||
return FALSE;
|
||||
|
||||
if ((pRSN->len >= 6) && // oui1(4)+ver(2)
|
||||
(pRSN->byElementID == WLAN_EID_RSN_WPA) && MEMEqualMemory(pRSN->abyOUI, abyOUI01, 4) &&
|
||||
(pRSN->wVersion == 1)) {
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: wpa.h
|
||||
*
|
||||
* Purpose: Defines the macros, types, and functions for dealing
|
||||
* with WPA informations.
|
||||
*
|
||||
* Author: Kyle Hsu
|
||||
*
|
||||
* Date: Jul 14, 2003
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __WPA_H__
|
||||
#define __WPA_H__
|
||||
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__80211HDR_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
#define WPA_NONE 0
|
||||
#define WPA_WEP40 1
|
||||
#define WPA_TKIP 2
|
||||
#define WPA_AESWRAP 3
|
||||
#define WPA_AESCCMP 4
|
||||
#define WPA_WEP104 5
|
||||
#define WPA_AUTH_IEEE802_1X 1
|
||||
#define WPA_AUTH_PSK 2
|
||||
|
||||
#define WPA_GROUPFLAG 0x02
|
||||
#define WPA_REPLAYBITSSHIFT 2
|
||||
#define WPA_REPLAYBITS 0x03
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
VOID
|
||||
WPA_ClearRSN(
|
||||
IN PKnownBSS pBSSList
|
||||
);
|
||||
|
||||
VOID
|
||||
WPA_ParseRSN(
|
||||
IN PKnownBSS pBSSList,
|
||||
IN PWLAN_IE_RSN_EXT pRSN
|
||||
);
|
||||
|
||||
BOOL
|
||||
WPA_SearchRSN(
|
||||
BYTE byCmd,
|
||||
BYTE byEncrypt,
|
||||
IN PKnownBSS pBSSList
|
||||
);
|
||||
|
||||
BOOL
|
||||
WPAb_Is_RSN(
|
||||
IN PWLAN_IE_RSN_EXT pRSN
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif // __WPA_H__
|
|
@ -0,0 +1,373 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: wpa2.c
|
||||
*
|
||||
* Purpose: Handles the Basic Service Set & Node Database functions
|
||||
*
|
||||
* Functions:
|
||||
*
|
||||
* Revision History:
|
||||
*
|
||||
* Author: Yiching Chen
|
||||
*
|
||||
* Date: Oct. 4, 2004
|
||||
*
|
||||
*/
|
||||
#if !defined(__WPA2_H__)
|
||||
#include "wpa2.h"
|
||||
#endif
|
||||
#if !defined(__UMEM_H__)
|
||||
#include "umem.h"
|
||||
#endif
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
#if !defined(__WMGR_H__)
|
||||
#include "wmgr.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------- Static Definitions -------------------------*/
|
||||
static int msglevel =MSG_LEVEL_INFO;
|
||||
//static int msglevel =MSG_LEVEL_DEBUG;
|
||||
/*--------------------- Static Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Static Variables --------------------------*/
|
||||
|
||||
const BYTE abyOUIGK[4] = { 0x00, 0x0F, 0xAC, 0x00 };
|
||||
const BYTE abyOUIWEP40[4] = { 0x00, 0x0F, 0xAC, 0x01 };
|
||||
const BYTE abyOUIWEP104[4] = { 0x00, 0x0F, 0xAC, 0x05 };
|
||||
const BYTE abyOUITKIP[4] = { 0x00, 0x0F, 0xAC, 0x02 };
|
||||
const BYTE abyOUICCMP[4] = { 0x00, 0x0F, 0xAC, 0x04 };
|
||||
|
||||
const BYTE abyOUI8021X[4] = { 0x00, 0x0F, 0xAC, 0x01 };
|
||||
const BYTE abyOUIPSK[4] = { 0x00, 0x0F, 0xAC, 0x02 };
|
||||
|
||||
|
||||
/*--------------------- Static Functions --------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Clear RSN information in BSSList.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pBSSNode - BSS list.
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none.
|
||||
*
|
||||
-*/
|
||||
VOID
|
||||
WPA2_ClearRSN (
|
||||
IN PKnownBSS pBSSNode
|
||||
)
|
||||
{
|
||||
int ii;
|
||||
|
||||
pBSSNode->bWPA2Valid = FALSE;
|
||||
|
||||
pBSSNode->byCSSGK = WLAN_11i_CSS_CCMP;
|
||||
for (ii=0; ii < 4; ii ++)
|
||||
pBSSNode->abyCSSPK[ii] = WLAN_11i_CSS_CCMP;
|
||||
pBSSNode->wCSSPKCount = 1;
|
||||
for (ii=0; ii < 4; ii ++)
|
||||
pBSSNode->abyAKMSSAuthType[ii] = WLAN_11i_AKMSS_802_1X;
|
||||
pBSSNode->wAKMSSAuthCount = 1;
|
||||
pBSSNode->sRSNCapObj.bRSNCapExist = FALSE;
|
||||
pBSSNode->sRSNCapObj.wRSNCap = 0;
|
||||
}
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Parse RSN IE.
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pBSSNode - BSS list.
|
||||
* pRSN - Pointer to the RSN IE.
|
||||
* Out:
|
||||
* none
|
||||
*
|
||||
* Return Value: none.
|
||||
*
|
||||
-*/
|
||||
VOID
|
||||
WPA2vParseRSN (
|
||||
IN PKnownBSS pBSSNode,
|
||||
IN PWLAN_IE_RSN pRSN
|
||||
)
|
||||
{
|
||||
int i, j;
|
||||
WORD m = 0, n = 0;
|
||||
PBYTE pbyOUI;
|
||||
BOOL bUseGK = FALSE;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"WPA2_ParseRSN: [%d]\n", pRSN->len);
|
||||
|
||||
WPA2_ClearRSN(pBSSNode);
|
||||
|
||||
if (pRSN->len == 2) { // ver(2)
|
||||
if ((pRSN->byElementID == WLAN_EID_RSN) && (pRSN->wVersion == 1)) {
|
||||
pBSSNode->bWPA2Valid = TRUE;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (pRSN->len < 6) { // ver(2) + GK(4)
|
||||
// invalid CSS, P802.11i/D10.0, p31
|
||||
return;
|
||||
}
|
||||
|
||||
// information element header makes sense
|
||||
if ((pRSN->byElementID == WLAN_EID_RSN) &&
|
||||
(pRSN->wVersion == 1)) {
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Legal 802.11i RSN\n");
|
||||
|
||||
pbyOUI = &(pRSN->abyRSN[0]);
|
||||
if (MEMEqualMemory(pbyOUI, abyOUIWEP40, 4))
|
||||
pBSSNode->byCSSGK = WLAN_11i_CSS_WEP40;
|
||||
else if (MEMEqualMemory(pbyOUI, abyOUITKIP, 4))
|
||||
pBSSNode->byCSSGK = WLAN_11i_CSS_TKIP;
|
||||
else if (MEMEqualMemory(pbyOUI, abyOUICCMP, 4))
|
||||
pBSSNode->byCSSGK = WLAN_11i_CSS_CCMP;
|
||||
else if (MEMEqualMemory(pbyOUI, abyOUIWEP104, 4))
|
||||
pBSSNode->byCSSGK = WLAN_11i_CSS_WEP104;
|
||||
else if (MEMEqualMemory(pbyOUI, abyOUIGK, 4)) {
|
||||
// invalid CSS, P802.11i/D10.0, p32
|
||||
return;
|
||||
} else
|
||||
// any vendor checks here
|
||||
pBSSNode->byCSSGK = WLAN_11i_CSS_UNKNOWN;
|
||||
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"802.11i CSS: %X\n", pBSSNode->byCSSGK);
|
||||
|
||||
if (pRSN->len == 6) {
|
||||
pBSSNode->bWPA2Valid = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (pRSN->len >= 8) { // ver(2) + GK(4) + PK count(2)
|
||||
pBSSNode->wCSSPKCount = *((PWORD) &(pRSN->abyRSN[4]));
|
||||
j = 0;
|
||||
pbyOUI = &(pRSN->abyRSN[6]);
|
||||
|
||||
for (i = 0; (i < pBSSNode->wCSSPKCount) && (j < sizeof(pBSSNode->abyCSSPK)/sizeof(BYTE)); i++) {
|
||||
|
||||
if (pRSN->len >= 8+i*4+4) { // ver(2)+GK(4)+PKCnt(2)+PKS(4*i)
|
||||
if (MEMEqualMemory(pbyOUI, abyOUIGK, 4)) {
|
||||
pBSSNode->abyCSSPK[j++] = WLAN_11i_CSS_USE_GROUP;
|
||||
bUseGK = TRUE;
|
||||
} else if (MEMEqualMemory(pbyOUI, abyOUIWEP40, 4)) {
|
||||
// Invialid CSS, continue to parsing
|
||||
} else if (MEMEqualMemory(pbyOUI, abyOUITKIP, 4)) {
|
||||
if (pBSSNode->byCSSGK != WLAN_11i_CSS_CCMP)
|
||||
pBSSNode->abyCSSPK[j++] = WLAN_11i_CSS_TKIP;
|
||||
else
|
||||
; // Invialid CSS, continue to parsing
|
||||
} else if (MEMEqualMemory(pbyOUI, abyOUICCMP, 4)) {
|
||||
pBSSNode->abyCSSPK[j++] = WLAN_11i_CSS_CCMP;
|
||||
} else if (MEMEqualMemory(pbyOUI, abyOUIWEP104, 4)) {
|
||||
// Invialid CSS, continue to parsing
|
||||
} else {
|
||||
// any vendor checks here
|
||||
pBSSNode->abyCSSPK[j++] = WLAN_11i_CSS_UNKNOWN;
|
||||
}
|
||||
pbyOUI += 4;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"abyCSSPK[%d]: %X\n", j-1, pBSSNode->abyCSSPK[j-1]);
|
||||
} else
|
||||
break;
|
||||
} //for
|
||||
|
||||
if (bUseGK == TRUE) {
|
||||
if (j != 1) {
|
||||
// invalid CSS, This should be only PK CSS.
|
||||
return;
|
||||
}
|
||||
if (pBSSNode->byCSSGK == WLAN_11i_CSS_CCMP) {
|
||||
// invalid CSS, If CCMP is enable , PK can't be CSSGK.
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ((pBSSNode->wCSSPKCount != 0) && (j == 0)) {
|
||||
// invalid CSS, No valid PK.
|
||||
return;
|
||||
}
|
||||
pBSSNode->wCSSPKCount = (WORD)j;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wCSSPKCount: %d\n", pBSSNode->wCSSPKCount);
|
||||
}
|
||||
|
||||
m = *((PWORD) &(pRSN->abyRSN[4]));
|
||||
|
||||
if (pRSN->len >= 10+m*4) { // ver(2) + GK(4) + PK count(2) + PKS(4*m) + AKMSS count(2)
|
||||
pBSSNode->wAKMSSAuthCount = *((PWORD) &(pRSN->abyRSN[6+4*m]));;
|
||||
j = 0;
|
||||
pbyOUI = &(pRSN->abyRSN[8+4*m]);
|
||||
for (i = 0; (i < pBSSNode->wAKMSSAuthCount) && (j < sizeof(pBSSNode->abyAKMSSAuthType)/sizeof(BYTE)); i++) {
|
||||
if (pRSN->len >= 10+(m+i)*4+4) { // ver(2)+GK(4)+PKCnt(2)+PKS(4*m)+AKMSS(2)+AKS(4*i)
|
||||
if (MEMEqualMemory(pbyOUI, abyOUI8021X, 4))
|
||||
pBSSNode->abyAKMSSAuthType[j++] = WLAN_11i_AKMSS_802_1X;
|
||||
else if (MEMEqualMemory(pbyOUI, abyOUIPSK, 4))
|
||||
pBSSNode->abyAKMSSAuthType[j++] = WLAN_11i_AKMSS_PSK;
|
||||
else
|
||||
// any vendor checks here
|
||||
pBSSNode->abyAKMSSAuthType[j++] = WLAN_11i_AKMSS_UNKNOWN;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"abyAKMSSAuthType[%d]: %X\n", j-1, pBSSNode->abyAKMSSAuthType[j-1]);
|
||||
} else
|
||||
break;
|
||||
}
|
||||
pBSSNode->wAKMSSAuthCount = (WORD)j;
|
||||
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wAKMSSAuthCount: %d\n", pBSSNode->wAKMSSAuthCount);
|
||||
|
||||
n = *((PWORD) &(pRSN->abyRSN[6+4*m]));;
|
||||
if (pRSN->len >= 12+4*m+4*n) { // ver(2)+GK(4)+PKCnt(2)+PKS(4*m)+AKMSSCnt(2)+AKMSS(4*n)+Cap(2)
|
||||
pBSSNode->sRSNCapObj.bRSNCapExist = TRUE;
|
||||
pBSSNode->sRSNCapObj.wRSNCap = *((PWORD) &(pRSN->abyRSN[8+4*m+4*n]));
|
||||
}
|
||||
}
|
||||
//ignore PMKID lists bcs only (Re)Assocrequest has this field
|
||||
pBSSNode->bWPA2Valid = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*+
|
||||
*
|
||||
* Description:
|
||||
* Set WPA IEs
|
||||
*
|
||||
* Parameters:
|
||||
* In:
|
||||
* pMgmtHandle - Pointer to management object
|
||||
* Out:
|
||||
* pRSNIEs - Pointer to the RSN IE to set.
|
||||
*
|
||||
* Return Value: length of IEs.
|
||||
*
|
||||
-*/
|
||||
UINT
|
||||
WPA2uSetIEs(
|
||||
IN PVOID pMgmtHandle,
|
||||
OUT PWLAN_IE_RSN pRSNIEs
|
||||
)
|
||||
{
|
||||
PSMgmtObject pMgmt = (PSMgmtObject) pMgmtHandle;
|
||||
PBYTE pbyBuffer = NULL;
|
||||
UINT ii = 0;
|
||||
PWORD pwPMKID = NULL;
|
||||
|
||||
if (pRSNIEs == NULL) {
|
||||
return(0);
|
||||
}
|
||||
if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
|
||||
(pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) &&
|
||||
(pMgmt->pCurrBSS != NULL)) {
|
||||
/* WPA2 IE */
|
||||
pbyBuffer = (PBYTE) pRSNIEs;
|
||||
pRSNIEs->byElementID = WLAN_EID_RSN;
|
||||
pRSNIEs->len = 6; //Version(2)+GK(4)
|
||||
pRSNIEs->wVersion = 1;
|
||||
//Group Key Cipher Suite
|
||||
pRSNIEs->abyRSN[0] = 0x00;
|
||||
pRSNIEs->abyRSN[1] = 0x0F;
|
||||
pRSNIEs->abyRSN[2] = 0xAC;
|
||||
if (pMgmt->byCSSGK == KEY_CTL_WEP) {
|
||||
pRSNIEs->abyRSN[3] = pMgmt->pCurrBSS->byCSSGK;
|
||||
} else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
|
||||
pRSNIEs->abyRSN[3] = WLAN_11i_CSS_TKIP;
|
||||
} else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
|
||||
pRSNIEs->abyRSN[3] = WLAN_11i_CSS_CCMP;
|
||||
} else {
|
||||
pRSNIEs->abyRSN[3] = WLAN_11i_CSS_UNKNOWN;
|
||||
}
|
||||
|
||||
// Pairwise Key Cipher Suite
|
||||
pRSNIEs->abyRSN[4] = 1;
|
||||
pRSNIEs->abyRSN[5] = 0;
|
||||
pRSNIEs->abyRSN[6] = 0x00;
|
||||
pRSNIEs->abyRSN[7] = 0x0F;
|
||||
pRSNIEs->abyRSN[8] = 0xAC;
|
||||
if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
|
||||
pRSNIEs->abyRSN[9] = WLAN_11i_CSS_TKIP;
|
||||
} else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
|
||||
pRSNIEs->abyRSN[9] = WLAN_11i_CSS_CCMP;
|
||||
} else if (pMgmt->byCSSPK == KEY_CTL_NONE) {
|
||||
pRSNIEs->abyRSN[9] = WLAN_11i_CSS_USE_GROUP;
|
||||
} else {
|
||||
pRSNIEs->abyRSN[9] = WLAN_11i_CSS_UNKNOWN;
|
||||
}
|
||||
pRSNIEs->len += 6;
|
||||
|
||||
// Auth Key Management Suite
|
||||
pRSNIEs->abyRSN[10] = 1;
|
||||
pRSNIEs->abyRSN[11] = 0;
|
||||
pRSNIEs->abyRSN[12] = 0x00;
|
||||
pRSNIEs->abyRSN[13] = 0x0F;
|
||||
pRSNIEs->abyRSN[14] = 0xAC;
|
||||
if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK) {
|
||||
pRSNIEs->abyRSN[15] = WLAN_11i_AKMSS_PSK;
|
||||
} else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
|
||||
pRSNIEs->abyRSN[15] = WLAN_11i_AKMSS_802_1X;
|
||||
} else {
|
||||
pRSNIEs->abyRSN[15] = WLAN_11i_AKMSS_UNKNOWN;
|
||||
}
|
||||
pRSNIEs->len +=6;
|
||||
|
||||
// RSN Capabilites
|
||||
if (pMgmt->pCurrBSS->sRSNCapObj.bRSNCapExist == TRUE) {
|
||||
MEMvCopy(&pRSNIEs->abyRSN[16], &pMgmt->pCurrBSS->sRSNCapObj.wRSNCap, 2);
|
||||
} else {
|
||||
pRSNIEs->abyRSN[16] = 0;
|
||||
pRSNIEs->abyRSN[17] = 0;
|
||||
}
|
||||
pRSNIEs->len +=2;
|
||||
|
||||
if ((pMgmt->gsPMKIDCache.BSSIDInfoCount > 0) &&
|
||||
(pMgmt->bRoaming == TRUE) &&
|
||||
(pMgmt->eAuthenMode == WMAC_AUTH_WPA2)) {
|
||||
// RSN PMKID
|
||||
pwPMKID = (PWORD)(&pRSNIEs->abyRSN[18]); // Point to PMKID count
|
||||
*pwPMKID = 0; // Initialize PMKID count
|
||||
pbyBuffer = &pRSNIEs->abyRSN[20]; // Point to PMKID list
|
||||
for (ii = 0; ii < pMgmt->gsPMKIDCache.BSSIDInfoCount; ii++) {
|
||||
if (MEMEqualMemory(&pMgmt->gsPMKIDCache.BSSIDInfo[ii].abyBSSID[0], pMgmt->abyCurrBSSID, U_ETHER_ADDR_LEN)) {
|
||||
(*pwPMKID) ++;
|
||||
MEMvCopy(pbyBuffer, pMgmt->gsPMKIDCache.BSSIDInfo[ii].abyPMKID, 16);
|
||||
pbyBuffer += 16;
|
||||
}
|
||||
}
|
||||
if (*pwPMKID != 0) {
|
||||
pRSNIEs->len += (2 + (*pwPMKID)*16);
|
||||
} else {
|
||||
pbyBuffer = &pRSNIEs->abyRSN[18];
|
||||
}
|
||||
}
|
||||
return(pRSNIEs->len + WLAN_IEHDR_LEN);
|
||||
}
|
||||
return(0);
|
||||
}
|
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*
|
||||
* File: wpa2.h
|
||||
*
|
||||
* Purpose: Defines the macros, types, and functions for dealing
|
||||
* with WPA2 informations.
|
||||
*
|
||||
* Author: Yiching Chen
|
||||
*
|
||||
* Date: Oct. 4, 2004
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __WPA2_H__
|
||||
#define __WPA2_H__
|
||||
|
||||
|
||||
#if !defined(__TTYPE_H__)
|
||||
#include "ttype.h"
|
||||
#endif
|
||||
#if !defined(__80211MGR_H__)
|
||||
#include "80211mgr.h"
|
||||
#endif
|
||||
#if !defined(__80211HDR_H__)
|
||||
#include "80211hdr.h"
|
||||
#endif
|
||||
#if !defined(__BSSDB_H__)
|
||||
#include "bssdb.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
#define MAX_PMKID_CACHE 16
|
||||
|
||||
typedef struct tagsPMKIDInfo {
|
||||
BYTE abyBSSID[6];
|
||||
BYTE abyPMKID[16];
|
||||
} PMKIDInfo, *PPMKIDInfo;
|
||||
|
||||
typedef struct tagSPMKIDCache {
|
||||
ULONG BSSIDInfoCount;
|
||||
PMKIDInfo BSSIDInfo[MAX_PMKID_CACHE];
|
||||
} SPMKIDCache, *PSPMKIDCache;
|
||||
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Types ------------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
VOID
|
||||
WPA2_ClearRSN (
|
||||
IN PKnownBSS pBSSNode
|
||||
);
|
||||
|
||||
VOID
|
||||
WPA2vParseRSN (
|
||||
IN PKnownBSS pBSSNode,
|
||||
IN PWLAN_IE_RSN pRSN
|
||||
);
|
||||
|
||||
UINT
|
||||
WPA2uSetIEs(
|
||||
IN PVOID pMgmtHandle,
|
||||
OUT PWLAN_IE_RSN pRSNIEs
|
||||
);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif // __WPA2_H__
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* File: wpactl.h
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* Author: Lyndon Chen
|
||||
*
|
||||
* Date: March 1, 2005
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __WPACTL_H__
|
||||
#define __WPACTL_H__
|
||||
|
||||
#if !defined(__DEVICE_H__)
|
||||
#include "device.h"
|
||||
#endif
|
||||
|
||||
#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
|
||||
#if !defined(__IOWPA_H__)
|
||||
#include "iowpa.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*--------------------- Export Definitions -------------------------*/
|
||||
|
||||
|
||||
//WPA related
|
||||
|
||||
typedef enum { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP } wpa_alg;
|
||||
typedef enum { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP,
|
||||
CIPHER_WEP104 } wpa_cipher;
|
||||
typedef enum { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE,
|
||||
KEY_MGMT_802_1X_NO_WPA, KEY_MGMT_WPA_NONE, KEY_MGMT_CCKM } wpa_key_mgmt;//20080717-02,<Modify> by James Li
|
||||
|
||||
#define AUTH_ALG_OPEN_SYSTEM 0x01
|
||||
#define AUTH_ALG_SHARED_KEY 0x02
|
||||
#define AUTH_ALG_LEAP 0x04
|
||||
|
||||
#define GENERIC_INFO_ELEM 0xdd
|
||||
#define RSN_INFO_ELEM 0x30
|
||||
|
||||
|
||||
|
||||
typedef ULONGLONG NDIS_802_11_KEY_RSC;
|
||||
|
||||
/*--------------------- Export Classes ----------------------------*/
|
||||
|
||||
/*--------------------- Export Variables --------------------------*/
|
||||
|
||||
/*--------------------- Export Functions --------------------------*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
int wpa_set_wpadev(PSDevice pDevice, int val);
|
||||
int wpa_ioctl(PSDevice pDevice, struct iw_point *p);
|
||||
int wpa_set_keys(PSDevice pDevice, void *ctx, BOOL fcpfkernel);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* End of extern "C" { */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __WPACL_H__
|
||||
|
||||
|
||||
|
Загрузка…
Ссылка в новой задаче