📄 rilhandndisoem1.cpp
字号:
NdisRilCallbacksFromCID( ContextIDIndex, &pCallbackContext, &pfnRilReceiveCallback, &pfnRilTransmitCallback, &pfnRilStatusCallback );
if ( pfnRilStatusCallback )
{
RilNdisStatus.dwContextId=ContextIDIndex;
pfnRilStatusCallback(pCallbackContext,&RilNdisStatus);
}
else
{
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: %s WARNING No Callback on context %x\r\n"),(OemNdisEvent.Type == OEM_NDIS_XON) ? L"OEM_NDIS_XON" : L"OEM_NDIS_XOFF", ContextIDIndex));
}
}
break;
case OEM_NDIS_IP_CONFIGURATION:
memset ( &RilNdisIpConfig, 0, sizeof(RILNDISIPCONFIG));
NdisConvertConfig ( &OemNdisEvent.IpConfig, &RilNdisIpConfig);
RilNdisIpConfig.dwContextId = OemNdisEvent.ContextID;
DumpNdisIPConfig( &RilNdisIpConfig );
RilNdisStatus.dwContextId=OemNdisEvent.ContextID;
RilNdisStatus.dwSize=sizeof(RilNdisStatus);
RilNdisStatus.dwStatusType=RIL_PARAM_RILNDISSTATUS_IPCONFIG;
RilNdisStatus.pRilNdisIpConfig=&RilNdisIpConfig;
pfnRilStatusCallback = NULL;
NdisRilCallbacksFromCID( OemNdisEvent.ContextID, &pCallbackContext, &pfnRilReceiveCallback, &pfnRilTransmitCallback, &pfnRilStatusCallback );
if ( pfnRilStatusCallback )
{
pfnRilStatusCallback(pCallbackContext,&RilNdisStatus);
}
else
{
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: OEM_NDIS_IP_CONFIGURATION WARNING No Callback \r\n")));
}
ProcessNextContextRequest();
break;
case OEM_NDIS_OPEN_COMPLETE:
NdisRilCallbacksFromCID( OemNdisEvent.ContextID, &pCallbackContext, &pfnRilReceiveCallback, &pfnRilTransmitCallback, &pfnRilStatusCallback );
if ( NULL == pfnRilStatusCallback )
{
OemNdisEvent.Status = RIL_E_CANCELLED;
}
OemNdisApiReference.Status = OemNdisEvent.Status;
OemNdisApiReference.EventType= OEM_NDIS_OPEN_COMPLETE;
OemNdisApiReference.ContextID = OemNdisEvent.ContextID;
m_NdisAsyncCommandList.ProcessCommand ( &OemNdisApiReference );
if ( OemNdisEvent.Status ) // FAILURE!
{
pCPdpContext = (CPdpContext*)NdisPdpContextFromCid( OemNdisEvent.ContextID );
ASSERT(pCPdpContext);
pCPdpContext->CloseContext(OemNdisEvent.ContextID);
NdisShutdownConnection ( OemNdisEvent.ContextID);
ProcessNextContextRequest();
}
else
{
RilGprsContexActivated.cbSize = sizeof(RILGPRSCONTEXTACTIVATED);
RilGprsContexActivated.fActivated = TRUE;
RilGprsContexActivated.dwContextID = OemNdisEvent.ContextID;
RilGprsContexActivated.dwEvent = RIL_RILGPRSCONTEXTACTIVATED_MEACT;
((CRilHandle*)m_pCRilHandle)->BroadcastRealBlobNotification(RIL_NOTIFY_GPRSCONNECTIONSTATUS, &RilGprsContexActivated, sizeof(RILGPRSCONTEXTACTIVATED));
}
break;
case OEM_NDIS_CLOSE_COMPLETE:
OemNdisApiReference.Status = OemNdisEvent.Status;
OemNdisApiReference.EventType= OEM_NDIS_CLOSE_COMPLETE;
OemNdisApiReference.ContextID = OemNdisEvent.ContextID;
m_NdisAsyncCommandList.ProcessCommand ( &OemNdisApiReference );
NdisShutdownConnection ( OemNdisEvent.ContextID );
// Now notify the driver that the context is closed
WriteMsgQueue(m_TxMsgQueue, &OemNdisEvent, sizeof(OemNdisEvent),0, 0 );
ProcessNextContextRequest();
break;
}
}
}
continue;
}
else
{
ASSERT(0);
}
}while(1);
Exit:
CloseMsgQueue (m_RxMsgQueue);
CloseMsgQueue (m_TxMsgQueue);
CloseMsgQueue (m_RxMsgQueueWrite);
CloseMsgQueue (m_TxMsgQueueRead);
if ( m_pNdisChannels )
{
LocalFree(m_pNdisChannels);
}
return 0;
}
// **************************************************************************
// Function Name: NdisAllocateCommand
//
// Purpose: Allocate an asynchronous command. This method is used
// when the response will key off of the event type.
//
// Arguments: IN eType: expected event.
//
// Return Values:
//
// Side effects:
//
// Description:
// **************************************************************************
void CRilNDIS::NdisAllocateCommand ( OEMNDISEVENTTYPE Type, DWORD ContextID, LPVOID pCRilInstance, HRESULT CommandID )
{
if ( ContextID && pCRilInstance )
{
OEMNDISAPIREFERENCE OemNdisApiReference;
memset(&OemNdisApiReference,0,sizeof(OemNdisApiReference));
OemNdisApiReference.pCRilInstance = pCRilInstance;
OemNdisApiReference.EventType = Type;
OemNdisApiReference.ContextID = ContextID;
OemNdisApiReference.CommandID = CommandID;
m_NdisAsyncCommandList.AddCommand ( &OemNdisApiReference );
}
}
void
CRilNDIS:: NdisRemoveCommand ( HRESULT hrCommandID )
{
if ( hrCommandID )
{
m_NdisAsyncCommandList.RemoveCommand ( hrCommandID );
}
}
void CRilNDIS::NdisConvertConfig ( const OEMNDISIPCONFIG* pOemNdisConfig, RILNDISIPCONFIG* pRilNdisIpConfig)
{
if ( pOemNdisConfig && pRilNdisIpConfig )
{
memset( pRilNdisIpConfig, 0, sizeof(RILNDISIPCONFIG));
pRilNdisIpConfig->cbSize = sizeof(RILNDISIPCONFIG);
/* derive whether address is IPv4(default) or IPv6 */
pRilNdisIpConfig->dwProtocol = RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV4;
if ( pOemNdisConfig->ipAddress.length == IPV6_ADDRESS_LENGTH )
{
pRilNdisIpConfig->dwProtocol = RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV6;
}
/* fill in protocol specific parameters */
if ( pRilNdisIpConfig->dwProtocol == RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV4 )
{
pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_SUBNETMASK;
pRilNdisIpConfig->ipv4.inSubnetMask = 0xffffff00;
if ( pOemNdisConfig->ipAddress.length && pOemNdisConfig->ipAddress.address )
{
pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPADDR;
pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_DEFAULTGATEWAY;
pRilNdisIpConfig->ipv4.inIPAddress = myinet_addr( pOemNdisConfig->ipAddress.address, pOemNdisConfig->ipAddress.length );
pRilNdisIpConfig->ipv4.inDefaultGateway = pRilNdisIpConfig->ipv4.inIPAddress ^ 0xFF;
}
if ( pOemNdisConfig->primaryDnsAddress.length && pOemNdisConfig->primaryDnsAddress.address)
{
pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_PRIMARYDNS;
pRilNdisIpConfig->ipv4.inPrimaryDNS = myinet_addr( pOemNdisConfig->primaryDnsAddress.address, pOemNdisConfig->primaryDnsAddress.length );
}
if ( pOemNdisConfig->secondaryDnsAddress.length && pOemNdisConfig->secondaryDnsAddress.address)
{
pRilNdisIpConfig->ipv4.dwFlags |= RIL_PARAM_NDISIPCONFIG_SECONDARYDNS;
pRilNdisIpConfig->ipv4.inSecondaryDNS = myinet_addr( pOemNdisConfig->secondaryDnsAddress.address, pOemNdisConfig->secondaryDnsAddress.length );
}
}
else if ( pRilNdisIpConfig->dwProtocol == RIL_PARAM_NDISIPCONFIG_PROTOCOL_IPV6 )
{
if ( pOemNdisConfig->ipAddress.length )
{
pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_IPADDR;
pRilNdisIpConfig->ipv6.inIPAddress = myinet_ipv6addr( pOemNdisConfig->ipAddress.address, pOemNdisConfig->ipAddress.length );
UCHAR subnetmask[IPV6_ADDRESS_LENGTH];
memset( subnetmask, 0xFF, sizeof(subnetmask) );
pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_SUBNETMASK;
pRilNdisIpConfig->ipv6.inSubnetMask = myinet_ipv6addr( subnetmask, IPV6_ADDRESS_LENGTH );
pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_DEFAULTGATEWAY;
pRilNdisIpConfig->ipv6.inDefaultGateway = pRilNdisIpConfig->ipv6.inIPAddress;
}
if ( pOemNdisConfig->primaryDnsAddress.length )
{
pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_PRIMARYDNS;
pRilNdisIpConfig->ipv6.inPrimaryDNS = myinet_ipv6addr( pOemNdisConfig->primaryDnsAddress.address, pOemNdisConfig->primaryDnsAddress.length );
}
if ( pOemNdisConfig->secondaryDnsAddress.length )
{
pRilNdisIpConfig->ipv6.dwFlags |= RIL_PARAM_NDISIPCONFIG_IPV6_SECONDARYDNS;
pRilNdisIpConfig->ipv6.inSecondaryDNS = myinet_ipv6addr( pOemNdisConfig->secondaryDnsAddress.address, pOemNdisConfig->secondaryDnsAddress.length );
}
}
}
}
inline void
CRilNDIS::PdpContextLock()
{
EnterCriticalSection(&m_PdpContextCriticalSection);
}
inline void
CRilNDIS::PdpContextUnlock()
{
LeaveCriticalSection(&m_PdpContextCriticalSection);
}
inline BOOL
CRilNDIS::IsPdpContextLocked()
{
return m_PdpContextCriticalSection.OwnerThread == (HANDLE)GetCurrentThreadId();
}
PPDP_CONTEXT_ENTRY
CRilNDIS::PdpContextEntryGet()
{
PPDP_CONTEXT_ENTRY pEntry = NULL;
ASSERT(IsPdpContextLocked());
if (!IsListEmpty(&m_PdpContextFreeList))
{
pEntry = (PPDP_CONTEXT_ENTRY)RemoveHeadList(&m_PdpContextFreeList);
}
if (pEntry == NULL)
{
pEntry = (PPDP_CONTEXT_ENTRY)LocalAlloc(LPTR, sizeof(*pEntry));
}
if ( pEntry )
{
pEntry->AsyncCommandID = 0;
pEntry->pCRilInstance = NULL;
memset(&pEntry->RilNdisGprsContext, 0, sizeof(pEntry->RilNdisGprsContext));
}
return pEntry;
}
void
CRilNDIS::DumpPdpContextList ( void )
{
PPDP_CONTEXT_ENTRY pEntry;
PdpContextLock();
//
// Find entry with matching ContextID in our list of pending requests
//
for (pEntry = (PPDP_CONTEXT_ENTRY)(m_PdpContextPendingList.Flink);
TRUE;
pEntry = (PPDP_CONTEXT_ENTRY)pEntry->Node.Flink)
{
if (pEntry == (PPDP_CONTEXT_ENTRY)(&m_PdpContextPendingList))
{
break;
}
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: DumpPdpContextList pPdpContextEntry = %x \r\n"), pEntry));
}
PdpContextUnlock();
}
void
CRilNDIS::AddPdpContextEntry( const RILNDISGPRSCONTEXT *pRilNdisGprsContext, HRESULT AsyncCommandID, PVOID pCRilInstance )
{
PPDP_CONTEXT_ENTRY pEntry;
PdpContextLock();
pEntry = PdpContextEntryGet();
ASSERT(pEntry);
if ( pEntry )
{
pEntry->AsyncCommandID = AsyncCommandID;
pEntry->pCRilInstance = pCRilInstance;
CeSafeCopyMemory(&pEntry->RilNdisGprsContext,pRilNdisGprsContext,sizeof(pEntry->RilNdisGprsContext));
InsertTailList(&m_PdpContextPendingList, &pEntry->Node);
}
PdpContextUnlock();
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: AddPdpContextEntry pPdpContextEntry = %x \r\n"), pEntry));
DumpPdpContextList();
}
void
CRilNDIS::RemovePdpContextEntry( PPDP_CONTEXT_ENTRY pPdpContextEntry )
{
PPDP_CONTEXT_ENTRY pEntry;
PdpContextLock();
//
// Find entry with matching ContextID in our list of pending requests
//
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: RemovePdpContextEntry pPdpContextEntry = %x \r\n"), pPdpContextEntry));
for (pEntry = (PPDP_CONTEXT_ENTRY)(m_PdpContextPendingList.Flink);
TRUE;
pEntry = (PPDP_CONTEXT_ENTRY)pEntry->Node.Flink)
{
if (pEntry == (PPDP_CONTEXT_ENTRY)(&m_PdpContextPendingList))
{
ASSERT(0);
break;
}
if ( pEntry == pPdpContextEntry )
{
RemoveEntryList(&pEntry->Node);
InsertTailList(&m_PdpContextFreeList, &pEntry->Node);
break;
}
}
PdpContextUnlock();
DumpPdpContextList();
}
PPDP_CONTEXT_ENTRY
CRilNDIS::GetNextPdpContextEntry( void )
{
PPDP_CONTEXT_ENTRY pEntry;
PPDP_CONTEXT_ENTRY pReturnEntry = NULL;
PdpContextLock();
//
// Find entry with matching ContextID in our list of pending requests
//
for (pEntry = (PPDP_CONTEXT_ENTRY)(m_PdpContextPendingList.Flink);
TRUE;
pEntry = (PPDP_CONTEXT_ENTRY)pEntry->Node.Flink)
{
if (pEntry == (PPDP_CONTEXT_ENTRY)(&m_PdpContextPendingList))
{
break;
}
else
{
pReturnEntry = pEntry;
break;
}
}
PdpContextUnlock();
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: GetNextPdpContextEntry pReturnEntry = %x \r\n"), pReturnEntry));
return pReturnEntry;
}
BOOL
CRilNDIS::IsPdpContextListEmpty( void )
{
BOOL fReturn = IsListEmpty(&m_PdpContextPendingList);
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: IsPdpContextListEmpty = %s \r\n"),
fReturn ? L"TRUE" : L"FALSE"));
return fReturn;
}
void
CRilNDIS::RemoveAndSignalAllPdpContextEntries ( DWORD ContextID )
{
PPDP_CONTEXT_ENTRY pEntry;
DWORD ResultDetails;
BOOL ExitNow = FALSE;
PdpContextLock();
//
// Find entry with matching ContextID in our list of pending requests
//
while ( FALSE == ExitNow )
{
for (pEntry = (PPDP_CONTEXT_ENTRY)(m_PdpContextPendingList.Flink);
TRUE;
pEntry = (PPDP_CONTEXT_ENTRY)pEntry->Node.Flink)
{
if (pEntry == (PPDP_CONTEXT_ENTRY)(&m_PdpContextPendingList))
{
ExitNow = TRUE;
break;
}
if ( pEntry->RilNdisGprsContext.dwContextID== ContextID )
{
ResultDetails = RIL_RESULT_ERROR;
((CRilInstanceHandle*)pEntry->pCRilInstance)->Notify(RIL_RESULT_ERROR, pEntry->AsyncCommandID, &ResultDetails, sizeof(ResultDetails));
RemoveEntryList(&pEntry->Node);
InsertTailList(&m_PdpContextFreeList, &pEntry->Node);
break;
}
}
}
PdpContextUnlock();
}
void
CRilNDIS::ProcessNextContextRequest(void)
{
PPDP_CONTEXT_ENTRY pPdpContextEntry=NULL;
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest \r\n")));
LockPdpContextList();
pPdpContextEntry = GetNextPdpContextEntry();
ASSERT(pPdpContextEntry);
RemovePdpContextEntry(pPdpContextEntry);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -