VOS_VOID RNIC_ShowDataFromIpStack(
    struct sk_buff                     *pstSkb
)
{
    VOS_UINT32                          i;

    PS_PRINTF("RNIC_ShowDataFromIpStack: data len is %d. \r\n", pstSkb->len);

    PS_PRINTF("RNIC_ShowDataFromIpStack: data content is: \r\n");

    for (i = 0; i < pstSkb->len; i++)
    {
        if (pstSkb->data[i] > 0xf)
        {
            PS_PRINTF("%x", pstSkb->data[i]);
        }
        else
        {
            PS_PRINTF("0%x", pstSkb->data[i]);
        }
    }

    PS_PRINTF("\r\n");

    return;
}
VOS_VOID RNIC_Help(VOS_VOID)
{

    PS_PRINTF("********************RNIC调试信息************************\n");
    PS_PRINTF("RNIC_ShowULProcStats  ucRmNetId                 显示指定RNIC网卡上行统计信息\n");
    PS_PRINTF("RNIC_ShowDLProcStats  ucRmNetId                 显示指定RNIC网卡下行统计信息\n");
    PS_PRINTF("RNIC_ShowRnicPdpStats ucRmNetId                 显示指定RNIC网卡PDP激活信息\n");
    PS_PRINTF("RNIC_ShowResetStats                             显示指定RNIC复位状态信息\n");

    return;
}
VOS_VOID RNIC_ShowRmnetConfigCheckInfo(VOS_VOID)
{
    PS_PRINTF("Totla req                           %d\n", g_stRnicRmnetConfigCheckInfo.ucTotlaCnt);
    PS_PRINTF("Modem type err                      %d\n", g_stRnicRmnetConfigCheckInfo.ucModemTypeErrCnt);
    PS_PRINTF("Rmnet id err                        %d\n", g_stRnicRmnetConfigCheckInfo.ucRmNetIdErrCnt);
    PS_PRINTF("Modem ID err                        %d\n", g_stRnicRmnetConfigCheckInfo.ucModemIdErrCnt);
    PS_PRINTF("Pdn ID err                          %d\n", g_stRnicRmnetConfigCheckInfo.ucPdnIdErrCnt);
    PS_PRINTF("Rab ID err                          %d\n", g_stRnicRmnetConfigCheckInfo.ucRabIdErrCnt);
    PS_PRINTF("Rmnet status err                    %d\n", g_stRnicRmnetConfigCheckInfo.ucRmnetStatusErrCnt);
    PS_PRINTF("IP type err                         %d\n", g_stRnicRmnetConfigCheckInfo.ucIpTypeErrCnt);
    PS_PRINTF("Send err                            %d\n", g_stRnicRmnetConfigCheckInfo.ucSendErrCnt);
    PS_PRINTF("Success                             %d\n", g_stRnicRmnetConfigCheckInfo.ucSuccCnt);
}
Exemplo n.º 4
0
static int
ps_attach(struct socket *so, int proto, struct thread *td) {
    struct pspcb *psp = sotopspcb(so);
    int error;

    PS_PRINTF(PS_DEBUG_SOCKET, "so = %p, proto=%d\n", so, proto);

    if (NULL != psp)
	return (EISCONN);
    
    error = soreserve(so, ps_sendspace, ps_recvspace);
    if (error)
	return (error);

    psp = malloc(sizeof(struct pspcb), M_PCB, M_WAITOK | M_ZERO);
    
    rw_init(&psp->psp_lock, "psp_lock");
    psp->psp_ifp = NULL;

    so->so_pcb = (caddr_t)psp;
    psp->psp_socket = so;

    mtx_lock(pspcb_lock);
    LIST_INSERT_HEAD(pspcbhead, psp, psp_list);
    mtx_unlock(pspcb_lock);

    return (0);
}
Exemplo n.º 5
0
static int 
dir_scope2dents(struct psfs_node *pnode, struct uio *uio, u_long *cookies, 
		off_t cnt, int *eofflag, boolean_t only_sids)
{
    int error = 0;
    off_t off;
    int index;
    struct dir_iter arg;

    KASSERT(0 == uio->uio_offset % DIRSIZ_RID && uio->uio_offset >= DIRSIZ_RID,
	    ("Invalid uio_offset %ld", uio->uio_offset));

    off = uio->uio_offset;

    /* XXX: Move from zero based indeces to 1 based indeces for scope_iter? */
    index = (uio->uio_offset / DIRSIZ_RID) - 1;
    arg.di_uio       = uio;
    arg.di_cookies   = cookies;
    arg.di_count     = 0;
    arg.di_type      = pnode->pn_type;
    arg.di_only_sids = only_sids;
    error = ps_scope_iterate(pnode->pn_pubi, dir_scopeiter, index, cnt, &arg, eofflag);

    if (cnt != arg.di_count) {
	/* XXX: We cannot KASSERT this (can we), as it may change due to other activity? */
	PS_PRINTF(PS_DEBUG_DIR | PS_DEBUG_WARNING,
		  "WARNING: count changed during runtime: %ld != %ld, error=%d\n", 
		  cnt, arg.di_count, error);
    }

    KASSERT((0 == uio->uio_offset % DIRSIZ_RID && uio->uio_offset >= DIRSIZ_RID),
	    ("Invalid uio_offset %ld", uio->uio_offset));

    return error;
}
Exemplo n.º 6
0
int
psfs_dir_cntdents(struct psfs_node *pnode, off_t *cntp) 
{
    int error = 0;
    off_t cnt = 0;
    ps_pubi_t pi;

    PS_PRINTF(PS_DEBUG_DIR, "pnode=%p\n", pnode);

    switch (pnode->pn_type) {
    case VROOT:
	error = ps_scope_get_rid_count(pnode->pn_pubi, &cnt, TRUE);
	if (error)
	    return error;
	cnt += sizeof(des_root)/sizeof(des_root[0]);
	break;
    case VSCOPE:
	error = ps_scope_get_rid_count(pnode->pn_pubi, &cnt, FALSE);
	if (error)
	    return error;
	cnt += sizeof(des_scope)/sizeof(des_scope[0]);
	break;
    case VPUB:
    case VVER:
	error = ps_pit_get(pnode->pn_rid, &pi);
	if (error) return error;
	PS_OBJ_PUBI_ASSERT_OWNED(pi);
	error = ps_obj_get_version_count(pi, &cnt);
	PS_OBJ_PUBI_UNLOCK(pi);
	cnt += sizeof(des_long)/sizeof(des_long[0]);
	break;
    case VPAGE:
	cnt = sizeof(des_long)/sizeof(des_long[0]);
	break;
    default:
	panic("psfs_dir_cntents: attempt to readdir a non-directory: pnode=%p", pnode);
    }

    *cntp = cnt;

    PS_PRINTF(PS_DEBUG_DIR, "pnode=%p -> cnt=%ld, error=%d\n", pnode, cnt, error);

    return error;
}
VOS_VOID RNIC_ShowResetStats(VOS_VOID)
{
    PS_PRINTF("模块初始化标识                              %d\n", g_astRnicStats[0].ulSemInitFlg);
    PS_PRINTF("当前的二进制信号量                          %p\n", g_stRnicCtx.hResetSem);
    PS_PRINTF("创建的二进制信号量                          %p\n", g_astRnicStats[0].hBinarySemId);
    PS_PRINTF("创建二进制信号量失败次数                    %d\n", g_astRnicStats[0].ulCreateBinarySemFailNum);
    PS_PRINTF("锁二进制信号量失败次数                      %d\n", g_astRnicStats[0].ulLockBinarySemFailNum);
    PS_PRINTF("最后一次锁二进制信号量失败原因              %x\n", g_astRnicStats[0].ulLastBinarySemErrRslt);
    PS_PRINTF("复位成功的次数                              %d\n", g_astRnicStats[0].ulResetSucessNum);
}
VOS_UINT32 Fc_BufferReportDiscount( VOS_UINT32 ulBufferSize )
{
    VOS_UINT8 ulTmpCurrPos;

    if(PS_FALSE == g_ulUlDowngradeFlag)
    {
        ulTmpCurrPos = g_stFcLteTemperatureCtrl.ucCurrPos;
    }
    else
    {
        if (g_stFcLteTemperatureCtrl.ucBsrThresCnt > 0)
        {
            ulTmpCurrPos = g_stFcLteTemperatureCtrl.ucBsrThresCnt - 1;
        }
        else
        {
            ulTmpCurrPos = FC_UL_THROUGHPUT_THRES_CNT;
        }
    }

    if(ulTmpCurrPos < FC_UL_THROUGHPUT_THRES_CNT)
    {
        if(ulBufferSize > g_stFcLteTemperatureCtrl.ulTemperSteps[ulTmpCurrPos])
        {
            ulBufferSize = g_stFcLteTemperatureCtrl.ulTemperSteps[ulTmpCurrPos];
        }
    }

    /* CPU或温控减速 */
    /* 0.9999浮点逼近 1 */
    if((g_dBsrCpuModu < 0.9999) && (g_stFcLteCpuCtrl.ulUlMinBsr < ulBufferSize))
    {
        ulBufferSize = (VOS_UINT32)(ulBufferSize * g_dBsrCpuModu);
        if(g_stFcLteCpuCtrl.ulUlMinBsr > ulBufferSize)
        {
            FC_CL_BSR_BELOW_MIN_STAT(1);
            ulBufferSize = g_stFcLteCpuCtrl.ulUlMinBsr;
        }
    }
    if(g_BsrCheck)
    {
        if(977 == PS_RAND(3000))
        {
            PS_PRINTF("BSR value:  %d\r\n", ulBufferSize);
        }
    }

    return ulBufferSize;
}
Exemplo n.º 9
0
static void
ps_detach(struct socket *so) {
    struct pspcb *psp = sotopspcb(so);

    PS_PRINTF(PS_DEBUG_SOCKET, "so = %p\n", so);

    KASSERT(psp != NULL, ("ps_detach: psp == NULL"));
    mtx_lock(pspcb_lock);
    rw_wlock(&psp->psp_lock);
    LIST_REMOVE(psp, psp_list);
    mtx_unlock(pspcb_lock);
    if (psp->psp_ifp)
	IFP2AC(psp->psp_ifp)->ac_netgraph = NULL;
    psp->psp_socket->so_pcb = NULL;
    free(psp, M_PCB);
}
VOS_VOID Fc_ShowLteResult(VOS_VOID)
{
    PS_PRINTF("C核LTE流控结果 :\r\n");
    /*lint -e960*/
    PS_PRINTF("\r\n");
    PS_PRINTF("CPU乘数  (*10000)      %05d\r\n", (VOS_UINT32)(g_dBsrCpuModu * 10000));
    PS_PRINTF("HARQ丢包率             %d\r\n", (100 - g_ulHarqKeepRate));
    PS_PRINTF("温保流控当前位置       %d\r\n", g_stFcLteTemperatureCtrl.ucCurrPos);
    PS_PRINTF("温保入口控制状态       %d\r\n", g_ulUlDowngradeFlag);

    PS_PRINTF("\r\n");
    /*lint +e960*/

    return;
}
VOS_UINT32 FC_CdsConfigcheck(VOS_VOID)
{
    if(g_stFcCdsConfig.stFcCdsDlConfig.ulDiscardRate >= 100)
    {
        PS_PRINTF("FC_CdsConfigcheck Error config stFcCdsDlConfig.ulDiscardRate over 100:%d\n", g_stFcCdsConfig.stFcCdsDlConfig.ulDiscardRate);
        return PS_FAIL;
    }
    if(g_stFcCdsConfig.stQosFcConfig.ulDiscardRate >= 100)
    {
        PS_PRINTF("FC_CdsConfigcheck Error config stQosFcConfig.ulDiscardRate over 100:%d\n", g_stFcCdsConfig.stQosFcConfig.ulDiscardRate);
        return PS_FAIL;
    }
    if(g_stFcCdsConfig.stQosFcConfig.ulRandomDiscardRate >= g_stFcCdsConfig.stQosFcConfig.ulDiscardRate)
    {
        PS_PRINTF("FC_CdsConfigcheck Error config stQosFcConfig.ulRandomDiscardRate greater than stQosFcConfig.ulDiscardRate:%d,%d\n", g_stFcCdsConfig.stQosFcConfig.ulRandomDiscardRate, g_stFcCdsConfig.stQosFcConfig.ulDiscardRate);
        return PS_FAIL;
    }
    if(g_stFcCdsConfig.stQosFcConfig.ulWarningThres >= g_stFcCdsConfig.stQosFcConfig.ulDiscardThres)
    {
        PS_PRINTF("FC_CdsConfigcheck Error config stQosFcConfig.ulWarningThres greater than stQosFcConfig.ulDiscardThres:%d,%d\n", g_stFcCdsConfig.stQosFcConfig.ulWarningThres, g_stFcCdsConfig.stQosFcConfig.ulDiscardThres);
        return PS_FAIL;
    }

    if(g_stFcCdsConfig.stQosFcConfig.ulDiscardThres >= g_stFcCdsConfig.stQosFcConfig.ulRandomDiscardThres)
    {
        PS_PRINTF("FC_CdsConfigcheck Error config stQosFcConfig.ulDiscardThres greater than stQosFcConfig.ulRandomDiscardThres:%d,%d\n", g_stFcCdsConfig.stQosFcConfig.ulDiscardThres, g_stFcCdsConfig.stQosFcConfig.ulRandomDiscardThres);
        return PS_FAIL;
    }
    if(g_stFcCdsConfig.stQosFcConfig.ulRandomDiscardThres >= g_stFcCdsConfig.stQosFcConfig.ulRestoreThres)
    {
        PS_PRINTF("FC_CdsConfigcheck Error config stQosFcConfig.ulRandomDiscardThres greater than stQosFcConfig.ulRestoreThres:%d,%d\n", g_stFcCdsConfig.stQosFcConfig.ulRandomDiscardThres, g_stFcCdsConfig.stQosFcConfig.ulRestoreThres);
        return PS_FAIL;
    }

    return PS_SUCC;
}
Exemplo n.º 12
0
static int 
dir_vers2dents(struct psfs_node *pnode, struct uio *uio, u_long *cookies, 
	       off_t maxcount, int *eofflag)
{
    int error = 0;
    off_t off;
    ps_pubi_t pi;
    ps_meta_t meta;
    int index, i;

    KASSERT(0 == uio->uio_offset % DIRSIZ_RID && uio->uio_offset >= DIRSIZ_RID,
	    ("Invalid uio_offset %ld", uio->uio_offset));

    off = uio->uio_offset;

    PS_PRINTF(PS_DEBUG_DIR, "off=%ld, maxcount=%ld, eofflag=%p\n", off, maxcount, eofflag);

    error = ps_pit_get(pnode->pn_rid, &pi);
    if (error)
	return error;

    error = ps_obj_get_page(pi, VMO_META, 0, (void **)&meta);
    if (error) {
	PS_OBJ_PUBI_UNLOCK(pi);
	return error;
    }
#ifdef INVARIANTS
    PS_PRINTF(PS_DEBUG_DIR, "meta->pm_interlock=%p:\n", meta->pm_interlock);
    if (ps_debug_mask & PS_DEBUG_DIR) {
	db_show_mtx(meta->pm_interlock);
    }
#endif
    PS_OBJ_META_LOCK(meta);
    PS_OBJ_PUBI_UNLOCK(pi);

    index = (uio->uio_offset / DIRSIZ_RID) - 1;
    for (i = index; i < meta->pm_vers_count; i++) {
	ps_pubi_t vpi;
	struct dirent dent;
	
	error = ps_pit_get(meta->pm_sub_object[i], &vpi);
	if (error) {
	    PS_PRINTF(PS_DEBUG_WARNING, "version %s not found in pit\n",
		      psfs_id2str(meta->pm_sub_object[i], NULL));
	    error = 0;
	    continue;
	}

	dent.d_fileno = vpi->pi_ino + IPUB;
	dent.d_type   = DT_DIR;
	dent.d_namlen = PSIRP_ID_LEN * 2;
	dent.d_reclen = GENERIC_DIRSIZ(&dent);
	PS_OBJ_PUBI_UNLOCK(vpi);

	psfs_id2str(meta->pm_sub_object[i], dent.d_name);

	error = uiomove(&dent, dent.d_reclen, uio);
	if (cookies)
	    *cookies++ = uio->uio_offset;
	if (error)
	    break;
    }
    if (eofflag && i >= meta->pm_vers_count)
	*eofflag = TRUE;
    /* 
     * Note that we have to unlock meta first, before locking pi,
     * as the locking order is always pi->meta->...
     */
    PS_OBJ_META_UNLOCK(meta);
    /* XXX: Is there any possibility for some race condition here? */
    PS_OBJ_PUBI_LOCK(pi);
    ps_obj_put_page(pi, VMO_META, FALSE);
    PS_OBJ_PUBI_UNLOCK(pi);
    if (error) 
	return error;


    PS_PRINTF(PS_DEBUG_DIR, "i=%d, *eofflag=%d -> %d\n", i, eofflag? *eofflag: 4077, error);

    KASSERT((0 == uio->uio_offset % DIRSIZ_RID && uio->uio_offset >= DIRSIZ_RID),
	    ("Invalid uio_offset %ld", uio->uio_offset));

    return error;
}
VOS_VOID RNIC_ShowDLProcStats(VOS_UINT8 ucRmNetId)
{
    if (ucRmNetId >= RNIC_NET_ID_MAX_NUM)
    {
        PS_PRINTF("RNIC_ShowDLProcStats: NetId overtop, ucRmNetId = %d\n", ucRmNetId);
        return;
    }

    /* 下行统计量 */
    PS_PRINTF("RNIC %d收到下行IPV4数据的个数                      %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlRecvIpv4PktNum);
    PS_PRINTF("RNIC %d收到下行IPV6数据的个数                      %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlRecvIpv6PktNum);
    PS_PRINTF("RNIC %d发送下行数据的个数                          %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlSendPktNum);
    PS_PRINTF("RNIC %d发送下行数据失败的个数                      %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlSendPktFailNum);
    PS_PRINTF("RNIC %d收到下行数据包大于MTU的个数                 %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlRecvBigPktNum);
    PS_PRINTF("RNIC %d网卡未激活丢弃的数据个数                    %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlDiscardPktNum);
    PS_PRINTF("RNIC %d下行加MAC头失败的个数                       %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlAddMacHdFailNum);
    PS_PRINTF("RNIC %d网卡私有数据错误丢掉下行数据包的个数        %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlNetCardDiscardNum);
    PS_PRINTF("RNIC %d网卡ID错误丢掉下行数据包的个数              %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlNetIdDiscardNum);
    PS_PRINTF("RNIC %d收到错误数据包的个数非ipv4ipv6包            %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulDlRecvErrPktNum);
    PS_PRINTF("\r\n");

    return;
}
Exemplo n.º 14
0
int 
psfs_dir_getdents(struct psfs_node *pnode, struct uio *uio, 
		  u_long *cookies, off_t cnt, int *eofflag)
{
    ps_pubi_t pi;
    int error = 0;
    off_t off;
    struct dirent *des;
    int i, des_cnt;

    PS_PRINTF(PS_DEBUG_DIR, "uio_offset %ld\n", uio->uio_offset);

    error = ps_pit_get(pnode->pn_rid, &pi);
    if (error)
	return error;

    switch (pnode->pn_type) {
    case VROOT:
	des     = des_root;
	des_cnt = sizeof(des_root)/sizeof(des_root[0]);
	break;
    case VSCOPE:
	des     = des_scope;
	des_cnt = sizeof(des_scope)/sizeof(des_scope[0]);
	break;
    case VPUB:
    case VVER:
    case VPAGE:
	des     = des_long;
	des_cnt = sizeof(des_long)/sizeof(des_long[0]);
	break;
    default:
	panic("psfs_dir_cntents: attempt to readdir a non-directory: pnode=%p", pnode);
    }

    PS_OBJ_PUBI_ASSERT_OWNED(pi);
    if (uio->uio_offset < DIRSIZ_RID) {
	/*
	 * Offsets < DIRSIZ_RID are used for the special files.
	 */
	
	off = 0;
	for (i = 0; i < des_cnt; i++) {
	    if (uio->uio_offset == off)
		break;
	    off += des[i].d_reclen;
	}
	while (0 == error && uio->uio_resid > 0 && i < des_cnt && 0 < cnt--) {
	    des[i].d_fileno = pi->pi_ino + pnode->pn_type;
	    error = uiomove(&des[i], des[i].d_reclen, uio);
	    if (cookies)
		*cookies++ = uio->uio_offset;
	    i++;
	}
    }
    PS_OBJ_PUBI_UNLOCK(pi);

    if (0 != uio->uio_offset % DIRSIZ_RID || DIRSIZ_RID > uio->uio_offset) {
	PS_PRINTF(PS_DEBUG_DIR | PS_DEBUG_ERROR,
		  "bad uio_offset %ld\n", uio->uio_offset);
	return EINVAL;
    }

    switch (pnode->pn_type) {
    case VROOT:
	error = dir_scope2dents(pnode, uio, cookies, cnt, eofflag, TRUE);
	break;
    case VSCOPE:
	error = dir_scope2dents(pnode, uio, cookies, cnt, eofflag, FALSE);
	break;
    case VPUB:
    case VVER:
	error = dir_vers2dents(pnode, uio, cookies, cnt, eofflag);
	break;
    case VPAGE:
	if (eofflag)
	    *eofflag = TRUE;
	break;
    default:
	panic("psfs_dir_getdents: unimplemented pnode type %d\n", pnode->pn_type);
    }

    return error;
}
VOS_VOID RNIC_ShowRnicPdpStats(VOS_UINT8 ucRmNetId)
{
    RNIC_PDP_CTX_STRU                  *pstPdpCtx;

    if (ucRmNetId >= RNIC_NET_ID_MAX_NUM)
    {
        PS_PRINTF("RNIC_ShowRnicPdpStats: NetId overtop, ucRmNetId = %d\n", ucRmNetId);
        return;
    }

    pstPdpCtx                           = RNIC_GetPdpCtxAddr(ucRmNetId);

    PS_PRINTF("RNIC %d IPV4 PDP STATUS                     %d\n",   ucRmNetId, pstPdpCtx->stIpv4PdpInfo.enRegStatus);
    PS_PRINTF("RNIC %d IPV4 PDP RABID                      %d\n",   ucRmNetId, pstPdpCtx->stIpv4PdpInfo.ucRabId);
    PS_PRINTF("RNIC %d IPV4 PDP PDNID                      %d\n",   ucRmNetId, pstPdpCtx->stIpv4PdpInfo.ucPdnId);
    PS_PRINTF("RNIC %d IPV4 PDP IPV4ADDR                   %d\n\n", ucRmNetId, pstPdpCtx->stIpv4PdpInfo.ulIpv4Addr);

    PS_PRINTF("RNIC %d IPV6 PDP STATUS                     %d\n",   ucRmNetId, pstPdpCtx->stIpv6PdpInfo.enRegStatus);
    PS_PRINTF("RNIC %d IPV6 PDP RABID                      %d\n",   ucRmNetId, pstPdpCtx->stIpv6PdpInfo.ucRabId);
    PS_PRINTF("RNIC %d IPV6 PDP PDNID                      %d\n",   ucRmNetId, pstPdpCtx->stIpv6PdpInfo.ucPdnId);
    PS_PRINTF("RNIC %d IPV6 PDP IPV6ADDR                   %s\n\n", ucRmNetId, pstPdpCtx->stIpv6PdpInfo.aucIpv6Addr);

    PS_PRINTF("RNIC %d IPV4V6 PDP STATUS                   %d\n", ucRmNetId, pstPdpCtx->stIpv4v6PdpInfo.enRegStatus);
    PS_PRINTF("RNIC %d IPV4V6 PDP RABID                    %d\n", ucRmNetId, pstPdpCtx->stIpv4v6PdpInfo.ucRabId);
    PS_PRINTF("RNIC %d IPV4V6 PDP PDNID                    %d\n", ucRmNetId, pstPdpCtx->stIpv4v6PdpInfo.ucPdnId);
    PS_PRINTF("RNIC %d IPV4V6 PDP IPV4ADDR                 %d\n", ucRmNetId, pstPdpCtx->stIpv4v6PdpInfo.ulIpv4Addr);
    PS_PRINTF("RNIC %d IPV4V6 PDP IPV6ADDR                 %s\n", ucRmNetId, pstPdpCtx->stIpv4v6PdpInfo.aucIpv6Addr);
}
VOS_VOID RNIC_ShowULProcStats(VOS_UINT8 ucRmNetId)
{
    PS_PRINTF("NET TX RMNETID ERR NUM                                 %d\n", g_stRnicMntnStats.ulNetTxRmNetIdErrNum);
    PS_PRINTF("SPE TX PORTID ERR NUM                                  %d\n", g_stRnicMntnStats.ulSpeTxPortIdErrNum);

    if (ucRmNetId >= RNIC_NET_ID_MAX_NUM)
    {
        PS_PRINTF("RNIC_ShowUlProcStats: NetId overtop, ucRmNetId = %d\n", ucRmNetId);
        return;
    }

    /* 上行统计量 */
    PS_PRINTF("RNIC %d流控状态                                        %d\n", ucRmNetId, g_stRnicCtx.astSpecCtx[ucRmNetId].enFlowCtrlStatus);
    PS_PRINTF("RNIC %d收到上行IPV4数据的个数                          %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlRecvIpv4PktNum);
    PS_PRINTF("RNIC %d收到上行IPV6数据的个数                          %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlRecvIpv6PktNum);
    PS_PRINTF("IPV4V6类型激活时RNIC %d收到上行数据的个数IPV4IPV6      %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlRecvIpv4v6PktNum);
    PS_PRINTF("RNIC %d未激活时收到上行数据的个数                      %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlRecvUndiaPktNum);
    PS_PRINTF("RNIC %d上行发送给ADS数据的个数                         %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlSendPktNum);
    PS_PRINTF("RNIC %d调ADS发送上行数据失败的个数                     %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlSendPktFailNum);
    PS_PRINTF("RNIC %d未拨上号前上行收到IPV4广播包的个数              %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlIpv4BrdcstPktNum);
    PS_PRINTF("RNIC %d上行转换为IMM_ZC失败的个数                      %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlImmzcFailPktNum);
    PS_PRINTF("RNIC %d上行去除MAC头失败的个数                         %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlRmvMacHdrFailPktNum);
    PS_PRINTF("RNIC %d网卡私有数据错误丢掉上行数据包的个数            %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlNetCardDiscardNum);
    PS_PRINTF("RNIC %d网卡ID错误丢掉上行数据包的个数                  %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlNetIdDiscardNum);
    PS_PRINTF("RNIC %dModem ID错误丢掉上行数据包的个数                %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlModemIdDiscardNum);
    PS_PRINTF("RNIC %d流控丢掉上行数据包的个数                        %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlFlowCtrlDiscardNum);
    PS_PRINTF("RNIC %d收到错误数据包的个数非ipv4ipv6包                %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlRecvErrPktNum);
    PS_PRINTF("RNIC %d成功上报APP按需拨号                             %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlSendAppDialUpSucc);
    PS_PRINTF("RNIC %d上报APP按需拨号失败                             %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlSendAppDialUpFail);
    PS_PRINTF("RNIC %d成功上报APP断开拨号                             %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlSendAppDialDownSucc);
    PS_PRINTF("RNIC %d上报APP断开拨号失败                             %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlSendAppDialDownFail);

    if (RNIC_RMNET_ID_0 == ucRmNetId)
    {
        PS_PRINTF("拨号模式                                           %d\n", g_stRnicCtx.stDialMode.enDialMode);
        PS_PRINTF("按需拨号是否上报事件                               %d\n", g_stRnicCtx.stDialMode.enEventReportFlag);
        PS_PRINTF("按需拨号断开时间                                   %d\n", g_stRnicCtx.stDialMode.ulIdleTime);
    }

    PS_PRINTF("RNIC %d RAB ID错误,RNIC丢弃的数据包个数                %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlRabIdErr);
    PS_PRINTF("RNIC %d PDN ID错误,RNIC丢弃的数据包个数                %d\n", ucRmNetId, g_astRnicStats[ucRmNetId].ulUlPdnIdErr);

    PS_PRINTF("\r\n");

    return;
}
VOS_VOID Fc_LteHelp(VOS_VOID)
{
    PS_PRINTF("LTE流控软调命令 :\r\n");
    PS_PRINTF("\r\n");
    PS_PRINTF("Fc_ShowLtePara       :显示LTE流控参数\r\n");
    PS_PRINTF("Fc_ShowLteStats      :显示LTE流控统计量\r\n");
    PS_PRINTF("Fc_ResetLteStats     :复位LTE流控统计量\r\n");
    PS_PRINTF("Fc_ShowLteResult     :显示C核LTE流控结果\r\n");

    PS_PRINTF("QosFc_ShowPara       :显示QoS流控参数\r\n");
    PS_PRINTF("QosFc_ShowStats      :显示QoS流控统计量\r\n");
    PS_PRINTF("QosFc_ResetStats     :复位QoS流控统计量\r\n");
    PS_PRINTF("QosFc_ShowState      :显示QoS流控状态\r\n");
    PS_PRINTF("QosFc_ShowRabState   :显示QoS流控承载状态\r\n");
    PS_PRINTF("QosFc_ShowEntity     :显示Qos流控实体状态\r\n");
    PS_PRINTF("QosFc_ShowChannel    :显示Qos流控通道状态\r\n");

    PS_PRINTF("\r\n");
    return;

}
VOS_VOID Fc_ShowLteStats(VOS_VOID)
{
    PS_PRINTF("C核LTE流控统计 :\r\n");
    PS_PRINTF("\r\n");
    PS_PRINTF("切为LTE模次数               %d\r\n", g_stFcCLStats.ulToLteNum);
    PS_PRINTF("切为GU模次数                %d\r\n", g_stFcCLStats.ulToGUNum);
    PS_PRINTF("进入NULL模式次数            %d\r\n", g_stFcCLStats.ulToNullNum);
    PS_PRINTF("进入LOOPBACK次数            %d\r\n", g_stFcCLStats.ulToLBNum);
    PS_PRINTF("LTE温控降速次数             %d\r\n", g_stFcCLStats.ulTemperatureDownNum);
    PS_PRINTF("LTE温控升速次数             %d\r\n", g_stFcCLStats.ulTemperatureUpNum);
    PS_PRINTF("LTE温控直接恢复次数         %d\r\n", g_stFcCLStats.ulTemperatureRecoverNum);
    PS_PRINTF("LTE温控降速到下限次数       %d\r\n", g_stFcCLStats.ulTemperatureToLimitNum);
    PS_PRINTF("LTE温控恢复到正常次数       %d\r\n", g_stFcCLStats.ulTemperatureToNormalNum);
    PS_PRINTF("LTE CPU过载降速次数         %d\r\n", g_stFcCLStats.ulCpuDownNum);
    PS_PRINTF("LTE CPU恢复升速次数         %d\r\n", g_stFcCLStats.ulCpuUpNum);
    PS_PRINTF("LTE CPU进入降速状态数       %d\r\n", g_stFcCLStats.ulCpuToDownNum);
    PS_PRINTF("LTE CPU恢复到正常次数       %d\r\n", g_stFcCLStats.ulCpuToNormalNum);
    PS_PRINTF("LTE HARQ过载降速次数        %d\r\n", g_stFcCLStats.ulHqDownNum);
    PS_PRINTF("LTE HARQ恢复升速次数        %d\r\n", g_stFcCLStats.ulHqUpNum);
    PS_PRINTF("LTE HARQ降到底次数          %d\r\n", g_stFcCLStats.ulHqToDownNum);
    PS_PRINTF("LTE HARQ恢复到正常次数      %d\r\n", g_stFcCLStats.ulHqToNormalNum);
    PS_PRINTF("LTE上报缓存低于下限         %d\r\n", g_stFcCLStats.ulBelowMinBsr);

    PS_PRINTF("\r\n");

    return;
}
VOS_VOID Fc_ShowLtePara(VOS_VOID)
{
    PS_PRINTF("LTE流控参数 :\r\n");
    PS_PRINTF("\r\n");
    PS_PRINTF("下行CDS流控是否使能   %s\r\n", g_stFcCdsDlCtrl.bDlCdsFcEnable?"Yes":"No");
    PS_PRINTF("下行CDS丢包门限       %d\r\n", g_stFcCdsDlCtrl.ulDiscardThres);
    PS_PRINTF("下行CDS丢包率         %d\r\n", g_stFcCdsDlCtrl.ulDiscardRate);
    PS_PRINTF("\r\n");

    PS_PRINTF("CPU过载流控延迟进入   %d\r\n", g_stFcLteCpuCtrl.ulFirstDelay);
    PS_PRINTF("CPU升速步长百分比     %d\r\n", g_stFcLteCpuCtrl.ulUlUpRate);
    PS_PRINTF("CPU降速步长百分比     %d\r\n", g_stFcLteCpuCtrl.ulUlDownRate);
    PS_PRINTF("CPU降速下限 BSR       %d\r\n", g_stFcLteCpuCtrl.ulUlMinBsr);
    PS_PRINTF("HARQ升速步长百分比    %d\r\n", g_stFcLteCpuCtrl.ulHqUpRate);
    PS_PRINTF("HARQ降速步长百分比    %d\r\n", g_stFcLteCpuCtrl.ulHqDownRate);
    PS_PRINTF("HARQ丢包降速上限      %d\r\n", g_stFcLteCpuCtrl.ulHqMaxDiscardRate);
    PS_PRINTF("CPU降速阈值           %d\r\n", g_stFcLteCpuCtrl.ulDowngradeThres);
    PS_PRINTF("CPU升速阈值           %d\r\n", g_stFcLteCpuCtrl.ulUpgradeThres);
    PS_PRINTF("\r\n");

    PS_PRINTF("降速起始位置          %d\r\n", g_stFcLteTemperatureCtrl.ucInitialPos);
    PS_PRINTF("温保总流控阶数          %d\r\n", g_stFcLteTemperatureCtrl.ucAvailCnt);
    PS_PRINTF("BSR降速阶数           %d\r\n", g_stFcLteTemperatureCtrl.ucBsrThresCnt);
    PS_PRINTF("温保入口控制参数      %d %d %d %d\r\n", g_stFcLteTemperatureCtrl.ulTemperSteps[0],
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[1],
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[2],
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[3]);
    PS_PRINTF("                      %d %d %d %d\r\n",
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[4],
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[5],
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[6],
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[7]);
    PS_PRINTF("                      %d %d %d %d\r\n",
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[8],
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[9],
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[10],
                                                          g_stFcLteTemperatureCtrl.ulTemperSteps[11]);
    PS_PRINTF("                      %d\r\n", g_stFcLteTemperatureCtrl.ulTemperSteps[12]);

    PS_PRINTF("BSR周期               %d\r\n", g_stFcLteTemperatureCtrl.ulBsrTimerLen);

    PS_PRINTF("\r\n");
    return;
}
Exemplo n.º 20
0
/*
 * Caveat:  Called from interrupt context
 */
static void
ps_ether_input(struct ifnet *ifp, struct mbuf **mp) {
    struct pspcb *psp = NULL, *psp_next;
    struct ether_header *eh;
    struct sockaddr esa;
    struct socket *so = NULL;
    u_short etype;

    eh = mtod(*mp, struct ether_header *);
    etype = ntohs(eh->ether_type);

    if (PS_ETHER_TYPE != etype)
	return;

    /*
     * We currently place the mbuf to a bound socket's rcv.
     *
     * However,this is not the long term plan.  Instead, in the 
     * longer term we should fill in a page, place the page at
     * the local cache, and then wake up the network receiver.
     * through the bound socket.
     */

    PS_PRINTF(PS_DEBUG_SOCKET, "m = %p\n", *mp);
    LIST_FOREACH_SAFE(psp, pspcbhead, psp_list, psp_next) {
#if __FreeBSD_version >= 701000
	if (!rw_try_rlock(&psp->psp_lock)) {
            PS_PRINTF(PS_DEBUG_SOCKET | PS_DEBUG_WARNING,
                      "psp is w-locked, discard data\n");
	    /* Simply discard data if the psp happens to be w-locked */
	    continue;
	}
#endif
	if (ifp == psp->psp_ifp) {
	    so = psp->psp_socket;
#if __FreeBSD_version >= 701000
	    rw_runlock(&psp->psp_lock);
#endif
	    break;
	}
#if __FreeBSD_version >= 701000
	rw_runlock(&psp->psp_lock);
#endif
    }

    if (so) {
	/*
	 * XXX: We don't understand why simple sbappend
	 *      doesn't work.  But spappendaddr does.  So be it.
	 */
	esa.sa_family = AF_LINK;
	esa.sa_len = 0;
	m_adj(*mp, sizeof(*eh)); /* Remove ethernet header */
	if (!sbappendaddr(&so->so_rcv, &esa, *mp, NULL)) {
            PS_PRINTF(PS_DEBUG_SOCKET | PS_DEBUG_WARNING,
                      "sbappendaddr() failed. "
                      "Probably not enough buffer space. "
                      "Packet lost.\n");
        }
	sorwakeup(so);
    	*mp = NULL;
	return;
    }


#ifdef NOTYET
    /* We could free *mp here, but we don't.  It gets discarded anyway */
    m_freem(*mp);
    *mp = NULL;
#endif
    return;
}
VOS_VOID Fc_LteInit(VOS_VOID)
{
    VOS_UINT32                  ulReturnCode;

#if (CDS_FEATURE_ON == CDS_FEATURE_LTE)
    VOS_UINT32                  i;

    /* 从NV读取流控配置信息 */
    /*lint -e718*/
    /*lint -e746*/
    /*lint -e732*/
    /*lint -e830*/
    ulReturnCode = LPs_NvimItem_Read(EN_NV_ID_FLOWCTRL_CONFIG,\
                                    (VOS_VOID *)(&g_stFcLteConfig),\
                                    sizeof(FLOWCTRL_LTE_CONFIG_STRU));
    /*lint +e830*/
    /*lint +e732*/
    /*lint +e746*/
    /*lint +e718*/
    if (PS_SUCC != ulReturnCode)
    {
        PS_PRINTF("Fc_LteInit,LPs_NvimItem_Read FLOWCTRL_LTE_CONFIG fail:%d\n", ulReturnCode);
        /* 初始化为默认值 */
        Fc_LteConfig2Default();
    }

    if(PS_SUCC != FC_LteConfigcheck())
    {
        /* 初始化为默认值 */
        Fc_LteConfig2Default();
    }

    g_stFcLteCpuCtrl.ulFirstDelay = g_stFcLteConfig.stFcCpuConfig.usFirstDelay;
    g_stFcLteCpuCtrl.ulUlDownRate = g_stFcLteConfig.stFcCpuConfig.usUlDownRate;
    g_stFcLteCpuCtrl.ulUlUpRate = g_stFcLteConfig.stFcCpuConfig.usUlUpRate;
    g_stFcLteCpuCtrl.ulHqDownRate = g_stFcLteConfig.stFcCpuConfig.usHqDownRate;
    g_stFcLteCpuCtrl.ulHqUpRate = g_stFcLteConfig.stFcCpuConfig.usHqUpRate;
    g_stFcLteCpuCtrl.ulHqMaxDiscardRate = g_stFcLteConfig.stFcCpuConfig.usHqMaxDiscardRate;
    g_stFcLteCpuCtrl.ulDowngradeThres = g_stFcLteConfig.stFcCpuConfig.usDowngradeThres;
    g_stFcLteCpuCtrl.ulUpgradeThres = g_stFcLteConfig.stFcCpuConfig.usUpgradeThres;

    g_stFcLteTemperatureCtrl.ucInitialPos = g_stFcLteConfig.stFcTemperatureConfig.ucInitialPos;
    g_stFcLteTemperatureCtrl.ulBsrTimerLen = 10;    /* 默认BSR周期10ms */
    g_stFcLteTemperatureCtrl.ucAvailCnt = 0;
    g_stFcLteTemperatureCtrl.ucBsrThresCnt = 0;
    g_stFcLteTemperatureCtrl.ucCurrPos = FC_UL_THROUGHPUT_THRES_CNT;

    for(i = 0; i < FC_UL_THROUGHPUT_THRES_CNT_NV; i++)
    {
        if(0 == g_stFcLteConfig.stFcTemperatureConfig.ulTemperSteps[i])
        {
            break;
        }

        if(g_stFcLteConfig.stFcTemperatureConfig.ulTemperSteps[i] < g_stFcLteConfig.stFcTemperatureConfig.ulMinBsrThr)
        {
            g_stFcLteTemperatureCtrl.ucAvailCnt++;
            /* 周期折算,NV设置为kbps,入口流控基于100ms字节数 */
            g_stFcLteTemperatureCtrl.ulTemperSteps[i] = g_stFcLteConfig.stFcTemperatureConfig.ulTemperSteps[i]*100 / 8;
        }
        else
        {
            g_stFcLteTemperatureCtrl.ucBsrThresCnt++;
        }
    }
    /* 入口流控紧随BSR流控 */
    g_stFcLteTemperatureCtrl.ucAvailCnt += g_stFcLteTemperatureCtrl.ucBsrThresCnt;

    for(; i < FC_UL_THROUGHPUT_THRES_CNT; i++)
    {
        g_stFcLteTemperatureCtrl.ulTemperSteps[i] = 0;
    }

    if(g_stFcLteConfig.stFcTemperatureConfig.ucZeroSupport > 0)
    {
        g_stFcLteTemperatureCtrl.ucAvailCnt++;
    }

    g_ulUlDowngradeFlag = PS_FALSE;

    Fc_KbpsToBsr();
#endif


    /* 从GU NV读取流控配置信息 */
    /*lint -e718*/
    /*lint -e746*/
    /*lint -e732*/
    ulReturnCode = NV_ReadEx(MODEM_ID_0,EN_NV_ITEM_CDS_FC_CONFIG,\
                                    (&g_stFcCdsConfig),\
                                    sizeof(FLOWCTRL_CDS_CONFIG_STRU));
    /*lint +e732*/
    /*lint +e746*/
    /*lint +e718*/

    if (PS_SUCC != ulReturnCode)
    {
        PS_PRINTF("Fc_LteInit,NV_Read FLOWCTRL_CDS_CONFIG fail:%d\n", ulReturnCode);
        /* 初始化为默认值 */
        Fc_CdsConfig2Default();
    }

    if(PS_SUCC != FC_CdsConfigcheck())
    {
        /* 初始化为默认值 */
        Fc_CdsConfig2Default();
    }

    /* 基于NV填充控制结构 */
    if(0 == (FC_CDS_DL_ENABLED_MASK & g_stFcCdsConfig.ulFcEnableMask))
    {
        g_stFcCdsDlCtrl.bDlCdsFcEnable = VOS_FALSE;
    }
    else
    {
        g_stFcCdsDlCtrl.bDlCdsFcEnable = VOS_TRUE;
    }

    g_stFcCdsDlCtrl.ulDiscardThres = g_stFcCdsConfig.stFcCdsDlConfig.ulDiscardThres;
    g_stFcCdsDlCtrl.ulDiscardRate = g_stFcCdsConfig.stFcCdsDlConfig.ulDiscardRate;

    return;
}
VOS_UINT32 FC_LteConfigcheck(VOS_VOID)
{
    VOS_UINT32 i = 0;

    if(g_stFcLteConfig.stFcCpuConfig.usUlDownRate >= 100)
    {
        PS_PRINTF("FC_LteConfigcheck Error config stFcCpuConfig.usUlDownRate over 100:%d\n", g_stFcLteConfig.stFcCpuConfig.usUlDownRate);
        return PS_FAIL;
    }
    if(g_stFcLteConfig.stFcCpuConfig.usUlUpRate >= 100)
    {
        PS_PRINTF("FC_LteConfigcheck Error config stFcCpuConfig.usUlUpRate over 100:%d\n", g_stFcLteConfig.stFcCpuConfig.usUlUpRate);
        return PS_FAIL;
    }
    if(g_stFcLteConfig.stFcCpuConfig.usHqDownRate >= 100)
    {
        PS_PRINTF("FC_LteConfigcheck Error config stFcCpuConfig.usHqDownRate over 100:%d\n", g_stFcLteConfig.stFcCpuConfig.usHqDownRate);
        return PS_FAIL;
    }
    if(g_stFcLteConfig.stFcCpuConfig.usHqUpRate >= 100)
    {
        PS_PRINTF("FC_LteConfigcheck Error config stFcCpuConfig.usHqUpRate over 100:%d\n", g_stFcLteConfig.stFcCpuConfig.usHqUpRate);
        return PS_FAIL;
    }
    if(g_stFcLteConfig.stFcCpuConfig.usDowngradeThres >= 100)
    {
        PS_PRINTF("FC_LteConfigcheck Error config stFcCpuConfig.usDowngradeThres over 100:%d\n", g_stFcLteConfig.stFcCpuConfig.usDowngradeThres);
        return PS_FAIL;
    }
    if(g_stFcLteConfig.stFcCpuConfig.usUpgradeThres >= g_stFcLteConfig.stFcCpuConfig.usDowngradeThres)
    {
        PS_PRINTF("FC_LteConfigcheck Error config stFcCpuConfig.usUpgradeThres greater than stFcCpuConfig.usDowngradeThres:%d,%d\n",
                                    g_stFcLteConfig.stFcCpuConfig.usUpgradeThres,
                                    g_stFcLteConfig.stFcCpuConfig.usDowngradeThres);
        return PS_FAIL;
    }

    if(g_stFcLteConfig.stFcTemperatureConfig.ucInitialPos >= FC_UL_THROUGHPUT_THRES_CNT_NV)
    {
        PS_PRINTF("FC_LteConfigcheck Error config stFcTemperatureConfig.ucInitialPos beyond :%d,%d\n", g_stFcLteConfig.stFcTemperatureConfig.ucInitialPos, FC_UL_THROUGHPUT_THRES_CNT_NV);
        return PS_FAIL;
    }
    if(g_stFcLteConfig.stFcTemperatureConfig.ucZeroSupport > 1)
    {
        PS_PRINTF("FC_LteConfigcheck Error config stFcTemperatureConfig.ucZeroSupport over 1:%d\n", g_stFcLteConfig.stFcTemperatureConfig.ucZeroSupport);
        return PS_FAIL;
    }

    for(i = 0; i < FC_UL_THROUGHPUT_THRES_CNT_NV-1; i++)
    {
        if(0 == g_stFcLteConfig.stFcTemperatureConfig.ulTemperSteps[i])
        {
            break;
        }

        if(g_stFcLteConfig.stFcTemperatureConfig.ulTemperSteps[i] < g_stFcLteConfig.stFcTemperatureConfig.ulTemperSteps[i+1])
        {
            PS_PRINTF("FC_LteConfigcheck: g_stFcLteConfig.stFcTemperatureConfig.ulTemperSteps must be descending order!");
            return PS_FAIL;
        }
    }

    return PS_SUCC;
}