Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dee04cac authored by John W. Linville's avatar John W. Linville
Browse files
parents ce6cac88 7cbc9bd9
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -246,6 +246,15 @@ enum {
#define HCI_AT_GENERAL_BONDING		0x04
#define HCI_AT_GENERAL_BONDING		0x04
#define HCI_AT_GENERAL_BONDING_MITM	0x05
#define HCI_AT_GENERAL_BONDING_MITM	0x05


/* Link Key types */
#define HCI_LK_COMBINATION		0x00
#define HCI_LK_LOCAL_UNIT		0x01
#define HCI_LK_REMOTE_UNIT		0x02
#define HCI_LK_DEBUG_COMBINATION	0x03
#define HCI_LK_UNAUTH_COMBINATION	0x04
#define HCI_LK_AUTH_COMBINATION		0x05
#define HCI_LK_CHANGED_COMBINATION	0x06

/* -----  HCI Commands ---- */
/* -----  HCI Commands ---- */
#define HCI_OP_NOP			0x0000
#define HCI_OP_NOP			0x0000


+11 −5
Original line number Original line Diff line number Diff line
@@ -126,6 +126,8 @@ struct hci_dev {
	__u16		sniff_min_interval;
	__u16		sniff_min_interval;
	__u16		sniff_max_interval;
	__u16		sniff_max_interval;


	unsigned int	auto_accept_delay;

	unsigned long	quirks;
	unsigned long	quirks;


	atomic_t	cmd_cnt;
	atomic_t	cmd_cnt;
@@ -226,6 +228,7 @@ struct hci_conn {
	__u16		pkt_type;
	__u16		pkt_type;
	__u16		link_policy;
	__u16		link_policy;
	__u32		link_mode;
	__u32		link_mode;
	__u8		key_type;
	__u8		auth_type;
	__u8		auth_type;
	__u8		sec_level;
	__u8		sec_level;
	__u8		pending_sec_level;
	__u8		pending_sec_level;
@@ -245,6 +248,7 @@ struct hci_conn {


	struct timer_list disc_timer;
	struct timer_list disc_timer;
	struct timer_list idle_timer;
	struct timer_list idle_timer;
	struct timer_list auto_accept_timer;


	struct work_struct work_add;
	struct work_struct work_add;
	struct work_struct work_del;
	struct work_struct work_del;
@@ -511,8 +515,8 @@ int hci_uuids_clear(struct hci_dev *hdev);


int hci_link_keys_clear(struct hci_dev *hdev);
int hci_link_keys_clear(struct hci_dev *hdev);
struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
int hci_add_link_key(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr,
int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
						u8 *key, u8 type, u8 pin_len);
			bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len);
int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);


int hci_remote_oob_data_clear(struct hci_dev *hdev);
int hci_remote_oob_data_clear(struct hci_dev *hdev);
@@ -771,15 +775,16 @@ int mgmt_index_removed(u16 index);
int mgmt_powered(u16 index, u8 powered);
int mgmt_powered(u16 index, u8 powered);
int mgmt_discoverable(u16 index, u8 discoverable);
int mgmt_discoverable(u16 index, u8 discoverable);
int mgmt_connectable(u16 index, u8 connectable);
int mgmt_connectable(u16 index, u8 connectable);
int mgmt_new_key(u16 index, struct link_key *key, u8 old_key_type);
int mgmt_new_key(u16 index, struct link_key *key, u8 persistent);
int mgmt_connected(u16 index, bdaddr_t *bdaddr);
int mgmt_connected(u16 index, bdaddr_t *bdaddr);
int mgmt_disconnected(u16 index, bdaddr_t *bdaddr);
int mgmt_disconnected(u16 index, bdaddr_t *bdaddr);
int mgmt_disconnect_failed(u16 index);
int mgmt_disconnect_failed(u16 index);
int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status);
int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status);
int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr);
int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr, u8 secure);
int mgmt_pin_code_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
int mgmt_pin_code_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value);
int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value,
							u8 confirm_hint);
int mgmt_user_confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
int mgmt_user_confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status);
int mgmt_user_confirm_neg_reply_complete(u16 index, bdaddr_t *bdaddr,
int mgmt_user_confirm_neg_reply_complete(u16 index, bdaddr_t *bdaddr,
								u8 status);
								u8 status);
@@ -790,6 +795,7 @@ int mgmt_read_local_oob_data_reply_complete(u16 index, u8 *hash, u8 *randomizer,
int mgmt_device_found(u16 index, bdaddr_t *bdaddr, u8 *dev_class, s8 rssi,
int mgmt_device_found(u16 index, bdaddr_t *bdaddr, u8 *dev_class, s8 rssi,
								u8 *eir);
								u8 *eir);
int mgmt_remote_name(u16 index, bdaddr_t *bdaddr, u8 *name);
int mgmt_remote_name(u16 index, bdaddr_t *bdaddr, u8 *name);
int mgmt_discovering(u16 index, u8 discovering);


/* HCI info for socket */
/* HCI info for socket */
#define hci_pi(sk) ((struct hci_pinfo *) sk)
#define hci_pi(sk) ((struct hci_pinfo *) sk)
+36 −33
Original line number Original line Diff line number Diff line
@@ -284,6 +284,25 @@ struct srej_list {


struct l2cap_chan {
struct l2cap_chan {
	struct sock *sk;
	struct sock *sk;

	struct l2cap_conn	*conn;

	__le16		psm;
	__u16		dcid;
	__u16		scid;

	__u16		imtu;
	__u16		omtu;
	__u16		flush_to;
	__u8		mode;

	__le16		sport;

	__u8		sec_level;
	__u8		role_switch;
	__u8		force_reliable;
	__u8		flushable;

	__u8		ident;
	__u8		ident;


	__u8		conf_req[64];
	__u8		conf_req[64];
@@ -291,6 +310,15 @@ struct l2cap_chan {
	__u8		num_conf_req;
	__u8		num_conf_req;
	__u8		num_conf_rsp;
	__u8		num_conf_rsp;


	__u8		fcs;

	__u8		tx_win;
	__u8		max_tx;
	__u16		retrans_timeout;
	__u16		monitor_timeout;
	__u16		mps;

	__u8		conf_state;
	__u16		conn_state;
	__u16		conn_state;


	__u8		next_tx_seq;
	__u8		next_tx_seq;
@@ -360,32 +388,6 @@ struct l2cap_conn {


struct l2cap_pinfo {
struct l2cap_pinfo {
	struct bt_sock	bt;
	struct bt_sock	bt;
	__le16		psm;
	__u16		dcid;
	__u16		scid;

	__u16		imtu;
	__u16		omtu;
	__u16		flush_to;
	__u8		mode;

	__u8		fcs;
	__u8		sec_level;
	__u8		role_switch;
	__u8		force_reliable;
	__u8		flushable;

	__u8		conf_state;

	__u8		tx_win;
	__u8		max_tx;
	__u16		retrans_timeout;
	__u16		monitor_timeout;
	__u16		mps;

	__le16		sport;

	struct l2cap_conn	*conn;
	struct l2cap_chan	*chan;
	struct l2cap_chan	*chan;
};
};


@@ -439,21 +441,20 @@ static inline int l2cap_tx_window_full(struct l2cap_chan *ch)
#define __is_sar_start(ctrl)	(((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START)
#define __is_sar_start(ctrl)	(((ctrl) & L2CAP_CTRL_SAR) == L2CAP_SDU_START)


extern int disable_ertm;
extern int disable_ertm;
extern const struct proto_ops l2cap_sock_ops;
extern struct bt_sock_list l2cap_sk_list;
extern struct bt_sock_list l2cap_sk_list;


int l2cap_init_sockets(void);
int l2cap_init_sockets(void);
void l2cap_cleanup_sockets(void);
void l2cap_cleanup_sockets(void);


void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data);
void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data);
void __l2cap_connect_rsp_defer(struct sock *sk);
void __l2cap_connect_rsp_defer(struct l2cap_chan *chan);
int __l2cap_wait_ack(struct sock *sk);
int __l2cap_wait_ack(struct sock *sk);


struct sk_buff *l2cap_create_connless_pdu(struct sock *sk, struct msghdr *msg, size_t len);
struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len);
struct sk_buff *l2cap_create_basic_pdu(struct sock *sk, struct msghdr *msg, size_t len);
struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len);
struct sk_buff *l2cap_create_iframe_pdu(struct sock *sk, struct msghdr *msg, size_t len, u16 control, u16 sdulen);
struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len, u16 control, u16 sdulen);
int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len);
int l2cap_sar_segment_sdu(struct l2cap_chan *chan, struct msghdr *msg, size_t len);
void l2cap_do_send(struct sock *sk, struct sk_buff *skb);
void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb);
void l2cap_streaming_send(struct l2cap_chan *chan);
void l2cap_streaming_send(struct l2cap_chan *chan);
int l2cap_ertm_send(struct l2cap_chan *chan);
int l2cap_ertm_send(struct l2cap_chan *chan);


@@ -465,7 +466,9 @@ void l2cap_sock_init(struct sock *sk, struct sock *parent);
struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
							int proto, gfp_t prio);
							int proto, gfp_t prio);
void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err);
void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err);
struct l2cap_chan *l2cap_chan_alloc(struct sock *sk);
void l2cap_chan_del(struct l2cap_chan *chan, int err);
void l2cap_chan_del(struct l2cap_chan *chan, int err);
int l2cap_do_connect(struct sock *sk);
void l2cap_chan_free(struct l2cap_chan *chan);
int l2cap_chan_connect(struct l2cap_chan *chan);


#endif /* __L2CAP_H */
#endif /* __L2CAP_H */
+9 −1
Original line number Original line Diff line number Diff line
@@ -195,6 +195,10 @@ struct mgmt_cp_remove_remote_oob_data {
	bdaddr_t bdaddr;
	bdaddr_t bdaddr;
} __packed;
} __packed;


#define MGMT_OP_START_DISCOVERY		0x001B

#define MGMT_OP_STOP_DISCOVERY		0x001C

#define MGMT_EV_CMD_COMPLETE		0x0001
#define MGMT_EV_CMD_COMPLETE		0x0001
struct mgmt_ev_cmd_complete {
struct mgmt_ev_cmd_complete {
	__le16 opcode;
	__le16 opcode;
@@ -226,8 +230,8 @@ struct mgmt_ev_controller_error {


#define MGMT_EV_NEW_KEY			0x000A
#define MGMT_EV_NEW_KEY			0x000A
struct mgmt_ev_new_key {
struct mgmt_ev_new_key {
	__u8 store_hint;
	struct mgmt_key_info key;
	struct mgmt_key_info key;
	__u8 old_key_type;
} __packed;
} __packed;


#define MGMT_EV_CONNECTED		0x000B
#define MGMT_EV_CONNECTED		0x000B
@@ -249,11 +253,13 @@ struct mgmt_ev_connect_failed {
#define MGMT_EV_PIN_CODE_REQUEST	0x000E
#define MGMT_EV_PIN_CODE_REQUEST	0x000E
struct mgmt_ev_pin_code_request {
struct mgmt_ev_pin_code_request {
	bdaddr_t bdaddr;
	bdaddr_t bdaddr;
	__u8 secure;
} __packed;
} __packed;


#define MGMT_EV_USER_CONFIRM_REQUEST	0x000F
#define MGMT_EV_USER_CONFIRM_REQUEST	0x000F
struct mgmt_ev_user_confirm_request {
struct mgmt_ev_user_confirm_request {
	bdaddr_t bdaddr;
	bdaddr_t bdaddr;
	__u8 confirm_hint;
	__le32 value;
	__le32 value;
} __packed;
} __packed;


@@ -281,3 +287,5 @@ struct mgmt_ev_remote_name {
	bdaddr_t bdaddr;
	bdaddr_t bdaddr;
	__u8 name[MGMT_MAX_NAME_LENGTH];
	__u8 name[MGMT_MAX_NAME_LENGTH];
} __packed;
} __packed;

#define MGMT_EV_DISCOVERING		0x0014
+2 −1
Original line number Original line Diff line number Diff line
@@ -346,7 +346,8 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock)


	bacpy(&session->bdaddr, &bt_sk(sock->sk)->dst);
	bacpy(&session->bdaddr, &bt_sk(sock->sk)->dst);


	session->mtu = min_t(uint, l2cap_pi(sock->sk)->omtu, l2cap_pi(sock->sk)->imtu);
	session->mtu = min_t(uint, l2cap_pi(sock->sk)->chan->omtu,
					l2cap_pi(sock->sk)->chan->imtu);


	BT_DBG("mtu %d", session->mtu);
	BT_DBG("mtu %d", session->mtu);


Loading