{
struct gatt_db_attribute *attr;
struct gatt_handler *handler;
+ struct l2cap_frame clone;
print_handle(frame, handle, false);
print_hex_field(" Data", frame->data, len);
if (!handler)
return;
+ /* Use a clone if the callback is not expected to parse the whole
+ * frame.
+ */
+ if (len != frame->size) {
+ l2cap_frame_clone(&clone, frame);
+ clone.size = len;
+ frame = &clone;
+ }
+
handler->notify(frame);
}
uint16_t cid, uint16_t psm,
const void *data, uint16_t size);
-static inline void l2cap_frame_pull(struct l2cap_frame *frame,
- const struct l2cap_frame *source, uint16_t len)
+static inline void l2cap_frame_clone(struct l2cap_frame *frame,
+ const struct l2cap_frame *source)
{
if (frame != source) {
frame->index = source->index;
frame->psm = source->psm;
frame->chan = source->chan;
frame->mode = source->mode;
+ frame->data = source->data;
+ frame->size = source->size;
}
+}
+
+static inline void l2cap_frame_pull(struct l2cap_frame *frame,
+ const struct l2cap_frame *source, uint16_t len)
+{
+ l2cap_frame_clone(frame, source);
frame->data = source->data + len;
frame->size = source->size - len;