This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Missing variable value in zb_zdo_ep_resp_t stuct

It appears to me that the zb_zdo_ep_resp_t struct is missing a variable value attribute since the actual list of end points is missing.  Should it not be similar to zb_zdo_match_desc_param_t which has a variable length cluster_list[1].

Thoughts?
Darren
Parents Reply Children
  • The zb_zdo_ep_resp_t includes a variable list of endpoints.  The actual number of endpoints returned is stored in ep_count but there is no actual entry in the structure for the start of the end point list.  Shouldn't the structure look like the following:

    /** @brief Active EP response */
    typedef ZB_PACKED_PRE struct zb_zdo_ep_resp_s
    {
      zb_uint8_t tsn;       /*!< ZDP transaction sequence number */
      zb_uint8_t status;    /*!< The status of the Active_EP_req command. */
      zb_uint16_t nwk_addr; /*!< NWK address for the request. */
      zb_uint8_t ep_count;  /*!< The count of active endpoints on the Remote Device. */
      zb_uint8_t ep_list[1]; /!< variable size: [ep_count] */
    }
    ZB_PACKED_STRUCT
    zb_zdo_ep_resp_t;

    Thanks,

    Darren

  • The list of EPs is in the p_buf, which you can get from the zb_uint8_t param in the callback:

    If you look in zmd_zb_active_ep_cb():

    static zb_void_t cmd_zb_active_ep_cb(zb_uint8_t param)
    {
        zb_buf_t         * p_buf  = ZB_BUF_FROM_REF(param);
        zb_zdo_ep_resp_t * p_resp = (zb_zdo_ep_resp_t *)ZB_BUF_BEGIN(p_buf);
        zdo_tsn_ctx_t    * p_tsn_ctx;
    
        p_tsn_ctx = get_ctx_by_tsn(p_resp->tsn);
        if (!p_tsn_ctx)
        {
            ZB_FREE_BUF_BY_REF(param);
            return;
        }
    
        if (p_resp->status == ZB_ZDP_STATUS_SUCCESS)
        {
            nrf_cli_fprintf(p_tsn_ctx->p_cli,
                            NRF_CLI_NORMAL,
                            "src_addr=%0hx ",
                            p_resp->nwk_addr);
    
            PRINT_LIST(p_tsn_ctx->p_cli, "ep=", "%d", zb_uint8_t, 
                       (zb_uint8_t *)p_resp + sizeof(zb_zdo_ep_resp_t),
                       p_resp->ep_count);
    
            print_done(p_tsn_ctx->p_cli, ZB_TRUE);
        }
        else
        {
            print_error(p_tsn_ctx->p_cli,
                        "active ep request failed");
        }
    
        invalidate_ctx(p_tsn_ctx);
        ZB_FREE_BUF_BY_REF(param);
    }

    the function PRINT_LIST() will print all of the EPs. 

    If you look at the definition of PRINT_LIST:

    /**@breif Print a list of items.
     * 
     * Individual items in the list are delimited by comma.
     *
     * @param p_cli a pointer to CLI instance
     * @param hdr   the list header string
     * @param fmt   a printf like format of an individual list item
     * @param type  type of the list item
     * @param size  the list size (in items)
     */
    #define PRINT_LIST(p_cli, hdr, fmt, type, ptr, size)                 \
    {                                                                    \
        /*lint -e662 */                                                  \
        nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, hdr);                     \
        for (type * p_item = (ptr); p_item < (ptr) + size - 1; p_item++) \
        {                                                                \
            nrf_cli_fprintf(p_cli,                                       \
                            NRF_CLI_NORMAL,                              \
                            fmt ",",                                     \
                            *p_item);                                    \
        }                                                                \
                                                                         \
        if (size > 0)                                                    \
        {                                                                \
            nrf_cli_fprintf(p_cli,                                       \
                            NRF_CLI_NORMAL,                              \
                            fmt " ",                                     \
                            *((ptr) + size - 1));                        \
        }                                                                \
        /*lint -restore */                                               \
    } 

    You can see that it takes 6 parameters, where the 5th is a pointer, which is fetched from p_resp, which is fetched from p_buf, which again is fetched from zb_uint8_t param in the callback.

    BR,

    Edvin

Related