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

📄 request.c

📁 三星2410的BSP开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
            break;

        ////////////////////////////////////////////////////////////////

        case OID_802_3_XMIT_MORE_COLLISIONS:                    
            GenericUlong = 0x00;
            DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID_802_3_XMIT_MORE_COLLISIONS:: Returning: BOGUS \r\n")));
            break;       

        ////////////////////////////////////////////////////////////////

        case OID_TYPE_CUSTOM_OPER:
            DEBUGMSG (ZONE_GET, (TEXT("VMini:: >>> OID_TYPE_CUSTOM_OPER...\r\n")));
            break;

        ////////////////////////////////////////////////////////////////

#ifdef NDIS50_MINIPORT

        case OID_PNP_CAPABILITIES:
        {
            DEBUGMSG (ZONE_GET, 
                (TEXT("VMini:: OID_PNP_CAPABILITIES..\r\n")));

            ndis_pnp_capablities.WakeUpCapabilities.MinMagicPacketWakeUp    = NdisDeviceStateUnspecified;
            ndis_pnp_capablities.WakeUpCapabilities.MinPatternWakeUp        = NdisDeviceStateUnspecified;
            ndis_pnp_capablities.WakeUpCapabilities.MinLinkChangeWakeUp     = NdisDeviceStateUnspecified;
            SourceBuffer        = (PVOID)&ndis_pnp_capablities; 
            SourceBufferLength  = sizeof(ndis_pnp_capablities);
            break;
        }

        case OID_PNP_QUERY_POWER:
        {
            DEVICE_POWER_STATE  DevicePowerState;

            DevicePowerState = *(PDEVICE_POWER_STATE)InformationBuffer;

            DEBUGMSG (ZONE_GET, 
                (TEXT("VMini:: Okay OID_PNP_QUERY_POWER for [%s].\r\n"),
                    (DevicePowerState == NdisDeviceStateD0) ? TEXT("D0"): 
                    (DevicePowerState == NdisDeviceStateD1) ? TEXT("D1"): 
                    (DevicePowerState == NdisDeviceStateD2) ? TEXT("D2"): 
                    (DevicePowerState == NdisDeviceStateD3) ? TEXT("D3"): 
                    TEXT("UNKNOWN")));
                
            GenericUlong = 0x00;
            break;
        }
#endif
            
		////////////////////////////////////////////////////////////////

        default:
            DEBUGMSG (ZONE_GET, (TEXT("VMini:: OID not supported!!\r\n")));    
            Status = NDIS_STATUS_NOT_SUPPORTED;
            break;  

    }   // switch (Oid) 


    ////////////////////////////////////////////////////////////////////////////
    //  Everyone gets here...
    // 
	
    if (Status == NDIS_STATUS_SUCCESS) 
    {
        if (SourceBufferLength > InformationBufferLength) 
        {
            ////////////////////////////////////////////////////////////////////
            //  Not enough room in InformationBuffer. Punt
            //          
            
			DEBUGMSG (0, 
				(TEXT("VMini:: Err: OID[0x%x] SrcLen = %d > BuffLen = %d \r\n"),
				Oid,
                SourceBufferLength, 
				InformationBufferLength));

            *BytesNeeded = SourceBufferLength;
            Status = NDIS_STATUS_INVALID_LENGTH;
        } 
        else 
        {
            ////////////////////////////////////////////////////////////////////
            //  Store result.
            //                      
            NdisMoveMemory(InformationBuffer, SourceBuffer, SourceBufferLength);
            *BytesWritten = SourceBufferLength;         
        }   
    }
    
    DEBUGMSG (ZONE_GET, (TEXT("VMini:: VMiniQueryInformation returning: %s\r\n"),
        Status ? TEXT("Error") : TEXT("Success")));
    
    return Status;  

}   //  InternalVMiniQueryInformation()



////////////////////////////////////////////////////////////////////////////////
//  InternalVMiniSetInformation()
//
//  The VMiniSetInformation handles a set operation for a single Oid
//
//  Arguments:
//      MiniportAdapterContext  -  a pointer to the adapter.
//      Oid                     -  The OID of the set.
//      InformationBuffer       -  Holds the data to be set.
//      InformationBufferLength -  The length of InformationBuffer.
//      BytesRead               -  If the call is successful, returns the number
//                                      of bytes read from InformationBuffer.
//      BytesNeeded             -  If there is not enough data in 
//                                      InformationBuffer to satisfy the OID, 
//                                      returns the amount of storage needed.
//
//  Return Value:
//
//  -   NDIS_STATUS_SUCCESS
//  -   NDIS_STATUS_PENDING
//  -   NDIS_STATUS_INVALID_LENGTH
//  -   NDIS_STATUS_INVALID_OID
//
//
NDIS_STATUS
InternalVMiniSetInformation(
   IN   NDIS_HANDLE MiniportAdapterContext,
   IN   NDIS_OID    Oid,
   IN   PVOID       InformationBuffer,
   IN   ULONG       InformationBufferLength,
   OUT  PULONG      BytesRead,
   OUT  PULONG      BytesNeeded
   )
{

    PSTRUCT_VMINI   Adapter         = MiniportAdapterContext;
    PUCHAR          InfoBuffer      = (PUCHAR)InformationBuffer;    
	DWORD			dwFilter;

    DEBUGMSG (ZONE_SET, (TEXT("VMini:: VMiniSetInformation() OID = 0x%x \r\n"),
        Oid));      


    ////////////////////////////////////////////////////////////////////////////
    //  Check for the most common OIDs
    //
    switch (Oid) 
    {   
        ////////////////////////////////////////////////////////////////////////
        //  MULTICAST LIST SETTING...
        //
        case OID_802_3_MULTICAST_LIST:                          
            DEBUGMSG (ZONE_SET, (TEXT("VMini:: OID_802_3_MULTICAST_LIST...\r\n")));
			DEBUGMSG (0, (TEXT("VMini:: OID_802_3_MULTICAST_LIST...\r\n")));

			*BytesRead = 0;
			*BytesNeeded = 0;
			
			if ((InformationBufferLength % 6) != 0)
			{
				DEBUGMSG (ZONE_ERROR, 
					(TEXT("VMini:: Err:: MulticastList:: Not mult of 6!\r\n")));

				return NDIS_STATUS_INVALID_LENGTH;			
			}

			if ((InformationBufferLength / 6) > DEFAULT_MULTICASTLIST_MAX)
			{
				DEBUGMSG (ZONE_ERROR,
					(TEXT("VMini:: MulticastList too long [%d] max [%d]  \r\n"),
					InformationBufferLength / 6,
					DEFAULT_MULTICASTLIST_MAX));

				return NDIS_STATUS_MULTICAST_FULL;
			}
			
			NdisMoveMemory(
				Adapter->vm_MulticastAddresses, 
				InformationBuffer, 
				InformationBufferLength);

			Adapter->vm_MulticastAddressesInUse = InformationBufferLength / 6;

			if (!KernelIoControl(
					IOCTL_VBRIDGE_802_3_MULTICAST_LIST,
					Adapter->vm_MulticastAddresses,
					Adapter->vm_MulticastAddressesInUse,
					NULL,
					0,
					NULL))
			{
				DEBUGMSG (ZONE_ERROR,
					(TEXT("VMini:: Failed to set multicast list.\r\n")));

				Adapter->vm_MulticastAddressesInUse = 0x00;
				return NDIS_STATUS_FAILURE;
			}
			
#if 0
{
			DWORD i;

			DEBUGMSG (1, 
				(TEXT("VMini:: Successfully set [%d] entry in multicast list:\r\n"),
				InformationBufferLength / 6));

			for (i = 0 ; i < Adapter->vm_MulticastAddressesInUse ; i++)
			{
				DEBUGMSG (1,
					(TEXT("Entry [%d] : %02x-%02x-%02x-%02x-%02x-%02x\r\n"),
					i,
					Adapter->vm_MulticastAddresses[i][0],
					Adapter->vm_MulticastAddresses[i][1],
					Adapter->vm_MulticastAddresses[i][2],
					Adapter->vm_MulticastAddresses[i][3],
					Adapter->vm_MulticastAddresses[i][4],
					Adapter->vm_MulticastAddresses[i][5]));
			}

}
#endif			
			return NDIS_STATUS_SUCCESS;
            break;


        ////////////////////////////////////////////////////////////////////////
        //  Packet Filter setting...
        //
        case OID_GEN_CURRENT_PACKET_FILTER:
            DEBUGMSG (ZONE_SET, (TEXT("VMini:: OID_GEN_CURRENT_PACKET_FILTER.\r\n")));

			*BytesRead = 0;
            *BytesNeeded = 0;

			if (InformationBufferLength != 4 ) 
				return NDIS_STATUS_INVALID_LENGTH;                        
        
			NdisMoveMemory(&dwFilter, InformationBuffer, 4);
        
			//
			//	Reject types we don't support..
			//
			if (dwFilter & 
				 (NDIS_PACKET_TYPE_SOURCE_ROUTING	|
				  NDIS_PACKET_TYPE_SMT				|
				  NDIS_PACKET_TYPE_MAC_FRAME		|
				  NDIS_PACKET_TYPE_FUNCTIONAL		|
				  NDIS_PACKET_TYPE_ALL_FUNCTIONAL	|
				  NDIS_PACKET_TYPE_GROUP)) 
			{
				return NDIS_STATUS_NOT_SUPPORTED;				
			}
			
			//
			//	Hence we support:
			//	DIRECTED, MULTICAST, ALL_MULTICAST, BROADCAST, 
			//
			//	Set the new value on the adapter..
			//
			Adapter->vm_CurrentPacketFilter = dwFilter;
			
			if (!KernelIoControl(
					IOCTL_VBRIDGE_CURRENT_PACKET_FILTER,
					&Adapter->vm_CurrentPacketFilter,
					sizeof(DWORD),
					NULL,
					0,
					NULL))
			{
				DEBUGMSG (ZONE_ERROR,
					(TEXT("VMini:: Failed to set filtering mode to: 0x%x\r\n"),
					Adapter->vm_CurrentPacketFilter));

				Adapter->vm_CurrentPacketFilter = 0x00;
				return NDIS_STATUS_FAILURE;
			}

			return NDIS_STATUS_SUCCESS;
            break;

        
        ////////////////////////////////////////////////////////////////////////
        //  LookAhead...
        //
        case OID_GEN_CURRENT_LOOKAHEAD:            
            DEBUGMSG (ZONE_SET, (TEXT("VMini:: OID_GEN_CURRENT_LOOKAHEAD...\r\n")));
			if (InformationBufferLength != 4 ) 
			{
				DEBUGMSG (ZONE_ERROR, 
					(TEXT("VMini - Set GEN_CURRENT_LOOKAHEAD inval len.\r\n")));
				return NDIS_STATUS_INVALID_LENGTH;                        
			}
			NdisMoveMemory(&g_dwLookAhead, InformationBuffer, 4);			
            *BytesRead = 4;
            break;

		
		////////////////////////////////////////////////////////////////////////
		//	Special case to force status disconnect..
		//
		
		case 0xf0000001:
		{
			DWORD	dwToDisconnect;

			if (InformationBufferLength != 4 ) 
			{
				DEBUGMSG (ZONE_ERROR, 
					(TEXT("VMini - Set 0xf0000001 inval len.\r\n")));
				
				return NDIS_STATUS_INVALID_LENGTH;
			}
			
			NdisMoveMemory(&dwToDisconnect, InformationBuffer, 4);			


			//
			//	0 means disconnect, anything else connect..
			//

			if (dwToDisconnect)
			{
				DEBUGMSG (ZONE_SET,
					(TEXT("VMini:: media status is DISCONNECTED..\r\n")));
				g_dwMediaStatus = NDIS_STATUS_MEDIA_CONNECT;
			}
			else
			{
				DEBUGMSG (ZONE_SET,
					(TEXT("VMini:: media status is CONNECTED..\r\n")));
				g_dwMediaStatus = NDIS_STATUS_MEDIA_DISCONNECT;
			}

			NdisMIndicateStatus(
				Adapter->vm_VMiniportHandle,
				g_dwMediaStatus,
				NULL,
				0);

			break;
		}
        
        ////////////////////////////////////////////////////////////////////////

        case OID_PNP_SET_POWER:
        {
            NDIS_DEVICE_POWER_STATE     NdisDevicePowerState;
            
            *BytesRead      = 4;
            *BytesNeeded    = 0;

            NdisDevicePowerState = *(PNDIS_DEVICE_POWER_STATE)InformationBuffer;

            DEBUGMSG (ZONE_SET,
                (TEXT("VMini:: OID_PNP_SET_POWER to [%s]\r\n"),
                (NdisDevicePowerState == NdisDeviceStateD0) ? TEXT("D0") :
                (NdisDevicePowerState == NdisDeviceStateD1) ? TEXT("D1") :
                (NdisDevicePowerState == NdisDeviceStateD2) ? TEXT("D2") :
                (NdisDevicePowerState == NdisDeviceStateD3) ? TEXT("D3") :
                TEXT("UNKNOWN.")));

            break;
        }

        ////////////////////////////////////////////////////////////////////////

        default:
            DEBUGMSG (ZONE_SET, (TEXT("VMini:: Default...returning INVALID\r\n")));
            *BytesRead = 0;
            *BytesNeeded = 0;
            return NDIS_STATUS_INVALID_OID;
    }
    
    return NDIS_STATUS_SUCCESS;

}   //  InternalVMiniSetInformation()



























⌨️ 快捷键说明

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