#pragma once

/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#include <stdint.h>
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/bits.h>
#include <osmocom/core/defs.h>

/*! \defgroup msgb Message buffers
 *  @{
 * \file msgb.h */

#define MSGB_DEBUG

/*! Osmocom message buffer */
struct msgb {
	struct llist_head list; /*!< linked list header */


	/* Part of which TRX logical channel we were received / transmitted */
	/* FIXME: move them into the control buffer */
	union {
		void *dst; /*!< reference of origin/destination */
		struct gsm_bts_trx *trx;
	};
	struct gsm_lchan *lchan; /*!< logical channel */

	unsigned char *l1h; /*!< pointer to Layer1 header (if any) */
	unsigned char *l2h; /*!< pointer to A-bis layer 2 header: OML, RSL(RLL), NS */
	unsigned char *l3h; /*!< pointer to Layer 3 header. For OML: FOM; RSL: 04.08; GPRS: BSSGP */
	unsigned char *l4h; /*!< pointer to layer 4 header */

	unsigned long cb[5]; /*!< control buffer */

	uint16_t data_len;   /*!< length of underlying data array */
	uint16_t len;	     /*!< length of bytes used in msgb */

	unsigned char *head;	/*!< start of underlying memory buffer */
	unsigned char *tail;	/*!< end of message in buffer */
	unsigned char *data;	/*!< start of message in buffer */
	unsigned char _data[0]; /*!< optional immediate data array */
};

extern struct msgb *msgb_alloc_c(const void *ctx, uint16_t size, const char *name);
extern struct msgb *msgb_alloc(uint16_t size, const char *name);
extern void msgb_free(struct msgb *m);
extern void msgb_enqueue(struct llist_head *queue, struct msgb *msg);
extern struct msgb *msgb_dequeue(struct llist_head *queue);
extern void msgb_reset(struct msgb *m);
uint16_t msgb_length(const struct msgb *msg);
extern const char *msgb_hexdump(const struct msgb *msg);
char *msgb_hexdump_buf(char *buf, size_t buf_len, const struct msgb *msg);
char *msgb_hexdump_c(const void *ctx, const struct msgb *msg);
extern int msgb_resize_area(struct msgb *msg, uint8_t *area,
	int old_size, int new_size);
extern struct msgb *msgb_copy(const struct msgb *msg, const char *name);
extern struct msgb *msgb_copy_c(const void *ctx, const struct msgb *msg, const char *name);
extern struct msgb *msgb_copy_resize(const struct msgb *msg, uint16_t new_len, const char *name);
extern struct msgb *msgb_copy_resize_c(const void *ctx, const struct msgb *msg, uint16_t new_len, const char *name);
static int msgb_test_invariant(const struct msgb *msg) __attribute__((pure));

/*! Free all msgbs from a queue built with msgb_enqueue().
 * \param[in] queue  list head of a msgb queue.
 */
static inline void msgb_queue_free(struct llist_head *queue)
{
	struct msgb *msg;
	while ((msg = msgb_dequeue(queue))) msgb_free(msg);
}

/*! Enqueue message buffer to tail of a queue and increment queue size counter
 * \param[in] queue linked list header of queue
 * \param[in] msg message buffer to be added to the queue
 * \param[in] count pointer to variable holding size of the queue
 *
 * The function will append the specified message buffer \a msg to the queue
 * implemented by \ref llist_head \a queue using function \ref msgb_enqueue_count,
 * then increment \a count
 */
static inline void msgb_enqueue_count(struct llist_head *queue, struct msgb *msg,
					unsigned int *count)
{
	msgb_enqueue(queue, msg);
	(*count)++;
}

/*! Dequeue message buffer from head of queue and decrement queue size counter
 * \param[in] queue linked list header of queue
 * \param[in] count pointer to variable holding size of the queue
 * \returns message buffer (if any) or NULL if queue empty
 *
 * The function will remove the first message buffer from the queue
 * implemented by \ref llist_head \a queue using function \ref msgb_enqueue_count,
 * and decrement \a count, all if queue is not empty.
 */
static inline struct msgb *msgb_dequeue_count(struct llist_head *queue,
						unsigned int *count)
{
	struct msgb *msg = msgb_dequeue(queue);
	if (msg)
		(*count)--;
	return msg;
}

#ifdef MSGB_DEBUG
#include <osmocom/core/panic.h>
#define MSGB_ABORT(msg, fmt, args ...) do {		\
	osmo_panic("msgb(%p): " fmt, msg, ## args);	\
	} while(0)
#else
#define MSGB_ABORT(msg, fmt, args ...)
#endif

/*! obtain L1 header of msgb */
#define msgb_l1(m)	((void *)(m->l1h))
/*! obtain L2 header of msgb */
#define msgb_l2(m)	((void *)(m->l2h))
/*! obtain L3 header of msgb */
#define msgb_l3(m)	((void *)(m->l3h))
/*! obtain L4 header of msgb */
#define msgb_l4(m)	((void *)(m->l4h))
/*! obtain SMS header of msgb */
#define msgb_sms(m)	msgb_l4(m)

/*! determine length of L1 message
 *  \param[in] msgb message buffer
 *  \returns size of L1 message in bytes
 *
 * This function computes the number of bytes between the tail of the
 * message and the layer 1 header.
 */
static inline unsigned int msgb_l1len(const struct msgb *msgb)
{
	OSMO_ASSERT(msgb->l1h);
	return msgb->tail - (uint8_t *)msgb_l1(msgb);
}

/*! determine length of L2 message
 *  \param[in] msgb message buffer
 *  \returns size of L2 message in bytes
 *
 * This function computes the number of bytes between the tail of the
 * message and the layer 2 header.
 */
static inline unsigned int msgb_l2len(const struct msgb *msgb)
{
	OSMO_ASSERT(msgb->l2h);
	return msgb->tail - (uint8_t *)msgb_l2(msgb);
}

/*! determine length of L3 message
 *  \param[in] msgb message buffer
 *  \returns size of L3 message in bytes
 *
 * This function computes the number of bytes between the tail of the
 * message and the layer 3 header.
 */
static inline unsigned int msgb_l3len(const struct msgb *msgb)
{
	OSMO_ASSERT(msgb->l3h);
	return msgb->tail - (uint8_t *)msgb_l3(msgb);
}

/*! determine length of L4 message
 *  \param[in] msgb message buffer
 *  \returns size of L4 message in bytes
 *
 * This function computes the number of bytes between the tail of the
 * message and the layer 4 header.
 */
static inline unsigned int msgb_l4len(const struct msgb *msgb)
{
	OSMO_ASSERT(msgb->l4h);
	return msgb->tail - (uint8_t *)msgb_l4(msgb);
}

/*! determine the length of the header
 *  \param[in] msgb message buffer
 *  \returns number of bytes between start of buffer and start of msg
 *
 * This function computes the length difference between the underlying
 * data buffer and the used section of the \a msgb.
 */
static inline unsigned int msgb_headlen(const struct msgb *msgb)
{
	return msgb->len - msgb->data_len;
}

/*! determine how much tail room is left in msgb
 *  \param[in] msgb message buffer
 *  \returns number of bytes remaining at end of msgb
 *
 * This function computes the amount of octets left in the underlying
 * data buffer after the end of the message.
 */
static inline int msgb_tailroom(const struct msgb *msgb)
{
	return (msgb->head + msgb->data_len) - msgb->tail;
}

/*! determine the amount of headroom in msgb
 *  \param[in] msgb message buffer
 *  \returns number of bytes left ahead of message start in msgb
 *
 * This function computes the amount of bytes left in the underlying
 * data buffer before the start of the actual message.
 */
static inline int msgb_headroom(const struct msgb *msgb)
{
	return (msgb->data - msgb->head);
}

/*! append data to end of message buffer
 *  \param[in] msgb message buffer
 *  \param[in] len number of bytes to append to message
 *  \returns pointer to start of newly-appended data
 *
 * This function will move the \a tail pointer of the message buffer \a
 * len bytes further, thus enlarging the message by \a len bytes.
 *
 * The return value is a pointer to start of the newly added section at
 * the end of the message and can be used for actually filling/copying
 * data into it.
 */
static inline unsigned char *msgb_put(struct msgb *msgb, unsigned int len)
{
	unsigned char *tmp = msgb->tail;
	if (OSMO_UNLIKELY(msgb_tailroom(msgb) < (int) len))
		MSGB_ABORT(msgb, "Not enough tailroom msgb_put"
			   " (allocated %u, head at %u, len %u, tailroom %u < want tailroom %u)\n",
			   msgb->data_len - sizeof(struct msgb),
			   msgb->head - msgb->_data,
			   msgb->len,
			   msgb_tailroom(msgb), len);
	msgb->tail += len;
	msgb->len += len;
	return tmp;
}

/*! append a uint8 value to the end of the message
 *  \param[in] msgb message buffer
 *  \param[in] word unsigned 8bit byte to be appended
 */
static inline void msgb_put_u8(struct msgb *msgb, uint8_t word)
{
	uint8_t *space = msgb_put(msgb, 1);
	space[0] = word & 0xFF;
}

/*! append a uint16 value to the end of the message
 *  \param[in] msgb message buffer
 *  \param[in] word unsigned 16bit byte to be appended
 */
static inline void msgb_put_u16(struct msgb *msgb, uint16_t word)
{
	uint8_t *space = msgb_put(msgb, 2);
	osmo_store16be(word, space);
}

/*! append a uint32 value to the end of the message
 *  \param[in] msgb message buffer
 *  \param[in] word unsigned 32bit byte to be appended
 */
static inline void msgb_put_u32(struct msgb *msgb, uint32_t word)
{
	uint8_t *space = msgb_put(msgb, 4);
	osmo_store32be(word, space);
}

/*! remove data from end of message
 *  \param[in] msgb message buffer
 *  \param[in] len number of bytes to remove from end
 */
static inline unsigned char *msgb_get(struct msgb *msgb, unsigned int len)
{
	if (OSMO_UNLIKELY(msgb_length(msgb) < len))
		MSGB_ABORT(msgb, "msgb too small to get %u (len %u)\n",
			   len, msgb_length(msgb));
	msgb->tail -= len;
	msgb->len -= len;
	return msgb->tail;
}

/*! remove uint8 from end of message
 *  \param[in] msgb message buffer
 *  \returns 8bit value taken from end of msgb
 */
static inline uint8_t msgb_get_u8(struct msgb *msgb)
{
	uint8_t *space = msgb_get(msgb, 1);
	return space[0];
}

/*! remove uint16 from end of message
 *  \param[in] msgb message buffer
 *  \returns 16bit value taken from end of msgb
 */
static inline uint16_t msgb_get_u16(struct msgb *msgb)
{
	uint8_t *space = msgb_get(msgb, 2);
	return osmo_load16be(space);
}

/*! remove uint32 from end of message
 *  \param[in] msgb message buffer
 *  \returns 32bit value taken from end of msgb
 */
static inline uint32_t msgb_get_u32(struct msgb *msgb)
{
	uint8_t *space = msgb_get(msgb, 4);
	return osmo_load32be(space);
}

/*! prepend (push) some data to start of message
 *  \param[in] msgb message buffer
 *  \param[in] len number of bytes to pre-pend
 *  \returns pointer to newly added portion at start of \a msgb
 *
 * This function moves the \a data pointer of the \ref msgb further
 * to the front (by \a len bytes), thereby enlarging the message by \a
 * len bytes.
 *
 * The return value is a pointer to the newly added section in the
 * beginning of the message.  It can be used to fill/copy data into it.
 */
static inline unsigned char *msgb_push(struct msgb *msgb, unsigned int len)
{
	if (OSMO_UNLIKELY(msgb_headroom(msgb) < (int) len))
		MSGB_ABORT(msgb, "Not enough headroom msgb_push"
			   " (allocated %u, head at %u < want headroom %u, len %u, tailroom %u)\n",
			   msgb->data_len - sizeof(struct msgb),
			   msgb->head - msgb->_data,
			   len,
			   msgb->len,
			   msgb_tailroom(msgb));
	msgb->data -= len;
	msgb->len += len;
	return msgb->data;
}

/*! prepend a uint8 value to the head of the message
 *  \param[in] msg message buffer
 *  \param[in] word unsigned 8bit byte to be prepended
 */
static inline void msgb_push_u8(struct msgb *msg, uint8_t word)
{
	uint8_t *space = msgb_push(msg, 1);
	space[0] = word;
}

/*! prepend a uint16 value to the head of the message
 *  \param[in] msg message buffer
 *  \param[in] word unsigned 16bit byte to be prepended
 */
static inline void msgb_push_u16(struct msgb *msg, uint16_t word)
{
	uint16_t *space = (uint16_t *) msgb_push(msg, 2);
	osmo_store16be(word, space);
}

/*! prepend a uint32 value to the head of the message
 *  \param[in] msg message buffer
 *  \param[in] word unsigned 32bit byte to be prepended
 */
static inline void msgb_push_u32(struct msgb *msg, uint32_t word)
{
	uint32_t *space = (uint32_t *) msgb_push(msg, 4);
	osmo_store32be(word, space);
}

static inline unsigned char *msgb_push_tl(struct msgb *msgb, uint8_t tag)
{
	uint8_t *data = msgb_push(msgb, 2);

	data[0] = tag;
	data[1] = msgb->len - 2;
	return data;
}

/*! remove (pull) a header from the front of the message buffer
 *  \param[in] msgb message buffer
 *  \param[in] len number of octets to be pulled
 *  \returns pointer to new start of msgb
 *
 * This function moves the \a data pointer of the \ref msgb further back
 * in the message, thereby shrinking the size of the message by \a len
 * bytes.
 */
static inline unsigned char *msgb_pull(struct msgb *msgb, unsigned int len)
{
	if (OSMO_UNLIKELY(msgb_length(msgb) < len))
		MSGB_ABORT(msgb, "msgb too small to pull %u (len %u)\n",
			   len, msgb_length(msgb));
	msgb->len -= len;
	return msgb->data += len;
}

/*! remove (pull) all headers in front of l3h from the message buffer.
 *  \param[in] msg message buffer with a valid l3h
 *  \returns pointer to new start of msgb (l3h)
 *
 * This function moves the \a data pointer of the \ref msgb further back
 * in the message, thereby shrinking the size of the message.
 * l1h and l2h will be cleared.
 */
static inline unsigned char *msgb_pull_to_l3(struct msgb *msg)
{
	unsigned char *ret = msgb_pull(msg, msg->l3h - msg->data);
	msg->l1h = msg->l2h = NULL;
	return ret;
}

/*! remove (pull) all headers in front of l2h from the message buffer.
 *  \param[in] msg message buffer with a valid l2h
 *  \returns pointer to new start of msgb (l2h)
 *
 * This function moves the \a data pointer of the \ref msgb further back
 * in the message, thereby shrinking the size of the message.
 * l1h will be cleared.
 */
static inline unsigned char *msgb_pull_to_l2(struct msgb *msg)
{
	unsigned char *ret = msgb_pull(msg, msg->l2h - msg->data);
	msg->l1h = NULL;
	return ret;
}

/*! remove uint8 from front of message
 *  \param[in] msgb message buffer
 *  \returns 8bit value taken from end of msgb
 */
static inline uint8_t msgb_pull_u8(struct msgb *msgb)
{
	uint8_t *space = msgb_pull(msgb, 1) - 1;
	return space[0];
}

/*! remove uint16 from front of message
 *  \param[in] msgb message buffer
 *  \returns 16bit value taken from end of msgb
 */
static inline uint16_t msgb_pull_u16(struct msgb *msgb)
{
	uint8_t *space = msgb_pull(msgb, 2) - 2;
	return osmo_load16be(space);
}

/*! remove uint32 from front of message
 *  \param[in] msgb message buffer
 *  \returns 32bit value taken from end of msgb
 */
static inline uint32_t msgb_pull_u32(struct msgb *msgb)
{
	uint8_t *space = msgb_pull(msgb, 4) - 4;
	return osmo_load32be(space);
}

/*! Increase headroom of empty msgb, reducing the tailroom
 *  \param[in] msg message buffer
 *  \param[in] len amount of extra octets to be reserved as headroom
 *
 * This function reserves some memory at the beginning of the underlying
 * data buffer.  The idea is to reserve space in case further headers
 * have to be pushed to the \ref msgb during further processing.
 *
 * Calling this function leads to undefined reusults if it is called on
 * a non-empty \ref msgb.
 */
static inline void msgb_reserve(struct msgb *msg, int len)
{
	msg->data += len;
	msg->tail += len;
}

/*! Trim the msgb to a given absolute length
 *  \param[in] msg message buffer
 *  \param[in] len new total length of buffer
 *  \returns 0 in case of success, negative in case of error
 */
static inline int msgb_trim(struct msgb *msg, int len)
{
	if (OSMO_UNLIKELY(len < 0))
		MSGB_ABORT(msg, "Negative length is not allowed\n");
	if (OSMO_UNLIKELY(len > msg->data_len))
		return -1;

	msg->len = len;
	msg->tail = msg->data + len;

	return 0;
}

/*! Trim the msgb to a given layer3 length
 *  \param[in] msg message buffer
 *  \param[in] l3len new layer3 length
 *  \returns 0 in case of success, negative in case of error
 */
static inline int msgb_l3trim(struct msgb *msg, int l3len)
{
	return msgb_trim(msg, (msg->l3h - msg->data) + l3len);
}

/*! Allocate message buffer with specified headroom from specified talloc context.
 *  \param[in] ctx talloc context from which to allocate
 *  \param[in] size size in bytes, including headroom
 *  \param[in] headroom headroom in bytes
 *  \param[in] name human-readable name
 *  \returns allocated message buffer with specified headroom
 *
 * This function is a convenience wrapper around \ref msgb_alloc
 * followed by \ref msgb_reserve in order to create a new \ref msgb with
 * user-specified amount of headroom.
 */
static inline struct msgb *msgb_alloc_headroom_c(const void *ctx, uint16_t size, uint16_t headroom,
						 const char *name)
{
	osmo_static_assert(size >= headroom, headroom_bigger);

	struct msgb *msg = msgb_alloc_c(ctx, size, name);
	if (OSMO_LIKELY(msg))
		msgb_reserve(msg, headroom);
	return msg;
}


/*! Allocate message buffer with specified headroom
 *  \param[in] size size in bytes, including headroom
 *  \param[in] headroom headroom in bytes
 *  \param[in] name human-readable name
 *  \returns allocated message buffer with specified headroom
 *
 * This function is a convenience wrapper around \ref msgb_alloc
 * followed by \ref msgb_reserve in order to create a new \ref msgb with
 * user-specified amount of headroom.
 */
static inline struct msgb *msgb_alloc_headroom(uint16_t size, uint16_t headroom,
						const char *name)
{
	osmo_static_assert(size >= headroom, headroom_bigger);

	struct msgb *msg = msgb_alloc(size, name);
	if (OSMO_LIKELY(msg))
		msgb_reserve(msg, headroom);
	return msg;
}

/*! Check a message buffer for consistency
 *  \param[in] msg message buffer
 *  \returns 0 (false) if inconsistent, != 0 (true) otherwise
 */
static inline int msgb_test_invariant(const struct msgb *msg)
{
	const unsigned char *lbound;
	if (!msg || !msg->data || !msg->tail ||
	    (msg->data + msg->len != msg->tail) ||
	    (msg->data < msg->head) ||
	    (msg->tail > msg->head + msg->data_len))
		return 0;

	lbound = msg->head;

	if (msg->l1h) {
		if (msg->l1h < lbound)
			return 0;
		lbound = msg->l1h;
	}
	if (msg->l2h) {
		if (msg->l2h < lbound)
			return 0;
		lbound = msg->l2h;
	}
	if (msg->l3h) {
		if (msg->l3h < lbound)
			return 0;
		lbound = msg->l3h;
	}
	if (msg->l4h) {
		if (msg->l4h < lbound)
			return 0;
		lbound = msg->l4h;
	}

	return lbound <= msg->head +  msg->data_len;
}


/* msgb data comparison helpers */

/*! Compare: check data in msgb against given data
 *  \param[in] msg message buffer
 *  \param[in] data expected data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb content is equal to the given data
 */
#define msgb_eq_data(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 0, msg, data, len, false)

/*! Compare: check L1 data in msgb against given data
 *  \param[in] msg message buffer
 *  \param[in] data expected L1 data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb L1 content is equal to the given data
 */
#define msgb_eq_l1_data(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 1, msg, data, len, false)

/*! Compare: check L2 data in msgb against given data
 *  \param[in] msg message buffer
 *  \param[in] data expected L2 data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb L2 content is equal to the given data
 */
#define msgb_eq_l2_data(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 2, msg, data, len, false)

/*! Compare: check L3 data in msgb against given data
 *  \param[in] msg message buffer
 *  \param[in] data expected L3 data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb L3 content is equal to the given data
 */
#define msgb_eq_l3_data(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 3, msg, data, len, false)

/*! Compare: check L4 data in msgb against given data
 *  \param[in] msg message buffer
 *  \param[in] data expected L4 data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb L4 content is equal to the given data
 */
#define msgb_eq_l4_data(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 4, msg, data, len, false)


/* msgb test/debug helpers */

/*! Compare and print: check data in msgb against given data and print errors if any
 *  \param[in] msg message buffer
 *  \param[in] data expected data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb content is equal to the given data
 */
#define msgb_eq_data_print(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 0, msg, data, len, true)

/*! Compare and print: check L1 data in msgb against given data and print errors if any
 *  \param[in] msg message buffer
 *  \param[in] data expected L1 data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb L1 content is equal to the given data
 */
#define msgb_eq_l1_data_print(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 1, msg, data, len, true)

/*! Compare and print: check L2 data in msgb against given data and print errors if any
 *  \param[in] msg message buffer
 *  \param[in] data expected L2 data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb L2 content is equal to the given data
 */
#define msgb_eq_l2_data_print(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 2, msg, data, len, true)

/*! Compare and print: check L3 data in msgb against given data and print errors if any
 *  \param[in] msg message buffer
 *  \param[in] data expected L3 data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb L3 content is equal to the given data
 */
#define msgb_eq_l3_data_print(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 3, msg, data, len, true)


/*! Compare and print: check L4 data in msgb against given data and print errors if any
 *  \param[in] msg message buffer
 *  \param[in] data expected L4 data
 *  \param[in] len length of data
 *  \returns boolean indicating whether msgb L4 content is equal to the given data
 */
#define msgb_eq_l4_data_print(msg, data, len)				\
	_msgb_eq(__FILE__, __LINE__, __func__, 4, msg, data, len, true)

bool _msgb_eq(const char *file, size_t line, const char *func, uint8_t level,
	      const struct msgb *msg, const uint8_t *data, size_t len, bool print);


/* msgb data comparison */

/*! Compare msgbs
 *  \param[in] msg1 message buffer
 *  \param[in] msg2 reference message buffer
 *  \returns boolean indicating whether msgb content is equal
 */
#define msgb_eq(msg1, msg2) msgb_eq_data(msg1, msgb_data(msg2), msgb_length(msg2))

/*! Compare msgbs L1 content
 *  \param[in] msg1 message buffer
 *  \param[in] msg2 reference message buffer
 *  \returns boolean indicating whether msgb L1 content is equal
 */
#define msgb_eq_l1(msg1, msg2) msgb_eq_l1_data(msg1, msgb_l1(msg2), msgb_l1len(msg2))

/*! Compare msgbs L2 content
 *  \param[in] msg1 message buffer
 *  \param[in] msg2 reference message buffer
 *  \returns boolean indicating whether msgb L2 content is equal
 */
#define msgb_eq_l2(msg1, msg2) msgb_eq_l2_data(msg1, msgb_l2(msg2), msgb_l2len(msg2))

/*! Compare msgbs L3 content
 *  \param[in] msg1 message buffer
 *  \param[in] msg2 reference message buffer
 *  \returns boolean indicating whether msgb L3 content is equal
 */
#define msgb_eq_l3(msg1, msg2) msgb_eq_l3_data(msg1, msgb_l3(msg2), msgb_l3len(msg2))

/*! Compare msgbs L4 content
 *  \param[in] msg1 message buffer
 *  \param[in] msg2 reference message buffer
 *  \returns boolean indicating whether msgb L4 content is equal
 */
#define msgb_eq_l4(msg1, msg2) msgb_eq_l4_data(msg1, msgb_l4(msg2), msgb_l4len(msg2))


/* non inline functions to ease binding */

uint8_t *msgb_data(const struct msgb *msg);

void *msgb_talloc_ctx_init(void *root_ctx, unsigned int pool_size);
void msgb_set_talloc_ctx(void *ctx) OSMO_DEPRECATED("Use msgb_talloc_ctx_init() instead");
int msgb_printf(struct msgb *msgb, const char *format, ...);

static inline const char *msgb_hexdump_l1(const struct msgb *msg)
{
	if (!msgb_l1(msg) || !(msgb_l1len(msg)))
		return "[]";
	return osmo_hexdump((const unsigned char *) msgb_l1(msg), msgb_l1len(msg));
}

static inline const char *msgb_hexdump_l2(const struct msgb *msg)
{
	if (!msgb_l2(msg) || !(msgb_l2len(msg)))
		return "[]";
	return osmo_hexdump((const unsigned char *) msgb_l2(msg), msgb_l2len(msg));
}

static inline const char *msgb_hexdump_l3(const struct msgb *msg)
{
	if (!msgb_l3(msg) || !(msgb_l3len(msg)))
		return "[]";
	return osmo_hexdump((const unsigned char*) msgb_l3(msg), msgb_l3len(msg));
}

static inline const char *msgb_hexdump_l4(const struct msgb *msg)
{
	if (!msgb_l4(msg) || !(msgb_l4len(msg)))
		return "[]";
	return osmo_hexdump((const unsigned char*) msgb_l4(msg), msgb_l4len(msg));
}

/*! @} */
