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