diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 14:43:13 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 14:43:13 -0700 | 
| commit | 951cc93a7493a81a47e20231441bc6cf17c98a37 (patch) | |
| tree | f53934f0f225e0215a85c8c59af4c6513e89e3f1 /include/net/bluetooth/l2cap.h | |
| parent | a7e1aabb28e8154ce987b622fd78d80a1ca39361 (diff) | |
| parent | 415b3334a21aa67806c52d1acf4e72e14f7f402f (diff) | |
| download | olio-linux-3.10-951cc93a7493a81a47e20231441bc6cf17c98a37.tar.xz olio-linux-3.10-951cc93a7493a81a47e20231441bc6cf17c98a37.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1287 commits)
  icmp: Fix regression in nexthop resolution during replies.
  net: Fix ppc64 BPF JIT dependencies.
  acenic: include NET_SKB_PAD headroom to incoming skbs
  ixgbe: convert to ndo_fix_features
  ixgbe: only enable WoL for magic packet by default
  ixgbe: remove ifdef check for non-existent define
  ixgbe: Pass staterr instead of re-reading status and error bits from descriptor
  ixgbe: Move interrupt related values out of ring and into q_vector
  ixgbe: add structure for containing RX/TX rings to q_vector
  ixgbe: inline the ixgbe_maybe_stop_tx function
  ixgbe: Update ATR to use recorded TX queues instead of CPU for routing
  igb: Fix for DH89xxCC near end loopback test
  e1000: always call e1000_check_for_link() on e1000_ce4100 MACs.
  netxen: add fw version compatibility check
  be2net: request native mode each time the card is reset
  ipv4: Constrain UFO fragment sizes to multiples of 8 bytes
  virtio_net: Fix panic in virtnet_remove
  ipv6: make fragment identifications less predictable
  ipv6: unshare inetpeers
  can: make function can_get_bittiming static
  ...
Diffstat (limited to 'include/net/bluetooth/l2cap.h')
| -rw-r--r-- | include/net/bluetooth/l2cap.h | 138 | 
1 files changed, 89 insertions, 49 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index d09c9b1118e..4f34ad25e75 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -37,7 +37,6 @@  #define L2CAP_DEFAULT_MONITOR_TO	12000   /* 12 seconds */  #define L2CAP_DEFAULT_MAX_PDU_SIZE	1009    /* Sized for 3-DH5 packet */  #define L2CAP_DEFAULT_ACK_TO		200 -#define L2CAP_LOCAL_BUSY_TRIES		12  #define L2CAP_LE_DEFAULT_MTU		23  #define L2CAP_CONN_TIMEOUT	(40000) /* 40 seconds */ @@ -130,6 +129,12 @@ struct l2cap_conninfo {  #define L2CAP_SDU_END               0x8000  #define L2CAP_SDU_CONTINUE          0xC000 +/* L2CAP Command rej. reasons */ +#define L2CAP_REJ_NOT_UNDERSTOOD      0x0000 +#define L2CAP_REJ_MTU_EXCEEDED        0x0001 +#define L2CAP_REJ_INVALID_CID         0x0002 + +  /* L2CAP structures */  struct l2cap_hdr {  	__le16     len; @@ -144,8 +149,19 @@ struct l2cap_cmd_hdr {  } __packed;  #define L2CAP_CMD_HDR_SIZE	4 -struct l2cap_cmd_rej { +struct l2cap_cmd_rej_unk { +	__le16     reason; +} __packed; + +struct l2cap_cmd_rej_mtu {  	__le16     reason; +	__le16     max_mtu; +} __packed; + +struct l2cap_cmd_rej_cid { +	__le16     reason; +	__le16     scid; +	__le16     dcid;  } __packed;  struct l2cap_conn_req { @@ -287,6 +303,10 @@ struct l2cap_chan {  	struct l2cap_conn	*conn; +	__u8		state; + +	atomic_t	refcnt; +  	__le16		psm;  	__u16		dcid;  	__u16		scid; @@ -295,6 +315,7 @@ struct l2cap_chan {  	__u16		omtu;  	__u16		flush_to;  	__u8		mode; +	__u8		chan_type;  	__le16		sport; @@ -302,6 +323,7 @@ struct l2cap_chan {  	__u8		role_switch;  	__u8		force_reliable;  	__u8		flushable; +	__u8		force_active;  	__u8		ident; @@ -318,8 +340,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; @@ -339,18 +361,29 @@ struct l2cap_chan {  	__u8		remote_max_tx;  	__u16		remote_mps; +	struct timer_list	chan_timer;  	struct timer_list	retrans_timer;  	struct timer_list	monitor_timer;  	struct timer_list	ack_timer;  	struct sk_buff		*tx_send_head;  	struct sk_buff_head	tx_q;  	struct sk_buff_head	srej_q; -	struct sk_buff_head	busy_q; -	struct work_struct	busy_work;  	struct list_head	srej_l;  	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 { @@ -376,6 +409,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;  }; @@ -384,44 +426,57 @@ struct l2cap_conn {  #define L2CAP_INFO_FEAT_MASK_REQ_SENT	0x04  #define L2CAP_INFO_FEAT_MASK_REQ_DONE	0x08 +#define L2CAP_CHAN_RAW			1 +#define L2CAP_CHAN_CONN_LESS		2 +#define L2CAP_CHAN_CONN_ORIENTED	3 +  /* ----- L2CAP socket info ----- */  #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk)  struct l2cap_pinfo {  	struct bt_sock	bt;  	struct l2cap_chan	*chan; +	struct sk_buff	*rx_busy_skb;  }; -#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 +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, +}; -#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)); +#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)  { @@ -446,32 +501,17 @@ extern int disable_ertm;  int l2cap_init_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_connect_rsp_defer(struct l2cap_chan *chan);  int __l2cap_wait_ack(struct sock *sk); -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 l2cap_chan *chan, struct msghdr *msg, size_t len); -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); -void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb); -void l2cap_streaming_send(struct l2cap_chan *chan); -int l2cap_ertm_send(struct l2cap_chan *chan); -  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_set_timer(struct sock *sk, long timeout); -void l2cap_sock_clear_timer(struct sock *sk); -void __l2cap_sock_close(struct sock *sk, int reason); -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); -void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err);  struct l2cap_chan *l2cap_chan_create(struct sock *sk); -void l2cap_chan_del(struct l2cap_chan *chan, int err); +void l2cap_chan_close(struct l2cap_chan *chan, int reason);  void l2cap_chan_destroy(struct l2cap_chan *chan);  int l2cap_chan_connect(struct l2cap_chan *chan); +int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len); +void l2cap_chan_busy(struct l2cap_chan *chan, int busy);  #endif /* __L2CAP_H */  |