xref: /freebsd/share/man/man4/ng_btsocket.4 (revision f2bb1cae36283a8eb5a0f19d8612c6abc5148e8f)
1f2bb1caeSJulian Elischer.\" ng_btsocket.4
2f2bb1caeSJulian Elischer.\"
3878ed226SJulian Elischer.\" Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
4878ed226SJulian Elischer.\" All rights reserved.
5878ed226SJulian Elischer.\"
6878ed226SJulian Elischer.\" Redistribution and use in source and binary forms, with or without
7878ed226SJulian Elischer.\" modification, are permitted provided that the following conditions
8878ed226SJulian Elischer.\" are met:
9878ed226SJulian Elischer.\" 1. Redistributions of source code must retain the above copyright
10878ed226SJulian Elischer.\"    notice, this list of conditions and the following disclaimer.
11878ed226SJulian Elischer.\" 2. Redistributions in binary form must reproduce the above copyright
12878ed226SJulian Elischer.\"    notice, this list of conditions and the following disclaimer in the
13878ed226SJulian Elischer.\"    documentation and/or other materials provided with the distribution.
14878ed226SJulian Elischer.\"
15878ed226SJulian Elischer.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16878ed226SJulian Elischer.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17878ed226SJulian Elischer.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18878ed226SJulian Elischer.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19878ed226SJulian Elischer.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20878ed226SJulian Elischer.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21878ed226SJulian Elischer.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22878ed226SJulian Elischer.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23878ed226SJulian Elischer.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24878ed226SJulian Elischer.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25878ed226SJulian Elischer.\" SUCH DAMAGE.
26878ed226SJulian Elischer.\"
27f2bb1caeSJulian Elischer.\" $Id: ng_btsocket.4,v 1.6 2003/03/18 00:09:34 max Exp $
28878ed226SJulian Elischer.\" $FreeBSD$
29878ed226SJulian Elischer.Dd July 8, 2002
30878ed226SJulian Elischer.Dt NG_BTSOCKET 4
31878ed226SJulian Elischer.Os
32878ed226SJulian Elischer.Sh NAME
33f393f498SRuslan Ermilov.Nm ng_btsocket
34878ed226SJulian Elischer.Nd Bluetooth sockets layer
35878ed226SJulian Elischer.Sh SYNOPSIS
36878ed226SJulian Elischer.In sys/types.h
37878ed226SJulian Elischer.In sys/socket.h
38878ed226SJulian Elischer.In bitstring.h
39878ed226SJulian Elischer.In netgraph.h
40878ed226SJulian Elischer.In ng_hci.h
41878ed226SJulian Elischer.In ng_l2cap.h
42878ed226SJulian Elischer.In ng_btsocket.h
43878ed226SJulian Elischer.Sh DESCRIPTION
44878ed226SJulian ElischerThe
45878ed226SJulian Elischer.Nm
46f2bb1caeSJulian Elischermodule implements three Netgraph node types. Each type in its turn implements
47f2bb1caeSJulian Elischerone protocol within
48878ed226SJulian Elischer.Dv PF_BLUETOOTH
49878ed226SJulian Elischerdomain.
50f2bb1caeSJulian Elischer.Pp
51f2bb1caeSJulian Elischer.Sh BLUETOOTH_PROTO_HCI protocol
52f2bb1caeSJulian Elischer.Ss SOCK_RAW HCI sockets
53878ed226SJulian ElischerImplemented by
54f2bb1caeSJulian Elischer.Cm btsock_hci_raw
55f2bb1caeSJulian ElischerNetgraph type. Raw HCI sockets allow sending of raw HCI command datagrams
56878ed226SJulian Elischeronly to correspondents named in
57878ed226SJulian Elischer.Xr send 2
58f2bb1caeSJulian Elischercalls. Raw HCI datagrams (HCI commands, events and data) are generally
59f2bb1caeSJulian Elischerreceived with
60878ed226SJulian Elischer.Xr recvfrom 2 ,
61f2bb1caeSJulian Elischerwhich returns the next datagram with its return address. Also raw HCI
62f2bb1caeSJulian Elischersockets can be used to control HCI nodes.
63878ed226SJulian Elischer.Pp
64878ed226SJulian ElischerThe Bluetooth raw HCI socket address is defined as follows:
65878ed226SJulian Elischer.Bd -literal -offset indent
66878ed226SJulian Elischer/* Bluetooth version of struct sockaddr for raw HCI sockets */
67878ed226SJulian Elischerstruct sockaddr_hci {
68878ed226SJulian Elischer        u_char	hci_len;      /* total length */
69878ed226SJulian Elischer        u_char	hci_family;   /* address family */
70878ed226SJulian Elischer	char	hci_node[16]; /* HCI node name */
71878ed226SJulian Elischer};
72878ed226SJulian Elischer.Ed
73878ed226SJulian Elischer.Pp
74878ed226SJulian ElischerRaw HCI sockets support number of
75878ed226SJulian Elischer.Xr ioctl 2
76878ed226SJulian Elischerrequests such as:
77f2bb1caeSJulian Elischer.Bl -tag -width foo
78878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_GET_STATE
79878ed226SJulian ElischerReturns current state for the HCI node.
80878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_INIT
81878ed226SJulian ElischerTurn on
82878ed226SJulian Elischer.Dq inited
83878ed226SJulian Elischerbit for the HCI node.
84878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_GET_DEBUG
85878ed226SJulian ElischerReturns current debug level for the HCI node.
86878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_SET_DEBUG
87878ed226SJulian ElischerSets current debug level for the HCI node.
88878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_GET_BUFFER
89878ed226SJulian ElischerReturns current state of data buffers for the HCI node.
90878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_GET_BDADDR
91878ed226SJulian ElischerReturns BD_ADDR for the HCI node.
92878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_GET_FEATURES
93878ed226SJulian ElischerReturns the list of features supported by hardware for the HCI node.
94878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_GET_STAT
95878ed226SJulian ElischerReturns various statistic counters for the HCI node.
96878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_RESET_STAT
97878ed226SJulian ElischerResets all statistic counters for the HCI node to zero.
98878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_FLUSH_NEIGHBOR_CACHE
99878ed226SJulian ElischerRemove all neighbor cache entries for the HCI node.
100878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_GET_NEIGHBOR_CACHE
101878ed226SJulian ElischerReturns content of the neighbor cache for the HCI node.
102878ed226SJulian Elischer.It Dv SIOC_HCI_RAW_NODE_GET_CON_LIST
103878ed226SJulian ElischerReturns list of active baseband connections (i.e. ACL and SCO links) for
104878ed226SJulian Elischerthe HCI node.
105878ed226SJulian Elischer.It SIOC_HCI_RAW_NODE_GET_LINK_POLICY_MASK
106878ed226SJulian ElischerReturns current link policy settings mask for the HCI node.
107878ed226SJulian Elischer.It SIOC_HCI_RAW_NODE_SET_LINK_POLICY_MASK
108878ed226SJulian ElischerSets current link policy settings mask for the HCI node.
109878ed226SJulian Elischer.It SIOC_HCI_RAW_NODE_GET_PACKET_MASK
110878ed226SJulian ElischerReturns current packet mask for the HCI node.
111878ed226SJulian Elischer.It SIOC_HCI_RAW_NODE_SET_PACKET_MASK
112878ed226SJulian ElischerSets current packet mask for the HCI node.
113f2bb1caeSJulian Elischer.It SIOC_HCI_RAW_NODE_GET_ROLE_SWITCH
114f2bb1caeSJulian ElischerReturns current value of the role switch parameter for the HCI node.
115f2bb1caeSJulian Elischer.It SIOC_HCI_RAW_NODE_SET_ROLE_SWITCH
116f2bb1caeSJulian ElischerSets new value of the role switch parameter for the HCI node.
117878ed226SJulian Elischer.El
118878ed226SJulian Elischer.Pp
119f2bb1caeSJulian ElischerThe
120f2bb1caeSJulian Elischer.Dv net.bluetooth.hci.sockets.raw.ioctl_timeout
121f2bb1caeSJulian Elischervariable, that can be examined and set via
122f2bb1caeSJulian Elischer.Xr sysctl 8 ,
123f2bb1caeSJulian Elischercontrols the control request timeout (in seconds) for raw HCI sockets.
124f2bb1caeSJulian Elischer.Pp
125f2bb1caeSJulian ElischerRaw HCI sockets support filters. The application can filter certain
126f2bb1caeSJulian ElischerHCI datagram types. For HCI event datagrams the application can set
127f2bb1caeSJulian Elischeradditional filter. The raw HCI socket filter defined as follows:
128878ed226SJulian Elischer.Bd -literal -offset indent
129878ed226SJulian Elischer/*
130878ed226SJulian Elischer * Raw HCI socket filter.
131878ed226SJulian Elischer *
132878ed226SJulian Elischer * For packet mask use (1 << (HCI packet indicator - 1))
133878ed226SJulian Elischer * For event mask use (1 << (Event - 1))
134878ed226SJulian Elischer */
135878ed226SJulian Elischer
136878ed226SJulian Elischerstruct ng_btsocket_hci_raw_filter {
137878ed226SJulian Elischer        bitstr_t bit_decl(packet_mask, 32);
138878ed226SJulian Elischer        bitstr_t bit_decl(event_mask, (NG_HCI_EVENT_MASK_SIZE * 8));
139878ed226SJulian Elischer};
140878ed226SJulian Elischer.Ed
141878ed226SJulian Elischer.Pp
142878ed226SJulian ElischerThe
143878ed226SJulian Elischer.Dv SO_HCI_RAW_FILTER
144878ed226SJulian Elischeroption defined at
145878ed226SJulian Elischer.Dv SOL_HCI_RAW
146878ed226SJulian Elischerlevel can be used to obtain via
147878ed226SJulian Elischer.Xr getsockopt 2
148878ed226SJulian Elischeror  change via
149878ed226SJulian Elischer.Xr setsockopt 2
150878ed226SJulian Elischerraw HCI socket's filter.
151f2bb1caeSJulian Elischer.Pp
152f2bb1caeSJulian Elischer.Sh BLUETOOTH_PROTO_L2CAP protocol
153878ed226SJulian ElischerThe Bluetooth L2CAP socket address is defined as follows:
154878ed226SJulian Elischer.Bd -literal -offset indent
155878ed226SJulian Elischer/* Bluetooth version of struct sockaddr for L2CAP sockets */
156878ed226SJulian Elischerstruct sockaddr_l2cap {
157878ed226SJulian Elischer        u_char    l2cap_len;    /* total length */
158878ed226SJulian Elischer        u_char    l2cap_family; /* address family */
159878ed226SJulian Elischer        u_int16_t l2cap_psm;    /* Protocol/Service Multiplexor */
160878ed226SJulian Elischer        bdaddr_t  l2cap_bdaddr; /* address */
161878ed226SJulian Elischer};
162878ed226SJulian Elischer.Ed
163f2bb1caeSJulian Elischer.Pp
164f2bb1caeSJulian Elischer.Ss SOCK_RAW L2CAP sockets
165878ed226SJulian ElischerImplemented by
166f2bb1caeSJulian Elischer.Cm btsock_l2c_raw
167878ed226SJulian ElischerNetgraph type.
168f2bb1caeSJulian ElischerRaw L2CAP sockets do not provide access to raw L2CAP datagrams. These
169878ed226SJulian Elischersockets used to control L2CAP nodes and to issue special L2CAP requests
170f2bb1caeSJulian Elischersuch as ECHO_REQUEST and GET_INFO request.
171878ed226SJulian Elischer.Pp
172878ed226SJulian ElischerRaw L2CAP sockets support number of
173878ed226SJulian Elischer.Xr ioctl 2
174878ed226SJulian Elischerrequests such as:
175f2bb1caeSJulian Elischer.Bl -tag -width foo
176878ed226SJulian Elischer.It Dv SIOC_L2CAP_NODE_GET_FLAGS
177878ed226SJulian ElischerReturns current state for the L2CAP node.
178878ed226SJulian Elischer.It Dv SIOC_L2CAP_NODE_GET_DEBUG
179878ed226SJulian ElischerReturns current debug level for the L2CAP node.
180878ed226SJulian Elischer.It Dv SIOC_L2CAP_NODE_SET_DEBUG
181878ed226SJulian ElischerSets current debug level for the L2CAP node.
182878ed226SJulian Elischer.It Dv SIOC_L2CAP_NODE_GET_CON_LIST
183878ed226SJulian ElischerReturns list of active baseband connections (i.e. ACL links) for the L2CAP
184878ed226SJulian Elischernode.
185878ed226SJulian Elischer.It Dv SIOC_L2CAP_NODE_GET_CHAN_LIST
186878ed226SJulian ElischerReturns list of active channels for the L2CAP node.
187878ed226SJulian Elischer.It Dv SIOC_L2CAP_L2CA_PING
188f2bb1caeSJulian ElischerIssues L2CAP ECHO_REQUEST.
189878ed226SJulian Elischer.It Dv SIOC_L2CAP_L2CA_GET_INFO
190f2bb1caeSJulian ElischerIssues L2CAP GET_INFO request.
191878ed226SJulian Elischer.El
192f2bb1caeSJulian Elischer.Pp
193f2bb1caeSJulian ElischerThe
194f2bb1caeSJulian Elischer.Dv net.bluetooth.l2cap.sockets.raw.ioctl_timeout
195f2bb1caeSJulian Elischervariable, that can be examined and set via
196f2bb1caeSJulian Elischer.Xr sysctl 8 ,
197f2bb1caeSJulian Elischercontrols the control request timeout (in seconds) for raw L2CAP sockets.
198f2bb1caeSJulian Elischer.Pp
199f2bb1caeSJulian Elischer.Ss SOCK_SEQPACKET L2CAP sockets
200878ed226SJulian ElischerImplemented by
201f2bb1caeSJulian Elischer.Cm btsock_l2c
202878ed226SJulian ElischerNetgraph type.
203878ed226SJulian ElischerL2CAP sockets are either
204878ed226SJulian Elischer.Dq active
205878ed226SJulian Elischeror
206878ed226SJulian Elischer.Dq passive .
207f2bb1caeSJulian ElischerActive sockets initiate connections to passive sockets. By default L2CAP
208f2bb1caeSJulian Elischersockets are created active; to create a passive socket the
209878ed226SJulian Elischer.Xr listen 2
210878ed226SJulian Elischersystem call must be used after binding the socket with the
211878ed226SJulian Elischer.Xr bind 2
212f2bb1caeSJulian Elischersystem call. Only passive sockets may use the
213878ed226SJulian Elischer.Xr accept 2
214f2bb1caeSJulian Elischercall to accept incoming connections. Only active sockets may use the
215878ed226SJulian Elischer.Xr connect 2
216878ed226SJulian Elischercall to initiate connections.
217878ed226SJulian Elischer.Pp
218f393f498SRuslan ErmilovL2CAP sockets support
219f2bb1caeSJulian Elischer.Dq wildcard addressing .
220f2bb1caeSJulian ElischerIn this case socket must be bound to
221878ed226SJulian Elischer.Dv NG_HCI_BDADDR_ANY
222f2bb1caeSJulian Elischeraddress.  Note that PSM (Protocol/Service Multiplexor) field is always
223f2bb1caeSJulian Elischerrequired. Once a connection has been established the socket's address is
224f2bb1caeSJulian Elischerfixed by the peer entity's location. The address assigned the socket is
225878ed226SJulian Elischerthe address associated with the Bluetooth device through which packets are
226878ed226SJulian Elischerbeing transmitted and received, and PSM (Protocol/Service Multiplexor).
227878ed226SJulian Elischer.Pp
228878ed226SJulian ElischerL2CAP sockets support number of options defined at
229878ed226SJulian Elischer.Dv SOL_L2CAP
230878ed226SJulian Elischerlevel which can be set with
231878ed226SJulian Elischer.Xr setsockopt 2
232878ed226SJulian Elischerand tested with
233878ed226SJulian Elischer.Xr getsockopt 2 :
234f2bb1caeSJulian Elischer.Bl -tag -width foo
235878ed226SJulian Elischer.It Dv SO_L2CAP_IMTU
236878ed226SJulian ElischerGet (set) maximum payload size the local socket is capable of accepting.
237878ed226SJulian Elischer.It Dv SO_L2CAP_OMTU
238878ed226SJulian ElischerGet maximum payload size the remote socket is capable of accepting.
239878ed226SJulian Elischer.It Dv SO_L2CAP_IFLOW
240878ed226SJulian ElischerGet incoming flow specification for the socket.
241f2bb1caeSJulian Elischer.Em Not implemented at the L2CAP layer .
242878ed226SJulian Elischer.It Dv SO_L2CAP_OFLOW
243878ed226SJulian ElischerGet (set) outgoing flow specification for the socket.
244f2bb1caeSJulian Elischer.Em Not implemented at the L2CAP layer .
245878ed226SJulian Elischer.It Dv SO_L2CAP_FLUSH
246878ed226SJulian ElischerGet (set) value of the flush timeout.
247f2bb1caeSJulian Elischer.Em Not implemeted at the L2CAP layer .
248878ed226SJulian Elischer.El
249f2bb1caeSJulian Elischer.Pp
250f2bb1caeSJulian Elischer.Sh BLUETOOTH_PROTO_RFCOMM protocol
251f2bb1caeSJulian ElischerThe Bluetooth RFCOMM socket address is defined as follows:
252f2bb1caeSJulian Elischer.Bd -literal -offset indent
253f2bb1caeSJulian Elischer/* Bluetooth version of struct sockaddr for RFCOMM sockets */
254f2bb1caeSJulian Elischerstruct sockaddr_rfcomm {
255f2bb1caeSJulian Elischer        u_char   rfcomm_len;     /* total length */
256f2bb1caeSJulian Elischer        u_char   rfcomm_family;  /* address family */
257f2bb1caeSJulian Elischer        bdaddr_t rfcomm_bdaddr;  /* address */
258f2bb1caeSJulian Elischer        u_int8_t rfcomm_channel; /* channel */
259f2bb1caeSJulian Elischer};
260f2bb1caeSJulian Elischer.Ed
261f2bb1caeSJulian Elischer.Pp
262f2bb1caeSJulian Elischer.Ss SOCK_STREAM RFCOMM sockets
263f2bb1caeSJulian ElischerNote that RFCOMM sockets do not have associated Netgraph node type. RFCOMM
264f2bb1caeSJulian Elischersockets are implemented as additional layer on top of L2CAP sockets. RFCOMM
265f2bb1caeSJulian Elischersockets are either
266f2bb1caeSJulian Elischer.Dq active
267f2bb1caeSJulian Elischeror
268f2bb1caeSJulian Elischer.Dq passive .
269f2bb1caeSJulian ElischerActive sockets initiate connections to passive sockets. By default RFCOMM
270f2bb1caeSJulian Elischersockets are created active; to create a passive socket the
271f2bb1caeSJulian Elischer.Xr listen 2
272f2bb1caeSJulian Elischersystem call must be used after binding the socket with the
273f2bb1caeSJulian Elischer.Xr bind 2
274f2bb1caeSJulian Elischersystem call. Only passive sockets may use the
275f2bb1caeSJulian Elischer.Xr accept 2
276f2bb1caeSJulian Elischercall to accept incoming connections. Only active sockets may use the
277f2bb1caeSJulian Elischer.Xr connect 2
278f2bb1caeSJulian Elischercall to initiate connections.
279f2bb1caeSJulian Elischer.Pp
280f2bb1caeSJulian ElischerRFCOMM sockets support
281f2bb1caeSJulian Elischer.Dq wildcard addressing .
282f2bb1caeSJulian ElischerIn this case socket must be bound to
283f2bb1caeSJulian Elischer.Dv NG_HCI_BDADDR_ANY
284f2bb1caeSJulian Elischeraddress.  Note that RFCOMM channel field is always required. Once a connection
285f2bb1caeSJulian Elischerhas been established the socket's address is fixed by the peer entity's
286f2bb1caeSJulian Elischerlocation. The address assigned the socket is the address associated with the
287f2bb1caeSJulian ElischerBluetooth device through which packets are being transmitted and received,
288f2bb1caeSJulian Elischerand RFCOMM channel.
289f2bb1caeSJulian Elischer.Pp
290f2bb1caeSJulian ElischerThe following options, which can be tested with
291f2bb1caeSJulian Elischer.Xr getsockopt 2
292f2bb1caeSJulian Elischercall, are defined at
293f2bb1caeSJulian Elischer.Dv SOL_RFCOMM
294f2bb1caeSJulian Elischerlevel for RFCOMM sockets:
295f2bb1caeSJulian Elischer.Bl -tag -width foo
296f2bb1caeSJulian Elischer.It SO_RFCOMM_MTU
297f2bb1caeSJulian ElischerReturns the maximum transfer unit size (in bytes) for the underlying RFCOMM
298f2bb1caeSJulian Elischerchannel. Note that application still can write/read bigger chunks to/from the
299f2bb1caeSJulian Elischersocket.
300f2bb1caeSJulian Elischer.It SO_RFCOMM_FC_INFO
301f2bb1caeSJulian ElischerReturn the flow control information for the underlying RFCOMM channel.
302f2bb1caeSJulian Elischer.El
303f2bb1caeSJulian Elischer.Pp
304f2bb1caeSJulian ElischerThe
305f2bb1caeSJulian Elischer.Dv net.bluetooth.rfcomm.sockets.stream.timeout
306f2bb1caeSJulian Elischervariable, that can be examined and set via
307f2bb1caeSJulian Elischer.Xr sysctl 8 ,
308f2bb1caeSJulian Elischercontrols the connection timeout (in seconds) for RFCOMM sockets.
309f2bb1caeSJulian Elischer.Pp
310878ed226SJulian Elischer.Sh HOOKS
311f2bb1caeSJulian ElischerThese node types support hooks with arbitrary names (as long as they are
312f2bb1caeSJulian Elischerunique) and always accept hook connection requests.
313878ed226SJulian Elischer.Sh NETGRAPH CONTROL MESSAGES
314f2bb1caeSJulian ElischerThese node types support the generic control messages.
315878ed226SJulian Elischer.Sh SHUTDOWN
316878ed226SJulian ElischerThese nodes are persistent and cannot be shut down.
317878ed226SJulian Elischer.Sh BUGS
318f2bb1caeSJulian ElischerMost likely. Please report if found.
319878ed226SJulian Elischer.Sh SEE ALSO
320878ed226SJulian Elischer.Xr socket 2 ,
321878ed226SJulian Elischer.Xr netgraph 4 ,
322f2bb1caeSJulian Elischer.Xr ngctl 8 ,
323f2bb1caeSJulian Elischer.Xr sysctl 8 ,
324f2bb1caeSJulian Elischer.Xr ng_bluetooth 4 ,
325878ed226SJulian Elischer.Xr ng_hci 4 ,
326878ed226SJulian Elischer.Xr ng_l2cap 4 ,
327f2bb1caeSJulian Elischer.Xr btsockstat 1
328878ed226SJulian Elischer.Sh HISTORY
329878ed226SJulian ElischerThe
330f2bb1caeSJulian Elischer.Nm
331f2bb1caeSJulian Elischermodule was implemented in
332878ed226SJulian Elischer.Fx 5.0 .
333878ed226SJulian Elischer.Sh AUTHORS
334878ed226SJulian Elischer.An Maksim Yevmenkin Aq m_evmenkin@yahoo.com
335