⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 request.c

📁 网络驱动开发
💻 C
📖 第 1 页 / 共 2 页
字号:
/*++

Copyright (c) 2000 Microsoft Corporation. All rights reserved.

   File:       request.c

               Developed for Toshiba by Elisa Research Inc., CA
               http://www.elisaresearch.com
               (510) 770-4920



Abstract:

Author:

	A. Wang

Environment:

	Kernel mode

Revision History:

	01/07/97		awang		Initial of Toshiba ATM 155 Device Driver.
   3/25/98         jcao        Custom OIDs Support  (keyword:tboid)
   02/25/99        hhan        Example of WMI Support

--*/

#include "precomp.h"
#pragma hdrstop

#define	MODULE_NUMBER	MODULE_REQUEST

#include "tboid.h"

NDIS_OID gTbAtm155OidListSupported[] =
{
   OID_GEN_CO_SUPPORTED_LIST,
   OID_GEN_CO_HARDWARE_STATUS,
   OID_GEN_CO_MEDIA_SUPPORTED,
   OID_GEN_CO_MEDIA_IN_USE,
   OID_GEN_CO_LINK_SPEED,
   OID_GEN_CO_VENDOR_ID,
   OID_GEN_CO_VENDOR_DESCRIPTION,
   OID_GEN_CO_DRIVER_VERSION,
   OID_GEN_CO_PROTOCOL_OPTIONS,
   OID_GEN_CO_MAC_OPTIONS,
   OID_GEN_CO_MEDIA_CONNECT_STATUS,
   OID_GEN_CO_VENDOR_DRIVER_VERSION,
   OID_GEN_CO_MINIMUM_LINK_SPEED,
   OID_GEN_CO_SUPPORTED_GUIDS,
   OID_GEN_CO_XMIT_PDUS_OK,
   OID_GEN_CO_RCV_PDUS_OK,
   OID_GEN_CO_XMIT_PDUS_ERROR,
   OID_GEN_CO_RCV_PDUS_ERROR,
   OID_GEN_CO_RCV_PDUS_NO_BUFFER,
   OID_GEN_CO_RCV_CRC_ERROR,
   OID_ATM_SUPPORTED_VC_RATES,
   OID_ATM_SUPPORTED_SERVICE_CATEGORY,
   OID_ATM_SUPPORTED_AAL_TYPES,
   OID_ATM_HW_CURRENT_ADDRESS,
   OID_ATM_MAX_ACTIVE_VCS,
   OID_ATM_MAX_ACTIVE_VCI_BITS,
   OID_ATM_MAX_ACTIVE_VPI_BITS,
   OID_ATM_MAX_AAL0_PACKET_SIZE,
   OID_ATM_MAX_AAL5_PACKET_SIZE,
   OID_ATM_GET_NEAREST_FLOW,
   OID_ATM_RCV_CELLS_OK,
   OID_ATM_XMIT_CELLS_OK,
   OID_ATM_RCV_CELLS_DROPPED,
   OID_ATM_RCV_INVALID_VPI_VCI,
   OID_ATM_RCV_REASSEMBLY_ERROR,
   // tboid                            New OIDs defined in tboid.h
   OID_TBATM_READ_PEEPHOLE,
   OID_TBATM_READ_CSR,
   // custom oid WMI support
   OID_VENDOR_STRING
};

NDIS_GUID	gTbAtm155GuidListSupported[4] =
{
	{{0xfa214809, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c},
    OID_VENDOR_STRING,
    (ULONG) -1,
    (fNDIS_GUID_TO_OID|fNDIS_GUID_ANSI_STRING)
	},
	{{0xfa21480a, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c},
	 OID_ATM_RCV_INVALID_VPI_VCI,
	 4,
	 fNDIS_GUID_TO_OID
	},
	{{0xfa21480b, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c},
	 OID_GEN_CO_XMIT_PDUS_OK,
	 8,
	 fNDIS_GUID_TO_OID
	},
	{{0xfa21480c, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c},
	 OID_GEN_CO_RCV_PDUS_OK,
	 8,
	 fNDIS_GUID_TO_OID
	}
};

const UCHAR	gTbAtm155DriverDescription[] = "Toshiba ATM 155 Driver";

NDIS_STATUS
tbAtm155QueryInformation(
	IN		PADAPTER_BLOCK	pAdapter,
	IN		PVC_BLOCK		pVc,
	IN OUT	PNDIS_REQUEST	pRequest
	)
/*++

Routine Description:

	This routine will handle the general and ATM specific OID queries.

Arguments:

	pAdapter	-	Pointer to the adapter block to query.
	pVc			-	Optionally points to the specific VC to query.
	pRequest	-	Pointer to the request.

Return Value:

--*/
{
   NDIS_STATUS             Status = NDIS_STATUS_SUCCESS;
	PUCHAR                  DataToMove;
	ULONG	                DataLength;
	ULONG	                ulTemp;
	USHORT                  usTemp;
	ATM_VC_RATES_SUPPORTED  VcRates;
   PCO_CALL_PARAMETERS	    CallParameters;
	PCO_MEDIA_PARAMETERS	MediaParameters;
	PATM_MEDIA_PARAMETERS   pAtmMediaParms;
	ULONG	                PreScale;
	ULONG	                RateResolution;
	BOOLEAN                 fRoundUp;
	NDIS_CO_LINK_SPEED      CoLinkSpeed;
   PHARDWARE_INFO          pHwInfo = pAdapter->HardwareInfo;
   // tboid
   PTB_PEEPHOLE	        pPeepholePara;
   PTB_CSR                 pCsrPara;
   PUCHAR                  CsrVirtualAddr;



	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("==>tbAtm155QueryInformation\n"));

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("tbAtm155QueryInformation:\n   pAdapter - 0x%x\n   pVc - 0x%x\n   pRequest - 0x%x\n   OID - 0x%x\n",
		 pAdapter, pVc, pRequest, pRequest->DATA.QUERY_INFORMATION.Oid));

	//
	//	Setup the default to point to the
	//	ULONG type.
	//
	DataToMove = (PUCHAR)&ulTemp;
	DataLength = sizeof(ulTemp);

	//
	//	Process the OID.
	//
	switch (pRequest->DATA.QUERY_INFORMATION.Oid)
	{
		case OID_GEN_CO_SUPPORTED_LIST:

			//
			//	Setup the data pointer and length to copy the supported
			//	oid list into the information buffer passed to us.
			//
			DataToMove = (PUCHAR)gTbAtm155OidListSupported;
			DataLength = sizeof(gTbAtm155OidListSupported);

			break;

		case OID_GEN_CO_HARDWARE_STATUS:

			//
			//	Copy the hardware status into the users buffer.
			//
			DataToMove = (PUCHAR)&pAdapter->HardwareStatus;
			DataLength = sizeof(pAdapter->HardwareStatus);

			break;

		case OID_GEN_CO_MEDIA_SUPPORTED:
		case OID_GEN_CO_MEDIA_IN_USE:

			//
			//	We support ATM.
			//
			ulTemp = NdisMediumAtm;

			break;

		case OID_GEN_CO_MINIMUM_LINK_SPEED:
		case OID_GEN_CO_LINK_SPEED:

			//
			//	Link speed depends upon the type of adapter.
			//
			CoLinkSpeed.Inbound = CoLinkSpeed.Outbound =
										ATM_USER_DATA_RATE_SONET_155;

			DataToMove = (PUCHAR)&CoLinkSpeed;
			DataLength = sizeof(CoLinkSpeed);

			break;

		case OID_GEN_CO_VENDOR_ID:

			//
			//	Copy the first 3 bytes of the hardware address for
			//	the vendor id.
			//
			DataToMove[0] = pAdapter->HardwareInfo->PermanentAddress[0];
			DataToMove[1] = pAdapter->HardwareInfo->PermanentAddress[1];
			DataToMove[2] = pAdapter->HardwareInfo->PermanentAddress[2];
			DataToMove[3] = 0;

			break;

		case OID_GEN_CO_VENDOR_DESCRIPTION:

			DataToMove = (PUCHAR)gTbAtm155DriverDescription;
			DataLength = sizeof(gTbAtm155DriverDescription);

			break;

		case OID_GEN_CO_DRIVER_VERSION:

			//
			//	Return the version of NDIS that we expect.
			//
			usTemp = ((TBATM155_NDIS_MAJOR_VERSION << 8) |
							    TBATM155_NDIS_MINOR_VERSION);
			DataToMove = (PUCHAR)&usTemp;
			DataLength = sizeof(USHORT);

			break;

		case OID_GEN_CO_PROTOCOL_OPTIONS:

			//
			//	We don't support protocol options.
			//
			ulTemp = 0;

			break;

		case OID_GEN_CO_MAC_OPTIONS:

			//
			//	We don't support MAC options.
			//
			ulTemp = 0;

			break;

		case OID_GEN_CO_MEDIA_CONNECT_STATUS:

			//
			//	Return whether or not we have a link.
			//
			ulTemp = pAdapter->MediaConnectStatus;

			break;

		case OID_GEN_CO_VENDOR_DRIVER_VERSION:

			ulTemp = (TBATM155_DRIVER_MAJOR_VERSION << 8) |
						TBATM155_DRIVER_MINOR_VERSION;
	
			break;

		case OID_ATM_SUPPORTED_VC_RATES:

			//
			//	This OID is used to query the miniport for it's minimum and
			//	maximum supported VC rates in cells per second.
			//
			VcRates.MaxCellRate = pAdapter->MaximumBandwidth;
			VcRates.MinCellRate = pAdapter->MinimumCbrBandwidth;

			DataToMove = (PUCHAR)&VcRates;
			DataLength = sizeof(VcRates);

			break;

		case OID_ATM_SUPPORTED_SERVICE_CATEGORY:
			//
			//	This OID is used to query the miniport for the supported
			//	QoS.
			//
#if    ABR_CODE

			ulTemp = ATM_SERVICE_CATEGORY_CBR | ATM_SERVICE_CATEGORY_UBR |
                    ATM_SERVICE_CATEGORY_ABR;

#else     // not ABR_CODE

			ulTemp = ATM_SERVICE_CATEGORY_CBR | ATM_SERVICE_CATEGORY_UBR;

#endif     // end of ABR_CODE

			break;

		case OID_ATM_SUPPORTED_AAL_TYPES:
			//
			//	This OID is used to query the miniport for the AAL types
			//	supported (either in software or hardware).
			//
			ulTemp = AAL_TYPE_AAL5;

			break;

		case OID_ATM_HW_CURRENT_ADDRESS:

			//
			//	This OID is used to query the miniport for it's
			//	hardware address.
			//
			DataToMove = pAdapter->HardwareInfo->StationAddress;
			DataLength = ATM_MAC_ADDRESS_LENGTH;

			break;

		case OID_ATM_MAX_ACTIVE_VCS:
			//
			//	Maximum active VCS are 1K or 4K.
			//
			ulTemp = pAdapter->HardwareInfo->NumOfVCs;

			break;

		case OID_ATM_MAX_ACTIVE_VCI_BITS:
			//
			//	We support 10 bits of VCI addresses...
			//
			ulTemp = 10;

			break;

		case OID_ATM_MAX_ACTIVE_VPI_BITS:

			//
			//	Only VPI 0...
			//
			ulTemp = 0;

			break;

		case OID_ATM_MAX_AAL0_PACKET_SIZE:

			//
			//	This ones easy...
			//
			ulTemp = CELL_PAYLOAD_SIZE;

			break;

		case OID_ATM_MAX_AAL5_PACKET_SIZE:

			//	
			//	Return the max packet size that we can support on
			//	AAL5.
           //
           // This value should be larger than 18190.
           //

			ulTemp = (ULONG)MAX_AAL5_PDU_SIZE;

			break;							 	

		case OID_ATM_GET_NEAREST_FLOW:

			//
			//	They must pass us a VC to query this.
			//
			if (NULL == pVc)
			{
				Status = NDIS_STATUS_INVALID_DATA;

				break;
			}

			//
			//	Verify the size of the CO_CALL_PARAMETERS
			//
			if (pRequest->DATA.QUERY_INFORMATION.InformationBufferLength <
					(sizeof(CO_CALL_PARAMETERS) + sizeof(CO_MEDIA_PARAMETERS) + sizeof(CO_SPECIFIC_PARAMETERS) + sizeof(ATM_MEDIA_PARAMETERS)))
			{
				Status = NDIS_STATUS_INVALID_DATA;

				break;
			}

			//
			//	This is used to determine the flow rate that our hardware
			//	can handle that is the closest to what the caller wants.
			//
			CallParameters = (PCO_CALL_PARAMETERS)pRequest->DATA.QUERY_INFORMATION.InformationBuffer;
			MediaParameters = CallParameters->MediaParameters;

			//
			//	Validate that we have ATM_MEDIA_SPECIFIC information....
			//
			if ((MediaParameters->MediaSpecific.ParamType != ATM_MEDIA_SPECIFIC) ||
				(MediaParameters->MediaSpecific.Length != sizeof(ATM_MEDIA_PARAMETERS)))
			{
				DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_ERR,
					("tbAtm155QueryInformation: OID_ATM_GET_NEAREST_FLOW has invalid ATM_MEDIA_PARAMETERS\n"));

				Status = NDIS_STATUS_INVALID_DATA;

				break;
			}

			//
			//	Get a pointer to the atm media parameters.
			//
			pAtmMediaParms = (PATM_MEDIA_PARAMETERS)MediaParameters->MediaSpecific.Parameters;

			fRoundUp = (BOOLEAN)((MediaParameters->Flags & ROUND_UP_FLOW) == ROUND_UP_FLOW);

			//
			//	Adjust the traffic parameters for both the receive and
			//	transmits.
			//
			if (MediaParameters->Flags & TRANSMIT_VC)
			{
				Status = tbAtm155AdjustTrafficParameters(
							pAdapter,
							&pAtmMediaParms->Transmit,
							fRoundUp,
							&PreScale,
							&RateResolution);
				if (NDIS_STATUS_SUCCESS != Status)
				{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -