summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/bluetooth/l2cap/ng_l2cap_var.h
blob: 3c4f28e885e0b33735dacbb084da3b6b6bbe96e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/*
 * ng_l2cap_var.h
 *
 * Copyright (c) 2001 Maksim Yevmenkin <m_evmenkin@yahoo.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $Id: ng_l2cap_var.h,v 1.2 2003/04/28 21:44:59 max Exp $
 * $FreeBSD$
 */

#ifndef _NETGRAPH_L2CAP_VAR_H_
#define _NETGRAPH_L2CAP_VAR_H_

/* MALLOC decalation */
#ifdef NG_SEPARATE_MALLOC
MALLOC_DECLARE(M_NETGRAPH_L2CAP);
#else
#define M_NETGRAPH_L2CAP M_NETGRAPH
#endif /* NG_SEPARATE_MALLOC */

/* Debug */
#define	NG_L2CAP_ALERT	if (l2cap->debug >= NG_L2CAP_ALERT_LEVEL) printf
#define	NG_L2CAP_ERR	if (l2cap->debug >= NG_L2CAP_ERR_LEVEL)   printf
#define	NG_L2CAP_WARN	if (l2cap->debug >= NG_L2CAP_WARN_LEVEL)  printf
#define	NG_L2CAP_INFO	if (l2cap->debug >= NG_L2CAP_INFO_LEVEL)  printf

/* Wrapper around m_pullup */
#define NG_L2CAP_M_PULLUP(m, s) \
	do { \
		if ((m)->m_len < (s)) \
			(m) = m_pullup((m), (s)); \
		if ((m) == NULL) \
			NG_L2CAP_ALERT("%s: %s - m_pullup(%zd) failed\n", \
				__func__, NG_NODE_NAME(l2cap->node), (s)); \
	} while (0)

/*
 * L2CAP signaling command ident's are assigned relative to the connection,
 * because there is only one signaling channel (cid == 0x01) for every 
 * connection. So up to 254 (0xff - 0x01) L2CAP commands can be pending at the 
 * same time for the same connection.
 */

#define NG_L2CAP_NULL_IDENT	0x00        /* DO NOT USE THIS IDENT */ 
#define NG_L2CAP_FIRST_IDENT	0x01        /* dynamically alloc. (start) */ 
#define NG_L2CAP_LAST_IDENT	0xff        /* dynamically alloc. (end) */ 

/* 
 * L2CAP (Node private)
 */

struct ng_l2cap_con;
struct ng_l2cap_chan;

typedef struct ng_l2cap {
	node_p				node;         /* node ptr */

	ng_l2cap_node_debug_ep		debug;        /* debug level */
	ng_l2cap_node_flags_ep		flags;        /* L2CAP node flags */
	ng_l2cap_node_auto_discon_ep	discon_timo;  /* auto discon. timeout */

	u_int16_t			pkt_size;     /* max. ACL packet size */
	u_int16_t			num_pkts;     /* out queue size */
	bdaddr_t			bdaddr;       /* unit BDADDR */

	hook_p				hci;          /* HCI downstream hook */
	hook_p				l2c;          /* L2CAP upstream hook */
	hook_p				ctl;          /* control hook */

	LIST_HEAD(, ng_l2cap_con)	con_list;     /* ACL connections */

	u_int16_t			cid;          /* last allocated CID */
	LIST_HEAD(, ng_l2cap_chan)	chan_list;    /* L2CAP channels */
} ng_l2cap_t;
typedef ng_l2cap_t *			ng_l2cap_p;

/* 
 * L2CAP connection descriptor
 */

struct ng_l2cap_cmd;

typedef struct ng_l2cap_con {
	ng_l2cap_p			 l2cap;      /* pointer to L2CAP */

	u_int16_t			 state;      /* ACL connection state */
	u_int16_t			 flags;      /* ACL connection flags */

	int32_t				 refcnt;     /* reference count */

	bdaddr_t			 remote;     /* remote unit address */
	u_int16_t			 con_handle; /* ACL connection handle */
	struct callout			 con_timo;   /* connection timeout */

	u_int8_t			 ident;      /* last allocated ident */
	TAILQ_HEAD(, ng_l2cap_cmd)	 cmd_list;   /* pending L2CAP cmds */

	struct mbuf			*tx_pkt;     /* xmitted L2CAP packet */
	int				 pending;    /* num. of pending pkts */

	struct mbuf			*rx_pkt;     /* received L2CAP packet */
	int				 rx_pkt_len; /* packet len. so far */

	LIST_ENTRY(ng_l2cap_con)	 next;       /* link */
} ng_l2cap_con_t;
typedef ng_l2cap_con_t *		ng_l2cap_con_p;

/*
 * L2CAP channel descriptor
 */

typedef struct ng_l2cap_chan {
	ng_l2cap_con_p			con;        /* pointer to connection */

	u_int16_t			state;      /* channel state */

	u_int8_t			cfg_state;  /* configuration state */
#define NG_L2CAP_CFG_IN			(1 << 0)    /* incoming cfg path done */
#define NG_L2CAP_CFG_OUT		(1 << 1)    /* outgoing cfg path done */
#define NG_L2CAP_CFG_BOTH		(NG_L2CAP_CFG_IN|NG_L2CAP_CFG_OUT)

	u_int8_t			ident;      /* last L2CAP req. ident */

	u_int16_t			psm;        /* channel PSM */
	u_int16_t			scid;       /* source channel ID */
	u_int16_t			dcid;       /* destination channel ID */

	u_int16_t			imtu;       /* incoming channel MTU */
	ng_l2cap_flow_t			iflow;      /* incoming flow control */

	u_int16_t			omtu;       /* outgoing channel MTU */
	ng_l2cap_flow_t			oflow;      /* outgoing flow control */

	u_int16_t			flush_timo; /* flush timeout */
	u_int16_t			link_timo;  /* link timeout */

	LIST_ENTRY(ng_l2cap_chan)	next;       /* link */
} ng_l2cap_chan_t;
typedef ng_l2cap_chan_t *		ng_l2cap_chan_p;

/*
 * L2CAP command descriptor
 */

typedef struct ng_l2cap_cmd {
	ng_l2cap_con_p			 con;       /* L2CAP connection */
	ng_l2cap_chan_p			 ch;        /* L2CAP channel */

	u_int16_t 			 flags;     /* command flags */
#define NG_L2CAP_CMD_PENDING		 (1 << 0)   /* command is pending */

	u_int8_t 			 code;      /* L2CAP command opcode */
	u_int8_t			 ident;     /* L2CAP command ident */
	u_int32_t			 token;     /* L2CA message token */

	struct callout			 timo;      /* RTX/ERTX timeout */

	struct mbuf			*aux;       /* optional data */

	TAILQ_ENTRY(ng_l2cap_cmd)	 next;      /* link */
} ng_l2cap_cmd_t;
typedef ng_l2cap_cmd_t *		ng_l2cap_cmd_p;

#endif /* ndef _NETGRAPH_L2CAP_VAR_H_ */

OpenPOWER on IntegriCloud