Home | History | Annotate | Download | only in 4X
      1 /****************************************************************************
      2 **+-----------------------------------------------------------------------+**
      3 **|                                                                       |**
      4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
      5 **| All rights reserved.                                                  |**
      6 **|                                                                       |**
      7 **| Redistribution and use in source and binary forms, with or without    |**
      8 **| modification, are permitted provided that the following conditions    |**
      9 **| are met:                                                              |**
     10 **|                                                                       |**
     11 **|  * Redistributions of source code must retain the above copyright     |**
     12 **|    notice, this list of conditions and the following disclaimer.      |**
     13 **|  * Redistributions in binary form must reproduce the above copyright  |**
     14 **|    notice, this list of conditions and the following disclaimer in    |**
     15 **|    the documentation and/or other materials provided with the         |**
     16 **|    distribution.                                                      |**
     17 **|  * Neither the name Texas Instruments nor the names of its            |**
     18 **|    contributors may be used to endorse or promote products derived    |**
     19 **|    from this software without specific prior written permission.      |**
     20 **|                                                                       |**
     21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
     22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
     23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
     24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
     25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
     26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
     27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
     28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
     29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
     30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
     31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
     32 **|                                                                       |**
     33 **+-----------------------------------------------------------------------+**
     34 ****************************************************************************/
     35 
     36 /***************************************************************************/
     37 /*                                                                         */
     38 /*   MODULE:	ackEmulDb.h                                                */
     39 /*   PURPOSE:	Ack emulation database                                     */
     40 /*                                                                         */
     41 /***************************************************************************/
     42 #ifndef _ACK_EMULATION_DB_H_
     43 #define _ACK_EMULATION_DB_H_
     44 
     45 #include "osTIType.h"
     46 
     47 #define ACK_EMUL_MODULE_LOG		CTRL_DATA_MODULE_LOG
     48 void ackEGetPktType(unsigned char* pPacket , UINT16 *packetInclude, UINT16 *tcpDataSize);
     49 
     50 #define TCP_LOOKAHEAD_SIZE 64
     51 #define MAX_ACK_TEMPLATE_SIZE 100
     52 #define MAX_AE_STATIONS 1
     53 
     54 
     55 #define IP_PROTOCOL_NUMBER          0x0800
     56 #define TCP_PROTOCOL                0x06
     57 #define IP_TOTAL_LEN_FIELD          2
     58 #define IP_IDENTIFIER_FIELD         4
     59 
     60 #define IP_PROTOCOL_FIELD           9
     61 #define IP_CHECKSUM_FIELD           10
     62 #define DEST_PORT_FIELD             2
     63 #define IP_SRC_ADDRESS_FIELD		   12
     64 #define IP_DEST_ADDRESS_FIELD		   16
     65 
     66 
     67 #define TCP_SEQUENCE_NUMBER_FIELD	4
     68 #define TCP_ACK_NUMBER_FIELD        8
     69 #define TCP_OFFSET_FIELD	         12
     70 #define TCP_CHECKSUM_FIELD	         16
     71 
     72 #define WTARGET_ACTIVE_TIME_OUT 500000 /* was 500 */
     73 #define WTARGET_TERMINATE_TIME_OUT 1000
     74 #define WSOURCE_SESSION_TIME_OUT 700
     75 
     76 #define MAX_ACIVE_SESSION	2
     77 #define MAX_STANDBY_SESSION 8
     78 
     79 #define INDEX_FREE 0
     80 #define INDEX_BUSY 1
     81 
     82 
     83 typedef struct {
     84   int	lastUsedIndex;
     85   int	currentActiveState;
     86   int	currentStandbyState;
     87 } sessionsTableManager_T;
     88 
     89 typedef struct {
     90 	int status;			/* INDEX_FREE or INDEX_BUSY */
     91 	int monitorIndex ; /* Index in wdrv_aeWTargetTable */
     92 }activeIndexTable_T;
     93 
     94 
     95 
     96 typedef struct {
     97    UINT8 data[MAX_ACK_TEMPLATE_SIZE];
     98    UINT8 ipHeaderLen;
     99    UINT8 tcpHeaderLen;
    100 } ackTemplate_T;
    101 
    102 typedef struct {
    103    UINT16	sPorts;                              /* Include source port  */
    104    UINT16	dPorts;                              /* Include destination port */
    105    UINT32	srcIPAddr;                          /* source ip address */
    106    UINT32	destIPAddr;                         /* destination ip address */
    107    UINT32   segmentSize;                        /* Stable segment size */
    108    UINT32   sequenceNumber;	                  /* The data sequence number */
    109    UINT32   ackNumber;	                        /* Specifies the next byte expected.*/
    110    UINT32   timeStamp;                          /*  */
    111    UINT32   ackCounter;	                        /* The number of 2 * Segement_size in ACK number  */
    112    ackTemplate_T    ackTemplate;			      	/* Ack template block */
    113    UINT8    monitorState;                       /* current monitor state */
    114    UINT8    equalSegmentSizeCounter;            /* count the number of equal segment size. */
    115    UINT8    yTagFlag;                           /* True if send Y tag */
    116    UINT8    activeIndex;                        /* Active session index */
    117    UINT16    sourceStationIndex;                 /* Source station index */
    118 
    119 } ackEmulationWTargetDbTyple_T;
    120 
    121 
    122 typedef struct {
    123    UINT32   segmentSize;                        /* Stable segment size */
    124    UINT32   ackNumber;	                        /* Specifies the next byte expected.*/
    125    UINT32   ackCounter;	                        /* The number of 2 * Segement_size in ACK number  */
    126    UINT32   timeStamp;	                        /* The number of 2 * Segement_size in ACK number  */
    127    UINT32   ackReorderProblem;
    128    ackTemplate_T    ackTemplate;			      	/* Ack template block */
    129 }ackEmulationWSourceDbTyple_T;
    130 
    131 
    132 /* Ack emulation monitor states */
    133 typedef enum {
    134 	REORDER_PROBLEM_OFF =0,
    135 	REORDER_PROBLEM_ON,
    136 	REORDER_PROBLEM_PRE,
    137 } wdrv_eaAckReorderProblem_T;
    138 
    139 
    140 typedef enum {
    141 	AE_INACTIVE =0,
    142 	AE_STANDBY,
    143 	AE_CANDIDATE_ACTIVE,
    144 	AE_ACTIVE,
    145 	AE_TERMINATE,
    146 } wdrv_eaMonitorStatus_T;
    147 
    148 
    149 typedef struct
    150 {
    151 	TI_HANDLE	hOs;
    152 	TI_HANDLE	hReport;
    153 
    154 
    155 	/* This table store the WTarget monitor session */
    156 	ackEmulationWTargetDbTyple_T wdrv_aeWTargetTable[MAX_ACIVE_SESSION+MAX_STANDBY_SESSION];
    157 	sessionsTableManager_T sessionsTableManager;
    158 
    159 	/* This table store the WSource monitor session */
    160 	ackEmulationWSourceDbTyple_T wdrv_aeWSourceTable[MAX_AE_STATIONS][MAX_ACIVE_SESSION];
    161 
    162 	/* This table store the Xtag status */
    163 	UINT8 ackEmulationXTagTable[MAX_AE_STATIONS];
    164 
    165 	/* This table store the active monitor session index */
    166 	activeIndexTable_T activeIndexTable[MAX_ACIVE_SESSION];
    167 
    168 }ackEmulDB_t;
    169 
    170 
    171 ackEmulDB_t* ackEmulDb_create(TI_HANDLE hOs);
    172 
    173 TI_STATUS ackEmulDb_config(ackEmulDB_t*	ackEmulDB,
    174 						   TI_HANDLE	hOs,
    175 						   TI_HANDLE	hReport);
    176 
    177 TI_STATUS ackEmulDb_destroy(ackEmulDB_t*	ackEmulDB);
    178 
    179 void wdrv_aeDbInit(ackEmulDB_t*	ackEmulDB);
    180 void wdrv_aeWTargetDbPrint(ackEmulDB_t*	ackEmulDB);
    181 int wdrv_aeWTargetDbFindDataSession(ackEmulDB_t*	ackEmulDB,UINT8 *pktBuf,UINT8 *sessionIndex, UINT8 *monitorState);
    182 int wdrv_aeWTargetDbFindAckSession(ackEmulDB_t*	ackEmulDB,UINT8 *pktBuf,UINT8 *sessionIndex, UINT8 *monitorState);
    183 int wdrv_aeWTargetDbAddSession(ackEmulDB_t*	ackEmulDB,UINT8 *pktBuf);
    184 
    185 int wdrv_aeWTargetDbDelSession(ackEmulDB_t*	ackEmulDB,UINT8 SessionIndex);
    186 int wdrv_aeWTargetDbSetActiveState(ackEmulDB_t*	ackEmulDB,UINT8 index , UINT8 *activeIndex);
    187 void wdrv_aeWTargetDbSaveAckTemplate(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT8 *pIpHeader);
    188 void wdrv_aeWTargetDbUpdateAckTemplate(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 sequenceNumber);
    189 int wdrv_aeWTargetDbCmpAckTemplate(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT8 *pIpHeader);
    190 void wdrv_aeWTargetDbResetTuple(ackEmulDB_t*	ackEmulDB,int index);
    191 
    192 void wdrv_aeWTargetDbGetSessionSequenceNumber(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 *sequenceNumber);
    193 void wdrv_aeWTargetDbGetSessionAckNumber(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 *ackNumber);
    194 void wdrv_aeWTargetDbGetSessionSegmentSize(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 *segmentSize);
    195 void wdrv_aeWTargetDbGetIncrSessionEqualSegmentSizeCounter(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT8 *equalSegmentSizeCounter);
    196 void wdrv_aeWTargetDbGetSessionAckCounter(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 *ackCounter);
    197 void wdrv_aeWTargetDbGetSessionMmonitorState(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT8 *monitorState);
    198 void wdrv_aeWTargetDbGetSessionActiveIndex(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT8 *activeIndex);
    199 
    200 void wdrv_aeWTargetDbSetSessionSequenceNumber(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 sequenceNumber);
    201 void wdrv_aeWTargetDbSetSessionAckNumber(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 ackNumber);
    202 void wdrv_aeWTargetDbSetSessionSegmentSize(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 segmentSize);
    203 void wdrv_aeWTargetDbSetSessionAckCounter(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 ackCounter);
    204 void wdrv_aeWTargetDbSetSessionMonitorState(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT8 monitorState);
    205 void wdrv_aeWTargetDbSetSessionEqualSegmentSizeCounter(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT8 equalSegmentSizeCounter);
    206 void wdrv_aeWTargetDbGetSessionTimeStamp(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 *timeStamp);
    207 void wdrv_aeWTargetDbSetSessionTimeStamp(ackEmulDB_t*	ackEmulDB,UINT8 index, UINT32 timeStamp);
    208 
    209 void wdrv_aeWSourceDbUpdateTemplate(ackEmulDB_t*	ackEmulDB,UINT8 *pktBuf,UINT8 stationIndex,UINT8 *sessionIndex);
    210 void wdrv_aeWSourceDbResetSession(ackEmulDB_t*	ackEmulDB,int stationIndex,int activeIndex);
    211 
    212 void wdrv_aeWSourceSaveAckTemplate(ackEmulDB_t*	ackEmulDB,UINT8 stationIndex,UINT8 activeIndex,
    213 											  UINT8* pDot11Header, UINT8 *pWlanSnapHeader, UINT8 *pIpHeader
    214 												,UINT16 dataLen,UINT16 segmentSize);
    215 
    216 void wdrv_aeWSourceDbGetSessionAckCounter(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 *ackCounter);
    217 
    218 void wdrv_aeWSourceDbSetSessionAckCounter(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 ackCounter);
    219 
    220 void wdrv_aeWSourceDbGetSessionAckNumber(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 *ackNumber);
    221 void wdrv_aeWSourceDbSetSessionAckNumber(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 ackNumber);
    222 
    223 void wdrv_aeWSourceDbGetSessionSegmentSize(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 *segmentSize);
    224 void wdrv_aeWSourceDbSetSessionSegmentSize(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 segmentSize);
    225 
    226 void wdrv_aeWSourceDbGetSessionTimeStamp(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 *timeStamp);
    227 void wdrv_aeWSourceDbSetSessionTimeStamp(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 timeStamp);
    228 
    229 void wdrv_aeWSourceDbGetSessionAckReorderProblem(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 *ackReorderProblem);
    230 void wdrv_aeWSourceDbSetSessionAckReorderProblem(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT32 ackReorderProblem);
    231 
    232 
    233 void wdrv_aeWSourceDbGetAckTemplate(ackEmulDB_t*	ackEmulDB,UINT16 stationIndex, UINT8 activeIndex, UINT8 **pTeplate,
    234 													 UINT8 *ipHeaderLen, UINT8 *tcpHeaderLen);
    235 
    236 
    237 void wdrv_aeDbGetXTagStatus(ackEmulDB_t*	ackEmulDB,UINT8 sessionIndex, UINT8 *status);
    238 void wdrv_aeDbSetXTagStatus(ackEmulDB_t*	ackEmulDB,UINT8 sessionIndex, UINT8 status);
    239 
    240 #endif
    241