static ANSC_HANDLE WebVhoGetOldestGso ( ANSC_HANDLE hThisObject, ULONG ulSessionId, char* identifier, PUCHAR address, PULONG pulSessionCount ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PWEB_VIRTUAL_HOST_OBJECT pMyObject = (PWEB_VIRTUAL_HOST_OBJECT )hThisObject; PWEB_SITE_MANAGER_OBJECT pSiteManager = (PWEB_SITE_MANAGER_OBJECT )pMyObject->hOwnerContext; WEB_SITE_MANAGER_PROPERTY SMProperty; PWEB_VIRTUAL_HOST_PROPERTY pProperty = (PWEB_VIRTUAL_HOST_PROPERTY)&pMyObject->Property; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PWEB_LSM_INTERFACE pLsmIf = (PWEB_LSM_INTERFACE )pMyObject->hLsmIf; PWEB_GENERAL_SESSION_OBJECT pSession = NULL; ULONG ulClientAddr = 0; USHORT usClientPort = 0; PSINGLE_LINK_ENTRY pSLinkEntry = NULL; ULONG ulHashIndex = AnscHashUlong(ulSessionId, WEB_VHO_GSO_TABLE_SIZE); ULONG i; ULONG ulCSessCount = 0; PWEB_GENERAL_SESSION_OBJECT pOldSession = NULL; for ( i = 0; i < WEB_VHO_GSO_TABLE_SIZE; i ++ ) { pSLinkEntry = AnscSListGetFirstEntry(&pMyObject->GsoTable[i]); while ( pSLinkEntry ) { pSession = ACCESS_WEB_GENERAL_SESSION_OBJECT(pSLinkEntry); ulClientAddr = *(PULONG)pSession->GetClientAddr((ANSC_HANDLE)pSession); usClientPort = pSession->GetClientPort((ANSC_HANDLE)pSession); pSLinkEntry = AnscSListGetNextEntry(pSLinkEntry); if ( pSession->LsmMaxAge != 0 && ulClientAddr == AnscReadUlong(address) ) { ulCSessCount ++; if ( !pOldSession ) { pOldSession = pSession; } else if ( pSession->LastReqAtInSec <= pOldSession->LastReqAtInSec && pSession->LastRepAtInSec <= pOldSession->LastRepAtInSec ) { pOldSession = pSession; } } } } *pulSessionCount = ulCSessCount; return (ANSC_HANDLE)pSession; }
ANSC_HANDLE HttpBmoGetHeaderField ( ANSC_HANDLE hThisObject, ULONG ulHeaderId ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_BASIC_MESSAGE_OBJECT pMyObject = (PHTTP_BASIC_MESSAGE_OBJECT)hThisObject; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PHTTP_HEADER_FIELD pHttpHfo = NULL; PSINGLE_LINK_ENTRY pSLinkEntry = NULL; ULONG ulHashIndex = AnscHashUlong(ulHeaderId, HTTP_BMO_HFO_TABLE_SIZE); AnscAcquireLock(&pMyObject->HfoTableLock); pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->HfoTable[ulHashIndex]); while ( pSLinkEntry ) { pHttpHfo = ACCESS_HTTP_HEADER_FIELD(pSLinkEntry); pSLinkEntry = AnscQueueGetNextEntry(pSLinkEntry); if ( pHttpHfo->HeaderId == ulHeaderId ) { AnscReleaseLock(&pMyObject->HfoTableLock); return (ANSC_HANDLE)pHttpHfo; } } AnscReleaseLock(&pMyObject->HfoTableLock); return (ANSC_HANDLE)NULL; }
ANSC_STATUS WebVhoDelGso ( ANSC_HANDLE hThisObject, ULONG ulSessionId, PUCHAR address, USHORT port ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PWEB_VIRTUAL_HOST_OBJECT pMyObject = (PWEB_VIRTUAL_HOST_OBJECT )hThisObject; PWEB_VIRTUAL_HOST_PROPERTY pProperty = (PWEB_VIRTUAL_HOST_PROPERTY)&pMyObject->Property; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PWEB_LSM_INTERFACE pLsmIf = (PWEB_LSM_INTERFACE )pMyObject->hLsmIf; PWEB_GENERAL_SESSION_OBJECT pSession = NULL; ULONG ulClientAddr = 0; PSINGLE_LINK_ENTRY pSLinkEntry = NULL; ULONG ulHashIndex = AnscHashUlong(ulSessionId, WEB_VHO_GSO_TABLE_SIZE); AnscAcquireLock(&pMyObject->GsoTableLock); pSLinkEntry = AnscSListGetFirstEntry(&pMyObject->GsoTable[ulHashIndex]); while ( pSLinkEntry ) { pSession = ACCESS_WEB_GENERAL_SESSION_OBJECT(pSLinkEntry); ulClientAddr = *(PULONG)pSession->GetClientAddr((ANSC_HANDLE)pSession); pSLinkEntry = AnscSListGetNextEntry(pSLinkEntry); if ( (pSession->GetSessionId((ANSC_HANDLE)pSession) == ulSessionId ) && (ulClientAddr == AnscReadUlong(address)) ) { AnscSListPopEntryByLink(&pMyObject->GsoTable[ulHashIndex], &pSession->Linkage); pSession->AcquireAccess((ANSC_HANDLE)pSession); returnStatus = pLsmIf->EndSession ( pLsmIf->hOwnerContext, (ANSC_HANDLE)pSession ); pSession->ReleaseAccess((ANSC_HANDLE)pSession); pSession->Cancel ((ANSC_HANDLE)pSession); pSession->Remove ((ANSC_HANDLE)pSession); } } AnscReleaseLock(&pMyObject->GsoTableLock); return ANSC_STATUS_SUCCESS; }
ANSC_STATUS HttpBmoDelHeaderField ( ANSC_HANDLE hThisObject, ULONG ulHeaderId ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_BASIC_MESSAGE_OBJECT pMyObject = (PHTTP_BASIC_MESSAGE_OBJECT)hThisObject; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PHTTP_HEADER_FIELD pHttpHfo = NULL; ULONG ulHashIndex = AnscHashUlong(ulHeaderId, HTTP_BMO_HFO_TABLE_SIZE); ULONG ulIndex = 0; while ( TRUE ) { pHttpHfo = (PHTTP_HEADER_FIELD)pMyObject->GetHeaderField2 ( (ANSC_HANDLE)pMyObject, ulHeaderId, ulIndex ); if ( !pHttpHfo ) { if ( ulIndex == 0 ) { return ANSC_STATUS_CANT_FIND; } else { return ANSC_STATUS_SUCCESS; } } AnscAcquireLock (&pMyObject->HfoTableLock); AnscQueuePopEntryByLink(&pMyObject->HfoTable[ulHashIndex], &pHttpHfo->Linkage); AnscReleaseLock (&pMyObject->HfoTableLock); AnscFreeMemory(pHttpHfo); ulIndex ++; } return ANSC_STATUS_SUCCESS; }
ANSC_STATUS TlsSmoDelSession ( ANSC_HANDLE hThisObject, ULONG host_id, ULONG peer_id, PUCHAR session_id, ULONG session_id_size ) { PTLS_SESSION_MANAGER_OBJECT pMyObject = (PTLS_SESSION_MANAGER_OBJECT )hThisObject; PTLS_SESSION_ENTRY_OBJECT pSessionEntry = (PTLS_SESSION_ENTRY_OBJECT )NULL; PSINGLE_LINK_ENTRY pSLinkEntry = (PSINGLE_LINK_ENTRY )NULL; ULONG ulHashIndex = AnscHashUlong(peer_id, TLS_SMO_SEO_TABLE_SIZE); AnscAcquireLock(&pMyObject->SeoTableLock); pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->SeoTable[ulHashIndex]); while ( pSLinkEntry ) { pSessionEntry = ACCESS_TLS_SESSION_ENTRY_OBJECT(pSLinkEntry); pSLinkEntry = AnscQueueGetNextEntry(pSLinkEntry); if ( pSessionEntry->Match2 ( (ANSC_HANDLE)pSessionEntry, host_id, peer_id, session_id, session_id_size ) ) { AnscQueuePopEntryByLink(&pMyObject->SeoTable[ulHashIndex], &pSessionEntry->Linkage); pSessionEntry->Remove((ANSC_HANDLE)pSessionEntry); break; } } AnscReleaseLock(&pMyObject->SeoTableLock); return ANSC_STATUS_SUCCESS; }
ANSC_STATUS TlsSmoAddSession ( ANSC_HANDLE hThisObject, ANSC_HANDLE hSession ) { PTLS_SESSION_MANAGER_OBJECT pMyObject = (PTLS_SESSION_MANAGER_OBJECT )hThisObject; PTLS_SESSION_ENTRY_OBJECT pSessionEntry = (PTLS_SESSION_ENTRY_OBJECT )hSession; ULONG ulHashIndex = AnscHashUlong(pSessionEntry->SessionState.PeerID, TLS_SMO_SEO_TABLE_SIZE); pSessionEntry->Timestamp = AnscGetTickInSeconds(); AnscAcquireLock (&pMyObject->SeoTableLock); AnscQueuePushEntry(&pMyObject->SeoTable[ulHashIndex], &pSessionEntry->Linkage); AnscReleaseLock (&pMyObject->SeoTableLock); return ANSC_STATUS_SUCCESS; }
ANSC_STATUS HttpBmoAddHeaderField ( ANSC_HANDLE hThisObject, ANSC_HANDLE hHfo ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_BASIC_MESSAGE_OBJECT pMyObject = (PHTTP_BASIC_MESSAGE_OBJECT)hThisObject; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PHTTP_HEADER_FIELD pHttpHfo = (PHTTP_HEADER_FIELD )hHfo; ULONG ulHashIndex = AnscHashUlong(pHttpHfo->HeaderId, HTTP_BMO_HFO_TABLE_SIZE); pHttpHfo->HashIndex = ulHashIndex; AnscAcquireLock (&pMyObject->HfoTableLock); AnscQueuePushEntry(&pMyObject->HfoTable[ulHashIndex], &pHttpHfo->Linkage); AnscReleaseLock (&pMyObject->HfoTableLock); return ANSC_STATUS_SUCCESS; }
ANSC_HANDLE WebVhoAddGso ( ANSC_HANDLE hThisObject, char* identifier, PUCHAR address, USHORT port ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PWEB_VIRTUAL_HOST_OBJECT pMyObject = (PWEB_VIRTUAL_HOST_OBJECT )hThisObject; PWEB_VIRTUAL_HOST_PROPERTY pProperty = (PWEB_VIRTUAL_HOST_PROPERTY)&pMyObject->Property; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PWEB_LSM_INTERFACE pLsmIf = (PWEB_LSM_INTERFACE )pMyObject->hLsmIf; PWEB_GENERAL_SESSION_OBJECT pSession = NULL; ULONG ulHashIndex = 0; pMyObject->GlobalSidCount++; if ( pMyObject->GlobalSidCount >= 0x7FFFFFFF ) { pMyObject->GlobalSidCount = 0; } pSession = (PWEB_GENERAL_SESSION_OBJECT)WebCreateGeneralSession ( pMyObject->hContainerContext, (ANSC_HANDLE)pMyObject, (ANSC_HANDLE)NULL ); if ( !pSession ) { return (ANSC_HANDLE)NULL; } else { pSession->SetHfpIf ((ANSC_HANDLE)pSession, (ANSC_HANDLE)pHfpIf ); pSession->SetSessionId ((ANSC_HANDLE)pSession, pMyObject->GlobalSidCount ); pSession->SetClientAddr ((ANSC_HANDLE)pSession, address ); pSession->SetClientPort ((ANSC_HANDLE)pSession, port ); pSession->SetLsmContext ((ANSC_HANDLE)pSession, (ANSC_HANDLE)NULL ); pSession->SetLsmMaxAge ((ANSC_HANDLE)pSession, pProperty->LsmCookieMaxAge ); pSession->SetLsmExpire ((ANSC_HANDLE)pSession, pProperty->SessionTimeOut ); pSession->SetMaxLifespan((ANSC_HANDLE)pSession, pProperty->SessionMaxLifespan); } if ( identifier ) { pSession->SetLsmIdentifier((ANSC_HANDLE)pSession, identifier); returnStatus = pLsmIf->ClassifyClient ( pLsmIf->hOwnerContext, (ANSC_HANDLE)pSession ); } else { returnStatus = pLsmIf->NewContact ( pLsmIf->hOwnerContext, (ANSC_HANDLE)pSession ); } ulHashIndex = AnscHashUlong(pSession->SessionId, WEB_VHO_GSO_TABLE_SIZE); pSession->HashIndex = ulHashIndex; AnscAcquireLock(&pMyObject->GsoTableLock); pSession->AcquireAccess((ANSC_HANDLE)pSession); pSession->Engage ((ANSC_HANDLE)pSession); AnscSListPushEntry(&pMyObject->GsoTable[ulHashIndex], &pSession->Linkage); AnscReleaseLock(&pMyObject->GsoTableLock); return (ANSC_HANDLE)pSession; }
ANSC_HANDLE WebVhoGetGso ( ANSC_HANDLE hThisObject, ULONG ulSessionId, char* identifier, PUCHAR address, USHORT port ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PWEB_VIRTUAL_HOST_OBJECT pMyObject = (PWEB_VIRTUAL_HOST_OBJECT )hThisObject; PWEB_SITE_MANAGER_OBJECT pSiteManager = (PWEB_SITE_MANAGER_OBJECT )pMyObject->hOwnerContext; WEB_SITE_MANAGER_PROPERTY SMProperty; PWEB_VIRTUAL_HOST_PROPERTY pProperty = (PWEB_VIRTUAL_HOST_PROPERTY)&pMyObject->Property; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PWEB_LSM_INTERFACE pLsmIf = (PWEB_LSM_INTERFACE )pMyObject->hLsmIf; PWEB_GENERAL_SESSION_OBJECT pSession = NULL; ULONG ulClientAddr = 0; USHORT usClientPort = 0; PSINGLE_LINK_ENTRY pSLinkEntry = NULL; ULONG ulHashIndex = AnscHashUlong(ulSessionId, WEB_VHO_GSO_TABLE_SIZE); ULONG i; ULONG ulCSessCount = 0; PWEB_GENERAL_SESSION_OBJECT pOldSession = NULL; AnscAcquireLock(&pMyObject->GsoTableLock); if ( ulSessionId != 0xFFFFFFFF ) { pSLinkEntry = AnscSListGetFirstEntry(&pMyObject->GsoTable[ulHashIndex]); while ( pSLinkEntry ) { pSession = ACCESS_WEB_GENERAL_SESSION_OBJECT(pSLinkEntry); ulClientAddr = *(PULONG)pSession->GetClientAddr((ANSC_HANDLE)pSession); usClientPort = pSession->GetClientPort((ANSC_HANDLE)pSession); pSLinkEntry = AnscSListGetNextEntry(pSLinkEntry); if ( pSession->GetLsmMaxAge((ANSC_HANDLE)pSession) == 0 ) { /* this session is marked to be closed */ continue; } if ( (pSession->GetSessionId((ANSC_HANDLE)pSession) == ulSessionId) && (ulClientAddr == AnscReadUlong(address)) ) { char* pLsmId = pSession->GetLsmIdentifier((ANSC_HANDLE)pSession); if ( !identifier ) { if ( !pLsmId || AnscSizeOfString(pLsmId) == 0 ) { AnscReleaseLock(&pMyObject->GsoTableLock); pSession->AcquireAccess((ANSC_HANDLE)pSession); return (ANSC_HANDLE)pSession; } else { break; } } else if ( AnscEqualString ( pLsmId, identifier, TRUE ) ) { AnscReleaseLock(&pMyObject->GsoTableLock); pSession->AcquireAccess((ANSC_HANDLE)pSession); return (ANSC_HANDLE)pSession; } else { break; } } } } else { for ( i = 0; i < WEB_VHO_GSO_TABLE_SIZE; i ++ ) { pSLinkEntry = AnscSListGetFirstEntry(&pMyObject->GsoTable[i]); while ( pSLinkEntry ) { pSession = ACCESS_WEB_GENERAL_SESSION_OBJECT(pSLinkEntry); ulClientAddr = *(PULONG)pSession->GetClientAddr((ANSC_HANDLE)pSession); usClientPort = pSession->GetClientPort((ANSC_HANDLE)pSession); pSLinkEntry = AnscSListGetNextEntry(pSLinkEntry); if ( (ulClientAddr == AnscReadUlong(address)) && usClientPort == port ) { AnscReleaseLock(&pMyObject->GsoTableLock); /* same connection */ pSession->AcquireAccess((ANSC_HANDLE)pSession); return (ANSC_HANDLE)pSession; } } } } pSiteManager->GetProperty((ANSC_HANDLE)pSiteManager, &SMProperty); pOldSession = (PWEB_GENERAL_SESSION_OBJECT)WebVhoGetOldestGso ( (ANSC_HANDLE)pMyObject, ulSessionId, identifier, address, &ulCSessCount ); if ( pOldSession && SMProperty.MaxSessionCountPerPeer != 0 && ulCSessCount >= SMProperty.MaxSessionCountPerPeer ) { pOldSession->Terminate((ANSC_HANDLE)pOldSession); } AnscReleaseLock(&pMyObject->GsoTableLock); /* * We couldn't find a general session object for this client, we shall create a new one and * let the Logical Session Manager classify the client based on his/her identifier. */ pSession = (PWEB_GENERAL_SESSION_OBJECT)pMyObject->AddGso ( (ANSC_HANDLE)pMyObject, identifier, address, port ); return (ANSC_HANDLE)pSession; }