Blame mesh/prov.h

Packit 34410b
/*
Packit 34410b
 *
Packit 34410b
 *  BlueZ - Bluetooth protocol stack for Linux
Packit 34410b
 *
Packit 34410b
 *  Copyright (C) 2018  Intel Corporation. All rights reserved.
Packit 34410b
 *
Packit 34410b
 *
Packit 34410b
 *  This library is free software; you can redistribute it and/or
Packit 34410b
 *  modify it under the terms of the GNU Lesser General Public
Packit 34410b
 *  License as published by the Free Software Foundation; either
Packit 34410b
 *  version 2.1 of the License, or (at your option) any later version.
Packit 34410b
 *
Packit 34410b
 *  This library is distributed in the hope that it will be useful,
Packit 34410b
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 34410b
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 34410b
 *  Lesser General Public License for more details.
Packit 34410b
 *
Packit 34410b
 */
Packit 34410b
Packit 34410b
#ifndef __packed
Packit 34410b
#define __packed __attribute__((packed))
Packit 34410b
#endif
Packit 34410b
Packit 34410b
struct mesh_net;
Packit 34410b
struct mesh_dev;
Packit 34410b
Packit 34410b
enum mesh_trans {
Packit 34410b
	MESH_TRANS_IDLE,
Packit 34410b
	MESH_TRANS_TX,
Packit 34410b
	MESH_TRANS_RX,
Packit 34410b
};
Packit 34410b
Packit 34410b
enum mesh_bearer {
Packit 34410b
	MESH_BEARER_IDLE,
Packit 34410b
	MESH_BEARER_ADV,
Packit 34410b
};
Packit 34410b
Packit 34410b
enum mesh_prov_mode {
Packit 34410b
	MESH_PROV_MODE_NONE,
Packit 34410b
	MESH_PROV_MODE_INITIATOR,
Packit 34410b
	MESH_PROV_MODE_GATT_ACCEPTOR,
Packit 34410b
	MESH_PROV_MODE_ADV_ACCEPTOR,
Packit 34410b
	MESH_PROV_MODE_GATT_CLIENT,
Packit 34410b
	MESH_PROV_MODE_MESH_SERVER,
Packit 34410b
	MESH_PROV_MODE_MESH_CLIENT,
Packit 34410b
	MESH_PROV_MODE_MESH_GATT_CLIENT,
Packit 34410b
};
Packit 34410b
Packit 34410b
struct mesh_prov;
Packit 34410b
Packit 34410b
typedef void (*prov_trans_tx_t)(void *trans_data, void *data, uint16_t len);
Packit 34410b
typedef void (*mesh_prov_open_func_t)(void *user_data, prov_trans_tx_t trans_tx,
Packit 34410b
					void *trans_data, uint8_t trans_type);
Packit 34410b
Packit 34410b
typedef void (*mesh_prov_close_func_t)(void *user_data, uint8_t reason);
Packit 34410b
typedef void (*mesh_prov_send_func_t)(bool success, struct mesh_prov *prov);
Packit 34410b
typedef void (*mesh_prov_ack_func_t)(void *user_data, uint8_t msg_num);
Packit 34410b
typedef void (*mesh_prov_receive_func_t)(void *user_data, const uint8_t *data,
Packit 34410b
								uint16_t size);
Packit 34410b
Packit 34410b
Packit 34410b
struct prov_invite {
Packit 34410b
	uint8_t attention;
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_invite_msg {
Packit 34410b
	uint8_t opcode;
Packit 34410b
	struct prov_invite invite;
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_start {
Packit 34410b
	uint8_t algorithm;
Packit 34410b
	uint8_t pub_key;
Packit 34410b
	uint8_t auth_method;
Packit 34410b
	uint8_t auth_action;
Packit 34410b
	uint8_t auth_size;
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_caps_msg {
Packit 34410b
	uint8_t opcode;
Packit 34410b
	struct mesh_net_prov_caps caps;
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_start_msg {
Packit 34410b
	uint8_t opcode;
Packit 34410b
	struct prov_start start;
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_pub_key_msg {
Packit 34410b
	uint8_t opcode;
Packit 34410b
	uint8_t pub_key[64];
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_conf_msg {
Packit 34410b
	uint8_t opcode;
Packit 34410b
	uint8_t conf[16];
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_rand_msg {
Packit 34410b
	uint8_t opcode;
Packit 34410b
	uint8_t rand[16];
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_data {
Packit 34410b
	uint8_t net_key[16];
Packit 34410b
	uint16_t net_idx;
Packit 34410b
	uint8_t flags;
Packit 34410b
	uint32_t iv_index;
Packit 34410b
	uint16_t primary;
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_data_msg {
Packit 34410b
	uint8_t opcode;
Packit 34410b
	struct prov_data data;
Packit 34410b
	uint64_t mic;
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct prov_fail_msg {
Packit 34410b
	uint8_t opcode;
Packit 34410b
	uint8_t reason;
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct conf_input {
Packit 34410b
	struct prov_invite		invite;
Packit 34410b
	struct mesh_net_prov_caps	caps;
Packit 34410b
	struct prov_start		start;
Packit 34410b
	uint8_t				prv_pub_key[64];
Packit 34410b
	uint8_t				dev_pub_key[64];
Packit 34410b
} __packed;
Packit 34410b
Packit 34410b
struct mesh_prov {
Packit 34410b
	int ref_count;
Packit 34410b
	struct mesh_dev *dev;
Packit 34410b
	struct mesh_net *net;
Packit 34410b
	enum mesh_prov_mode mode;
Packit 34410b
	enum mesh_trans trans;
Packit 34410b
	enum mesh_bearer bearer;
Packit 34410b
	uint8_t uuid[16];
Packit 34410b
	uint8_t caps[12];
Packit 34410b
Packit 34410b
	uint32_t conn_id;
Packit 34410b
	uint16_t net_idx;
Packit 34410b
	uint16_t remote;
Packit 34410b
	uint16_t addr;
Packit 34410b
	uint16_t expected_len;
Packit 34410b
	uint16_t packet_len;
Packit 34410b
	uint8_t local_msg_num;
Packit 34410b
	uint8_t peer_msg_num;
Packit 34410b
	uint8_t last_peer_msg_num;
Packit 34410b
	uint8_t got_segs;
Packit 34410b
	uint8_t expected_segs;
Packit 34410b
	uint8_t expected_fcs;
Packit 34410b
	uint8_t packet_buf[80];
Packit 34410b
	uint8_t peer_buf[80];
Packit 34410b
	struct timeval tx_start;
Packit 34410b
	struct l_timeout *tx_timeout;
Packit 34410b
Packit 34410b
	/* Provisioning credentials and crypto material */
Packit 34410b
	struct conf_input conf_inputs;
Packit 34410b
	uint8_t dev_key[16];
Packit 34410b
	uint8_t conf_salt[16];
Packit 34410b
	uint8_t s_key[16];
Packit 34410b
	uint8_t s_nonce[13];
Packit 34410b
	uint8_t conf_key[16];
Packit 34410b
	uint8_t conf[16];
Packit 34410b
	uint8_t r_conf[16];
Packit 34410b
	uint8_t rand_auth[32];
Packit 34410b
	uint8_t prov_salt[16];
Packit 34410b
	uint8_t secret[32];
Packit 34410b
	uint8_t r_public[64];
Packit 34410b
	uint8_t l_public[64];
Packit 34410b
	/* End Provisioning credentials and crypto material */
Packit 34410b
Packit 34410b
	mesh_prov_open_func_t open_callback;
Packit 34410b
	mesh_prov_close_func_t close_callback;
Packit 34410b
	mesh_prov_receive_func_t receive_callback;
Packit 34410b
	void *receive_data;
Packit 34410b
	mesh_prov_send_func_t send_callback;
Packit 34410b
	void *send_data;
Packit 34410b
};
Packit 34410b
Packit 34410b
struct mesh_prov *mesh_prov_new(struct mesh_net *net, uint16_t remote);
Packit 34410b
Packit 34410b
struct mesh_prov *mesh_prov_ref(struct mesh_prov *prov);
Packit 34410b
void mesh_prov_unref(struct mesh_prov *prov);
Packit 34410b
Packit 34410b
bool mesh_prov_gatt_client(struct mesh_prov *prov, struct mesh_dev *dev,
Packit 34410b
					uint8_t uuid[16],
Packit 34410b
					mesh_prov_open_func_t open_callback,
Packit 34410b
					mesh_prov_close_func_t close_callback,
Packit 34410b
					mesh_prov_receive_func_t recv_callback,
Packit 34410b
					void *user_data);
Packit 34410b
Packit 34410b
bool mesh_prov_listen(struct mesh_net *net, uint8_t uuid[16], uint8_t caps[12],
Packit 34410b
					mesh_prov_open_func_t open_callback,
Packit 34410b
					mesh_prov_close_func_t close_callback,
Packit 34410b
					mesh_prov_receive_func_t recv_callback,
Packit 34410b
					void *user_data);
Packit 34410b
Packit 34410b
bool mesh_prov_connect(struct mesh_prov *prov, struct mesh_dev *dev,
Packit 34410b
					uint16_t net_idx, uint8_t uuid[16],
Packit 34410b
					mesh_prov_open_func_t open_callback,
Packit 34410b
					mesh_prov_close_func_t close_callback,
Packit 34410b
					mesh_prov_receive_func_t recv_callback,
Packit 34410b
					void *user_data);
Packit 34410b
Packit 34410b
unsigned int mesh_prov_send(struct mesh_prov *prov,
Packit 34410b
					const void *data, uint16_t size,
Packit 34410b
					mesh_prov_send_func_t send_callback,
Packit 34410b
					void *user_data);
Packit 34410b
bool mesh_prov_cancel(struct mesh_prov *prov, unsigned int id);
Packit 34410b
Packit 34410b
bool mesh_prov_close(struct mesh_prov *prov, uint8_t reason);
Packit 34410b
void mesh_prov_set_addr(struct mesh_prov *prov, uint16_t addr);
Packit 34410b
uint16_t mesh_prov_get_addr(struct mesh_prov *prov);
Packit 34410b
void mesh_prov_set_idx(struct mesh_prov *prov, uint16_t net_idx);
Packit 34410b
uint16_t mesh_prov_get_idx(struct mesh_prov *prov);