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 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; }