/*
 *
 *  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.
 *
 */

#ifndef __packed
#define __packed __attribute__((packed))
#endif

struct mesh_net;
struct mesh_dev;

enum mesh_trans {
	MESH_TRANS_IDLE,
	MESH_TRANS_TX,
	MESH_TRANS_RX,
};

enum mesh_bearer {
	MESH_BEARER_IDLE,
	MESH_BEARER_ADV,
};

enum mesh_prov_mode {
	MESH_PROV_MODE_NONE,
	MESH_PROV_MODE_INITIATOR,
	MESH_PROV_MODE_GATT_ACCEPTOR,
	MESH_PROV_MODE_ADV_ACCEPTOR,
	MESH_PROV_MODE_GATT_CLIENT,
	MESH_PROV_MODE_MESH_SERVER,
	MESH_PROV_MODE_MESH_CLIENT,
	MESH_PROV_MODE_MESH_GATT_CLIENT,
};

struct mesh_prov;
typedef void (*mesh_prov_open_func_t)(struct mesh_prov *prov);
typedef void (*mesh_prov_close_func_t)(struct mesh_prov *prov, uint8_t reason);
typedef void (*mesh_prov_send_func_t)(bool success, struct mesh_prov *prov);
typedef void (*mesh_prov_receive_func_t)(const void *data, uint16_t size,
							struct mesh_prov *prov);

struct prov_invite {
	uint8_t attention;
} __packed;

struct prov_start {
	uint8_t algorithm;
	uint8_t pub_key;
	uint8_t auth_method;
	uint8_t auth_action;
	uint8_t auth_size;
} __packed;

struct conf_input {
	struct prov_invite		invite;
	struct mesh_net_prov_caps	caps;
	struct prov_start		start;
	uint8_t				prv_pub_key[64];
	uint8_t				dev_pub_key[64];
} __packed;

struct mesh_prov {
	int ref_count;
	struct mesh_dev *dev;
	struct mesh_net *net;
	enum mesh_prov_mode mode;
	enum mesh_trans trans;
	enum mesh_bearer bearer;
	uint8_t uuid[16];
	uint8_t caps[12];

	uint32_t conn_id;
	uint16_t net_idx;
	uint16_t remote;
	uint16_t addr;
	uint16_t expected_len;
	uint16_t packet_len;
	uint8_t local_msg_num;
	uint8_t peer_msg_num;
	uint8_t last_peer_msg_num;
	uint8_t got_segs;
	uint8_t expected_segs;
	uint8_t expected_fcs;
	uint8_t packet_buf[80];
	uint8_t peer_buf[80];
	struct timeval tx_start;
	struct l_timeout *tx_timeout;

	/* Provisioning credentials and crypto material */
	struct conf_input conf_inputs;
	uint8_t dev_key[16];
	uint8_t conf_salt[16];
	uint8_t s_key[16];
	uint8_t s_nonce[13];
	uint8_t conf_key[16];
	uint8_t conf[16];
	uint8_t r_conf[16];
	uint8_t rand_auth[32];
	uint8_t prov_salt[16];
	uint8_t secret[32];
	uint8_t r_public[64];
	uint8_t l_public[64];
	/* End Provisioning credentials and crypto material */

	mesh_prov_open_func_t open_callback;
	mesh_prov_close_func_t close_callback;
	mesh_prov_receive_func_t receive_callback;
	void *receive_data;
	mesh_prov_send_func_t send_callback;
	void *send_data;
};

struct mesh_prov *mesh_prov_new(struct mesh_net *net, uint16_t remote);

struct mesh_prov *mesh_prov_ref(struct mesh_prov *prov);
void mesh_prov_unref(struct mesh_prov *prov);

bool mesh_prov_gatt_client(struct mesh_prov *prov, struct mesh_dev *dev,
					uint8_t uuid[16],
					mesh_prov_open_func_t open_callback,
					mesh_prov_close_func_t close_callback,
					mesh_prov_receive_func_t recv_callback,
					void *user_data);

bool mesh_prov_listen(struct mesh_net *net, uint8_t uuid[16], uint8_t caps[12],
					mesh_prov_open_func_t open_callback,
					mesh_prov_close_func_t close_callback,
					mesh_prov_receive_func_t recv_callback,
					void *user_data);

bool mesh_prov_connect(struct mesh_prov *prov, struct mesh_dev *dev,
					uint16_t net_idx, uint8_t uuid[16],
					mesh_prov_open_func_t open_callback,
					mesh_prov_close_func_t close_callback,
					mesh_prov_receive_func_t recv_callback,
					void *user_data);

unsigned int mesh_prov_send(struct mesh_prov *prov,
					const void *data, uint16_t size,
					mesh_prov_send_func_t send_callback,
					void *user_data);
bool mesh_prov_cancel(struct mesh_prov *prov, unsigned int id);

bool mesh_prov_close(struct mesh_prov *prov, uint8_t reason);
void mesh_prov_set_addr(struct mesh_prov *prov, uint16_t addr);
uint16_t mesh_prov_get_addr(struct mesh_prov *prov);
void mesh_prov_set_idx(struct mesh_prov *prov, uint16_t net_idx);
uint16_t mesh_prov_get_idx(struct mesh_prov *prov);
