/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
/* IuUP CN node, minimal implementation */

/*                                            _____IuUP_CN_____
 *                                            |               |
 * UE <--> RNC --PDU-> osmo_iuup_cn_rx_pdu() -+->           ---+-> rx_payload()
 *          |                                 |               |
 *          |  <-PDU-- tx_msg() <-------------+--           <-+--- osmo_iuup_cn_tx_payload()
 *                                            |               |
 *                                            -----------------
 */

#pragma once

struct osmo_iuup_cn;
struct msgb;

typedef int (*osmo_iuup_data_cb_t)(struct msgb *msg, void *node_priv);

struct osmo_iuup_cn_cfg {
	void *node_priv;

	/* When the IuUP peer sent a voice packet, the clean RTP without the IuUP header is fed to this
	 * callback. */
	osmo_iuup_data_cb_t rx_payload;

	/* IuUP handler requests that a PDU shall be sent to the IuUP peer (e.g. the RNC).
	 * It is guaranteed that the msgb->dst pointer is preserved or copied from the msgb that
	 * originated the request. */
	osmo_iuup_data_cb_t tx_msg;
};

bool osmo_iuup_cn_is_iuup_init(struct msgb *msg);

struct osmo_iuup_cn *osmo_iuup_cn_init(void *ctx, struct osmo_iuup_cn_cfg *cfg,
				       const char *name_fmt, ...);
void osmo_iuup_cn_free(struct osmo_iuup_cn *cn);

int osmo_iuup_cn_tx_payload(struct osmo_iuup_cn *cn, struct msgb *payload);

int osmo_iuup_cn_rx_pdu(struct osmo_iuup_cn *cn, struct msgb *pdu);
