1107120Sjulian/*
2107120Sjulian * ng_btsocket_l2cap.h
3139823Simp */
4139823Simp
5139823Simp/*-
6107120Sjulian * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
7107120Sjulian * All rights reserved.
8107120Sjulian *
9107120Sjulian * Redistribution and use in source and binary forms, with or without
10107120Sjulian * modification, are permitted provided that the following conditions
11107120Sjulian * are met:
12107120Sjulian * 1. Redistributions of source code must retain the above copyright
13107120Sjulian *    notice, this list of conditions and the following disclaimer.
14107120Sjulian * 2. Redistributions in binary form must reproduce the above copyright
15107120Sjulian *    notice, this list of conditions and the following disclaimer in the
16107120Sjulian *    documentation and/or other materials provided with the distribution.
17107120Sjulian *
18107120Sjulian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19107120Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20107120Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21107120Sjulian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22107120Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23107120Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24107120Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25107120Sjulian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26107120Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27107120Sjulian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28107120Sjulian * SUCH DAMAGE.
29107120Sjulian *
30114878Sjulian * $Id: ng_btsocket_l2cap.h,v 1.4 2003/03/25 23:53:33 max Exp $
31107120Sjulian * $FreeBSD$
32107120Sjulian */
33107120Sjulian
34107120Sjulian#ifndef _NETGRAPH_BTSOCKET_L2CAP_H_
35122634Semax#define _NETGRAPH_BTSOCKET_L2CAP_H_
36107120Sjulian
37107120Sjulian/*
38107120Sjulian * L2CAP routing entry
39107120Sjulian */
40107120Sjulian
41107120Sjulianstruct ng_hook;
42107120Sjulianstruct ng_message;
43107120Sjulian
44107120Sjulianstruct ng_btsocket_l2cap_rtentry {
45107120Sjulian	bdaddr_t				 src;  /* source BD_ADDR */
46107120Sjulian	struct ng_hook				*hook; /* downstream hook */
47114878Sjulian	LIST_ENTRY(ng_btsocket_l2cap_rtentry)	 next; /* link to next */
48107120Sjulian};
49107120Sjuliantypedef struct ng_btsocket_l2cap_rtentry	ng_btsocket_l2cap_rtentry_t;
50107120Sjuliantypedef struct ng_btsocket_l2cap_rtentry *	ng_btsocket_l2cap_rtentry_p;
51107120Sjulian
52107120Sjulian/*****************************************************************************
53107120Sjulian *****************************************************************************
54107120Sjulian **                          SOCK_RAW L2CAP sockets                         **
55107120Sjulian *****************************************************************************
56107120Sjulian *****************************************************************************/
57107120Sjulian
58107120Sjulian#define NG_BTSOCKET_L2CAP_RAW_SENDSPACE	NG_L2CAP_MTU_DEFAULT
59107120Sjulian#define NG_BTSOCKET_L2CAP_RAW_RECVSPACE	NG_L2CAP_MTU_DEFAULT
60107120Sjulian
61107120Sjulian/*
62107120Sjulian * Bluetooth raw L2CAP socket PCB
63107120Sjulian */
64107120Sjulian
65107120Sjulianstruct ng_btsocket_l2cap_raw_pcb {
66107120Sjulian	struct socket				*so;	/* socket */
67107120Sjulian
68114878Sjulian	u_int32_t				 flags; /* flags */
69114878Sjulian#define NG_BTSOCKET_L2CAP_RAW_PRIVILEGED	(1 << 0)
70114878Sjulian
71107120Sjulian	bdaddr_t				 src;	/* source address */
72114878Sjulian	bdaddr_t				 dst;	/* dest address */
73107120Sjulian	ng_btsocket_l2cap_rtentry_p		 rt;    /* routing info */
74107120Sjulian
75107120Sjulian	u_int32_t				 token;	/* message token */
76107120Sjulian	struct ng_mesg				*msg;   /* message */
77107120Sjulian
78114878Sjulian	struct mtx				 pcb_mtx; /* pcb mutex */
79114878Sjulian
80107120Sjulian	LIST_ENTRY(ng_btsocket_l2cap_raw_pcb)	 next;  /* link to next PCB */
81107120Sjulian};
82107120Sjuliantypedef struct ng_btsocket_l2cap_raw_pcb	ng_btsocket_l2cap_raw_pcb_t;
83107120Sjuliantypedef struct ng_btsocket_l2cap_raw_pcb *	ng_btsocket_l2cap_raw_pcb_p;
84107120Sjulian
85107120Sjulian#define	so2l2cap_raw_pcb(so) \
86107120Sjulian	((struct ng_btsocket_l2cap_raw_pcb *)((so)->so_pcb))
87107120Sjulian
88107120Sjulian/*
89107120Sjulian * Bluetooth raw L2CAP socket methods
90107120Sjulian */
91107120Sjulian
92107120Sjulian#ifdef _KERNEL
93107120Sjulian
94107120Sjulianvoid ng_btsocket_l2cap_raw_init       (void);
95157366Srwatsonvoid ng_btsocket_l2cap_raw_abort      (struct socket *);
96160549Srwatsonvoid ng_btsocket_l2cap_raw_close      (struct socket *);
97107120Sjulianint  ng_btsocket_l2cap_raw_attach     (struct socket *, int, struct thread *);
98107120Sjulianint  ng_btsocket_l2cap_raw_bind       (struct socket *, struct sockaddr *,
99107120Sjulian                                       struct thread *);
100107120Sjulianint  ng_btsocket_l2cap_raw_connect    (struct socket *, struct sockaddr *,
101107120Sjulian                                       struct thread *);
102107120Sjulianint  ng_btsocket_l2cap_raw_control    (struct socket *, u_long, caddr_t,
103107120Sjulian                                       struct ifnet *, struct thread *);
104157370Srwatsonvoid ng_btsocket_l2cap_raw_detach     (struct socket *);
105107120Sjulianint  ng_btsocket_l2cap_raw_disconnect (struct socket *);
106107120Sjulianint  ng_btsocket_l2cap_raw_peeraddr   (struct socket *, struct sockaddr **);
107107120Sjulianint  ng_btsocket_l2cap_raw_send       (struct socket *, int, struct mbuf *,
108107120Sjulian                                       struct sockaddr *, struct mbuf *,
109107120Sjulian                                       struct thread *);
110107120Sjulianint  ng_btsocket_l2cap_raw_sockaddr   (struct socket *, struct sockaddr **);
111107120Sjulian
112107120Sjulian#endif /* _KERNEL */
113107120Sjulian
114107120Sjulian/*****************************************************************************
115107120Sjulian *****************************************************************************
116107120Sjulian **                    SOCK_SEQPACKET L2CAP sockets                         **
117107120Sjulian *****************************************************************************
118107120Sjulian *****************************************************************************/
119107120Sjulian
120107120Sjulian#define NG_BTSOCKET_L2CAP_SENDSPACE	NG_L2CAP_MTU_DEFAULT /* (64 * 1024) */
121107120Sjulian#define NG_BTSOCKET_L2CAP_RECVSPACE	(64 * 1024)
122107120Sjulian
123107120Sjulian/*
124107120Sjulian * Bluetooth L2CAP socket PCB
125107120Sjulian */
126107120Sjulian
127107120Sjulianstruct ng_btsocket_l2cap_pcb {
128107120Sjulian	struct socket			*so;	     /* Pointer to socket */
129107120Sjulian
130107120Sjulian	bdaddr_t			 src;	     /* Source address */
131107120Sjulian	bdaddr_t			 dst;	     /* Destination address */
132107120Sjulian
133107120Sjulian	u_int16_t			 psm;	     /* PSM */
134107120Sjulian	u_int16_t			 cid;	     /* Local channel ID */
135107120Sjulian
136107120Sjulian	u_int16_t			 flags;      /* socket flags */
137107120Sjulian#define NG_BTSOCKET_L2CAP_CLIENT	(1 << 0)     /* socket is client */
138107120Sjulian#define NG_BTSOCKET_L2CAP_TIMO		(1 << 1)     /* timeout pending */
139107120Sjulian
140107120Sjulian	u_int8_t			 state;      /* socket state */
141107120Sjulian#define NG_BTSOCKET_L2CAP_CLOSED	0            /* socket closed */
142107120Sjulian#define NG_BTSOCKET_L2CAP_CONNECTING	1            /* wait for connect */
143107120Sjulian#define NG_BTSOCKET_L2CAP_CONFIGURING	2            /* wait for config */
144107120Sjulian#define NG_BTSOCKET_L2CAP_OPEN		3            /* socket open */
145107120Sjulian#define NG_BTSOCKET_L2CAP_DISCONNECTING	4            /* wait for disconnect */
146107120Sjulian
147107120Sjulian	u_int8_t			 cfg_state;  /* config state */
148107120Sjulian#define	NG_BTSOCKET_L2CAP_CFG_IN	(1 << 0)     /* incoming path done */
149107120Sjulian#define	NG_BTSOCKET_L2CAP_CFG_OUT	(1 << 1)     /* outgoing path done */
150107120Sjulian#define	NG_BTSOCKET_L2CAP_CFG_BOTH \
151107120Sjulian	(NG_BTSOCKET_L2CAP_CFG_IN | NG_BTSOCKET_L2CAP_CFG_OUT)
152107120Sjulian
153107120Sjulian#define	NG_BTSOCKET_L2CAP_CFG_IN_SENT	(1 << 2)     /* L2CAP ConfigReq sent */
154107120Sjulian#define	NG_BTSOCKET_L2CAP_CFG_OUT_SENT	(1 << 3)     /* ---/--- */
155107120Sjulian
156107120Sjulian	u_int16_t			 imtu;       /* Incoming MTU */
157107120Sjulian	ng_l2cap_flow_t			 iflow;      /* Input flow spec */
158107120Sjulian
159107120Sjulian	u_int16_t			 omtu;       /* Outgoing MTU */
160107120Sjulian	ng_l2cap_flow_t			 oflow;      /* Outgoing flow spec */
161107120Sjulian
162107120Sjulian	u_int16_t			 flush_timo; /* flush timeout */
163107120Sjulian	u_int16_t			 link_timo;  /* link timeout */
164107120Sjulian
165107120Sjulian	struct callout_handle		 timo;       /* timeout */
166107120Sjulian
167107120Sjulian	u_int32_t			 token;	     /* message token */
168107120Sjulian	ng_btsocket_l2cap_rtentry_p	 rt;         /* routing info */
169107120Sjulian
170107120Sjulian	struct mtx			 pcb_mtx;    /* pcb mutex */
171107120Sjulian
172107120Sjulian	LIST_ENTRY(ng_btsocket_l2cap_pcb) next;      /* link to next PCB */
173107120Sjulian};
174107120Sjuliantypedef struct ng_btsocket_l2cap_pcb	ng_btsocket_l2cap_pcb_t;
175107120Sjuliantypedef struct ng_btsocket_l2cap_pcb *	ng_btsocket_l2cap_pcb_p;
176107120Sjulian
177107120Sjulian#define	so2l2cap_pcb(so) \
178107120Sjulian	((struct ng_btsocket_l2cap_pcb *)((so)->so_pcb))
179107120Sjulian
180107120Sjulian/*
181107120Sjulian * Bluetooth L2CAP socket methods
182107120Sjulian */
183107120Sjulian
184107120Sjulian#ifdef _KERNEL
185107120Sjulian
186107120Sjulianvoid ng_btsocket_l2cap_init       (void);
187157366Srwatsonvoid ng_btsocket_l2cap_abort      (struct socket *);
188160549Srwatsonvoid ng_btsocket_l2cap_close      (struct socket *);
189107120Sjulianint  ng_btsocket_l2cap_accept     (struct socket *, struct sockaddr **);
190107120Sjulianint  ng_btsocket_l2cap_attach     (struct socket *, int, struct thread *);
191107120Sjulianint  ng_btsocket_l2cap_bind       (struct socket *, struct sockaddr *,
192107120Sjulian                                   struct thread *);
193107120Sjulianint  ng_btsocket_l2cap_connect    (struct socket *, struct sockaddr *,
194107120Sjulian                                   struct thread *);
195107120Sjulianint  ng_btsocket_l2cap_control    (struct socket *, u_long, caddr_t,
196107120Sjulian                                   struct ifnet *, struct thread *);
197107120Sjulianint  ng_btsocket_l2cap_ctloutput  (struct socket *, struct sockopt *);
198157370Srwatsonvoid ng_btsocket_l2cap_detach     (struct socket *);
199107120Sjulianint  ng_btsocket_l2cap_disconnect (struct socket *);
200151888Srwatsonint  ng_btsocket_l2cap_listen     (struct socket *, int, struct thread *);
201107120Sjulianint  ng_btsocket_l2cap_peeraddr   (struct socket *, struct sockaddr **);
202107120Sjulianint  ng_btsocket_l2cap_send       (struct socket *, int, struct mbuf *,
203107120Sjulian                                   struct sockaddr *, struct mbuf *,
204107120Sjulian                                   struct thread *);
205107120Sjulianint  ng_btsocket_l2cap_sockaddr   (struct socket *, struct sockaddr **);
206107120Sjulian
207107120Sjulian#endif /* _KERNEL */
208107120Sjulian
209107120Sjulian#endif /* _NETGRAPH_BTSOCKET_L2CAP_H_ */
210107120Sjulian
211