how can i get the number BLE TX re transmissions

hello Nordic

i am working with nrf52832 and nrf52840 socs, with ncs v2.1.0

i would like to know how many of the BLE packets i am sending has to be resent (and if it is possible to know the reason of resent, in case there is another reason beside packet missed some bytes/bits on the OTA way, that would be great as well ) 

any idea how can i get that info ?

also another question, if i move (with BLE 4.2 and above) to extended length packets, to increase throughput, should there be more resent packets since the risk of loosing data in a larger packet is greater ?

hope to read you soon

best regards

Ziv

  • hi Sigurd

    i tried to use the same function as in the example, with some minor modifications. 

    static bool on_vs_evt(struct net_buf_simple *buf)
    {
        uint8_t                                      code;
        sdc_hci_subevent_vs_qos_conn_event_report_t *evt;
    
        code = net_buf_simple_pull_u8(buf);
        if (code != SDC_HCI_SUBEVENT_VS_QOS_CONN_EVENT_REPORT)
        {
            return false;
        }
    
        evt = (void *)buf->data;
        con_event_info.nak_count += evt->nak_count;
        con_event_info.crc_err_count += evt->crc_error_count;
        con_event_info.timeout_disconnection_count += evt->rx_timeout;
    
        con_event_info.con_event_count += evt->event_counter;
    
        return true;
    }
    
    static int enable_qos_conn_evt_report(void)
    {
        int             err;
        struct net_buf *buf;
    
        err = bt_hci_register_vnd_evt_cb(on_vs_evt);
        if (err)
        {
            printk("Failed registering vendor specific callback (err %d)\n", err);
            return err;
        }
    
        sdc_hci_cmd_vs_qos_conn_event_report_enable_t *cmd_enable;
    
        buf = bt_hci_cmd_create(SDC_HCI_OPCODE_CMD_VS_QOS_CONN_EVENT_REPORT_ENABLE, sizeof(*cmd_enable));
        if (!buf)
        {
            printk("Could not allocate command buffer\n");
            return -ENOMEM;
        }
    
        cmd_enable = net_buf_add(buf, sizeof(*cmd_enable));
        cmd_enable->enable = true;
    
        err = bt_hci_cmd_send_sync(
            SDC_HCI_OPCODE_CMD_VS_QOS_CONN_EVENT_REPORT_ENABLE, buf, NULL);
        if (err)
        {
            printk("Could not send command buffer (err %d)\n", err);
            return err;
        }
    
        printk("Connection event reports enabled\n");
        return 0;
    }

    where should i put the ' enable_qos_conn_evt_report() ' call ? cause if i put it when i init the BLE here:

    static void augu_com_start_ble(void)
    {
        int rc;
    
        rc = STATS_INIT_AND_REG(smp_svr_stats, STATS_SIZE_32, "smp_svr_stats");
        __ASSERT(rc == 0, "failed in STATS_INIT_AND_REG");
    
    
        ///////////////////////
        enable_qos_conn_evt_report();
    ///////////////////////
    #ifdef CONFIG_FILE_SYSTEM
        fs_mgmt_register_group();
        os_mgmt_register_group();
        img_mgmt_register_group();
        stat_mgmt_register_group();
    #endif
        /* Enable Bluetooth. */
        rc = bt_enable(bt_ready);
        if (rc != 0)
        {
            AUGU_LOG_ERR("Bluetooth init failed (err %d)", rc);
            return;
        }
    
        bt_conn_cb_register(&conn_callbacks);
    
        /* Initialize the Bluetooth mcumgr transport. */
        smp_bt_register();
    
        commands_service_init();
    #if defined(CONFIG_BOARD_CANARY_TYPE)
        testing_service_init();
    #endif
        halo_svc_init();
        cts_init();
    
        if (IS_ENABLED(CONFIG_BT_SETTINGS))
        {
            settings_load();
        }
    
        k_sem_take(&bt_ready_sem, K_FOREVER);
    }

    then i get 

    00> ASSERTION FAIL [err == 0] @ WEST_TOPDIR/zephyr/subsys/bluetooth/host/hci_core.c:327
    00> 
    00>   k_sem_take failed with err -11
    00> 
    00> [00000010] <err> os: r0/a1:  0x00000003  r1/a2:  0x00000002  r2/a3:  0x00000001
    00> [00000010] <err> os: r3/a4:  0x20003cd8 r12/ip:  0x0000000a r14/lr:  0x00022087
    00> [00000010] <err> os:  xpsr:  0x41000000
    00> [00000010] <err> os: s[ 0]:  0x00000000  s[ 1]:  0x00000000  s[ 2]:  0x00000000  s[ 3]:  0x00000000
    00> [00000010] <err> os: s[ 4]:  0x00000000  s[ 5]:  0x00000000  s[ 6]:  0x00000000  s[ 7]:  0x00000000
    00> [00000010] <err> os: s[ 8]:  0x00000000  s[ 9]:  0x00000000  s[10]:  0x00000000  s[11]:  0x00000000
    00> [00000010] <err> os: s[12]:  0x00000000  s[13]:  0x00000000  s[14]:  0x00000000  s[15]:  0x00000000
    00> [00000010] [1;31m<err> os: fpscr:  0x20006518
    00> [00000010] <err> os: r4/v1:  0x2002446c  r5/v2:  0x00000000  r6/v3:  0xfffffff5
    00> [00000010] <err> os: r7/v4:  0x20022a10  r8/v5:  0x0000fd04  r9/v6:  0x20008250
    00> [00000010] <err> os: r10/v7: 0x00000000  r11/v8: 0x00000000    psp:  0x200229a8
    00> [00000010] <err> os: EXC_RETURN: 0x0
    00> [00000010] <err> os: Faulting instruction address (r15/pc): 0x00022092
    00> [00000046] <err> os: ***** HARD FAULT *****
    00> [00000046] <err> os:   Debug event
    00> [00000046] <err> os: r0/a1:  0x00000000  r1/a2:  0x00000000  r2/a3:  0x45524f43
    00> [00000046] <err> os: r3/a4:  0x80000000 r12/ip:  0x0000000a r14/lr:  0x00054fb9
    00> [00000046] <err> os:  xpsr:  0x8100000b
    00> [00000046] <err> os: s[ 0]:  0x00000000  s[ 1]:  0x00000000  s[ 2]:  0x00000000  s[ 3]:  0x00000000
    00> [00000046] <err> os: s[ 4]:  0x00000000  s[ 5]:  0x00000000  s[ 6]:  0x00000000  s[ 7]:  0x00000000
    00> [00000046] [1;31m<err> os: s[ 8]:  0x00000000  s[ 9]:  0x00000000  s[10]:  0x00000000  s[11]:  0x00000000
    00> [00000046] <err> os: s[12]:  0x00000000  s[13]:  0x00000000  s[14]:  0x00000000  s[15]:  0x00000000
    00> [00000046] <err> os: fpscr:  0x200220e0
    00> [00000046] <err> os: r4/v1:  0x20022158  r5/v2:  0x0000244d  r6/v3:  0x2000b5f4
    00> [00000046] <err> os: r7/v4:  0x20022188  r8/v5:  0x200220f4  r9/v6:  0x00000003
    00> [00000046] [1;31m<err> os: r10/v7: 0x00000003  r11/v8: 0x20022170    psp:  0x200229a8
    00> [00000046] <err> os: EXC_RETURN: 0xffffffe1
    00> [00000046] <err> os: Faulting instruction address (r15/pc): 0x0005430c
    00> [00000046] <err> os: >>> ZEPHYR FATAL ERROR 0: CPU exception on CPU 0
    00> [00000046] <err> os: Fault during interrupt handling
    00> 
    00> [00000046] <err> os: Current thread: 0x20006518 (main)[0m
    00> [00000047] <err> fatal_error: Resetting system
    00> *** Booting Zephyr OS build v3.1.99-ncs1  ***

    if i move it to other place in the BLE init call:

    static void augu_com_start_ble(void)
    {
        int rc;
    
        rc = STATS_INIT_AND_REG(smp_svr_stats, STATS_SIZE_32, "smp_svr_stats");
        __ASSERT(rc == 0, "failed in STATS_INIT_AND_REG");
    
    #ifdef CONFIG_FILE_SYSTEM
        fs_mgmt_register_group();
        os_mgmt_register_group();
        img_mgmt_register_group();
        stat_mgmt_register_group();
    #endif
        /* Enable Bluetooth. */
        rc = bt_enable(bt_ready);
        if (rc != 0)
        {
            AUGU_LOG_ERR("Bluetooth init failed (err %d)", rc);
            return;
        }
    
        bt_conn_cb_register(&conn_callbacks);
    
        ///////////////////////
        enable_qos_conn_evt_report();
        ///////////////////////
        /* Initialize the Bluetooth mcumgr transport. */
        smp_bt_register();
    
        commands_service_init();
    #if defined(CONFIG_BOARD_CANARY_TYPE)
        testing_service_init();
    #endif
        halo_svc_init();
        cts_init();
    
        if (IS_ENABLED(CONFIG_BT_SETTINGS))
        {
            settings_load();
        }
    
        k_sem_take(&bt_ready_sem, K_FOREVER);
    }

    then i get '0' for all event report values (i know i am transferring data so there must be connection events and packet transfers).

    if i put the enable qos call it in the 'connected' callback then again i get '0' for all values in the event report

    (p.s. what qos and vs stands for ?)

    hope to read you soon

    best regards

    Ziv 

  • Hi,

    Take a look at how it's done here:

    https://github.com/nrfconnect/sdk-nrf/blob/628de35443dff27f6915e718c6de2afe2b9015a5/samples/bluetooth/llpm/src/main.c#L492

    ziv123 said:
    (p.s. what qos and vs stands for ?)

    qos = Quality of Service

    vs = vendor specific

  • Hi,

    Take a look at how it's done here:

    i took a look there, that's what i meant by :

    i tried to use the same function as in the example, with some minor modifications. 
  • You are seeing on_vs_evt() beeing called, right?

    But evt->event_counter is 0?

  • You are seeing on_vs_evt() beeing called, right?

    no, i added a counter to ' on_vs_evt() ' to counts how many times it is called (which should be equal to evt->event_counter i guess) and it is '0' as well, 

    i also see that the enable function itself fails on 

    int bt_hci_cmd_send_sync(uint16_t opcode, struct net_buf *buf,
    			 struct net_buf **rsp)

    in hci_core.c module (err -5 -> -EIO)

    	status = cmd(buf)->status;
    	if (status) {
    		BT_WARN("opcode 0x%04x status 0x%02x", opcode, status);
    		net_buf_unref(buf);
    
    		switch (status) {
    		case BT_HCI_ERR_CONN_LIMIT_EXCEEDED:
    			return -ECONNREFUSED;
    		default:
    			return -EIO;
    		}
    	}

    with:

    0> [00000000] <wrn> bt_hci_core: opcode 0xfd04 status 0x01
    00> [00000000] <err> COMM_MNG: Could not send command buffer (err -5)

    haven't figure out why yet

    when i tried to run the llpm example from my ncs (v2.1.0) with nrf52832 board, and i get different values for some reason i can't understand.. 

    in the above pic is what i see in debug mode, i get a value inserted to the function 64772, and stepping in the function i see a different value - 3075, also the 'buf' values are different .. what am i missing ?? 

    also it seems like the function ' enable_qos_conn_evt_report ' is called many times which is not clear to me yet, and the ' bt_hci_cmd_send_sync ' is called many times in it , not clear as well ??

    hope to read you soon

    best regards

    Ziv

Related