This is an automated email from the ASF dual-hosted git repository.

naraj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 5c68cca8d6660fe94d355b0bbe5fb4d49c6c2f9b
Author: MichaƂ Narajowski <michal.narajow...@codecoup.pl>
AuthorDate: Thu Apr 25 14:09:10 2019 +0200

    apps/bttester: Fix using mbufs
    
    This patch uses send_buf to make sure the whole chain gets
    sent, not just the first buffer.
---
 apps/bttester/src/gatt.c | 80 +++++++++++++++++++++++++-----------------------
 1 file changed, 41 insertions(+), 39 deletions(-)

diff --git a/apps/bttester/src/gatt.c b/apps/bttester/src/gatt.c
index 8bd04f9..1e53022 100644
--- a/apps/bttester/src/gatt.c
+++ b/apps/bttester/src/gatt.c
@@ -570,23 +570,27 @@ static size_t read_value(uint16_t conn_handle, uint16_t 
attr_handle,
                ble_uuid_to_str(ctxt->dsc->uuid, str);
        }
 
-       rc = os_mbuf_append(ctxt->om, value->buf->om_data, value->buf->om_len);
+       rc = os_mbuf_appendfrom(ctxt->om, value->buf,
+                               0, os_mbuf_len(value->buf));
        return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES;
 }
 
-static void attr_value_changed_ev(u16_t handle, const u8_t *value, u16_t len)
+static void attr_value_changed_ev(u16_t handle, struct os_mbuf *data)
 {
-       u8_t buf[len + sizeof(struct gatt_attr_value_changed_ev)];
-       struct gatt_attr_value_changed_ev *ev = (void *) buf;
+       struct gatt_attr_value_changed_ev *ev;
+       struct os_mbuf *buf = os_msys_get(0, 0);
 
        SYS_LOG_DBG("");
 
+       net_buf_simple_init(buf, 0);
+       ev = net_buf_simple_add(buf, sizeof(*ev));
+
        ev->handle = sys_cpu_to_le16(handle);
-       ev->data_length = sys_cpu_to_le16(len);
-       memcpy(ev->data, value, len);
+       ev->data_length = sys_cpu_to_le16(os_mbuf_len(data));
+       os_mbuf_appendfrom(buf, data, 0, os_mbuf_len(data));
 
-       tester_send(BTP_SERVICE_ID_GATT, GATT_EV_ATTR_VALUE_CHANGED,
-                   CONTROLLER_INDEX, buf, sizeof(buf));
+       tester_send_buf(BTP_SERVICE_ID_GATT, GATT_EV_ATTR_VALUE_CHANGED,
+                       CONTROLLER_INDEX, buf);
 }
 
 static size_t write_value(uint16_t conn_handle, uint16_t attr_handle,
@@ -594,7 +598,7 @@ static size_t write_value(uint16_t conn_handle, uint16_t 
attr_handle,
                          void *arg)
 {
        struct gatt_value *value = arg;
-       uint16_t om_len, len;
+       uint16_t write_len, current_len;
        int rc;
 
        SYS_LOG_DBG("");
@@ -609,22 +613,22 @@ static size_t write_value(uint16_t conn_handle, uint16_t 
attr_handle,
                }
        }
 
-       om_len = OS_MBUF_PKTLEN(ctxt->om);
-       if (om_len > value->buf->om_len) {
+       write_len = os_mbuf_len(ctxt->om);
+       current_len = os_mbuf_len(value->buf);
+
+       SYS_LOG_DBG("current_len = %d", current_len);
+       SYS_LOG_DBG("write_len = %d", write_len);
+       if (write_len > current_len) {
                return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN;
        }
 
-       rc = ble_hs_mbuf_to_flat(ctxt->om, value->buf->om_data,
-                                value->buf->om_len, &len);
+       os_mbuf_adj(value->buf, -current_len);
+       rc = os_mbuf_appendfrom(value->buf, ctxt->om, 0, write_len);
        if (rc != 0) {
                return BLE_ATT_ERR_UNLIKELY;
        }
 
-       /* Maximum attribute value size is 512 bytes */
-       assert(value->buf->om_len < 512);
-
-       attr_value_changed_ev(attr_handle, value->buf->om_data,
-                             value->buf->om_len);
+       attr_value_changed_ev(attr_handle, value->buf);
 
        return 0;
 }
@@ -791,12 +795,10 @@ static void set_value(u8_t *data, u16_t len)
        value_len = sys_le16_to_cpu(cmd->len);
        value = cmd->value;
 
-       if (value_len > gatt_value->buf->om_len) {
-               os_mbuf_extend(gatt_value->buf,
-                              (value_len - gatt_value->buf->om_len));
-       }
+       os_mbuf_adj(gatt_value->buf, - os_mbuf_len(gatt_value->buf));
+       os_mbuf_append(gatt_value->buf, value, value_len);
 
-       memcpy(gatt_value->buf->om_data, value, value_len);
+       SYS_LOG_DBG("os_mbuf_len = %d", os_mbuf_len(gatt_value->buf));
 
        if (gatt_value->type == GATT_VALUE_TYPE_CHR) {
                chr = gatt_value->ptr;
@@ -1704,42 +1706,42 @@ static struct bt_gatt_subscribe_params {
        u16_t value_handle;
 } subscribe_params;
 
-/* ev header + default MTU_ATT-3 */
-static u8_t ev_buf[33];
-
 int tester_gatt_notify_rx_ev(u16_t conn_handle, u16_t attr_handle,
                             u8_t indication, struct os_mbuf *om)
 {
-       struct gatt_notification_ev *ev = (void *) ev_buf;
+       struct gatt_notification_ev *ev;
        struct ble_gap_conn_desc conn;
+       struct os_mbuf *buf = os_msys_get(0, 0);
        const ble_addr_t *addr;
-       int rc;
 
        SYS_LOG_DBG("");
 
        if (!subscribe_params.ccc_handle) {
-               return 0;
+               goto fail;
        }
 
-       rc = ble_gap_conn_find(conn_handle, &conn);
-       if (rc) {
-               return -1;
+       if (ble_gap_conn_find(conn_handle, &conn)) {
+               goto fail;
        }
 
+       net_buf_simple_init(buf, 0);
+       ev = net_buf_simple_add(buf, sizeof(*ev));
+
        addr = &conn.peer_ota_addr;
 
+       ev->address_type = addr->type;
+       memcpy(ev->address, addr->val, sizeof(ev->address));
        ev->type = (u8_t) (indication ? 0x02 : 0x01);
        ev->handle = sys_cpu_to_le16(attr_handle);
-       ev->data_length = sys_cpu_to_le16(om->om_len);
-       memcpy(ev->data, om->om_data, om->om_len);
-       memcpy(ev->address, addr->val, sizeof(ev->address));
-       ev->address_type = addr->type;
+       ev->data_length = sys_cpu_to_le16(os_mbuf_len(om));
+       os_mbuf_appendfrom(buf, om, 0, os_mbuf_len(om));
 
-       tester_send(BTP_SERVICE_ID_GATT, GATT_EV_NOTIFICATION,
-                   CONTROLLER_INDEX, ev_buf, sizeof(*ev) + om->om_len);
+       tester_send_buf(BTP_SERVICE_ID_GATT, GATT_EV_NOTIFICATION,
+                       CONTROLLER_INDEX, buf);
 
+fail:
+       os_mbuf_free_chain(buf);
        return 0;
-
 }
 
 int tester_gatt_subscribe_ev(u16_t conn_handle, u16_t attr_handle, u8_t reason,

Reply via email to