PPP_ZC_STRU *ppp_m_alloc_ttfmem_from_mbuf(struct ppp_mbuf *bp)
{
    VOS_UINT16  usLen;
    PPP_ZC_STRU *pstMem;


    if (VOS_NULL_PTR == bp)
    {
        return VOS_NULL_PTR;
    }

    usLen   = (VOS_INT16)ppp_m_length(bp);

    if (0 == usLen)
    {
        return VOS_NULL_PTR;

    }

    pstMem  = PPP_MemAlloc(usLen, PPP_ZC_DL_RESERVE_LEN);

    if (VOS_NULL_PTR == pstMem)
    {
        return VOS_NULL_PTR;
    }

    /* 设置零拷贝数据内容长度 */
    PPP_ZC_SET_DATA_LEN(pstMem, usLen);

    ppp_mbuf_View(bp, PPP_ZC_GET_DATA_PTR(pstMem), usLen);

    return pstMem;
} /* ppp_m_ttfmem_alloc_from_mbuf */
/******************************************************************************
 Function:       PPP_STUB_TraceDlData
 Description:    接收来自GTR的上行数据
 Calls:
 Data Accessed:
 Data Updated:
 Input:
 Output:
 Return:

 Others:
******************************************************************************/
VOS_VOID PPP_STUB_RcvUlData(PPP_STUB_ZC_DATA_MSG_STRU *pstUlStubDataMsg)
{
    PPP_ZC_STRU                        *pstImmZc;

    pstImmZc = PPP_MemAlloc(pstUlStubDataMsg->u.stUlDataReq.usDataLen, 0);

    if ( VOS_NULL_PTR == pstImmZc )
    {
        return;
    }

    PPP_MemWriteData(pstImmZc, &(pstUlStubDataMsg->u.stUlDataReq.aucData[0]),
                     pstUlStubDataMsg->u.stUlDataReq.usDataLen);

    PPP_PullPacketEvent(PppGetAllocedId(), pstImmZc);

    return;
}