1 /** @file
2 * @brief Buffer management.
3 */
4
5 /*
6 * SPDX-FileCopyrightText: 2015 Intel Corporation
7 * SPDX-FileContributor: 2018-2021 Espressif Systems (Shanghai) CO LTD
8 *
9 * SPDX-License-Identifier: Apache-2.0
10 */
11 #ifndef _BLE_MESH_BUF_H_
12 #define _BLE_MESH_BUF_H_
13
14 #include "mesh_config.h"
15 #include "mesh_types.h"
16 #include "mesh_slist.h"
17 #include "mesh_compiler.h"
18
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22
23 /* Unaligned access */
24 #define UNALIGNED_GET(p) \
25 __extension__ ({ \
26 struct __attribute__((__packed__)) { \
27 __typeof__(*(p)) __v; \
28 } *__p = (__typeof__(__p)) (p); \
29 __p->__v; \
30 })
31
32 #define BLE_MESH_NET_BUF_USER_DATA_SIZE 4
33
34 /**
35 * @brief Network buffer library
36 * @defgroup net_buf Network Buffer Library
37 * @ingroup networking
38 * @{
39 */
40
41 /* Alignment needed for various parts of the buffer definition */
42 #define __net_buf_align __aligned(sizeof(int))
43
44 /**
45 * @def NET_BUF_SIMPLE_DEFINE
46 * @brief Define a net_buf_simple stack variable.
47 *
48 * This is a helper macro which is used to define a net_buf_simple object
49 * on the stack.
50 *
51 * @param _name Name of the net_buf_simple object.
52 * @param _size Maximum data storage for the buffer.
53 */
54 #define NET_BUF_SIMPLE_DEFINE(_name, _size) \
55 uint8_t net_buf_data_##_name[_size]; \
56 struct net_buf_simple _name = { \
57 .data = net_buf_data_##_name, \
58 .len = 0, \
59 .size = _size, \
60 .__buf = net_buf_data_##_name, \
61 }
62
63 /**
64 * @def NET_BUF_SIMPLE_DEFINE_STATIC
65 * @brief Define a static net_buf_simple variable.
66 *
67 * This is a helper macro which is used to define a static net_buf_simple
68 * object.
69 *
70 * @param _name Name of the net_buf_simple object.
71 * @param _size Maximum data storage for the buffer.
72 */
73 #define NET_BUF_SIMPLE_DEFINE_STATIC(_name, _size) \
74 static uint8_t net_buf_data_##_name[_size]; \
75 static struct net_buf_simple _name = { \
76 .data = net_buf_data_##_name, \
77 .len = 0, \
78 .size = _size, \
79 .__buf = net_buf_data_##_name, \
80 }
81
82 /**
83 * @brief Simple network buffer representation.
84 *
85 * This is a simpler variant of the net_buf object (in fact net_buf uses
86 * net_buf_simple internally). It doesn't provide any kind of reference
87 * counting, user data, dynamic allocation, or in general the ability to
88 * pass through kernel objects such as FIFOs.
89 *
90 * The main use of this is for scenarios where the meta-data of the normal
91 * net_buf isn't needed and causes too much overhead. This could be e.g.
92 * when the buffer only needs to be allocated on the stack or when the
93 * access to and lifetime of the buffer is well controlled and constrained.
94 */
95 struct net_buf_simple {
96 /** Pointer to the start of data in the buffer. */
97 uint8_t *data;
98
99 /** Length of the data behind the data pointer. */
100 uint16_t len;
101
102 /** Amount of data that this buffer can store. */
103 uint16_t size;
104
105 /** Start of the data storage. Not to be accessed directly
106 * (the data pointer should be used instead).
107 */
108 uint8_t *__buf;
109 };
110
111 /**
112 * @def NET_BUF_SIMPLE
113 * @brief Define a net_buf_simple stack variable and get a pointer to it.
114 *
115 * This is a helper macro which is used to define a net_buf_simple object on
116 * the stack and the get a pointer to it as follows:
117 *
118 * struct net_buf_simple *my_buf = NET_BUF_SIMPLE(10);
119 *
120 * After creating the object it needs to be initialized by calling
121 * net_buf_simple_init().
122 *
123 * @param _size Maximum data storage for the buffer.
124 *
125 * @return Pointer to stack-allocated net_buf_simple object.
126 */
127 #define NET_BUF_SIMPLE(_size) \
128 ((struct net_buf_simple *)(&(struct { \
129 struct net_buf_simple buf; \
130 uint8_t data[_size] __net_buf_align; \
131 }) { \
132 .buf.size = _size, \
133 .buf.__buf = NULL, \
134 }))
135
136 /**
137 * @brief Initialize a net_buf_simple object.
138 *
139 * This needs to be called after creating a net_buf_simple object using
140 * the NET_BUF_SIMPLE macro.
141 *
142 * @param buf Buffer to initialize.
143 * @param reserve_head Headroom to reserve.
144 */
net_buf_simple_init(struct net_buf_simple * buf,size_t reserve_head)145 static inline void net_buf_simple_init(struct net_buf_simple *buf,
146 size_t reserve_head)
147 {
148 if (!buf->__buf) {
149 buf->__buf = (uint8_t *)buf + sizeof(*buf);
150 }
151
152 buf->data = buf->__buf + reserve_head;
153 buf->len = 0;
154 }
155
156 /**
157 * @brief Initialize a net_buf_simple object with data.
158 *
159 * Initialized buffer object with external data.
160 *
161 * @param buf Buffer to initialize.
162 * @param data External data pointer
163 * @param size Amount of data the pointed data buffer if able to fit.
164 */
165 void net_buf_simple_init_with_data(struct net_buf_simple *buf,
166 void *data, size_t size);
167
168 /**
169 * @brief Reset buffer
170 *
171 * Reset buffer data so it can be reused for other purposes.
172 *
173 * @param buf Buffer to reset.
174 */
net_buf_simple_reset(struct net_buf_simple * buf)175 static inline void net_buf_simple_reset(struct net_buf_simple *buf)
176 {
177 buf->len = 0;
178 buf->data = buf->__buf;
179 }
180
181 /**
182 * Clone buffer state, using the same data buffer.
183 *
184 * Initializes a buffer to point to the same data as an existing buffer.
185 * Allows operations on the same data without altering the length and
186 * offset of the original.
187 *
188 * @param original Buffer to clone.
189 * @param clone The new clone.
190 */
191 void net_buf_simple_clone(const struct net_buf_simple *original,
192 struct net_buf_simple *clone);
193
194 /**
195 * @brief Prepare data to be added at the end of the buffer
196 *
197 * Increments the data length of a buffer to account for more data
198 * at the end.
199 *
200 * @param buf Buffer to update.
201 * @param len Number of bytes to increment the length with.
202 *
203 * @return The original tail of the buffer.
204 */
205 void *net_buf_simple_add(struct net_buf_simple *buf, size_t len);
206
207 /**
208 * @brief Copy given number of bytes from memory to the end of the buffer
209 *
210 * Increments the data length of the buffer to account for more data at the
211 * end.
212 *
213 * @param buf Buffer to update.
214 * @param mem Location of data to be added.
215 * @param len Length of data to be added
216 *
217 * @return The original tail of the buffer.
218 */
219 void *net_buf_simple_add_mem(struct net_buf_simple *buf, const void *mem,
220 size_t len);
221
222 /**
223 * @brief Add (8-bit) byte at the end of the buffer
224 *
225 * Increments the data length of the buffer to account for more data at the
226 * end.
227 *
228 * @param buf Buffer to update.
229 * @param val byte value to be added.
230 *
231 * @return Pointer to the value added
232 */
233 uint8_t *net_buf_simple_add_u8(struct net_buf_simple *buf, uint8_t val);
234
235 /**
236 * @brief Add 16-bit value at the end of the buffer
237 *
238 * Adds 16-bit value in little endian format at the end of buffer.
239 * Increments the data length of a buffer to account for more data
240 * at the end.
241 *
242 * @param buf Buffer to update.
243 * @param val 16-bit value to be added.
244 */
245 void net_buf_simple_add_le16(struct net_buf_simple *buf, uint16_t val);
246
247 /**
248 * @brief Add 16-bit value at the end of the buffer
249 *
250 * Adds 16-bit value in big endian format at the end of buffer.
251 * Increments the data length of a buffer to account for more data
252 * at the end.
253 *
254 * @param buf Buffer to update.
255 * @param val 16-bit value to be added.
256 */
257 void net_buf_simple_add_be16(struct net_buf_simple *buf, uint16_t val);
258
259 /**
260 * @brief Add 24-bit value at the end of the buffer
261 *
262 * Adds 24-bit value in little endian format at the end of buffer.
263 * Increments the data length of a buffer to account for more data
264 * at the end.
265 *
266 * @param buf Buffer to update.
267 * @param val 24-bit value to be added.
268 */
269 void net_buf_simple_add_le24(struct net_buf_simple *buf, uint32_t val);
270
271 /**
272 * @brief Add 24-bit value at the end of the buffer
273 *
274 * Adds 24-bit value in big endian format at the end of buffer.
275 * Increments the data length of a buffer to account for more data
276 * at the end.
277 *
278 * @param buf Buffer to update.
279 * @param val 24-bit value to be added.
280 */
281 void net_buf_simple_add_be24(struct net_buf_simple *buf, uint32_t val);
282
283 /**
284 * @brief Add 32-bit value at the end of the buffer
285 *
286 * Adds 32-bit value in little endian format at the end of buffer.
287 * Increments the data length of a buffer to account for more data
288 * at the end.
289 *
290 * @param buf Buffer to update.
291 * @param val 32-bit value to be added.
292 */
293 void net_buf_simple_add_le32(struct net_buf_simple *buf, uint32_t val);
294
295 /**
296 * @brief Add 32-bit value at the end of the buffer
297 *
298 * Adds 32-bit value in big endian format at the end of buffer.
299 * Increments the data length of a buffer to account for more data
300 * at the end.
301 *
302 * @param buf Buffer to update.
303 * @param val 32-bit value to be added.
304 */
305 void net_buf_simple_add_be32(struct net_buf_simple *buf, uint32_t val);
306
307 /**
308 * @brief Add 48-bit value at the end of the buffer
309 *
310 * Adds 48-bit value in little endian format at the end of buffer.
311 * Increments the data length of a buffer to account for more data
312 * at the end.
313 *
314 * @param buf Buffer to update.
315 * @param val 48-bit value to be added.
316 */
317 void net_buf_simple_add_le48(struct net_buf_simple *buf, uint64_t val);
318
319 /**
320 * @brief Add 48-bit value at the end of the buffer
321 *
322 * Adds 48-bit value in big endian format at the end of buffer.
323 * Increments the data length of a buffer to account for more data
324 * at the end.
325 *
326 * @param buf Buffer to update.
327 * @param val 48-bit value to be added.
328 */
329 void net_buf_simple_add_be48(struct net_buf_simple *buf, uint64_t val);
330
331 /**
332 * @brief Add 64-bit value at the end of the buffer
333 *
334 * Adds 64-bit value in little endian format at the end of buffer.
335 * Increments the data length of a buffer to account for more data
336 * at the end.
337 *
338 * @param buf Buffer to update.
339 * @param val 64-bit value to be added.
340 */
341 void net_buf_simple_add_le64(struct net_buf_simple *buf, uint64_t val);
342
343 /**
344 * @brief Add 64-bit value at the end of the buffer
345 *
346 * Adds 64-bit value in big endian format at the end of buffer.
347 * Increments the data length of a buffer to account for more data
348 * at the end.
349 *
350 * @param buf Buffer to update.
351 * @param val 64-bit value to be added.
352 */
353 void net_buf_simple_add_be64(struct net_buf_simple *buf, uint64_t val);
354
355 /**
356 * @brief Push data to the beginning of the buffer.
357 *
358 * Modifies the data pointer and buffer length to account for more data
359 * in the beginning of the buffer.
360 *
361 * @param buf Buffer to update.
362 * @param len Number of bytes to add to the beginning.
363 *
364 * @return The new beginning of the buffer data.
365 */
366 void *net_buf_simple_push(struct net_buf_simple *buf, size_t len);
367
368 /**
369 * @brief Push 16-bit value to the beginning of the buffer
370 *
371 * Adds 16-bit value in little endian format to the beginning of the
372 * buffer.
373 *
374 * @param buf Buffer to update.
375 * @param val 16-bit value to be pushed to the buffer.
376 */
377 void net_buf_simple_push_le16(struct net_buf_simple *buf, uint16_t val);
378
379 /**
380 * @brief Push 16-bit value to the beginning of the buffer
381 *
382 * Adds 16-bit value in big endian format to the beginning of the
383 * buffer.
384 *
385 * @param buf Buffer to update.
386 * @param val 16-bit value to be pushed to the buffer.
387 */
388 void net_buf_simple_push_be16(struct net_buf_simple *buf, uint16_t val);
389
390 /**
391 * @brief Push 8-bit value to the beginning of the buffer
392 *
393 * Adds 8-bit value the beginning of the buffer.
394 *
395 * @param buf Buffer to update.
396 * @param val 8-bit value to be pushed to the buffer.
397 */
398 void net_buf_simple_push_u8(struct net_buf_simple *buf, uint8_t val);
399
400 /**
401 * @brief Push 24-bit value to the beginning of the buffer
402 *
403 * Adds 24-bit value in little endian format to the beginning of the
404 * buffer.
405 *
406 * @param buf Buffer to update.
407 * @param val 24-bit value to be pushed to the buffer.
408 */
409 void net_buf_simple_push_le24(struct net_buf_simple *buf, uint32_t val);
410
411 /**
412 * @brief Push 24-bit value to the beginning of the buffer
413 *
414 * Adds 24-bit value in big endian format to the beginning of the
415 * buffer.
416 *
417 * @param buf Buffer to update.
418 * @param val 24-bit value to be pushed to the buffer.
419 */
420 void net_buf_simple_push_be24(struct net_buf_simple *buf, uint32_t val);
421
422 /**
423 * @brief Push 32-bit value to the beginning of the buffer
424 *
425 * Adds 32-bit value in little endian format to the beginning of the
426 * buffer.
427 *
428 * @param buf Buffer to update.
429 * @param val 32-bit value to be pushed to the buffer.
430 */
431 void net_buf_simple_push_le32(struct net_buf_simple *buf, uint32_t val);
432
433 /**
434 * @brief Push 32-bit value to the beginning of the buffer
435 *
436 * Adds 32-bit value in big endian format to the beginning of the
437 * buffer.
438 *
439 * @param buf Buffer to update.
440 * @param val 32-bit value to be pushed to the buffer.
441 */
442 void net_buf_simple_push_be32(struct net_buf_simple *buf, uint32_t val);
443
444 /**
445 * @brief Push 48-bit value to the beginning of the buffer
446 *
447 * Adds 48-bit value in little endian format to the beginning of the
448 * buffer.
449 *
450 * @param buf Buffer to update.
451 * @param val 48-bit value to be pushed to the buffer.
452 */
453 void net_buf_simple_push_le48(struct net_buf_simple *buf, uint64_t val);
454
455 /**
456 * @brief Push 48-bit value to the beginning of the buffer
457 *
458 * Adds 48-bit value in big endian format to the beginning of the
459 * buffer.
460 *
461 * @param buf Buffer to update.
462 * @param val 48-bit value to be pushed to the buffer.
463 */
464 void net_buf_simple_push_be48(struct net_buf_simple *buf, uint64_t val);
465
466 /**
467 * @brief Push 64-bit value to the beginning of the buffer
468 *
469 * Adds 64-bit value in little endian format to the beginning of the
470 * buffer.
471 *
472 * @param buf Buffer to update.
473 * @param val 64-bit value to be pushed to the buffer.
474 */
475 void net_buf_simple_push_le64(struct net_buf_simple *buf, uint64_t val);
476
477 /**
478 * @brief Push 64-bit value to the beginning of the buffer
479 *
480 * Adds 64-bit value in big endian format to the beginning of the
481 * buffer.
482 *
483 * @param buf Buffer to update.
484 * @param val 64-bit value to be pushed to the buffer.
485 */
486 void net_buf_simple_push_be64(struct net_buf_simple *buf, uint64_t val);
487
488 /**
489 * @brief Remove data from the beginning of the buffer.
490 *
491 * Removes data from the beginning of the buffer by modifying the data
492 * pointer and buffer length.
493 *
494 * @param buf Buffer to update.
495 * @param len Number of bytes to remove.
496 *
497 * @return New beginning of the buffer data.
498 */
499 void *net_buf_simple_pull(struct net_buf_simple *buf, size_t len);
500
501 /**
502 * @brief Remove data from the beginning of the buffer.
503 *
504 * Removes data from the beginning of the buffer by modifying the data
505 * pointer and buffer length.
506 *
507 * @param buf Buffer to update.
508 * @param len Number of bytes to remove.
509 *
510 * @return Pointer to the old location of the buffer data.
511 */
512 void *net_buf_simple_pull_mem(struct net_buf_simple *buf, size_t len);
513
514 /**
515 * @brief Remove a 8-bit value from the beginning of the buffer
516 *
517 * Same idea as with net_buf_simple_pull(), but a helper for operating
518 * on 8-bit values.
519 *
520 * @param buf A valid pointer on a buffer.
521 *
522 * @return The 8-bit removed value
523 */
524 uint8_t net_buf_simple_pull_u8(struct net_buf_simple *buf);
525
526 /**
527 * @brief Remove and convert 16 bits from the beginning of the buffer.
528 *
529 * Same idea as with net_buf_simple_pull(), but a helper for operating
530 * on 16-bit little endian data.
531 *
532 * @param buf A valid pointer on a buffer.
533 *
534 * @return 16-bit value converted from little endian to host endian.
535 */
536 uint16_t net_buf_simple_pull_le16(struct net_buf_simple *buf);
537
538 /**
539 * @brief Remove and convert 16 bits from the beginning of the buffer.
540 *
541 * Same idea as with net_buf_simple_pull(), but a helper for operating
542 * on 16-bit big endian data.
543 *
544 * @param buf A valid pointer on a buffer.
545 *
546 * @return 16-bit value converted from big endian to host endian.
547 */
548 uint16_t net_buf_simple_pull_be16(struct net_buf_simple *buf);
549
550 /**
551 * @brief Remove and convert 24 bits from the beginning of the buffer.
552 *
553 * Same idea as with net_buf_simple_pull(), but a helper for operating
554 * on 24-bit little endian data.
555 *
556 * @param buf A valid pointer on a buffer.
557 *
558 * @return 24-bit value converted from little endian to host endian.
559 */
560 uint32_t net_buf_simple_pull_le24(struct net_buf_simple *buf);
561
562 /**
563 * @brief Remove and convert 24 bits from the beginning of the buffer.
564 *
565 * Same idea as with net_buf_simple_pull(), but a helper for operating
566 * on 24-bit big endian data.
567 *
568 * @param buf A valid pointer on a buffer.
569 *
570 * @return 24-bit value converted from big endian to host endian.
571 */
572 uint32_t net_buf_simple_pull_be24(struct net_buf_simple *buf);
573
574 /**
575 * @brief Remove and convert 32 bits from the beginning of the buffer.
576 *
577 * Same idea as with net_buf_simple_pull(), but a helper for operating
578 * on 32-bit little endian data.
579 *
580 * @param buf A valid pointer on a buffer.
581 *
582 * @return 32-bit value converted from little endian to host endian.
583 */
584 uint32_t net_buf_simple_pull_le32(struct net_buf_simple *buf);
585
586 /**
587 * @brief Remove and convert 32 bits from the beginning of the buffer.
588 *
589 * Same idea as with net_buf_simple_pull(), but a helper for operating
590 * on 32-bit big endian data.
591 *
592 * @param buf A valid pointer on a buffer.
593 *
594 * @return 32-bit value converted from big endian to host endian.
595 */
596 uint32_t net_buf_simple_pull_be32(struct net_buf_simple *buf);
597
598 /**
599 * @brief Remove and convert 48 bits from the beginning of the buffer.
600 *
601 * Same idea as with net_buf_simple_pull(), but a helper for operating
602 * on 48-bit little endian data.
603 *
604 * @param buf A valid pointer on a buffer.
605 *
606 * @return 48-bit value converted from little endian to host endian.
607 */
608 uint64_t net_buf_simple_pull_le48(struct net_buf_simple *buf);
609
610 /**
611 * @brief Remove and convert 48 bits from the beginning of the buffer.
612 *
613 * Same idea as with net_buf_simple_pull(), but a helper for operating
614 * on 48-bit big endian data.
615 *
616 * @param buf A valid pointer on a buffer.
617 *
618 * @return 48-bit value converted from big endian to host endian.
619 */
620 uint64_t net_buf_simple_pull_be48(struct net_buf_simple *buf);
621
622 /**
623 * @brief Remove and convert 64 bits from the beginning of the buffer.
624 *
625 * Same idea as with net_buf_simple_pull(), but a helper for operating
626 * on 64-bit little endian data.
627 *
628 * @param buf A valid pointer on a buffer.
629 *
630 * @return 64-bit value converted from little endian to host endian.
631 */
632 uint64_t net_buf_simple_pull_le64(struct net_buf_simple *buf);
633
634 /**
635 * @brief Remove and convert 64 bits from the beginning of the buffer.
636 *
637 * Same idea as with net_buf_simple_pull(), but a helper for operating
638 * on 64-bit big endian data.
639 *
640 * @param buf A valid pointer on a buffer.
641 *
642 * @return 64-bit value converted from big endian to host endian.
643 */
644 uint64_t net_buf_simple_pull_be64(struct net_buf_simple *buf);
645
646 /**
647 * @brief Get the tail pointer for a buffer.
648 *
649 * Get a pointer to the end of the data in a buffer.
650 *
651 * @param buf Buffer.
652 *
653 * @return Tail pointer for the buffer.
654 */
net_buf_simple_tail(struct net_buf_simple * buf)655 static inline uint8_t *net_buf_simple_tail(struct net_buf_simple *buf)
656 {
657 return buf->data + buf->len;
658 }
659
660 /**
661 * @brief Check buffer headroom.
662 *
663 * Check how much free space there is in the beginning of the buffer.
664 *
665 * buf A valid pointer on a buffer
666 *
667 * @return Number of bytes available in the beginning of the buffer.
668 */
669 size_t net_buf_simple_headroom(struct net_buf_simple *buf);
670
671 /**
672 * @brief Check buffer tailroom.
673 *
674 * Check how much free space there is at the end of the buffer.
675 *
676 * @param buf A valid pointer on a buffer
677 *
678 * @return Number of bytes available at the end of the buffer.
679 */
680 size_t net_buf_simple_tailroom(struct net_buf_simple *buf);
681
682 /**
683 * @brief Parsing state of a buffer.
684 *
685 * This is used for temporarily storing the parsing state of a buffer
686 * while giving control of the parsing to a routine which we don't
687 * control.
688 */
689 struct net_buf_simple_state {
690 /** Offset of the data pointer from the beginning of the storage */
691 uint16_t offset;
692 /** Length of data */
693 uint16_t len;
694 };
695
696 /**
697 * @brief Save the parsing state of a buffer.
698 *
699 * Saves the parsing state of a buffer so it can be restored later.
700 *
701 * @param buf Buffer from which the state should be saved.
702 * @param state Storage for the state.
703 */
net_buf_simple_save(struct net_buf_simple * buf,struct net_buf_simple_state * state)704 static inline void net_buf_simple_save(struct net_buf_simple *buf,
705 struct net_buf_simple_state *state)
706 {
707 state->offset = net_buf_simple_headroom(buf);
708 state->len = buf->len;
709 }
710
711 /**
712 * @brief Restore the parsing state of a buffer.
713 *
714 * Restores the parsing state of a buffer from a state previously stored
715 * by net_buf_simple_save().
716 *
717 * @param buf Buffer to which the state should be restored.
718 * @param state Stored state.
719 */
net_buf_simple_restore(struct net_buf_simple * buf,struct net_buf_simple_state * state)720 static inline void net_buf_simple_restore(struct net_buf_simple *buf,
721 struct net_buf_simple_state *state)
722 {
723 buf->data = buf->__buf + state->offset;
724 buf->len = state->len;
725 }
726
727 /**
728 * @brief Initialize buffer with the given headroom.
729 *
730 * The buffer is not expected to contain any data when this API is called.
731 *
732 * @param buf Buffer to initialize.
733 * @param reserve How much headroom to reserve.
734 */
735 void net_buf_simple_reserve(struct net_buf_simple *buf, size_t reserve);
736
737 /**
738 * Flag indicating that the buffer has associated fragments. Only used
739 * internally by the buffer handling code while the buffer is inside a
740 * FIFO, meaning this never needs to be explicitly set or unset by the
741 * net_buf API user. As long as the buffer is outside of a FIFO, i.e.
742 * in practice always for the user for this API, the buf->frags pointer
743 * should be used instead.
744 */
745 #define NET_BUF_FRAGS BIT(0)
746
747 /**
748 * @brief Network buffer representation.
749 *
750 * This struct is used to represent network buffers. Such buffers are
751 * normally defined through the NET_BUF_POOL_*_DEFINE() APIs and allocated
752 * using the net_buf_alloc() API.
753 */
754 struct net_buf {
755 union {
756 /** Allow placing the buffer into sys_slist_t */
757 sys_snode_t node;
758
759 /** Fragments associated with this buffer. */
760 struct net_buf *frags;
761 };
762
763 /** Reference count. */
764 uint8_t ref;
765
766 /** Bit-field of buffer flags. */
767 uint8_t flags;
768
769 /** Where the buffer should go when freed up. */
770 struct net_buf_pool *pool;
771
772 /* Union for convenience access to the net_buf_simple members, also
773 * preserving the old API.
774 */
775 union {
776 /* The ABI of this struct must match net_buf_simple */
777 struct {
778 /** Pointer to the start of data in the buffer. */
779 uint8_t *data;
780
781 /** Length of the data behind the data pointer. */
782 uint16_t len;
783
784 /** Amount of data that this buffer can store. */
785 uint16_t size;
786
787 /** Start of the data storage. Not to be accessed
788 * directly (the data pointer should be used
789 * instead).
790 */
791 uint8_t *__buf;
792 };
793
794 struct net_buf_simple b;
795 };
796
797 /** System metadata for this buffer. */
798 uint8_t user_data[BLE_MESH_NET_BUF_USER_DATA_SIZE] __net_buf_align;
799 };
800
801 struct net_buf_data_cb {
802 uint8_t *(*alloc)(struct net_buf *buf, size_t *size, int32_t timeout);
803 uint8_t *(*ref)(struct net_buf *buf, uint8_t *data);
804 void (*unref)(struct net_buf *buf, uint8_t *data);
805 };
806
807 struct net_buf_data_alloc {
808 const struct net_buf_data_cb *cb;
809 void *alloc_data;
810 };
811
812 struct net_buf_pool {
813 /** Number of buffers in pool */
814 const uint16_t buf_count;
815
816 /** Number of uninitialized buffers */
817 uint16_t uninit_count;
818
819 #if defined(CONFIG_BLE_MESH_NET_BUF_POOL_USAGE)
820 /** Amount of available buffers in the pool. */
821 int16_t avail_count;
822
823 /** Total size of the pool. */
824 const uint16_t pool_size;
825
826 /** Name of the pool. Used when printing pool information. */
827 const char *name;
828 #endif /* CONFIG_BLE_MESH_NET_BUF_POOL_USAGE */
829
830 /** Optional destroy callback when buffer is freed. */
831 void (*const destroy)(struct net_buf *buf);
832
833 /** Data allocation handlers. */
834 const struct net_buf_data_alloc *alloc;
835
836 /** Helper to access the start of storage (for net_buf_pool_init) */
837 struct net_buf *const __bufs;
838 };
839
840 #if defined(CONFIG_BLE_MESH_NET_BUF_POOL_USAGE)
841 #define NET_BUF_POOL_INITIALIZER(_pool, _alloc, _bufs, _count, _destroy) \
842 { \
843 .alloc = _alloc, \
844 .__bufs = (struct net_buf *)_bufs, \
845 .buf_count = _count, \
846 .uninit_count = _count, \
847 .avail_count = _count, \
848 .destroy = _destroy, \
849 .name = STRINGIFY(_pool), \
850 }
851 #else
852 #define NET_BUF_POOL_INITIALIZER(_pool, _alloc, _bufs, _count, _destroy) \
853 { \
854 .alloc = _alloc, \
855 .__bufs = (struct net_buf *)_bufs, \
856 .buf_count = _count, \
857 .uninit_count = _count, \
858 .destroy = _destroy, \
859 }
860 #endif /* CONFIG_BLE_MESH_NET_BUF_POOL_USAGE */
861
862 struct net_buf_pool_fixed {
863 size_t data_size;
864 uint8_t *data_pool;
865 };
866
867 /** @cond INTERNAL_HIDDEN */
868 extern const struct net_buf_data_cb net_buf_fixed_cb;
869
870 /**
871 * @def NET_BUF_POOL_FIXED_DEFINE
872 * @brief Define a new pool for buffers based on fixed-size data
873 *
874 * Defines a net_buf_pool struct and the necessary memory storage (array of
875 * structs) for the needed amount of buffers. After this, the buffers can be
876 * accessed from the pool through net_buf_alloc. The pool is defined as a
877 * static variable, so if it needs to be exported outside the current module
878 * this needs to happen with the help of a separate pointer rather than an
879 * extern declaration.
880 *
881 * The data payload of the buffers will be allocated from a byte array
882 * of fixed sized chunks. This kind of pool does not support blocking on
883 * the data allocation, so the timeout passed to net_buf_alloc will be
884 * always treated as K_NO_WAIT when trying to allocate the data. This means
885 * that allocation failures, i.e. NULL returns, must always be handled
886 * cleanly.
887 *
888 * If provided with a custom destroy callback, this callback is
889 * responsible for eventually calling net_buf_destroy() to complete the
890 * process of returning the buffer to the pool.
891 *
892 * @param _name Name of the pool variable.
893 * @param _count Number of buffers in the pool.
894 * @param _data_size Maximum data payload per buffer.
895 * @param _destroy Optional destroy callback when buffer is freed.
896 */
897 #define NET_BUF_POOL_FIXED_DEFINE(_name, _count, _data_size, _destroy) \
898 static struct net_buf net_buf_##_name[_count]; \
899 static uint8_t net_buf_data_##_name[_count][_data_size]; \
900 static const struct net_buf_pool_fixed net_buf_fixed_##_name = { \
901 .data_size = _data_size, \
902 .data_pool = (uint8_t *)net_buf_data_##_name, \
903 }; \
904 static const struct net_buf_data_alloc net_buf_fixed_alloc_##_name = { \
905 .cb = &net_buf_fixed_cb, \
906 .alloc_data = (void *)&net_buf_fixed_##_name, \
907 }; \
908 struct net_buf_pool _name __net_buf_align \
909 __in_section(_net_buf_pool, static, _name) = \
910 NET_BUF_POOL_INITIALIZER(_name, &net_buf_fixed_alloc_##_name, \
911 net_buf_##_name, _count, _destroy)
912
913 /**
914 * @def NET_BUF_POOL_DEFINE
915 * @brief Define a new pool for buffers
916 *
917 * Defines a net_buf_pool struct and the necessary memory storage (array of
918 * structs) for the needed amount of buffers. After this,the buffers can be
919 * accessed from the pool through net_buf_alloc. The pool is defined as a
920 * static variable, so if it needs to be exported outside the current module
921 * this needs to happen with the help of a separate pointer rather than an
922 * extern declaration.
923 *
924 * If provided with a custom destroy callback this callback is
925 * responsible for eventually calling net_buf_destroy() to complete the
926 * process of returning the buffer to the pool.
927 *
928 * @param _name Name of the pool variable.
929 * @param _count Number of buffers in the pool.
930 * @param _size Maximum data size for each buffer.
931 * @param _ud_size Amount of user data space to reserve.
932 * @param _destroy Optional destroy callback when buffer is freed.
933 */
934 #define NET_BUF_POOL_DEFINE(_name, _count, _size, _ud_size, _destroy) \
935 NET_BUF_POOL_FIXED_DEFINE(_name, _count, _size, _destroy)
936
937 /**
938 * @brief Get a zero-based index for a buffer.
939 *
940 * This function will translate a buffer into a zero-based index,
941 * based on its placement in its buffer pool. This can be useful if you
942 * want to associate an external array of meta-data contexts with the
943 * buffers of a pool.
944 *
945 * @param buf Network buffer.
946 *
947 * @return Zero-based index for the buffer.
948 */
949 int net_buf_id(struct net_buf *buf);
950
951 /**
952 * @brief Allocate a new fixed buffer from a pool.
953 *
954 * @param pool Which pool to allocate the buffer from.
955 * @param timeout Affects the action taken should the pool be empty.
956 * If K_NO_WAIT, then return immediately. If K_FOREVER, then
957 * wait as long as necessary. Otherwise, wait up to the specified
958 * number of milliseconds before timing out. Note that some types
959 * of data allocators do not support blocking (such as the HEAP
960 * type). In this case it's still possible for net_buf_alloc() to
961 * fail (return NULL) even if it was given K_FOREVER.
962 *
963 * @return New buffer or NULL if out of buffers.
964 */
965 #if defined(CONFIG_BLE_MESH_NET_BUF_LOG)
966 struct net_buf *net_buf_alloc_fixed_debug(struct net_buf_pool *pool, int32_t timeout,
967 const char *func, int line);
968 #define net_buf_alloc_fixed(_pool, _timeout) \
969 net_buf_alloc_fixed_debug(_pool, _timeout, __func__, __LINE__)
970 #else
971 struct net_buf *net_buf_alloc_fixed(struct net_buf_pool *pool, int32_t timeout);
972 #endif
973
974 /**
975 * @def net_buf_alloc
976 *
977 * @copydetails net_buf_alloc_fixed
978 */
979 #define net_buf_alloc(pool, timeout) net_buf_alloc_fixed(pool, timeout)
980
981 /**
982 * @brief Reset buffer
983 *
984 * Reset buffer data and flags so it can be reused for other purposes.
985 *
986 * @param buf Buffer to reset.
987 */
988 void net_buf_reset(struct net_buf *buf);
989
990 /**
991 * @def net_buf_reserve
992 * @brief Initialize buffer with the given headroom.
993 *
994 * The buffer is not expected to contain any data when this API is called.
995 *
996 * @param buf Buffer to initialize.
997 * @param reserve How much headroom to reserve.
998 */
999 #define net_buf_reserve(buf, reserve) net_buf_simple_reserve(&(buf)->b, reserve)
1000
1001 /**
1002 * @brief Put a buffer into a list
1003 *
1004 * Put a buffer to the end of a list. If the buffer contains follow-up
1005 * fragments this function will take care of inserting them as well
1006 * into the list.
1007 *
1008 * @param list Which list to append the buffer to.
1009 * @param buf Buffer.
1010 */
1011 void net_buf_slist_put(sys_slist_t *list, struct net_buf *buf);
1012
1013 /**
1014 * @brief Get a buffer from a list.
1015 *
1016 * Get buffer from a list. If the buffer had any fragments, these will
1017 * automatically be recovered from the list as well and be placed to
1018 * the buffer's fragment list.
1019 *
1020 * @param list Which list to take the buffer from.
1021 *
1022 * @return New buffer or NULL if the FIFO is empty.
1023 */
1024 struct net_buf *net_buf_slist_get(sys_slist_t *list);
1025
1026 /**
1027 * @brief Decrements the reference count of a buffer.
1028 *
1029 * Decrements the reference count of a buffer and puts it back into the
1030 * pool if the count reaches zero.
1031 *
1032 * @param buf A valid pointer on a buffer
1033 */
1034 #if defined(CONFIG_BLE_MESH_NET_BUF_LOG)
1035 void net_buf_unref_debug(struct net_buf *buf, const char *func, int line);
1036 #define net_buf_unref(_buf) \
1037 net_buf_unref_debug(_buf, __func__, __LINE__)
1038 #else
1039 void net_buf_unref(struct net_buf *buf);
1040 #endif
1041
1042 /**
1043 * @brief Increment the reference count of a buffer.
1044 *
1045 * @param buf A valid pointer on a buffer
1046 *
1047 * @return the buffer newly referenced
1048 */
1049 struct net_buf *net_buf_ref(struct net_buf *buf);
1050
1051 /**
1052 * @brief Get a pointer to the user data of a buffer.
1053 *
1054 * @param buf A valid pointer on a buffer
1055 *
1056 * @return Pointer to the user data of the buffer.
1057 */
net_buf_user_data(struct net_buf * buf)1058 static inline void *net_buf_user_data(struct net_buf *buf)
1059 {
1060 return (void *)buf->user_data;
1061 }
1062
1063 /**
1064 * @def net_buf_add
1065 * @brief Prepare data to be added at the end of the buffer
1066 *
1067 * Increments the data length of a buffer to account for more data
1068 * at the end.
1069 *
1070 * @param buf Buffer to update.
1071 * @param len Number of bytes to increment the length with.
1072 *
1073 * @return The original tail of the buffer.
1074 */
1075 #define net_buf_add(buf, len) net_buf_simple_add(&(buf)->b, len)
1076
1077 /**
1078 * @def net_buf_add_mem
1079 * @brief Copy bytes from memory to the end of the buffer
1080 *
1081 * Copies the given number of bytes to the end of the buffer. Increments the
1082 * data length of the buffer to account for more data at the end.
1083 *
1084 * @param buf Buffer to update.
1085 * @param mem Location of data to be added.
1086 * @param len Length of data to be added
1087 *
1088 * @return The original tail of the buffer.
1089 */
1090 #define net_buf_add_mem(buf, mem, len) net_buf_simple_add_mem(&(buf)->b, mem, len)
1091
1092 /**
1093 * @def net_buf_add_u8
1094 * @brief Add (8-bit) byte at the end of the buffer
1095 *
1096 * Adds a byte at the end of the buffer. Increments the data length of
1097 * the buffer to account for more data at the end.
1098 *
1099 * @param buf Buffer to update.
1100 * @param val byte value to be added.
1101 *
1102 * @return Pointer to the value added
1103 */
1104 #define net_buf_add_u8(buf, val) net_buf_simple_add_u8(&(buf)->b, val)
1105
1106 /**
1107 * @def net_buf_add_le16
1108 * @brief Add 16-bit value at the end of the buffer
1109 *
1110 * Adds 16-bit value in little endian format at the end of buffer.
1111 * Increments the data length of a buffer to account for more data
1112 * at the end.
1113 *
1114 * @param buf Buffer to update.
1115 * @param val 16-bit value to be added.
1116 */
1117 #define net_buf_add_le16(buf, val) net_buf_simple_add_le16(&(buf)->b, val)
1118
1119 /**
1120 * @def net_buf_add_be16
1121 * @brief Add 16-bit value at the end of the buffer
1122 *
1123 * Adds 16-bit value in big endian format at the end of buffer.
1124 * Increments the data length of a buffer to account for more data
1125 * at the end.
1126 *
1127 * @param buf Buffer to update.
1128 * @param val 16-bit value to be added.
1129 */
1130 #define net_buf_add_be16(buf, val) net_buf_simple_add_be16(&(buf)->b, val)
1131
1132 /**
1133 * @def net_buf_add_le24
1134 * @brief Add 24-bit value at the end of the buffer
1135 *
1136 * Adds 24-bit value in little endian format at the end of buffer.
1137 * Increments the data length of a buffer to account for more data
1138 * at the end.
1139 *
1140 * @param buf Buffer to update.
1141 * @param val 24-bit value to be added.
1142 */
1143 #define net_buf_add_le24(buf, val) net_buf_simple_add_le24(&(buf)->b, val)
1144
1145 /**
1146 * @def net_buf_add_be24
1147 * @brief Add 24-bit value at the end of the buffer
1148 *
1149 * Adds 24-bit value in big endian format at the end of buffer.
1150 * Increments the data length of a buffer to account for more data
1151 * at the end.
1152 *
1153 * @param buf Buffer to update.
1154 * @param val 24-bit value to be added.
1155 */
1156 #define net_buf_add_be24(buf, val) net_buf_simple_add_be24(&(buf)->b, val)
1157
1158 /**
1159 * @def net_buf_add_le32
1160 * @brief Add 32-bit value at the end of the buffer
1161 *
1162 * Adds 32-bit value in little endian format at the end of buffer.
1163 * Increments the data length of a buffer to account for more data
1164 * at the end.
1165 *
1166 * @param buf Buffer to update.
1167 * @param val 32-bit value to be added.
1168 */
1169 #define net_buf_add_le32(buf, val) net_buf_simple_add_le32(&(buf)->b, val)
1170
1171 /**
1172 * @def net_buf_add_be32
1173 * @brief Add 32-bit value at the end of the buffer
1174 *
1175 * Adds 32-bit value in big endian format at the end of buffer.
1176 * Increments the data length of a buffer to account for more data
1177 * at the end.
1178 *
1179 * @param buf Buffer to update.
1180 * @param val 32-bit value to be added.
1181 */
1182 #define net_buf_add_be32(buf, val) net_buf_simple_add_be32(&(buf)->b, val)
1183
1184 /**
1185 * @def net_buf_add_le48
1186 * @brief Add 48-bit value at the end of the buffer
1187 *
1188 * Adds 48-bit value in little endian format at the end of buffer.
1189 * Increments the data length of a buffer to account for more data
1190 * at the end.
1191 *
1192 * @param buf Buffer to update.
1193 * @param val 48-bit value to be added.
1194 */
1195 #define net_buf_add_le48(buf, val) net_buf_simple_add_le48(&(buf)->b, val)
1196
1197 /**
1198 * @def net_buf_add_be48
1199 * @brief Add 48-bit value at the end of the buffer
1200 *
1201 * Adds 48-bit value in big endian format at the end of buffer.
1202 * Increments the data length of a buffer to account for more data
1203 * at the end.
1204 *
1205 * @param buf Buffer to update.
1206 * @param val 48-bit value to be added.
1207 */
1208 #define net_buf_add_be48(buf, val) net_buf_simple_add_be48(&(buf)->b, val)
1209
1210 /**
1211 * @def net_buf_add_le64
1212 * @brief Add 64-bit value at the end of the buffer
1213 *
1214 * Adds 64-bit value in little endian format at the end of buffer.
1215 * Increments the data length of a buffer to account for more data
1216 * at the end.
1217 *
1218 * @param buf Buffer to update.
1219 * @param val 64-bit value to be added.
1220 */
1221 #define net_buf_add_le64(buf, val) net_buf_simple_add_le64(&(buf)->b, val)
1222
1223 /**
1224 * @def net_buf_add_be64
1225 * @brief Add 64-bit value at the end of the buffer
1226 *
1227 * Adds 64-bit value in big endian format at the end of buffer.
1228 * Increments the data length of a buffer to account for more data
1229 * at the end.
1230 *
1231 * @param buf Buffer to update.
1232 * @param val 64-bit value to be added.
1233 */
1234 #define net_buf_add_be64(buf, val) net_buf_simple_add_be64(&(buf)->b, val)
1235
1236 /**
1237 * @def net_buf_push
1238 * @brief Push data to the beginning of the buffer.
1239 *
1240 * Modifies the data pointer and buffer length to account for more data
1241 * in the beginning of the buffer.
1242 *
1243 * @param buf Buffer to update.
1244 * @param len Number of bytes to add to the beginning.
1245 *
1246 * @return The new beginning of the buffer data.
1247 */
1248 #define net_buf_push(buf, len) net_buf_simple_push(&(buf)->b, len)
1249
1250 /**
1251 * @def net_buf_push_le16
1252 * @brief Push 16-bit value to the beginning of the buffer
1253 *
1254 * Adds 16-bit value in little endian format to the beginning of the
1255 * buffer.
1256 *
1257 * @param buf Buffer to update.
1258 * @param val 16-bit value to be pushed to the buffer.
1259 */
1260 #define net_buf_push_le16(buf, val) net_buf_simple_push_le16(&(buf)->b, val)
1261
1262 /**
1263 * @def net_buf_push_be16
1264 * @brief Push 16-bit value to the beginning of the buffer
1265 *
1266 * Adds 16-bit value in little endian format to the beginning of the
1267 * buffer.
1268 *
1269 * @param buf Buffer to update.
1270 * @param val 16-bit value to be pushed to the buffer.
1271 */
1272 #define net_buf_push_be16(buf, val) net_buf_simple_push_be16(&(buf)->b, val)
1273
1274 /**
1275 * @def net_buf_push_u8
1276 * @brief Push 8-bit value to the beginning of the buffer
1277 *
1278 * Adds 8-bit value the beginning of the buffer.
1279 *
1280 * @param buf Buffer to update.
1281 * @param val 8-bit value to be pushed to the buffer.
1282 */
1283 #define net_buf_push_u8(buf, val) net_buf_simple_push_u8(&(buf)->b, val)
1284
1285 /**
1286 * @def net_buf_push_le24
1287 * @brief Push 24-bit value to the beginning of the buffer
1288 *
1289 * Adds 24-bit value in little endian format to the beginning of the
1290 * buffer.
1291 *
1292 * @param buf Buffer to update.
1293 * @param val 24-bit value to be pushed to the buffer.
1294 */
1295 #define net_buf_push_le24(buf, val) net_buf_simple_push_le24(&(buf)->b, val)
1296
1297 /**
1298 * @def net_buf_push_be24
1299 * @brief Push 24-bit value to the beginning of the buffer
1300 *
1301 * Adds 24-bit value in little endian format to the beginning of the
1302 * buffer.
1303 *
1304 * @param buf Buffer to update.
1305 * @param val 24-bit value to be pushed to the buffer.
1306 */
1307 #define net_buf_push_be24(buf, val) net_buf_simple_push_be24(&(buf)->b, val)
1308
1309 /**
1310 * @def net_buf_push_le32
1311 * @brief Push 32-bit value to the beginning of the buffer
1312 *
1313 * Adds 32-bit value in little endian format to the beginning of the
1314 * buffer.
1315 *
1316 * @param buf Buffer to update.
1317 * @param val 32-bit value to be pushed to the buffer.
1318 */
1319 #define net_buf_push_le32(buf, val) net_buf_simple_push_le32(&(buf)->b, val)
1320
1321 /**
1322 * @def net_buf_push_be32
1323 * @brief Push 32-bit value to the beginning of the buffer
1324 *
1325 * Adds 32-bit value in little endian format to the beginning of the
1326 * buffer.
1327 *
1328 * @param buf Buffer to update.
1329 * @param val 32-bit value to be pushed to the buffer.
1330 */
1331 #define net_buf_push_be32(buf, val) net_buf_simple_push_be32(&(buf)->b, val)
1332
1333 /**
1334 * @def net_buf_push_le48
1335 * @brief Push 48-bit value to the beginning of the buffer
1336 *
1337 * Adds 48-bit value in little endian format to the beginning of the
1338 * buffer.
1339 *
1340 * @param buf Buffer to update.
1341 * @param val 48-bit value to be pushed to the buffer.
1342 */
1343 #define net_buf_push_le48(buf, val) net_buf_simple_push_le48(&(buf)->b, val)
1344
1345 /**
1346 * @def net_buf_push_be48
1347 * @brief Push 48-bit value to the beginning of the buffer
1348 *
1349 * Adds 48-bit value in little endian format to the beginning of the
1350 * buffer.
1351 *
1352 * @param buf Buffer to update.
1353 * @param val 48-bit value to be pushed to the buffer.
1354 */
1355 #define net_buf_push_be48(buf, val) net_buf_simple_push_be48(&(buf)->b, val)
1356
1357 /**
1358 * @def net_buf_push_le64
1359 * @brief Push 64-bit value to the beginning of the buffer
1360 *
1361 * Adds 64-bit value in little endian format to the beginning of the
1362 * buffer.
1363 *
1364 * @param buf Buffer to update.
1365 * @param val 64-bit value to be pushed to the buffer.
1366 */
1367 #define net_buf_push_le64(buf, val) net_buf_simple_push_le64(&(buf)->b, val)
1368
1369 /**
1370 * @def net_buf_push_be64
1371 * @brief Push 64-bit value to the beginning of the buffer
1372 *
1373 * Adds 64-bit value in little endian format to the beginning of the
1374 * buffer.
1375 *
1376 * @param buf Buffer to update.
1377 * @param val 64-bit value to be pushed to the buffer.
1378 */
1379 #define net_buf_push_be64(buf, val) net_buf_simple_push_be64(&(buf)->b, val)
1380
1381 /**
1382 * @def net_buf_pull
1383 * @brief Remove data from the beginning of the buffer.
1384 *
1385 * Removes data from the beginning of the buffer by modifying the data
1386 * pointer and buffer length.
1387 *
1388 * @param buf Buffer to update.
1389 * @param len Number of bytes to remove.
1390 *
1391 * @return New beginning of the buffer data.
1392 */
1393 #define net_buf_pull(buf, len) net_buf_simple_pull(&(buf)->b, len)
1394
1395 /**
1396 * @def net_buf_pull_mem
1397 * @brief Remove data from the beginning of the buffer.
1398 *
1399 * Removes data from the beginning of the buffer by modifying the data
1400 * pointer and buffer length.
1401 *
1402 * @param buf Buffer to update.
1403 * @param len Number of bytes to remove.
1404 *
1405 * @return Pointer to the old beginning of the buffer data.
1406 */
1407 #define net_buf_pull_mem(buf, len) net_buf_simple_pull_mem(&(buf)->b, len)
1408
1409 /**
1410 * @def net_buf_pull_u8
1411 * @brief Remove a 8-bit value from the beginning of the buffer
1412 *
1413 * Same idea as with net_buf_pull(), but a helper for operating on
1414 * 8-bit values.
1415 *
1416 * @param buf A valid pointer on a buffer.
1417 *
1418 * @return The 8-bit removed value
1419 */
1420 #define net_buf_pull_u8(buf) net_buf_simple_pull_u8(&(buf)->b)
1421
1422 /**
1423 * @def net_buf_pull_le16
1424 * @brief Remove and convert 16 bits from the beginning of the buffer.
1425 *
1426 * Same idea as with net_buf_pull(), but a helper for operating on
1427 * 16-bit little endian data.
1428 *
1429 * @param buf A valid pointer on a buffer.
1430 *
1431 * @return 16-bit value converted from little endian to host endian.
1432 */
1433 #define net_buf_pull_le16(buf) net_buf_simple_pull_le16(&(buf)->b)
1434
1435 /**
1436 * @def net_buf_pull_be16
1437 * @brief Remove and convert 16 bits from the beginning of the buffer.
1438 *
1439 * Same idea as with net_buf_pull(), but a helper for operating on
1440 * 16-bit big endian data.
1441 *
1442 * @param buf A valid pointer on a buffer.
1443 *
1444 * @return 16-bit value converted from big endian to host endian.
1445 */
1446 #define net_buf_pull_be16(buf) net_buf_simple_pull_be16(&(buf)->b)
1447
1448 /**
1449 * @def net_buf_pull_le24
1450 * @brief Remove and convert 24 bits from the beginning of the buffer.
1451 *
1452 * Same idea as with net_buf_pull(), but a helper for operating on
1453 * 24-bit little endian data.
1454 *
1455 * @param buf A valid pointer on a buffer.
1456 *
1457 * @return 24-bit value converted from little endian to host endian.
1458 */
1459 #define net_buf_pull_le24(buf) net_buf_simple_pull_le24(&(buf)->b)
1460
1461 /**
1462 * @def net_buf_pull_be24
1463 * @brief Remove and convert 24 bits from the beginning of the buffer.
1464 *
1465 * Same idea as with net_buf_pull(), but a helper for operating on
1466 * 24-bit big endian data.
1467 *
1468 * @param buf A valid pointer on a buffer.
1469 *
1470 * @return 24-bit value converted from big endian to host endian.
1471 */
1472 #define net_buf_pull_be24(buf) net_buf_simple_pull_be24(&(buf)->b)
1473
1474 /**
1475 * @def net_buf_pull_le32
1476 * @brief Remove and convert 32 bits from the beginning of the buffer.
1477 *
1478 * Same idea as with net_buf_pull(), but a helper for operating on
1479 * 32-bit little endian data.
1480 *
1481 * @param buf A valid pointer on a buffer.
1482 *
1483 * @return 32-bit value converted from little endian to host endian.
1484 */
1485 #define net_buf_pull_le32(buf) net_buf_simple_pull_le32(&(buf)->b)
1486
1487 /**
1488 * @def net_buf_pull_be32
1489 * @brief Remove and convert 32 bits from the beginning of the buffer.
1490 *
1491 * Same idea as with net_buf_pull(), but a helper for operating on
1492 * 32-bit big endian data.
1493 *
1494 * @param buf A valid pointer on a buffer
1495 *
1496 * @return 32-bit value converted from big endian to host endian.
1497 */
1498 #define net_buf_pull_be32(buf) net_buf_simple_pull_be32(&(buf)->b)
1499
1500 /**
1501 * @def net_buf_pull_le48
1502 * @brief Remove and convert 48 bits from the beginning of the buffer.
1503 *
1504 * Same idea as with net_buf_pull(), but a helper for operating on
1505 * 48-bit little endian data.
1506 *
1507 * @param buf A valid pointer on a buffer.
1508 *
1509 * @return 48-bit value converted from little endian to host endian.
1510 */
1511 #define net_buf_pull_le48(buf) net_buf_simple_pull_le48(&(buf)->b)
1512
1513 /**
1514 * @def net_buf_pull_be48
1515 * @brief Remove and convert 48 bits from the beginning of the buffer.
1516 *
1517 * Same idea as with net_buf_pull(), but a helper for operating on
1518 * 48-bit big endian data.
1519 *
1520 * @param buf A valid pointer on a buffer
1521 *
1522 * @return 48-bit value converted from big endian to host endian.
1523 */
1524 #define net_buf_pull_be48(buf) net_buf_simple_pull_be48(&(buf)->b)
1525
1526 /**
1527 * @def net_buf_pull_le64
1528 * @brief Remove and convert 64 bits from the beginning of the buffer.
1529 *
1530 * Same idea as with net_buf_pull(), but a helper for operating on
1531 * 64-bit little endian data.
1532 *
1533 * @param buf A valid pointer on a buffer.
1534 *
1535 * @return 64-bit value converted from little endian to host endian.
1536 */
1537 #define net_buf_pull_le64(buf) net_buf_simple_pull_le64(&(buf)->b)
1538
1539 /**
1540 * @def net_buf_pull_be64
1541 * @brief Remove and convert 64 bits from the beginning of the buffer.
1542 *
1543 * Same idea as with net_buf_pull(), but a helper for operating on
1544 * 64-bit big endian data.
1545 *
1546 * @param buf A valid pointer on a buffer
1547 *
1548 * @return 64-bit value converted from big endian to host endian.
1549 */
1550 #define net_buf_pull_be64(buf) net_buf_simple_pull_be64(&(buf)->b)
1551
1552 /**
1553 * @def net_buf_tailroom
1554 * @brief Check buffer tailroom.
1555 *
1556 * Check how much free space there is at the end of the buffer.
1557 *
1558 * @param buf A valid pointer on a buffer
1559 *
1560 * @return Number of bytes available at the end of the buffer.
1561 */
1562 #define net_buf_tailroom(buf) net_buf_simple_tailroom(&(buf)->b)
1563
1564 /**
1565 * @def net_buf_headroom
1566 * @brief Check buffer headroom.
1567 *
1568 * Check how much free space there is in the beginning of the buffer.
1569 *
1570 * buf A valid pointer on a buffer
1571 *
1572 * @return Number of bytes available in the beginning of the buffer.
1573 */
1574 #define net_buf_headroom(buf) net_buf_simple_headroom(&(buf)->b)
1575
1576 /**
1577 * @def net_buf_tail
1578 * @brief Get the tail pointer for a buffer.
1579 *
1580 * Get a pointer to the end of the data in a buffer.
1581 *
1582 * @param buf Buffer.
1583 *
1584 * @return Tail pointer for the buffer.
1585 */
1586 #define net_buf_tail(buf) net_buf_simple_tail(&(buf)->b)
1587
1588 /**
1589 * @brief Find the last fragment in the fragment list.
1590 *
1591 * @return Pointer to last fragment in the list.
1592 */
1593 struct net_buf *net_buf_frag_last(struct net_buf *frags);
1594
1595 /**
1596 * @brief Insert a new fragment to a chain of bufs.
1597 *
1598 * Insert a new fragment into the buffer fragments list after the parent.
1599 *
1600 * Note: This function takes ownership of the fragment reference so the
1601 * caller is not required to unref.
1602 *
1603 * @param parent Parent buffer/fragment.
1604 * @param frag Fragment to insert.
1605 */
1606 void net_buf_frag_insert(struct net_buf *parent, struct net_buf *frag);
1607
1608 /**
1609 * @brief Add a new fragment to the end of a chain of bufs.
1610 *
1611 * Append a new fragment into the buffer fragments list.
1612 *
1613 * Note: This function takes ownership of the fragment reference so the
1614 * caller is not required to unref.
1615 *
1616 * @param head Head of the fragment chain.
1617 * @param frag Fragment to add.
1618 *
1619 * @return New head of the fragment chain. Either head (if head
1620 * was non-NULL) or frag (if head was NULL).
1621 */
1622 struct net_buf *net_buf_frag_add(struct net_buf *head, struct net_buf *frag);
1623
1624 /**
1625 * @brief Delete existing fragment from a chain of bufs.
1626 *
1627 * @param parent Parent buffer/fragment, or NULL if there is no parent.
1628 * @param frag Fragment to delete.
1629 *
1630 * @return Pointer to the buffer following the fragment, or NULL if it
1631 * had no further fragments.
1632 */
1633 #if defined(CONFIG_BLE_MESH_NET_BUF_LOG)
1634 struct net_buf *net_buf_frag_del_debug(struct net_buf *parent,
1635 struct net_buf *frag,
1636 const char *func, int line);
1637 #define net_buf_frag_del(_parent, _frag) \
1638 net_buf_frag_del_debug(_parent, _frag, __func__, __LINE__)
1639 #else
1640 struct net_buf *net_buf_frag_del(struct net_buf *parent, struct net_buf *frag);
1641 #endif
1642
1643 /**
1644 * @brief Copy bytes from net_buf chain starting at offset to linear buffer
1645 *
1646 * Copy (extract) @a len bytes from @a src net_buf chain, starting from @a
1647 * offset in it, to a linear buffer @a dst. Return number of bytes actually
1648 * copied, which may be less than requested, if net_buf chain doesn't have
1649 * enough data, or destination buffer is too small.
1650 *
1651 * @param dst Destination buffer
1652 * @param dst_len Destination buffer length
1653 * @param src Source net_buf chain
1654 * @param offset Starting offset to copy from
1655 * @param len Number of bytes to copy
1656 * @return number of bytes actually copied
1657 */
1658 size_t net_buf_linearize(void *dst, size_t dst_len,
1659 struct net_buf *src, size_t offset, size_t len);
1660
1661 /**
1662 * @typedef net_buf_allocator_cb
1663 * @brief Network buffer allocator callback.
1664 *
1665 * @details The allocator callback is called when net_buf_append_bytes
1666 * needs to allocate a new net_buf.
1667 *
1668 * @param timeout Affects the action taken should the net buf pool be empty.
1669 * If K_NO_WAIT, then return immediately. If K_FOREVER, then
1670 * wait as long as necessary. Otherwise, wait up to the specified
1671 * number of milliseconds before timing out.
1672 * @param user_data The user data given in net_buf_append_bytes call.
1673 * @return pointer to allocated net_buf or NULL on error.
1674 */
1675 typedef struct net_buf *(*net_buf_allocator_cb)(int32_t timeout, void *user_data);
1676
1677 /**
1678 * @brief Append data to a list of net_buf
1679 *
1680 * @details Append data to a net_buf. If there is not enough space in the
1681 * net_buf then more net_buf will be added, unless there are no free net_buf
1682 * and timeout occurs.
1683 *
1684 * @param buf Network buffer.
1685 * @param len Total length of input data
1686 * @param value Data to be added
1687 * @param timeout Timeout is passed to the net_buf allocator callback.
1688 * @param allocate_cb When a new net_buf is required, use this callback.
1689 * @param user_data A user data pointer to be supplied to the allocate_cb.
1690 * This pointer is can be anything from a mem_pool or a net_pkt, the
1691 * logic is left up to the allocate_cb function.
1692 *
1693 * @return Length of data actually added. This may be less than input
1694 * length if other timeout than K_FOREVER was used, and there
1695 * were no free fragments in a pool to accommodate all data.
1696 */
1697 size_t net_buf_append_bytes(struct net_buf *buf, size_t len,
1698 const void *value, int32_t timeout,
1699 net_buf_allocator_cb allocate_cb, void *user_data);
1700
1701 /**
1702 * @brief Skip N number of bytes in a net_buf
1703 *
1704 * @details Skip N number of bytes starting from fragment's offset. If the total
1705 * length of data is placed in multiple fragments, this function will skip from
1706 * all fragments until it reaches N number of bytes. Any fully skipped buffers
1707 * are removed from the net_buf list.
1708 *
1709 * @param buf Network buffer.
1710 * @param len Total length of data to be skipped.
1711 *
1712 * @return Pointer to the fragment or
1713 * NULL and pos is 0 after successful skip,
1714 * NULL and pos is 0xffff otherwise.
1715 */
net_buf_skip(struct net_buf * buf,size_t len)1716 static inline struct net_buf *net_buf_skip(struct net_buf *buf, size_t len)
1717 {
1718 while (buf && len--) {
1719 net_buf_pull_u8(buf);
1720 if (!buf->len) {
1721 buf = net_buf_frag_del(NULL, buf);
1722 }
1723 }
1724
1725 return buf;
1726 }
1727
1728 /**
1729 * @brief Calculate amount of bytes stored in fragments.
1730 *
1731 * Calculates the total amount of data stored in the given buffer and the
1732 * fragments linked to it.
1733 *
1734 * @param buf Buffer to start off with.
1735 *
1736 * @return Number of bytes in the buffer and its fragments.
1737 */
net_buf_frags_len(struct net_buf * buf)1738 static inline size_t net_buf_frags_len(struct net_buf *buf)
1739 {
1740 size_t bytes = 0;
1741
1742 while (buf) {
1743 bytes += buf->len;
1744 buf = buf->frags;
1745 }
1746
1747 return bytes;
1748 }
1749
1750 /**
1751 * @}
1752 */
1753
1754 #ifdef __cplusplus
1755 }
1756 #endif
1757
1758 #endif /* _BLE_MESH_BUF_H_ */
1759