/**********************************************************************

    caller:     owner of this object

    prototype:

        ULONG
        NSLookupDiagnostics_Rollback
            (
                ANSC_HANDLE                 hInsContext
            );

    description:

        This function is called to roll back the update whenever there's a
        validation found.

    argument:   ANSC_HANDLE                 hInsContext,
                The instance handle;

    return:     The status of the operation.

**********************************************************************/
ULONG
NSLookupDiagnostics_Rollback
    (
        ANSC_HANDLE                 hInsContext
    )
{
    ANSC_STATUS                     returnStatus       = ANSC_STATUS_SUCCESS;
    PCOSA_DATAMODEL_DIAG            pMyObject          = (PCOSA_DATAMODEL_DIAG)g_pCosaBEManager->hDiag;
    PDSLH_NSLOOKUP_INFO             pNSLookupInfo      = pMyObject->hDiagNSLookInfo;
    PDSLH_NSLOOKUP_INFO             pNSLookupDiagInfo  = NULL;

    if ( !pNSLookupInfo )
    {
        return ANSC_STATUS_FAILURE;
    }

    pNSLookupDiagInfo = (PDSLH_NSLOOKUP_INFO)CosaDmlDiagGetResults(DSLH_DIAGNOSTIC_TYPE_NSLookup);

    if ( pNSLookupDiagInfo )
    {
        DslhInitNSLookupInfo(pNSLookupInfo);

        pNSLookupInfo->StructSize    = sizeof(DSLH_NSLOOKUP_INFO);

        AnscCopyString(pNSLookupInfo->HostName,  pNSLookupDiagInfo->HostName);
        AnscCopyString(pNSLookupInfo->Interface, pNSLookupDiagInfo->Interface);
        AnscCopyString(pNSLookupInfo->DNSServer, pNSLookupDiagInfo->DNSServer);

        pNSLookupInfo->bForced = FALSE;
        pNSLookupInfo->Timeout = pNSLookupDiagInfo->Timeout;
        pNSLookupInfo->NumberOfRepetitions = pNSLookupDiagInfo->NumberOfRepetitions;
        pNSLookupInfo->UpdatedAt = pNSLookupDiagInfo->UpdatedAt;
    }
    else
    {
        DslhInitNSLookupInfo(pNSLookupInfo);
    }

    return returnStatus;
}
ANSC_STATUS
CosaDiagInitialize
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus         = ANSC_STATUS_SUCCESS;
    PCOSA_DATAMODEL_DIAG            pMyObject            = (PCOSA_DATAMODEL_DIAG )hThisObject;
    PDSLH_PING_INFO                 pDiagPingInfo        = (PDSLH_PING_INFO      )NULL;
    PDSLH_TRACEROUTE_INFO           pDiagTracerouteInfo  = (PDSLH_TRACEROUTE_INFO)NULL;
    PDSLH_NSLOOKUP_INFO             pDiagNSLookInfo      = (PDSLH_NSLOOKUP_INFO  )NULL;
    PDSLH_TR143_DOWNLOAD_DIAG_INFO  pDownloadInfo        = (PDSLH_TR143_DOWNLOAD_DIAG_INFO)NULL;
    PDSLH_TR143_UPLOAD_DIAG_INFO    pUploadInfo          = (PDSLH_TR143_UPLOAD_DIAG_INFO)NULL;
    PDSLH_TR143_UDP_ECHO_CONFIG     pUdpEchoInfo         = (PDSLH_TR143_UDP_ECHO_CONFIG)NULL;
    PCOSA_DML_DIAG_ARP_TABLE        pArpTable            = (PCOSA_DML_DIAG_ARP_TABLE)NULL;

    pDiagPingInfo = AnscAllocateMemory(sizeof(DSLH_PING_INFO));

    if ( !pDiagPingInfo )
    {
        return ANSC_STATUS_RESOURCES;
    }
    else
    {
        DslhInitPingInfo(pDiagPingInfo);
        pMyObject->hDiagPingInfo = (ANSC_HANDLE)pDiagPingInfo;
    }

    pDiagTracerouteInfo = AnscAllocateMemory(sizeof(DSLH_TRACEROUTE_INFO));

    if ( !pDiagTracerouteInfo )
    {
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagPingInfo);
        pMyObject->hDiagPingInfo = NULL;
        return ANSC_STATUS_RESOURCES;
    }
    else
    {
        DslhInitTracerouteInfo(pDiagTracerouteInfo);
        pMyObject->hDiagTracerouteInfo = (ANSC_HANDLE)pDiagTracerouteInfo;
    }

    pDiagNSLookInfo = AnscAllocateMemory(sizeof(DSLH_NSLOOKUP_INFO));

    if ( !pDiagNSLookInfo )
    {
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagPingInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagTracerouteInfo);
        pMyObject->hDiagPingInfo = NULL;
        pMyObject->hDiagTracerouteInfo = NULL;
        return ANSC_STATUS_RESOURCES;
    }
    else
    {
        DslhInitNSLookupInfo(pDiagNSLookInfo);
        pMyObject->hDiagNSLookInfo = (ANSC_HANDLE)pDiagNSLookInfo;
    }

    /* Init Download diagnostics configurations */
    pDownloadInfo = AnscAllocateMemory(sizeof(DSLH_TR143_DOWNLOAD_DIAG_INFO));

    if ( !pDownloadInfo )
    {
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagPingInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagTracerouteInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagNSLookInfo);
        pMyObject->hDiagPingInfo = NULL;
        pMyObject->hDiagTracerouteInfo = NULL;
        pMyObject->hDiagNSLookInfo = NULL;
        return ANSC_STATUS_RESOURCES;
    }
    else
    {
        DslhInitDownloadDiagInfo(pDownloadInfo);
        pMyObject->hDiagDownloadInfo = (ANSC_HANDLE)pDownloadInfo;
    }

    /* Init Upload diagnostics configurations */
    pUploadInfo = AnscAllocateMemory(sizeof(DSLH_TR143_UPLOAD_DIAG_INFO));

    if ( !pUploadInfo )
    {
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagPingInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagTracerouteInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagNSLookInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagDownloadInfo);
        pMyObject->hDiagPingInfo = NULL;
        pMyObject->hDiagTracerouteInfo = NULL;
        pMyObject->hDiagNSLookInfo = NULL;
        pMyObject->hDiagDownloadInfo = NULL;
        return ANSC_STATUS_RESOURCES;
    }
    else
    {
        DslhInitUploadDiagInfo(pUploadInfo);
        pMyObject->hDiagUploadInfo = (ANSC_HANDLE)pUploadInfo;
    }

    /* Init UDP ECHO server diagnostics configurations */
    pUdpEchoInfo = AnscAllocateMemory(sizeof(DSLH_TR143_UDP_ECHO_CONFIG));

    if ( !pUdpEchoInfo )
    {
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagPingInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagTracerouteInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagNSLookInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagDownloadInfo);
        AnscFreeMemory((ANSC_HANDLE)pMyObject->hDiagUploadInfo);
        pMyObject->hDiagPingInfo = NULL;
        pMyObject->hDiagTracerouteInfo = NULL;
        pMyObject->hDiagNSLookInfo = NULL;
        pMyObject->hDiagDownloadInfo = NULL;
        pMyObject->hDiagUploadInfo = NULL;
        return ANSC_STATUS_RESOURCES;
    }
    else
    {
        DslhInitUDPEchoConfig(pUdpEchoInfo);
        pMyObject->hDiagUdpechoSrvInfo = (ANSC_HANDLE)pUdpEchoInfo;
    }

    /* initiate ARPTable */
    pMyObject->pArpTable          = NULL;
    pMyObject->ArpEntryCount      = 0;
    pMyObject->PreviousVisitTime  = 0;


    /* Initiation all functions */

    return returnStatus;
}
ANSC_STATUS
BbhmDiagnsEnrollObjects
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus        = ANSC_STATUS_SUCCESS;
    PBBHM_DIAG_NS_LOOKUP_OBJECT     pMyObject           = (PBBHM_DIAG_NS_LOOKUP_OBJECT  )hThisObject;
    PDSLH_NSLOOKUP_INFO             pDslhDiagInfo       = (PDSLH_NSLOOKUP_INFO          )NULL;
    PBBHM_NS_LOOKUP_TDO_OBJECT      pStateTimer         = (PBBHM_NS_LOOKUP_TDO_OBJECT   )pMyObject->hStateTimer;
    PANSC_OBJECT_CONTAINER_OBJECT   pContainer          = (PANSC_OBJECT_CONTAINER_OBJECT)pMyObject->hContainerContext;

    AnscCoEnrollObjects((ANSC_HANDLE)pMyObject);
    pDslhDiagInfo = AnscAllocateMemory(sizeof(DSLH_NSLOOKUP_INFO));

    if ( !pDslhDiagInfo )
    {
        return ANSC_STATUS_RESOURCES;
    }
    else
    {
        DslhInitNSLookupInfo(pDslhDiagInfo);

        pMyObject->hDslhDiagInfo    = pDslhDiagInfo;
    }

    if ( !pMyObject->hSendBuffer )
    {
        pMyObject->hSendBuffer = (PCHAR)AnscAllocateMemory(BBHM_NS_LOOKUP_DEF_PACKET_SIZE);

        if ( !pMyObject->hSendBuffer )
        {
            return  ANSC_STATUS_RESOURCES;
        }
    }

    if ( !pStateTimer )
    {
        pStateTimer =
            (PBBHM_NS_LOOKUP_TDO_OBJECT)BbhmDiagnsTdoCreate
                (
                    (ANSC_HANDLE)pContainer,
                    (ANSC_HANDLE)pMyObject,
                    NULL
                );

        if ( !pStateTimer )
        {
            return  ANSC_STATUS_RESOURCES;
        }
        else
        {
            pMyObject->hStateTimer = (ANSC_HANDLE)pStateTimer;
        }

        pStateTimer->SetTimerType((ANSC_HANDLE)pStateTimer, ANSC_TIMER_TYPE_SPORADIC                        );
        pStateTimer->SetInterval ((ANSC_HANDLE)pStateTimer, BBHM_NS_LOOKUP_DEF_TIME_BETWEEN_IN_MILLISECONDS );
        pStateTimer->SetCounter  ((ANSC_HANDLE)pStateTimer, BBHM_NS_LOOKUP_DEF_NUMBER_PACKETS               );
    }

    BbhmDiageoEnrollObjects((ANSC_HANDLE)pMyObject);

    return  ANSC_STATUS_SUCCESS;
}