char*
_ansc_strdup
    (
        char*                       pSrc
    )
{
    char*                           pTemp;
    ULONG                           ulLen;

    ulLen = _ansc_strlen(pSrc) + 1;

    pTemp = AnscAllocateMemory(ulLen);

    _ansc_strcpy(pTemp, pSrc);

    return pTemp;
}
char*
_ansc_strdup
    (
        char*                       pSrc
    )
{
    char*                           pTemp;
    ULONG                           ulLen;

    ulLen = _ansc_strlen(pSrc) + 1;

    pTemp = malloc(ulLen);

    _ansc_strcpy(pTemp, pSrc);

    return pTemp;
}
void CosaDmlNeighborTableGetEntry
    (
        ANSC_HANDLE                 hContext,
        PULONG                      pulInstanceNumber,
        PCOSA_DML_NEIGHTABLE_INFO*  ppNbTbl
    )
{
    char    cmd[]      = "ip -6 neigh show |grep -E 'brlan0' > " NEIGHBOR_TABLE_RESULT_FILE "\n";
    char    cmd2[]     = "grep lladdr -c " NEIGHBOR_TABLE_RESULT_FILE "> " NEIGHBOR_TABLE_LINENUM_FILE "\n";
    FILE*   fp         = NULL;
    char    buf[128]   = {0};
    int     counter    = 0;
    int     i          = 0;
    char   *p          = NULL;
    char   *p1         = NULL;

    if ( *ppNbTbl ){
        free(*ppNbTbl);
        *ppNbTbl = NULL;
        *pulInstanceNumber = 0;
    }

    system(cmd);
    system(cmd2);
    
    fp = fopen(NEIGHBOR_TABLE_LINENUM_FILE, "r");
    if (NULL != fp) {
        fgets(buf, sizeof(buf), fp);
        
        counter = atoi(buf);
        fprintf(stderr, "%s -- %d %d\n", __FUNCTION__, __LINE__, counter);

        fclose(fp);
    }

    if ( counter <= 0 ){
        return;
    }

    *ppNbTbl = malloc(sizeof(COSA_DML_NEIGHTABLE_INFO)*counter);
    if ( *ppNbTbl == NULL ){
        return;
    }

    /* 
        2040:cafe::5850:5ff9:d425:f21c dev brlan0 lladdr 3c:97:0e:44:50:95 REACHABLE
        fe80::9490:e980:ba75:3632 dev brlan0 lladdr 3c:97:0e:44:50:95 REACHABLE
        fe80::21f:caff:fe5e:4f55 dev erouter0 lladdr 00:1f:ca:5e:4f:55 router STALE
        */    
    fp = fopen(NEIGHBOR_TABLE_RESULT_FILE, "r");
    if (NULL != fp) {
        
        i = 0;
        while( fgets(buf, sizeof(buf), fp) ) {
            p   = &buf[0];
            p1  = p;

            //get address
            while(*p != ' ') p++;
            *p = 0;

            _ansc_strcpy((*ppNbTbl)[i].Address, p1);
            p++;

            //get interface
            p = _ansc_strstr(p, "dev ");
            if ( p == NULL ){
                *pulInstanceNumber = i;
                fclose(fp);/*RDKB-6843, CID-33223, free unused resource befor exit*/
                return;
            }

            p  += _ansc_strlen("dev ");
            while(*p == ' ') p++;

            p1 = p;
            while(*p != ' ') p++;
            *p = 0;
            
            _ansc_strcpy((*ppNbTbl)[i].Interface, p1);
            p++;
            
            //get mac
            p = _ansc_strstr(p, "lladdr ");
            if ( p == NULL ){
                *pulInstanceNumber = i;
                fclose(fp);/*RDKB-6843, CID-33223, free unused resource befor exit*/
                return;
            }

            p  += _ansc_strlen("lladdr ");
            while(*p == ' ') p++;

            p1 = p;
            while(*p != ' ') p++;
            *p = 0;
            
            _ansc_strcpy((*ppNbTbl)[i].MACAddress, p1);
            p++;

            //get status
            if ( _ansc_strstr(p, "INCOMPLETE" )){
                (*ppNbTbl)[i].Status = NEIGHBOR_STATUS_INCOMPLETE;
            }else if ( _ansc_strstr(p, "REACHABLE" )){
                (*ppNbTbl)[i].Status = NEIGHBOR_STATUS_REACHABLE;
            }else if ( _ansc_strstr(p, "STALE" )){
                (*ppNbTbl)[i].Status = NEIGHBOR_STATUS_STALE;
            }else if ( _ansc_strstr(p, "DELAY" )){
                (*ppNbTbl)[i].Status = NEIGHBOR_STATUS_DELAY;
            }else if ( _ansc_strstr(p, "PROBE" )){
                (*ppNbTbl)[i].Status = NEIGHBOR_STATUS_PROBE;
            }else{
                *pulInstanceNumber = i;
                fclose(fp);/*RDKB-6843, CID-33223, free unused resource befor exit*/
                return;
            }

            i++;
        }
        
        *pulInstanceNumber = i;
        fclose(fp);
    }

    return;
}
ANSC_STATUS
Pam_GetFirstIpInterfaceObjectName
    (
        BOOL                        bUpstream,
        char*                       pIfObjName,
        PULONG                      pulObjNameSize
    )
{
    ANSC_STATUS                     returnStatus        = ANSC_STATUS_CANT_FIND;
    int                             iReturnValue        = 0;
    ULONG                           ulTotal             = 0;
    ULONG                           ulIndex             = 0;
    ULONG                           ulInstNum           = 0;
    ULONG                           ulLen               = 0;
    char                            pObjName[256]       = {0};
    char                            Buffer[128]         = {0};
    ULONG                           BufferSize          = 0;
    char                            LowerLayers[256]    = {0};
    ULONG                           LowerLayersSize     = 0;
    BOOL                            bLowerLayerUpstream = FALSE;
    char*                           EnvIndex            = NULL;
    ULONG                           ulEnvIndex          = PAM_MAX_IP_INTERFACE_NUM;


   CcspTraceInfo(("[%s] -- Enter \n", __FUNCTION__));

#ifdef _COSA_SIM_
    // Hard coded, RTian 09/20/2013
    {
        if(bUpstream) {
            pulObjNameSize = sprintf(pIfObjName, "Device.IP.Interface.1.") + 1;
            //        else pulObjNameSize = sprintf(pIfObjName, "Device.IP.Interface.4.") + 1;
	    CcspTraceInfo(("[%s] -- Exit, defined _COSA_SIM_ pulObjNameSize: %d from \n", __FUNCTION__, pulObjNameSize));

            return ANSC_STATUS_SUCCESS;
        }
    }
#endif

    ulTotal = CosaGetParamValueUlong("Device.IP.InterfaceNumberOfEntries");

    EnvIndex = getenv(PAM_FIRST_IP_INTERFACE);
    if(EnvIndex != NULL)
    {
        ulEnvIndex = atol(EnvIndex);
    }
    
    for ( ulIndex = 0; ulIndex < ulTotal; ulIndex++ )
    {
        if(EnvIndex != NULL && ulEnvIndex < PAM_MAX_IP_INTERFACE_NUM)
        {
            ulInstNum = CosaGetInstanceNumberByIndex("Device.IP.Interface.", ulEnvIndex);
            if( 0 == ulInstNum)
            {
                EnvIndex    = NULL;
                ulEnvIndex  = PAM_MAX_IP_INTERFACE_NUM;
            }
            else
            {
                ulIndex     = EnvIndex;
            }
        }
        ulInstNum = CosaGetInstanceNumberByIndex("Device.IP.Interface.", ulIndex);

        if ( 0 == ulInstNum )
        {
            CcspTraceWarning(("Pam_GetFirstIpInterfaceObjectName -- invalid Device.IP.Interface instance number!\n"));
            returnStatus = ANSC_STATUS_FAILURE;
            break;
        }
        else
        {
            _ansc_sprintf(pObjName, "Device.IP.Interface.%d.LowerLayers", ulInstNum);
            /*CcspTraceInfo(("Checking %s...\n", pObjName));*/

            LowerLayersSize = sizeof(LowerLayers);
            iReturnValue    = CosaGetParamValueString(pObjName, LowerLayers, &LowerLayersSize);
            
            if ( iReturnValue != 0 )
            {
                returnStatus = ANSC_STATUS_FAILURE;
                break;
            }
            else if ( LowerLayersSize == 0 )
            {
                continue;
            }

            do
            {
                /*
                 *  We have to check whether LowerLayers is a partial object name (without '.' at the end) or not 
                 *  Assuming only one lower layer value for now
                 *  Look for the LowerLayer with a empty LowerLayers parameter
                 */
                ulLen = _ansc_strlen(LowerLayers);

                if ( LowerLayers[ulLen - 1] == '.' )
                {
                    LowerLayers[ulLen - 1] = '\0';
                }

                _ansc_strcpy (pObjName, LowerLayers);
                _ansc_sprintf(Buffer, "%s.LowerLayers", LowerLayers);
            
                CcspTraceDebug(("Checking %s...\n", Buffer));
                
                LowerLayersSize = sizeof(LowerLayers);
                iReturnValue    = CosaGetParamValueString(Buffer, LowerLayers, &LowerLayersSize);

                if ( iReturnValue != 0 )
                {
                    break;
                }
                else if ( LowerLayersSize == 0 )
                {
                    break;
                }
            }
            while (TRUE);
            
            /*
             *  Check the Upstream parameter.
             *  Note, not all error cases are covered well here, which happened to help to pass the test
             *  on DRG -- LowerLayers parameter of IP.Interface on top of Bridge.1 is not actually correct.  
             */
            _ansc_sprintf(Buffer, "%s.Upstream", pObjName);
            bLowerLayerUpstream = CosaGetParamValueBool(Buffer);
            
            if ( bUpstream == bLowerLayerUpstream )
            {
                CcspTraceDebug
                    ((
                         "Found the lowest %s layer %s for IP interface Device.IP.Interface.%d.\n",
                         bUpstream ? "upstream" : "downstream",
                         LowerLayers,
                         ulInstNum
                    ));

                _ansc_sprintf(Buffer, "Device.IP.Interface.%d.", ulInstNum);
                BufferSize = _ansc_strlen(Buffer);
                
                if ( BufferSize < *pulObjNameSize )
                {
                    AnscCopyString(pIfObjName, Buffer);
                    *pulObjNameSize = BufferSize;
                    returnStatus    = ANSC_STATUS_SUCCESS;
                }
                else
                {
                    *pulObjNameSize = BufferSize;
                    returnStatus = ANSC_STATUS_MORE_DATA;
                }

                break;                
            }
        }
    }

    CcspTraceInfo(("[%s] -- Exit returnStatus: %d\n", __FUNCTION__, returnStatus));
    return  returnStatus;
}