/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2018  Intel Corporation. All rights reserved.
 *
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library 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
 *  Lesser General Public License for more details.
 *
 */

struct mesh_io_private;

typedef bool (*mesh_io_init_t)(uint16_t index, struct mesh_io *io);
typedef bool (*mesh_io_destroy_t)(struct mesh_io *io);
typedef bool (*mesh_io_caps_t)(struct mesh_io *io, struct mesh_io_caps *caps);
typedef bool (*mesh_io_send_t)(struct mesh_io *io,
					struct mesh_io_send_info *info,
					const uint8_t *data, uint16_t len);
typedef bool (*mesh_io_register_t)(struct mesh_io *io, uint8_t filter_id,
				mesh_io_recv_func_t cb, void *user_data);
typedef bool (*mesh_io_deregister_t)(struct mesh_io *io, uint8_t filter_id);
typedef bool (*mesh_io_filter_set_t)(struct mesh_io *io,
			uint8_t filter_id, const uint8_t *data, uint8_t len,
			mesh_io_status_func_t callback, void *user_data);
typedef bool (*mesh_io_tx_cancel_t)(struct mesh_io *io, uint8_t *pattern,
								uint8_t len);

struct mesh_io_api {
	mesh_io_init_t		init;
	mesh_io_destroy_t	destroy;
	mesh_io_caps_t		caps;
	mesh_io_send_t		send;
	mesh_io_register_t	reg;
	mesh_io_deregister_t	dereg;
	mesh_io_filter_set_t	set;
	mesh_io_tx_cancel_t	cancel;
};

struct mesh_io {
	enum mesh_io_type		type;
	uint16_t			index;
	const struct mesh_io_api	*api;
	struct mesh_io_private		*pvt;
};

struct mesh_io_table {
	enum mesh_io_type		type;
	const struct mesh_io_api	*api;
};
