oal_uint32 dmac_data_acq_report_data_info(oal_uint8 *puc_daq_addr, oal_uint32 ul_len, oal_netbuf_stru *pst_netbuf)
{
    dmac_data_acq_info_stru        *pst_daq_data_info           = OAL_PTR_NULL;
    dmac_data_acq_data_head_stru   *pst_daq_data_head           = OAL_PTR_NULL;
    oal_int32                       l_bytes = 0;
    oal_uint32                      ul_time = 0;

    /***** 发送数采基本信息给app 填写消息头 *****/
    pst_daq_data_head = (dmac_data_acq_data_head_stru *)oal_netbuf_data(pst_netbuf);

    pst_daq_data_head->en_send_type = DMAC_DATA_ACQ_SEND_TYPE_INFO;
    pst_daq_data_head->ul_msg_sn    = 0;
    pst_daq_data_head->ul_data_len  = OAL_SIZEOF(dmac_data_acq_info_stru);

    /***** 发送数采基本信息给app 填写消息内容 *****/
    pst_daq_data_info = (dmac_data_acq_info_stru *)(oal_netbuf_data(pst_netbuf) + DMAC_DATA_ACQ_DATA_HEAD_LEN);

    pst_daq_data_info->ul_daq_addr    = (oal_uint32)puc_daq_addr;
    pst_daq_data_info->ul_data_len    = ul_len;
    pst_daq_data_info->ul_unit_len    = DMAC_DATA_ACQ_UNIT_DATA_LEN;


    /***** 将daq info通知app侧 *****/
    l_bytes = oam_netlink_kernel_send(oal_netbuf_data(pst_netbuf), OAL_SIZEOF(dmac_data_acq_info_stru) + DMAC_DATA_ACQ_DATA_HEAD_LEN, OAM_NL_CMD_DAQ);

    if (l_bytes <= 0)
    {
        OAM_ERROR_LOG1(0, OAM_SF_ANY, "{dmac_data_acq_report_data_info::invalid l_bytes[%d].}", l_bytes);

        return OAL_FAIL;
    }

    g_st_data_acq.uc_ack_flag = OAL_FALSE;

    while(!g_st_data_acq.uc_ack_flag)
    {

        oal_msleep(1000);

        if (DMAC_DATA_ACQ_MAX_WAIT_TIME <= ul_time)
        {
            OAM_ERROR_LOG0(0, OAM_SF_ANY, "{dmac_data_acq_report_data_info::wait app ack timeout. Try again.}");

            return OAL_FAIL;
        }

        ul_time++;
    }

    return OAL_SUCC;
}
Пример #2
0
/*****************************************************************************
 函 数 名  : sdt_drv_netlink_send
 功能描述  : SDT驱动侧通过netlink向SDT APP发送数据
             记录待发送的数据与发送失败的数据;通过序列号记录
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2014年1月27日
    作    者   : z00237171
    修改内容   : 新生成函数

*****************************************************************************/
oal_uint32  sdt_drv_netlink_send(oal_netbuf_stru *pst_netbuf, oal_uint32  ul_len)
{
#if (_PRE_OS_VERSION_RAW != _PRE_OS_VERSION)
#if((_PRE_TARGET_PRODUCT_TYPE_5610DMB == _PRE_CONFIG_TARGET_PRODUCT)\
    ||(_PRE_TARGET_PRODUCT_TYPE_VSPM310DMB == _PRE_CONFIG_TARGET_PRODUCT)\
    ||(_PRE_TARGET_PRODUCT_TYPE_WS835DMB == _PRE_CONFIG_TARGET_PRODUCT))
    oal_int32                   l_ret_len = 0;
    sdt_drv_pkt_hdr_stru       *p_sdt_hdr;
#endif
    oal_netbuf_stru            *pst_copy_netbuf;
    oal_nlmsghdr_stru          *pst_nlhdr;

    oal_uint32                  ul_nlmsg_len;
    oal_int32                   l_unicast_bytes  = 0;

    /* 由上层保证参数非空 */

    /* 如果没有与app建立连接,则直接返回,每500次打印一次提示信息 */
    if (0 == g_st_sdt_drv_mng_entry.ul_usepid)
    {
        if (0 == (oal_atomic_read(&g_st_sdt_drv_mng_entry.ul_unconnect_cnt) % SDT_DRV_REPORT_NO_CONNECT_FREQUENCE))
        {
            OAL_IO_PRINT("Info:waitting app_sdt start...\r\n");
            oal_atomic_inc(&g_st_sdt_drv_mng_entry.ul_unconnect_cnt);
        }

        oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE);
        //oal_netbuf_free(pst_netbuf);

        return OAL_FAIL;
    }

#if ((_PRE_TARGET_PRODUCT_TYPE_5610DMB == _PRE_CONFIG_TARGET_PRODUCT)\
    ||(_PRE_TARGET_PRODUCT_TYPE_VSPM310DMB == _PRE_CONFIG_TARGET_PRODUCT)\
    ||(_PRE_TARGET_PRODUCT_TYPE_WS835DMB == _PRE_CONFIG_TARGET_PRODUCT))
    // 数据包分析
    p_sdt_hdr =  (sdt_drv_pkt_hdr_stru*)oal_netbuf_data(pst_netbuf);
    if (OAM_DATA_TYPE_LOG == p_sdt_hdr->en_msg_type || OAM_DATA_TYPE_OTA == p_sdt_hdr->en_msg_type)
    {
        if (0 == g_st_count)
        {
            ul_nlmsg_len = OAL_NLMSG_LENGTH(MAX_NLMSG_LEN);
            g_pst_copy_netbuf = oal_netbuf_alloc(ul_nlmsg_len, 0, WLAN_MEM_NETBUF_ALIGN);
            if (OAL_UNLIKELY(OAL_PTR_NULL == g_pst_copy_netbuf))
            {
                oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE);
                //oal_netbuf_free(pst_netbuf);

                OAL_IO_PRINT("oal_netbuf_alloc failed. \r\n");
                return OAL_FAIL;
            }

            g_pst_nlhdr = oal_nlmsg_put(g_pst_copy_netbuf, 0, 0, 0, (oal_int32)MAX_NLMSG_LEN, 0);
        }

        if (NULL != g_pst_nlhdr)
        {
            l_ret_len = MAX_NLMSG_LEN - g_buf_offset - ul_len;
            if (l_ret_len > 0)
            {
                oal_memcopy((oal_void *)OAL_NLMSG_DATA(g_pst_nlhdr) + g_buf_offset, (const oal_void *)oal_netbuf_data(pst_netbuf), ul_len);
                g_st_count++;
                g_buf_offset += ul_len;
            }
        }

        if (MAX_QUEUE_COUNT == g_st_count || g_buf_offset > MAX_CO_SIZE || l_ret_len < 0)
        {
            g_st_count = 0;
            g_buf_offset = 0;

            l_unicast_bytes = oal_netlink_unicast(g_st_sdt_drv_mng_entry.pst_nlsk, g_pst_copy_netbuf, g_st_sdt_drv_mng_entry.ul_usepid, 0);
            oal_msleep(300);

            OAM_SDT_STAT_INCR(ul_nlk_sd_cnt);
            if (l_unicast_bytes <= 0)
            {
                oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE);
                //oal_netbuf_free(pst_netbuf);
                oal_msleep(500);
                OAM_SDT_STAT_INCR(ul_nlk_sd_fail);
                return OAL_FAIL;
            }
        }

        oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE);
        return OAL_SUCC;
    }
#endif

   /* 填写netlink消息头 */
    ul_nlmsg_len = OAL_NLMSG_SPACE(ul_len);
    pst_copy_netbuf = oal_netbuf_alloc(ul_nlmsg_len, 0, WLAN_MEM_NETBUF_ALIGN);
    if (OAL_UNLIKELY(OAL_PTR_NULL == pst_copy_netbuf))
    {
        oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE);
        //oal_netbuf_free(pst_netbuf);

        OAL_IO_PRINT("oal_netbuf_alloc failed. \r\n");
        return OAL_FAIL;
    }

    pst_nlhdr = oal_nlmsg_put(pst_copy_netbuf, 0, 0, 0, (oal_int32)ul_len, 0);
    oal_memcopy((oal_void *)OAL_NLMSG_DATA(pst_nlhdr), (const oal_void *)oal_netbuf_data(pst_netbuf), ul_len);

    l_unicast_bytes = oal_netlink_unicast(g_st_sdt_drv_mng_entry.pst_nlsk, pst_copy_netbuf, g_st_sdt_drv_mng_entry.ul_usepid, OAL_MSG_DONTWAIT);

    oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE);
    //oal_netbuf_free(pst_netbuf);

    OAM_SDT_STAT_INCR(ul_nlk_sd_cnt);
    if (l_unicast_bytes <= 0)
    {
        OAM_SDT_STAT_INCR(ul_nlk_sd_fail);
        return OAL_FAIL;
    }
#endif
    return OAL_SUCC;
}
oal_uint32 dmac_data_acq_report_data(oal_uint8 *puc_daq_addr, oal_uint32 ul_len, oal_netbuf_stru *pst_netbuf)
{
    oal_uint8                      *puc_data_offset             = OAL_PTR_NULL;
    oal_uint32                      ul_trans_remainder_len      = 0;
    oal_uint32                      ul_unit_len;
    oal_uint32                      ul_ret;
    oal_uint32                      ul_time = 0;

    ul_trans_remainder_len  = ul_len;
    ul_unit_len             = DMAC_DATA_ACQ_UNIT_DATA_LEN;
    puc_data_offset         = puc_daq_addr;

    g_st_data_acq.ul_daq_sn  = 0;

    dmac_data_acq_set_send_flag(OAL_TRUE);

    /* 发送daq 数据信息 */
    while (ul_trans_remainder_len >= ul_unit_len)
    {
        if (OAL_FALSE == g_st_data_acq.en_daq_app_error)
        {
            if (OAL_TRUE == dmac_data_acq_get_send_flag())
            {
                ul_ret = dmac_data_acq_report_data_unit(puc_data_offset, ul_unit_len, pst_netbuf);
                if (ul_ret != OAL_SUCC)
                {
                    /* 释放内存 */
                    OAM_ERROR_LOG1(0, OAM_SF_ANY, "{dmac_data_acq_report_data::dmac_data_acq_report_data_unit failed[%d].}", ul_ret);

                    return ul_ret;
                }

                ul_trans_remainder_len  -= ul_unit_len;
                puc_data_offset         += ul_unit_len;
            }
            else
            {
                oal_msleep(1000);

                if (DMAC_DATA_ACQ_MAX_WAIT_TIME <= ul_time)
                {
                    OAM_ERROR_LOG0(0, OAM_SF_ANY, "{dmac_report_data_acq_record::send data uint failed. Try again.}");

                    return OAL_FAIL;
                }

                ul_time++;
            }
        }
        else
        {
            OAM_ERROR_LOG0(0, OAM_SF_ANY, "{dmac_report_data_acq_record::send data uint failed. app error, Try again.}");

            return OAL_FAIL;
        }
    }

    /* 最后一片数据采集长度 */
    if ((ul_trans_remainder_len != 0) && (OAL_FALSE == g_st_data_acq.en_daq_app_error))
    {

        ul_ret = dmac_data_acq_report_data_unit(puc_data_offset, ul_trans_remainder_len,pst_netbuf);
        if (ul_ret != OAL_SUCC)
        {
            OAM_ERROR_LOG1(0, OAM_SF_ANY, "{dmac_report_data_acq_record::dmac_data_acq_report_data_unit failed[%d].}", ul_ret);

            return ul_ret;
        }
    }

    g_st_data_acq.uc_ack_flag = OAL_FALSE;

    while(!g_st_data_acq.uc_ack_flag)
    {

        oal_msleep(1000);

        if ((OAL_TRUE == g_st_data_acq.en_daq_app_error) || (DMAC_DATA_ACQ_MAX_WAIT_TIME <= ul_time))
        {
            OAM_ERROR_LOG0(0, OAM_SF_ANY, "{dmac_data_acq_report_data::wait app ack timeout or app error. Try again.}");

            return OAL_FAIL;
        }

        ul_time++;
    }

    return OAL_SUCC;
}