📄 rilhandndisoem1.cpp
字号:
{
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);
pPdpContextEntry = GetNextPdpContextEntry();
while (pPdpContextEntry)
{
ASSERT(pPdpContextEntry->AsyncCommandID);
ASSERT(pPdpContextEntry->pCRilInstance);
HRESULT Result=E_FAIL;
DWORD Index;
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest cid = %x, Activation = %s pCRilInstance = %x AsyncCommandID = %x\r\n"),
pPdpContextEntry->RilNdisGprsContext.dwContextID,
pPdpContextEntry->RilNdisGprsContext.fContextActivation ? L"TRUE" : L"FALSE",
pPdpContextEntry->pCRilInstance,
pPdpContextEntry->AsyncCommandID));
CPdpContext *pCPdpContext = (CPdpContext*)NdisPdpContextFromCid( pPdpContextEntry->RilNdisGprsContext.dwContextID );
if ( !pPdpContextEntry->RilNdisGprsContext.fContextActivation )
{
if ( pCPdpContext)
{
NdisAllocateCommand ( OEM_NDIS_CLOSE_COMPLETE, pPdpContextEntry->RilNdisGprsContext.dwContextID, (LPVOID)pPdpContextEntry->pCRilInstance, pPdpContextEntry->AsyncCommandID );
Result = pCPdpContext->ActivateContext((PVOID) &pPdpContextEntry->RilNdisGprsContext);
if ( FAILED(Result))
{
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest CLOSE handle = %x Call FAILED\r\n"), pCPdpContext));
NdisShutdownConnection ( pPdpContextEntry->RilNdisGprsContext.dwContextID );
}
else
{
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest CLOSE handle = %x \r\n"), pCPdpContext));
}
}
else // No connection object - no connection
{
Result = RIL_E_INVALIDCONTEXTSTATE;
}
}
else
{
if ( NULL == pCPdpContext) // This should normally be the case.
{
// Check to see if there are any available to initialise.
if ( SUCCEEDED(NdisGetFreeEntry( &Index)) )
{
HANDLE NdisRxMsgQueueWriteHandle = NdisGetRxMsgQueueWriteHandle();
pCPdpContext = new CPdpContext(NdisRxMsgQueueWriteHandle);
if ( pCPdpContext )
{
NdisAddNdisEntry(pPdpContextEntry->RilNdisGprsContext.dwContextID, Index, pPdpContextEntry->pCRilInstance, pCPdpContext, &pPdpContextEntry->RilNdisGprsContext );
NdisAllocateCommand ( OEM_NDIS_OPEN_COMPLETE, pPdpContextEntry->RilNdisGprsContext.dwContextID, (LPVOID)pPdpContextEntry->pCRilInstance, pPdpContextEntry->AsyncCommandID);
Result = pCPdpContext->ActivateContext((PVOID) &pPdpContextEntry->RilNdisGprsContext);
if ( FAILED(Result))
{
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest OPEN FAILED \r\n")));
NdisRemoveNdisEntry(pPdpContextEntry->RilNdisGprsContext.dwContextID);
}
else
{
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: ProcessNextContextRequest OPEN handle = %x \r\n"), pCPdpContext));
}
}
}
else
{
Result = RIL_E_MAXCONTEXTS;
}
}
else // connection object - connection
{
Result = RIL_E_INVALIDCONTEXTSTATE;
}
}
// Process error condition
if ( FAILED(Result) )
{
NdisRemoveCommand( pPdpContextEntry->AsyncCommandID );
((CRilInstanceHandle*)pPdpContextEntry->pCRilInstance)->Notify(RIL_RESULT_ERROR,
pPdpContextEntry->AsyncCommandID,
&Result,
sizeof(Result));
RemovePdpContextEntry(pPdpContextEntry);
pPdpContextEntry = GetNextPdpContextEntry();
}
else
{
pPdpContextEntry = NULL;
}
}
UnlockPdpContextList();
}
CRilInstanceNDIS::CRilInstanceNDIS()
{
m_pCrilInstance = NULL;
}
CRilInstanceNDIS::~CRilInstanceNDIS()
{
m_pCrilInstance = NULL;
}
void CRilInstanceNDIS::Init(PVOID hInstance)
{
m_pCrilInstance = hInstance;
}
// **************************************************************************
// Function Name: NdisSendPacket
//
// Purpose: Add async command and make NDIS call.
//
// Arguments: IN ndis packet pointer
//
// Return Values: E_FAIL if parameter or immediate failure detected.
// Command result value for async response.
//
// Side effects:
//
// Description:
// **************************************************************************
HRESULT CRilInstanceNDIS::NdisSendPacket( RILNDISPACKET* lpNdisPacket )
{
return S_OK;
}
// **************************************************************************
// Function Name: NdisSetGPRSContextActivated
//
// Purpose: Bring the GRPS context up or down depending on input.
//
// Arguments: IN structure defining the connection details.
//
// Return Values: E_FAIL if error detected.
// Command result for async response.
//
// Side effects:
//
// Description:
// **************************************************************************
HRESULT CRilInstanceNDIS::NdisSetGPRSContextActivated (const RILNDISGPRSCONTEXT *lpNdisSetGprsContextActivated )
{
HRESULT Result=E_FAIL;
CRilHandle* pCrilHandle = ((CRilInstanceHandle*)m_pCrilInstance)->GetCrilHandle();
HANDLE NdisRxMsgQueueWriteHandle = pCrilHandle->CRilNdis.NdisGetRxMsgQueueWriteHandle();
HRESULT AsyncCommandID = 0;
DWORD Index;
if ( NdisRxMsgQueueWriteHandle &&
pCrilHandle &&
lpNdisSetGprsContextActivated &&
lpNdisSetGprsContextActivated->dwContextID &&
lpNdisSetGprsContextActivated->dwContextID <= pCrilHandle->CRilNdis.MaxContextID())
{
RILNDISGPRSCONTEXT NdisSetGprsContextActivated;
CeSafeCopyMemory(&NdisSetGprsContextActivated, lpNdisSetGprsContextActivated, sizeof(NdisSetGprsContextActivated));
if ( (TRUE == NdisSetGprsContextActivated.fContextActivation &&
NdisSetGprsContextActivated.pfnNdisReceive &&
NdisSetGprsContextActivated.pfnNdisTransmit &&
NdisSetGprsContextActivated.pfnNdisStatus) ||
(FALSE ==NdisSetGprsContextActivated.fContextActivation) )
{
// Force NULL-terminated string variables
NdisSetGprsContextActivated.tszDNS1[ARRAY_LENGTH(NdisSetGprsContextActivated.tszDNS1)-1]= TCHAR ('\0');
NdisSetGprsContextActivated.tszDNS2[ARRAY_LENGTH(NdisSetGprsContextActivated.tszDNS2)-1]= TCHAR ('\0');
NdisSetGprsContextActivated.tszPassword[ARRAY_LENGTH(NdisSetGprsContextActivated.tszPassword)-1]= TCHAR ('\0');
NdisSetGprsContextActivated.tszUserName[ARRAY_LENGTH(NdisSetGprsContextActivated.tszUserName)-1]= TCHAR ('\0');
CPdpContext *pCPdpContext = (CPdpContext*)pCrilHandle->CRilNdis.NdisPdpContextFromCid( NdisSetGprsContextActivated.dwContextID );
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: NdisSetGPRSContextActivated cid = %x, Activation = %s \r\n"),
NdisSetGprsContextActivated.dwContextID, NdisSetGprsContextActivated.fContextActivation ? L"TRUE" : L"FALSE" ));
AsyncCommandID = pCrilHandle->GetNextCmdID();
pCrilHandle->CRilNdis.LockPdpContextList();
if ( FALSE == pCrilHandle->CRilNdis.IsPdpContextListEmpty())
{
DEBUGMSG(ZONE_NDIS, (TEXT("RILNDIS: NdisSetGPRSContextActivated Queueing Request Command ID = %x \r\n"), AsyncCommandID));
Result = RIL_RESULT_OK;
pCrilHandle->CRilNdis.AddPdpContextEntry(&NdisSetGprsContextActivated,AsyncCommandID,(PVOID)m_pCrilInstance);
if ( !NdisSetGprsContextActivated.fContextActivation )
{
if (FALSE == WaitForCloseResponse())
{
pCrilHandle->CRilNdis.NdisRemoveCallbacks(NdisSetGprsContextActivated.dwContextID);
((CRilInstanceHandle*)m_pCrilInstance)->Notify(Result,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -