diff options
Diffstat (limited to 'include/net/bluetooth/hci_core.h')
| -rw-r--r-- | include/net/bluetooth/hci_core.h | 401 | 
1 files changed, 259 insertions, 142 deletions
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 3ede820d328..b386bf17e6c 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -68,6 +68,11 @@ struct discovery_state {  	struct list_head	unknown;	/* Name state not known */  	struct list_head	resolve;	/* Name needs to be resolved */  	__u32			timestamp; +	bdaddr_t		last_adv_addr; +	u8			last_adv_addr_type; +	s8			last_adv_rssi; +	u8			last_adv_data[HCI_MAX_AD_LENGTH]; +	u8			last_adv_data_len;  };  struct hci_conn_hash { @@ -81,6 +86,7 @@ struct hci_conn_hash {  struct bdaddr_list {  	struct list_head list;  	bdaddr_t bdaddr; +	u8 bdaddr_type;  };  struct bt_uuid { @@ -90,6 +96,13 @@ struct bt_uuid {  	u8 svc_hint;  }; +struct smp_csrk { +	bdaddr_t bdaddr; +	u8 bdaddr_type; +	u8 master; +	u8 val[16]; +}; +  struct smp_ltk {  	struct list_head list;  	bdaddr_t bdaddr; @@ -98,9 +111,17 @@ struct smp_ltk {  	u8 type;  	u8 enc_size;  	__le16 ediv; -	u8 rand[8]; +	__le64 rand;  	u8 val[16]; -} __packed; +}; + +struct smp_irk { +	struct list_head list; +	bdaddr_t rpa; +	bdaddr_t bdaddr; +	u8 addr_type; +	u8 val[16]; +};  struct link_key {  	struct list_head list; @@ -113,12 +134,21 @@ struct link_key {  struct oob_data {  	struct list_head list;  	bdaddr_t bdaddr; -	u8 hash[16]; -	u8 randomizer[16]; +	u8 hash192[16]; +	u8 randomizer192[16]; +	u8 hash256[16]; +	u8 randomizer256[16];  };  #define HCI_MAX_SHORT_NAME_LENGTH	10 +/* Default LE RPA expiry time, 15 minutes */ +#define HCI_DEFAULT_RPA_TIMEOUT		(15 * 60) + +/* Default min/max age of connection information (1s/3s) */ +#define DEFAULT_CONN_INFO_MIN_AGE	1000 +#define DEFAULT_CONN_INFO_MAX_AGE	3000 +  struct amp_assoc {  	__u16	len;  	__u16	offset; @@ -140,6 +170,9 @@ struct hci_dev {  	__u8		bus;  	__u8		dev_type;  	bdaddr_t	bdaddr; +	bdaddr_t	random_addr; +	bdaddr_t	static_addr; +	__u8		adv_addr_type;  	__u8		dev_name[HCI_MAX_NAME_LENGTH];  	__u8		short_name[HCI_MAX_SHORT_NAME_LENGTH];  	__u8		eir[HCI_MAX_EIR_LENGTH]; @@ -158,11 +191,22 @@ struct hci_dev {  	__u16		manufacturer;  	__u16		lmp_subver;  	__u16		voice_setting; +	__u8		num_iac;  	__u8		io_capability;  	__s8		inq_tx_power;  	__u16		page_scan_interval;  	__u16		page_scan_window;  	__u8		page_scan_type; +	__u8		le_adv_channel_map; +	__u8		le_scan_type; +	__u16		le_scan_interval; +	__u16		le_scan_window; +	__u16		le_conn_min_interval; +	__u16		le_conn_max_interval; +	__u16		discov_interleaved_timeout; +	__u16		conn_info_min_age; +	__u16		conn_info_max_age; +	__u8		ssp_debug_mode;  	__u16		devid_source;  	__u16		devid_vendor; @@ -248,19 +292,21 @@ struct hci_dev {  	__u32			req_status;  	__u32			req_result; -	struct list_head	mgmt_pending; +	struct crypto_blkcipher	*tfm_aes;  	struct discovery_state	discovery;  	struct hci_conn_hash	conn_hash; -	struct list_head	blacklist; +	struct list_head	mgmt_pending; +	struct list_head	blacklist;  	struct list_head	uuids; -  	struct list_head	link_keys; -  	struct list_head	long_term_keys; - +	struct list_head	identity_resolving_keys;  	struct list_head	remote_oob_data; +	struct list_head	le_white_list; +	struct list_head	le_conn_params; +	struct list_head	pend_le_conns;  	struct hci_dev_stats	stat; @@ -279,14 +325,20 @@ struct hci_dev {  	__s8			adv_tx_power;  	__u8			adv_data[HCI_MAX_AD_LENGTH];  	__u8			adv_data_len; +	__u8			scan_rsp_data[HCI_MAX_AD_LENGTH]; +	__u8			scan_rsp_data_len; + +	__u8			irk[16]; +	__u32			rpa_timeout; +	struct delayed_work	rpa_expired; +	bdaddr_t		rpa;  	int (*open)(struct hci_dev *hdev);  	int (*close)(struct hci_dev *hdev);  	int (*flush)(struct hci_dev *hdev);  	int (*setup)(struct hci_dev *hdev); -	int (*send)(struct sk_buff *skb); +	int (*send)(struct hci_dev *hdev, struct sk_buff *skb);  	void (*notify)(struct hci_dev *hdev, unsigned int evt); -	int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);  };  #define HCI_PHY_HANDLE(handle)	(handle & 0xff) @@ -298,6 +350,12 @@ struct hci_conn {  	bdaddr_t	dst;  	__u8		dst_type; +	bdaddr_t	src; +	__u8		src_type; +	bdaddr_t	init_addr; +	__u8		init_addr_type; +	bdaddr_t	resp_addr; +	__u8		resp_addr_type;  	__u16		handle;  	__u16		state;  	__u8		mode; @@ -306,7 +364,6 @@ struct hci_conn {  	__u8		attempt;  	__u8		dev_class[3];  	__u8		features[HCI_MAX_PAGES][8]; -	__u16		interval;  	__u16		pkt_type;  	__u16		link_policy;  	__u32		link_mode; @@ -321,8 +378,15 @@ struct hci_conn {  	__u8		passkey_entered;  	__u16		disc_timeout;  	__u16		setting; +	__u16		le_conn_min_interval; +	__u16		le_conn_max_interval; +	__s8		rssi; +	__s8		tx_power; +	__s8		max_tx_power;  	unsigned long	flags; +	unsigned long	conn_info_timestamp; +  	__u8		remote_cap;  	__u8		remote_auth;  	__u8		remote_id; @@ -334,8 +398,9 @@ struct hci_conn {  	struct list_head chan_list;  	struct delayed_work disc_work; -	struct timer_list idle_timer; -	struct timer_list auto_accept_timer; +	struct delayed_work auto_accept_work; +	struct delayed_work idle_work; +	struct delayed_work le_conn_timeout;  	struct device	dev; @@ -361,24 +426,39 @@ struct hci_chan {  	__u8		state;  }; +struct hci_conn_params { +	struct list_head list; + +	bdaddr_t addr; +	u8 addr_type; + +	u16 conn_min_interval; +	u16 conn_max_interval; + +	enum { +		HCI_AUTO_CONN_DISABLED, +		HCI_AUTO_CONN_ALWAYS, +		HCI_AUTO_CONN_LINK_LOSS, +	} auto_connect; +}; +  extern struct list_head hci_dev_list;  extern struct list_head hci_cb_list;  extern rwlock_t hci_dev_list_lock;  extern rwlock_t hci_cb_list_lock;  /* ----- HCI interface to upper protocols ----- */ -extern int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr); -extern void l2cap_connect_cfm(struct hci_conn *hcon, u8 status); -extern int l2cap_disconn_ind(struct hci_conn *hcon); -extern void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason); -extern int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt); -extern int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, -			      u16 flags); - -extern int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags); -extern void sco_connect_cfm(struct hci_conn *hcon, __u8 status); -extern void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason); -extern int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb); +int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr); +void l2cap_connect_cfm(struct hci_conn *hcon, u8 status); +int l2cap_disconn_ind(struct hci_conn *hcon); +void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason); +int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt); +int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags); + +int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags); +void sco_connect_cfm(struct hci_conn *hcon, __u8 status); +void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason); +int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);  /* ----- Inquiry cache ----- */  #define INQUIRY_CACHE_AGE_MAX   (HZ*30)   /* 30 seconds */ @@ -436,8 +516,11 @@ enum {  	HCI_CONN_LE_SMP_PEND,  	HCI_CONN_MGMT_CONNECTED,  	HCI_CONN_SSP_ENABLED, +	HCI_CONN_SC_ENABLED, +	HCI_CONN_AES_CCM,  	HCI_CONN_POWER_SAVE,  	HCI_CONN_REMOTE_OOB, +	HCI_CONN_6LOWPAN,  };  static inline bool hci_conn_ssp_enabled(struct hci_conn *conn) @@ -447,6 +530,13 @@ static inline bool hci_conn_ssp_enabled(struct hci_conn *conn)  	       test_bit(HCI_CONN_SSP_ENABLED, &conn->flags);  } +static inline bool hci_conn_sc_enabled(struct hci_conn *conn) +{ +	struct hci_dev *hdev = conn->hdev; +	return test_bit(HCI_SC_ENABLED, &hdev->dev_flags) && +	       test_bit(HCI_CONN_SC_ENABLED, &conn->flags); +} +  static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)  {  	struct hci_conn_hash *h = &hdev->conn_hash; @@ -510,6 +600,13 @@ static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)  	}  } +static inline unsigned int hci_conn_count(struct hci_dev *hdev) +{ +	struct hci_conn_hash *c = &hdev->conn_hash; + +	return c->acl_num + c->amp_num + c->sco_num + c->le_num; +} +  static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,  								__u16 handle)  { @@ -583,8 +680,10 @@ void hci_chan_del(struct hci_chan *chan);  void hci_chan_list_flush(struct hci_conn *conn);  struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle); -struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, -			     __u8 dst_type, __u8 sec_level, __u8 auth_type); +struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, +				u8 dst_type, u8 sec_level, u8 auth_type); +struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst, +				 u8 sec_level, u8 auth_type);  struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst,  				 __u16 setting);  int hci_conn_check_link_mode(struct hci_conn *conn); @@ -595,6 +694,8 @@ int hci_conn_switch_role(struct hci_conn *conn, __u8 role);  void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active); +void hci_le_conn_failed(struct hci_conn *conn, u8 status); +  /*   * hci_conn_get() and hci_conn_put() are used to control the life-time of an   * "hci_conn" object. They do not guarantee that the hci_conn object is running, @@ -644,7 +745,7 @@ static inline void hci_conn_drop(struct hci_conn *conn)  		switch (conn->type) {  		case ACL_LINK:  		case LE_LINK: -			del_timer(&conn->idle_timer); +			cancel_delayed_work(&conn->idle_work);  			if (conn->state == BT_CONNECTED) {  				timeo = conn->disc_timeout;  				if (!conn->out) @@ -703,19 +804,6 @@ static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)  	dev_set_drvdata(&hdev->dev, data);  } -/* hci_dev_list shall be locked */ -static inline uint8_t __hci_num_ctrl(void) -{ -	uint8_t count = 0; -	struct list_head *p; - -	list_for_each(p, &hci_dev_list) { -		count++; -	} - -	return count; -} -  struct hci_dev *hci_dev_get(int index);  struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src); @@ -738,43 +826,74 @@ int hci_get_auth_info(struct hci_dev *hdev, void __user *arg);  int hci_inquiry(void __user *arg);  struct bdaddr_list *hci_blacklist_lookup(struct hci_dev *hdev, -					 bdaddr_t *bdaddr); -int hci_blacklist_clear(struct hci_dev *hdev); +					 bdaddr_t *bdaddr, u8 type);  int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);  int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); -int hci_uuids_clear(struct hci_dev *hdev); +struct bdaddr_list *hci_white_list_lookup(struct hci_dev *hdev, +					  bdaddr_t *bdaddr, u8 type); +void hci_white_list_clear(struct hci_dev *hdev); +int hci_white_list_add(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); +int hci_white_list_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); + +struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev, +					       bdaddr_t *addr, u8 addr_type); +int hci_conn_params_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type, +			u8 auto_connect, u16 conn_min_interval, +			u16 conn_max_interval); +void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); +void hci_conn_params_clear(struct hci_dev *hdev); -int hci_link_keys_clear(struct hci_dev *hdev); +struct bdaddr_list *hci_pend_le_conn_lookup(struct hci_dev *hdev, +					    bdaddr_t *addr, u8 addr_type); +void hci_pend_le_conn_add(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); +void hci_pend_le_conn_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); +void hci_pend_le_conns_clear(struct hci_dev *hdev); + +void hci_update_background_scan(struct hci_dev *hdev); + +void hci_uuids_clear(struct hci_dev *hdev); + +void hci_link_keys_clear(struct hci_dev *hdev);  struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);  int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,  		     bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len); -struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8]); -int hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type, u8 type, -		int new_key, u8 authenticated, u8 tk[16], u8 enc_size, -		__le16 ediv, u8 rand[8]); +struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, __le64 rand, +			     bool master); +struct smp_ltk *hci_add_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, +			    u8 addr_type, u8 type, u8 authenticated, +			    u8 tk[16], u8 enc_size, __le16 ediv, __le64 rand);  struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr, -				     u8 addr_type); -int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr); -int hci_smp_ltks_clear(struct hci_dev *hdev); +				     u8 addr_type, bool master); +int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type); +void hci_smp_ltks_clear(struct hci_dev *hdev);  int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr); -int hci_remote_oob_data_clear(struct hci_dev *hdev); +struct smp_irk *hci_find_irk_by_rpa(struct hci_dev *hdev, bdaddr_t *rpa); +struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr, +				     u8 addr_type); +struct smp_irk *hci_add_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, +			    u8 addr_type, u8 val[16], bdaddr_t *rpa); +void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type); +void hci_smp_irks_clear(struct hci_dev *hdev); + +void hci_remote_oob_data_clear(struct hci_dev *hdev);  struct oob_data *hci_find_remote_oob_data(struct hci_dev *hdev, -							bdaddr_t *bdaddr); -int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash, -								u8 *randomizer); +					  bdaddr_t *bdaddr); +int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, +			    u8 *hash, u8 *randomizer); +int hci_add_remote_oob_ext_data(struct hci_dev *hdev, bdaddr_t *bdaddr, +				u8 *hash192, u8 *randomizer192, +				u8 *hash256, u8 *randomizer256);  int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);  void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb); -int hci_recv_frame(struct sk_buff *skb); +int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);  int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);  int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);  void hci_init_sysfs(struct hci_dev *hdev); -int hci_add_sysfs(struct hci_dev *hdev); -void hci_del_sysfs(struct hci_dev *hdev);  void hci_conn_init_sysfs(struct hci_conn *conn);  void hci_conn_add_sysfs(struct hci_conn *conn);  void hci_conn_del_sysfs(struct hci_conn *conn); @@ -803,26 +922,19 @@ void hci_conn_del_sysfs(struct hci_conn *conn);  #define lmp_transp_capable(dev)    ((dev)->features[0][2] & LMP_TRANSPARENT)  /* ----- Extended LMP capabilities ----- */ +#define lmp_csb_master_capable(dev) ((dev)->features[2][0] & LMP_CSB_MASTER) +#define lmp_csb_slave_capable(dev)  ((dev)->features[2][0] & LMP_CSB_SLAVE) +#define lmp_sync_train_capable(dev) ((dev)->features[2][0] & LMP_SYNC_TRAIN) +#define lmp_sync_scan_capable(dev)  ((dev)->features[2][0] & LMP_SYNC_SCAN) +#define lmp_sc_capable(dev)         ((dev)->features[2][1] & LMP_SC) +#define lmp_ping_capable(dev)       ((dev)->features[2][1] & LMP_PING) + +/* ----- Host capabilities ----- */  #define lmp_host_ssp_capable(dev)  ((dev)->features[1][0] & LMP_HOST_SSP) +#define lmp_host_sc_capable(dev)   ((dev)->features[1][0] & LMP_HOST_SC)  #define lmp_host_le_capable(dev)   (!!((dev)->features[1][0] & LMP_HOST_LE))  #define lmp_host_le_br_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE_BREDR)) -/* returns true if at least one AMP active */ -static inline bool hci_amp_capable(void) -{ -	struct hci_dev *hdev; -	bool ret = false; - -	read_lock(&hci_dev_list_lock); -	list_for_each_entry(hdev, &hci_dev_list, list) -		if (hdev->amp_type == HCI_AMP && -		    test_bit(HCI_UP, &hdev->flags)) -			ret = true; -	read_unlock(&hci_dev_list_lock); - -	return ret; -} -  /* ----- HCI protocols ----- */  #define HCI_PROTO_DEFER             0x01 @@ -1033,32 +1145,24 @@ static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type)  	return false;  } -static inline size_t eir_get_length(u8 *eir, size_t eir_len) +static inline bool hci_bdaddr_is_rpa(bdaddr_t *bdaddr, u8 addr_type)  { -	size_t parsed = 0; - -	while (parsed < eir_len) { -		u8 field_len = eir[0]; - -		if (field_len == 0) -			return parsed; +	if (addr_type != 0x01) +		return false; -		parsed += field_len + 1; -		eir += field_len + 1; -	} +	if ((bdaddr->b[5] & 0xc0) == 0x40) +	       return true; -	return eir_len; +	return false;  } -static inline u16 eir_append_data(u8 *eir, u16 eir_len, u8 type, u8 *data, -				  u8 data_len) +static inline struct smp_irk *hci_get_irk(struct hci_dev *hdev, +					  bdaddr_t *bdaddr, u8 addr_type)  { -	eir[eir_len++] = sizeof(type) + data_len; -	eir[eir_len++] = type; -	memcpy(&eir[eir_len], data, data_len); -	eir_len += data_len; +	if (!hci_bdaddr_is_rpa(bdaddr, addr_type)) +		return NULL; -	return eir_len; +	return hci_find_irk_by_rpa(hdev, bdaddr);  }  int hci_register_cb(struct hci_cb *hcb); @@ -1082,6 +1186,9 @@ void hci_req_add_ev(struct hci_request *req, u16 opcode, u32 plen,  		    const void *param, u8 event);  void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status); +void hci_req_add_le_scan_disable(struct hci_request *req); +void hci_req_add_le_passive_scan(struct hci_request *req); +  struct sk_buff *__hci_cmd_sync(struct hci_dev *hdev, u16 opcode, u32 plen,  			       const void *param, u32 timeout);  struct sk_buff *__hci_cmd_sync_ev(struct hci_dev *hdev, u16 opcode, u32 plen, @@ -1114,37 +1221,40 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event);   */  #define DISCOV_LE_SCAN_WIN		0x12  #define DISCOV_LE_SCAN_INT		0x12 -#define DISCOV_LE_TIMEOUT		msecs_to_jiffies(10240) -#define DISCOV_INTERLEAVED_TIMEOUT	msecs_to_jiffies(5120) +#define DISCOV_LE_TIMEOUT		10240	/* msec */ +#define DISCOV_INTERLEAVED_TIMEOUT	5120	/* msec */  #define DISCOV_INTERLEAVED_INQUIRY_LEN	0x04  #define DISCOV_BREDR_INQUIRY_LEN	0x08  int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); -int mgmt_index_added(struct hci_dev *hdev); -int mgmt_index_removed(struct hci_dev *hdev); -int mgmt_set_powered_failed(struct hci_dev *hdev, int err); +void mgmt_index_added(struct hci_dev *hdev); +void mgmt_index_removed(struct hci_dev *hdev); +void mgmt_set_powered_failed(struct hci_dev *hdev, int err);  int mgmt_powered(struct hci_dev *hdev, u8 powered); -int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable); -int mgmt_connectable(struct hci_dev *hdev, u8 connectable); -int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status); -int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, -		      bool persistent); -int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, -			  u8 addr_type, u32 flags, u8 *name, u8 name_len, -			  u8 *dev_class); -int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, -			     u8 link_type, u8 addr_type, u8 reason); -int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, -			   u8 link_type, u8 addr_type, u8 status); -int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, -			u8 addr_type, u8 status); -int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure); -int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, -				 u8 status); -int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, -				     u8 status); +void mgmt_discoverable_timeout(struct hci_dev *hdev); +void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable); +void mgmt_connectable(struct hci_dev *hdev, u8 connectable); +void mgmt_advertising(struct hci_dev *hdev, u8 advertising); +void mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status); +void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, +		       bool persistent); +void mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, +			   u8 addr_type, u32 flags, u8 *name, u8 name_len, +			   u8 *dev_class); +void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, +			      u8 link_type, u8 addr_type, u8 reason, +			      bool mgmt_connected); +void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, +			    u8 link_type, u8 addr_type, u8 status); +void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, +			 u8 addr_type, u8 status); +void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure); +void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, +				  u8 status); +void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr, +				      u8 status);  int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr, -			      u8 link_type, u8 addr_type, __le32 value, +			      u8 link_type, u8 addr_type, u32 value,  			      u8 confirm_hint);  int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,  				     u8 link_type, u8 addr_type, u8 status); @@ -1159,26 +1269,32 @@ int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,  int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,  			     u8 link_type, u8 addr_type, u32 passkey,  			     u8 entered); -int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, -		     u8 addr_type, u8 status); -int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status); -int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); -int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, -				   u8 status); -int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status); -int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash, -					    u8 *randomizer, u8 status); -int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); -int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, -		      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, -		      u8 ssp, u8 *eir, u16 eir_len); -int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, -		     u8 addr_type, s8 rssi, u8 *name, u8 name_len); -int mgmt_discovering(struct hci_dev *hdev, u8 discovering); +void mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, +		      u8 addr_type, u8 status); +void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status); +void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); +void mgmt_sc_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); +void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, +				    u8 status); +void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status); +void mgmt_read_local_oob_data_complete(struct hci_dev *hdev, u8 *hash192, +				       u8 *randomizer192, u8 *hash256, +				       u8 *randomizer256, u8 status); +void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, +		       u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, +		       u8 ssp, u8 *eir, u16 eir_len, u8 *scan_rsp, +		       u8 scan_rsp_len); +void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, +		      u8 addr_type, s8 rssi, u8 *name, u8 name_len); +void mgmt_discovering(struct hci_dev *hdev, u8 discovering);  int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);  int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type); -bool mgmt_valid_hdev(struct hci_dev *hdev); -int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent); +void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent); +void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk); +void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk, +		   bool persistent); +void mgmt_reenable_advertising(struct hci_dev *hdev); +void mgmt_smp_complete(struct hci_conn *conn, bool complete);  /* HCI info for socket */  #define hci_pi(sk) ((struct hci_pinfo *) sk) @@ -1208,14 +1324,15 @@ struct hci_sec_filter {  #define hci_req_lock(d)		mutex_lock(&d->req_lock)  #define hci_req_unlock(d)	mutex_unlock(&d->req_lock) -void hci_update_ad(struct hci_request *req); -  void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,  					u16 latency, u16 to_multiplier); -void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8], +void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __le64 rand,  							__u8 ltk[16]); -u8 bdaddr_to_le(u8 bdaddr_type); +int hci_update_random_address(struct hci_request *req, bool require_privacy, +			      u8 *own_addr_type); +void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, +			       u8 *bdaddr_type);  #define SCO_AIRMODE_MASK       0x0003  #define SCO_AIRMODE_CVSD       0x0000  | 
