/*
 * Copyright (c) 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

struct op_agg_ctx {
	/** Context is initialized. */
	bool initialized;

	/** NetKey Index of the subnet to send the message on. */
	uint16_t net_idx;

	/** AppKey Index to encrypt the message with. */
	uint16_t app_idx;

	/** Remote element address. */
	uint16_t addr;

	/** List of source element addresses.
	 * Used by Client to match aggregated responses
	 * with local source client models.
	 */
	struct net_buf_simple *srcs;

	/** Response error code. */
	int rsp_err;

	/** Aggregated message buffer. */
	struct net_buf_simple *sdu;

	/** Used only by the Opcodes Aggregator Server.
	 *
	 * Indicates that the received aggregated message
	 * was acknowledged by local server model.
	 */
	bool ack;
};

struct op_agg_ctx *bt_mesh_op_agg_ctx_get(void);
void bt_mesh_op_agg_ctx_reinit(void);

int bt_mesh_op_agg_encode_msg(struct net_buf_simple *msg);
int bt_mesh_op_agg_decode_msg(struct net_buf_simple *msg,
			      struct net_buf_simple *buf);

int bt_mesh_op_agg_accept(struct bt_mesh_msg_ctx *ctx);

int bt_mesh_op_agg_send(struct bt_mesh_model *model,
			struct bt_mesh_msg_ctx *ctx, struct net_buf_simple *msg,
			const struct bt_mesh_send_cb *cb);
