ANSC_STATUS
WebVhoLsmNewContact
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hSession
    )
{
    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     = (PWEB_GENERAL_SESSION_OBJECT)hSession;

    returnStatus =
        pSession->SetLsmIdentifier
            (
                (ANSC_HANDLE)pSession,
                WEB_DEF_LSM_CLIENT_ID
            );

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