Commit 1c1236e3 authored by John W. Linville's avatar John W. Linville
Browse files

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/padovan/bluetooth-next-2.6

parents e10542c4 43f3dc41
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -745,6 +745,33 @@ struct hci_cp_le_conn_update {
	__le16   max_ce_len;
} __packed;

#define HCI_OP_LE_START_ENC		0x2019
struct hci_cp_le_start_enc {
	__le16	handle;
	__u8	rand[8];
	__le16	ediv;
	__u8	ltk[16];
} __packed;

#define HCI_OP_LE_LTK_REPLY		0x201a
struct hci_cp_le_ltk_reply {
	__le16	handle;
	__u8	ltk[16];
} __packed;
struct hci_rp_le_ltk_reply {
	__u8	status;
	__le16	handle;
} __packed;

#define HCI_OP_LE_LTK_NEG_REPLY		0x201b
struct hci_cp_le_ltk_neg_reply {
	__le16	handle;
} __packed;
struct hci_rp_le_ltk_neg_reply {
	__u8	status;
	__le16	handle;
} __packed;

/* ---- HCI Events ---- */
#define HCI_EV_INQUIRY_COMPLETE		0x01

@@ -1035,6 +1062,13 @@ struct hci_ev_le_conn_complete {
	__u8     clk_accurancy;
} __packed;

#define HCI_EV_LE_LTK_REQ		0x05
struct hci_ev_le_ltk_req {
	__le16	handle;
	__u8	random[8];
	__le16	ediv;
} __packed;

/* Advertising report event types */
#define ADV_IND		0x00
#define ADV_DIRECT_IND	0x01
+13 −0
Original line number Diff line number Diff line
@@ -177,6 +177,8 @@ struct hci_dev {

	__u16			init_last_cmd;

	struct crypto_blkcipher	*tfm;

	struct inquiry_cache	inq_cache;
	struct hci_conn_hash	conn_hash;
	struct list_head	blacklist;
@@ -247,6 +249,7 @@ struct hci_conn {
	__u8		power_save;
	__u16		disc_timeout;
	unsigned long	pend;
	__u8		ltk[16];

	__u8		remote_cap;
	__u8		remote_oob;
@@ -526,6 +529,8 @@ 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);
int hci_blacklist_add(struct hci_dev *hdev, bdaddr_t *bdaddr);
int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr);

int hci_uuids_clear(struct hci_dev *hdev);

@@ -742,6 +747,9 @@ static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status,
	if (conn->sec_level == BT_SECURITY_SDP)
		conn->sec_level = BT_SECURITY_LOW;

	if (conn->pending_sec_level > conn->sec_level)
		conn->sec_level = conn->pending_sec_level;

	hci_proto_encrypt_cfm(conn, status, encrypt);

	read_lock_bh(&hci_cb_list_lock);
@@ -859,4 +867,9 @@ void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result);

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],
							__u8 ltk[16]);
void hci_le_ltk_reply(struct hci_conn *conn, u8 ltk[16]);
void hci_le_ltk_neg_reply(struct hci_conn *conn);

#endif /* __HCI_CORE_H */
+62 −33
Original line number Diff line number Diff line
@@ -287,6 +287,10 @@ struct l2cap_chan {

	struct l2cap_conn	*conn;

	__u8		state;

	atomic_t	refcnt;

	__le16		psm;
	__u16		dcid;
	__u16		scid;
@@ -320,8 +324,8 @@ struct l2cap_chan {
	__u16		monitor_timeout;
	__u16		mps;

	__u8		conf_state;
	__u16		conn_state;
	unsigned long	conf_state;
	unsigned long	conn_state;

	__u8		next_tx_seq;
	__u8		expected_ack_seq;
@@ -354,6 +358,18 @@ struct l2cap_chan {

	struct list_head list;
	struct list_head global_l;

	void		*data;
	struct l2cap_ops *ops;
};

struct l2cap_ops {
	char		*name;

	struct l2cap_chan	*(*new_connection) (void *data);
	int			(*recv) (void *data, struct sk_buff *skb);
	void			(*close) (void *data);
	void			(*state_change) (void *data, int state);
};

struct l2cap_conn {
@@ -379,6 +395,15 @@ struct l2cap_conn {

	__u8		disc_reason;

	__u8		preq[7]; /* SMP Pairing Request */
	__u8		prsp[7]; /* SMP Pairing Response */
	__u8		prnd[16]; /* SMP Pairing Random */
	__u8		pcnf[16]; /* SMP Pairing Confirm */
	__u8		tk[16]; /* SMP Temporary Key */
	__u8		smp_key_size;

	struct timer_list security_timer;

	struct list_head chan_l;
	rwlock_t	chan_lock;
};
@@ -399,36 +424,45 @@ struct l2cap_pinfo {
	struct l2cap_chan	*chan;
};

#define L2CAP_CONF_REQ_SENT       0x01
#define L2CAP_CONF_INPUT_DONE     0x02
#define L2CAP_CONF_OUTPUT_DONE    0x04
#define L2CAP_CONF_MTU_DONE       0x08
#define L2CAP_CONF_MODE_DONE      0x10
#define L2CAP_CONF_CONNECT_PEND   0x20
#define L2CAP_CONF_NO_FCS_RECV    0x40
#define L2CAP_CONF_STATE2_DEVICE  0x80
enum {
	CONF_REQ_SENT,
	CONF_INPUT_DONE,
	CONF_OUTPUT_DONE,
	CONF_MTU_DONE,
	CONF_MODE_DONE,
	CONF_CONNECT_PEND,
	CONF_NO_FCS_RECV,
	CONF_STATE2_DEVICE,
};

#define L2CAP_CONF_MAX_CONF_REQ 2
#define L2CAP_CONF_MAX_CONF_RSP 2

#define L2CAP_CONN_SAR_SDU         0x0001
#define L2CAP_CONN_SREJ_SENT       0x0002
#define L2CAP_CONN_WAIT_F          0x0004
#define L2CAP_CONN_SREJ_ACT        0x0008
#define L2CAP_CONN_SEND_PBIT       0x0010
#define L2CAP_CONN_REMOTE_BUSY     0x0020
#define L2CAP_CONN_LOCAL_BUSY      0x0040
#define L2CAP_CONN_REJ_ACT         0x0080
#define L2CAP_CONN_SEND_FBIT       0x0100
#define L2CAP_CONN_RNR_SENT        0x0200
#define L2CAP_CONN_SAR_RETRY       0x0400

#define __mod_retrans_timer() mod_timer(&chan->retrans_timer, \
		jiffies +  msecs_to_jiffies(L2CAP_DEFAULT_RETRANS_TO));
#define __mod_monitor_timer() mod_timer(&chan->monitor_timer, \
		jiffies + msecs_to_jiffies(L2CAP_DEFAULT_MONITOR_TO));
#define __mod_ack_timer() mod_timer(&chan->ack_timer, \
		jiffies + msecs_to_jiffies(L2CAP_DEFAULT_ACK_TO));
enum {
	CONN_SAR_SDU,
	CONN_SREJ_SENT,
	CONN_WAIT_F,
	CONN_SREJ_ACT,
	CONN_SEND_PBIT,
	CONN_REMOTE_BUSY,
	CONN_LOCAL_BUSY,
	CONN_REJ_ACT,
	CONN_SEND_FBIT,
	CONN_RNR_SENT,
	CONN_SAR_RETRY,
};

#define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t))
#define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer)
#define __set_retrans_timer(c) l2cap_set_timer(c, &c->retrans_timer, \
		L2CAP_DEFAULT_RETRANS_TO);
#define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer)
#define __set_monitor_timer(c) l2cap_set_timer(c, &c->monitor_timer, \
		L2CAP_DEFAULT_MONITOR_TO);
#define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer)
#define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \
		L2CAP_DEFAULT_ACK_TO);
#define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer)

static inline int l2cap_tx_window_full(struct l2cap_chan *ch)
{
@@ -459,11 +493,6 @@ int __l2cap_wait_ack(struct sock *sk);
int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm);
int l2cap_add_scid(struct l2cap_chan *chan,  __u16 scid);

void l2cap_sock_kill(struct sock *sk);
void l2cap_sock_init(struct sock *sk, struct sock *parent);
struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
							int proto, gfp_t prio);

struct l2cap_chan *l2cap_chan_create(struct sock *sk);
void l2cap_chan_close(struct l2cap_chan *chan, int reason);
void l2cap_chan_destroy(struct l2cap_chan *chan);
+10 −0
Original line number Diff line number Diff line
@@ -199,6 +199,16 @@ struct mgmt_cp_remove_remote_oob_data {

#define MGMT_OP_STOP_DISCOVERY		0x001C

#define MGMT_OP_BLOCK_DEVICE		0x001D
struct mgmt_cp_block_device {
	bdaddr_t bdaddr;
} __packed;

#define MGMT_OP_UNBLOCK_DEVICE		0x001E
struct mgmt_cp_unblock_device {
	bdaddr_t bdaddr;
} __packed;

#define MGMT_EV_CMD_COMPLETE		0x0001
struct mgmt_ev_cmd_complete {
	__le16 opcode;
+46 −0
Original line number Diff line number Diff line
/*
   BlueZ - Bluetooth protocol stack for Linux
   Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License version 2 as
   published by the Free Software Foundation;

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
   SOFTWARE IS DISCLAIMED.
*/

#ifndef __SMP_H
#define __SMP_H

@@ -16,6 +38,23 @@ struct smp_cmd_pairing {
	__u8	resp_key_dist;
} __packed;

#define SMP_IO_DISPLAY_ONLY	0x00
#define SMP_IO_DISPLAY_YESNO	0x01
#define SMP_IO_KEYBOARD_ONLY	0x02
#define SMP_IO_NO_INPUT_OUTPUT	0x03
#define SMP_IO_KEYBOARD_DISPLAY	0x04

#define SMP_OOB_NOT_PRESENT	0x00
#define SMP_OOB_PRESENT		0x01

#define SMP_DIST_ENC_KEY	0x01
#define SMP_DIST_ID_KEY		0x02
#define SMP_DIST_SIGN		0x04

#define SMP_AUTH_NONE		0x00
#define SMP_AUTH_BONDING	0x01
#define SMP_AUTH_MITM		0x04

#define SMP_CMD_PAIRING_CONFIRM	0x03
struct smp_cmd_pairing_confirm {
	__u8	confirm_val[16];
@@ -73,4 +112,11 @@ struct smp_cmd_security_req {
#define SMP_UNSPECIFIED		0x08
#define SMP_REPEATED_ATTEMPTS		0x09

#define SMP_MIN_ENC_KEY_SIZE		7
#define SMP_MAX_ENC_KEY_SIZE		16

/* SMP Commands */
int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level);
int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb);

#endif /* __SMP_H */
Loading