#ifndef _HOST_MIBSINTERFACE_H
#define _HOST_MIBSINTERFACE_H

/*
 * Copyright (c) 2007 Beceem Communications Pvt. Ltd
 * File Name: HostMIBSInterface.h
 * Abstract: This file contains DS used by the Host to update the Host
 * statistics used for the MIBS.
 */

#define MIBS_MAX_CLASSIFIERS 100
#define MIBS_MAX_PHSRULES 100
#define MIBS_MAX_SERVICEFLOWS 17
#define MIBS_MAX_IP_RANGE_LENGTH 4
#define MIBS_MAX_PORT_RANGE 4
#define MIBS_MAX_PROTOCOL_LENGTH   32
#define MIBS_MAX_PHS_LENGTHS	 255
#define MIBS_IPV6_ADDRESS_SIZEINBYTES 0x10
#define MIBS_IP_LENGTH_OF_ADDRESS	4
#define MIBS_MAX_HIST_ENTRIES 12
#define MIBS_PKTSIZEHIST_RANGE 128

typedef union _U_MIBS_IP_ADDRESS
{
    struct
	{
		//Source Ip Address Range
		ULONG		ulIpv4Addr[MIBS_MAX_IP_RANGE_LENGTH];
		//Source Ip Mask Address Range
		ULONG       ulIpv4Mask[MIBS_MAX_IP_RANGE_LENGTH];
	};
	struct
	{
		//Source Ip Address Range
		ULONG		ulIpv6Addr[MIBS_MAX_IP_RANGE_LENGTH * 4];
		//Source Ip Mask Address Range
		ULONG       ulIpv6Mask[MIBS_MAX_IP_RANGE_LENGTH * 4];

	};
	struct
	{
		UCHAR		ucIpv4Address[MIBS_MAX_IP_RANGE_LENGTH *
									MIBS_IP_LENGTH_OF_ADDRESS];
		UCHAR		ucIpv4Mask[MIBS_MAX_IP_RANGE_LENGTH *
									MIBS_IP_LENGTH_OF_ADDRESS];
	};
	struct
	{
		UCHAR		ucIpv6Address[MIBS_MAX_IP_RANGE_LENGTH * MIBS_IPV6_ADDRESS_SIZEINBYTES];
		UCHAR		ucIpv6Mask[MIBS_MAX_IP_RANGE_LENGTH * MIBS_IPV6_ADDRESS_SIZEINBYTES];
	};
}U_MIBS_IP_ADDRESS;


typedef struct _S_MIBS_HOST_INFO
{
	ULONG64			GoodTransmits;
	ULONG64			GoodReceives;
	// this to keep track of the Tx and Rx MailBox Registers.
	ULONG			NumDesUsed;
	ULONG			CurrNumFreeDesc;
	ULONG			PrevNumFreeDesc;
	// to keep track the no of byte received
	ULONG			PrevNumRcevBytes;
	ULONG			CurrNumRcevBytes;

	/* QOS Related */
	ULONG			BEBucketSize;
	ULONG			rtPSBucketSize;
	ULONG			LastTxQueueIndex;
	BOOLEAN			TxOutofDescriptors;
	BOOLEAN			TimerActive;
	UINT32			u32TotalDSD;
	UINT32			aTxPktSizeHist[MIBS_MAX_HIST_ENTRIES];
	UINT32			aRxPktSizeHist[MIBS_MAX_HIST_ENTRIES];
}S_MIBS_HOST_INFO;

typedef struct _S_MIBS_CLASSIFIER_RULE
{
	ULONG				ulSFID;
	UCHAR               ucReserved[2];
	B_UINT16            uiClassifierRuleIndex;
	BOOLEAN				bUsed;
	USHORT				usVCID_Value;
	// This field detemines the Classifier Priority
	B_UINT8             u8ClassifierRulePriority;
	U_MIBS_IP_ADDRESS   stSrcIpAddress;
	/*IP Source Address Length*/
	UCHAR               ucIPSourceAddressLength;

	U_MIBS_IP_ADDRESS   stDestIpAddress;
	/* IP Destination Address Length */
	UCHAR               ucIPDestinationAddressLength;
	UCHAR               ucIPTypeOfServiceLength;//Type of service Length
	UCHAR               ucTosLow;//Tos Low
	UCHAR               ucTosHigh;//Tos High
	UCHAR               ucTosMask;//Tos Mask
	UCHAR               ucProtocolLength;//protocol Length
	UCHAR               ucProtocol[MIBS_MAX_PROTOCOL_LENGTH];//protocol Length
	USHORT				usSrcPortRangeLo[MIBS_MAX_PORT_RANGE];
	USHORT				usSrcPortRangeHi[MIBS_MAX_PORT_RANGE];
	UCHAR               ucSrcPortRangeLength;
	USHORT				usDestPortRangeLo[MIBS_MAX_PORT_RANGE];
	USHORT				usDestPortRangeHi[MIBS_MAX_PORT_RANGE];
	UCHAR               ucDestPortRangeLength;
	BOOLEAN				bProtocolValid;
	BOOLEAN				bTOSValid;
	BOOLEAN				bDestIpValid;
	BOOLEAN				bSrcIpValid;
	UCHAR				ucDirection;
	BOOLEAN             bIpv6Protocol;
	UINT32              u32PHSRuleID;
}S_MIBS_CLASSIFIER_RULE;


typedef struct _S_MIBS_PHS_RULE
{
	ULONG		ulSFID;
	/// brief 8bit PHSI Of The Service Flow
	B_UINT8     u8PHSI;
	/// brief PHSF Of The Service Flow
	B_UINT8     u8PHSFLength;
	B_UINT8     u8PHSF[MIBS_MAX_PHS_LENGTHS];
	/// brief PHSM Of The Service Flow
	B_UINT8     u8PHSMLength;
	B_UINT8     u8PHSM[MIBS_MAX_PHS_LENGTHS];
	/// brief 8bit PHSS Of The Service Flow
	B_UINT8     u8PHSS;
	/// brief 8bit PHSV Of The Service Flow
	B_UINT8     u8PHSV;
	// Reserved bytes are 5, so that it is similar to S_PHS_RULE structure.
	B_UINT8	    reserved[5];

	LONG	    PHSModifiedBytes;
	ULONG	    PHSModifiedNumPackets;
	ULONG		PHSErrorNumPackets;
}S_MIBS_PHS_RULE;

typedef struct _S_MIBS_EXTSERVICEFLOW_PARAMETERS
{
	UINT32 		wmanIfSfid;
	UINT32 		wmanIfCmnCpsSfState;
	UINT32 		wmanIfCmnCpsMaxSustainedRate;
	UINT32 		wmanIfCmnCpsMaxTrafficBurst;
	UINT32 		wmanIfCmnCpsMinReservedRate;
	UINT32 		wmanIfCmnCpsToleratedJitter;
	UINT32 		wmanIfCmnCpsMaxLatency;
	UINT32 		wmanIfCmnCpsFixedVsVariableSduInd;
	UINT32 		wmanIfCmnCpsSduSize;
	UINT32 		wmanIfCmnCpsSfSchedulingType;
	UINT32 		wmanIfCmnCpsArqEnable;
	UINT32 		wmanIfCmnCpsArqWindowSize;
	UINT32 		wmanIfCmnCpsArqBlockLifetime;
	UINT32 		wmanIfCmnCpsArqSyncLossTimeout;
	UINT32 		wmanIfCmnCpsArqDeliverInOrder;
	UINT32 		wmanIfCmnCpsArqRxPurgeTimeout;
	UINT32 		wmanIfCmnCpsArqBlockSize;
	UINT32 		wmanIfCmnCpsMinRsvdTolerableRate;
	UINT32 		wmanIfCmnCpsReqTxPolicy;
	UINT32 		wmanIfCmnSfCsSpecification;
	UINT32 		wmanIfCmnCpsTargetSaid;

}S_MIBS_EXTSERVICEFLOW_PARAMETERS;


typedef struct _S_MIBS_SERVICEFLOW_TABLE
{
	 //classification extension Rule
	ULONG		ulSFID;
    USHORT		usVCID_Value;
	UINT		uiThreshold;
	// This field determines the priority of the SF Queues
	B_UINT8     u8TrafficPriority;

	BOOLEAN		bValid;
   	BOOLEAN     bActive;
	BOOLEAN		bActivateRequestSent;
	//BE or rtPS
	B_UINT8		u8QueueType;
	//maximum size of the bucket for the queue
	UINT		uiMaxBucketSize;
	UINT		uiCurrentQueueDepthOnTarget;
	UINT		uiCurrentBytesOnHost;
	UINT		uiCurrentPacketsOnHost;
	UINT		uiDroppedCountBytes;
	UINT		uiDroppedCountPackets;
	UINT		uiSentBytes;
	UINT		uiSentPackets;
	UINT		uiCurrentDrainRate;
	UINT		uiThisPeriodSentBytes;
	LARGE_INTEGER	liDrainCalculated;
	UINT		uiCurrentTokenCount;
	LARGE_INTEGER	liLastUpdateTokenAt;
	UINT		uiMaxAllowedRate;
	UINT        NumOfPacketsSent;
	UCHAR		ucDirection;
	USHORT		usCID;
	S_MIBS_EXTSERVICEFLOW_PARAMETERS	stMibsExtServiceFlowTable;
	UINT		uiCurrentRxRate;
	UINT		uiThisPeriodRxBytes;
	UINT		uiTotalRxBytes;
	UINT		uiTotalTxBytes;
}S_MIBS_SERVICEFLOW_TABLE;

typedef struct _S_MIBS_DROPPED_APP_CNTRL_MESSAGES
{
	ULONG cm_responses;
	ULONG cm_control_newdsx_multiclassifier_resp;
	ULONG link_control_resp;
	ULONG status_rsp;
	ULONG stats_pointer_resp;
	ULONG idle_mode_status;
	ULONG auth_ss_host_msg;
	ULONG low_priority_message;

}S_MIBS_DROPPED_APP_CNTRL_MESSAGES;

typedef struct _S_MIBS_HOST_STATS_MIBS
{
	S_MIBS_HOST_INFO				stHostInfo;
	S_MIBS_CLASSIFIER_RULE			astClassifierTable[MIBS_MAX_CLASSIFIERS];
	S_MIBS_SERVICEFLOW_TABLE		astSFtable[MIBS_MAX_SERVICEFLOWS];
	S_MIBS_PHS_RULE                 astPhsRulesTable[MIBS_MAX_PHSRULES];
	S_MIBS_DROPPED_APP_CNTRL_MESSAGES	stDroppedAppCntrlMsgs;
}S_MIBS_HOST_STATS_MIBS;
#endif