3 # Copyright (c) 2005 Maksim Yevmenkin <m_evmenkin@yahoo.com>
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 # KEYWORD: nojail nostart
37 start_cmd="bluetooth_start"
38 stop_cmd="bluetooth_stop"
40 ##############################################################################
41 # Read and parse Bluetooth device configuration file
42 ##############################################################################
50 if [ ! -e $_file ]; then
54 if [ ! -f $_file -o ! -r $_file ]; then
55 err 1 "Bluetooth configuration file $_file is not a file or not readable"
66 if [ -z "$_line" ]; then
71 if expr "$_line" : "[a-zA-Z0-9_]*=" > /dev/null 2>&1; then
72 eval "${_namespace}${_line}"
74 warn "Unable to parse line \"$_line\" in $_file"
84 ##############################################################################
85 # Setup Bluetooth stack. Create and connect nodes
86 ##############################################################################
88 bluetooth_setup_stack()
96 ngctl mkpeer ${dev}: hci ${hook} drv \
97 > /dev/null 2>&1 || return 1
99 ngctl name ${dev}:${hook} ${dev}hci \
100 > /dev/null 2>&1 || return 1
102 ngctl msg ${dev}hci: set_debug ${bluetooth_device_hci_debug_level} \
103 > /dev/null 2>&1 || return 1
106 ngctl mkpeer ${dev}hci: l2cap acl hci \
107 > /dev/null 2>&1 || return 1
109 ngctl name ${dev}hci:acl ${dev}l2cap \
110 > /dev/null 2>&1 || return 1
112 ngctl msg ${dev}l2cap: set_debug ${bluetooth_device_l2cap_debug_level} \
113 > /dev/null 2>&1 || return 1
115 # Connect HCI node to the Bluetooth sockets layer
116 ngctl connect ${dev}hci: btsock_hci_raw: raw ${dev}raw \
117 > /dev/null 2>&1 || return 1
119 # Connect L2CAP node to Bluetooth sockets layer
120 ngctl connect ${dev}l2cap: btsock_l2c_raw: ctl ${dev}ctl \
121 > /dev/null 2>&1 || return 1
123 ngctl connect ${dev}l2cap: btsock_l2c: l2c ${dev}l2c \
124 > /dev/null 2>&1 || return 1
126 # Initilalize HCI node
127 ${hccontrol} -n ${dev}hci reset \
128 > /dev/null 2>&1 || return 1
130 ${hccontrol} -n ${dev}hci read_bd_addr \
131 > /dev/null 2>&1 || return 1
133 ${hccontrol} -n ${dev}hci read_local_supported_features \
134 > /dev/null 2>&1 || return 1
136 ${hccontrol} -n ${dev}hci read_buffer_size \
137 > /dev/null 2>&1 || return 1
139 if checkyesno bluetooth_device_discoverable; then
140 if checkyesno bluetooth_device_connectable; then
141 ${hccontrol} -n ${dev}hci write_scan_enable 3 \
142 > /dev/null 2>&1 || return 1
144 ${hccontrol} -n ${dev}hci write_scan_enable 1 \
145 > /dev/null 2>&1 || return 1
148 if checkyesno bluetooth_device_connectable; then
149 ${hccontrol} -n ${dev}hci write_scan_enable 2 \
150 > /dev/null 2>&1 || return 1
152 ${hccontrol} -n ${dev}hci write_scan_enable 0 \
153 > /dev/null 2>&1 || return 1
158 ${hccontrol} -n ${dev}hci write_class_of_device ${bluetooth_device_class} \
159 > /dev/null 2>&1 || return 1
161 if checkyesno bluetooth_device_authentication_enable; then
162 ${hccontrol} -n ${dev}hci write_authentication_enable 1 \
163 > /dev/null 2>&1 || return 1
165 ${hccontrol} -n ${dev}hci write_authentication_enable 0 \
166 > /dev/null 2>&1 || return 1
169 case "${bluetooth_device_encryption_mode}" in
171 ${hccontrol} -n ${dev}hci write_encryption_mode 0 \
172 > /dev/null 2>&1 || return 1
176 ${hccontrol} -n ${dev}hci write_encryption_mode 1 \
177 > /dev/null 2>&1 || return 1
181 ${hccontrol} -n ${dev}hci write_encryption_mode 2 \
182 > /dev/null 2>&1 || return 1
186 warn "Unsupported encryption mode ${bluetooth_device_encryption_mode} for device ${dev}"
191 if checkyesno bluetooth_device_role_switch; then
192 ${hccontrol} -n ${dev}hci write_node_role_switch 1 \
193 > /dev/null 2>&1 || return 1
195 ${hccontrol} -n ${dev}hci write_node_role_switch 0 \
196 > /dev/null 2>&1 || return 1
199 ${hccontrol} -n ${dev}hci change_local_name "${bluetooth_device_local_name}" \
200 > /dev/null 2>&1 || return 1
202 ${hccontrol} -n ${dev}hci initialize \
203 > /dev/null 2>&1 || return 1
208 ##############################################################################
209 # Shutdown Bluetooth stack. Destroy all nodes
210 ##############################################################################
212 bluetooth_shutdown_stack()
216 ngctl shutdown ${dev}hci: > /dev/null 2>&1
217 ngctl shutdown ${dev}l2cap: > /dev/null 2>&1
222 ##############################################################################
224 ##############################################################################
230 # Automatically load modules
231 kldload ng_bluetooth > /dev/null 2>&1
232 kldload ng_hci > /dev/null 2>&1
233 kldload ng_l2cap > /dev/null 2>&1
234 kldload ng_btsocket > /dev/null 2>&1
236 # Try to figure out device type by looking at device name
238 # sioX - serial/UART Bluetooth device
240 kldload ng_h4 > /dev/null 2>&1
244 # Obtain unit number from device.
245 unit=`expr ${dev} : 'sio\([0-9]\{1,\}\)'`
246 if [ -z "${unit}" ]; then
247 err 1 "Unable to get sio unit number: ${dev}"
250 ${hcseriald} -f /dev/cuad${unit} -n ${dev}
251 sleep 1 # wait a little bit
253 if [ ! -f "/var/run/hcseriald.${dev}.pid" ]; then
254 err 1 "Unable to start hcseriald on ${dev}"
258 # 3Com Bluetooth Adapter 3CRWB60-A
262 # Obtain unit number from device.
263 unit=`expr ${dev} : 'btccc\([0-9]\{1,\}\)'`
264 if [ -z "${unit}" ]; then
265 err 1 "Unable to get bt3c unit number: ${dev}"
269 # USB Bluetooth adapters
273 # Obtain unit number from device.
274 unit=`expr ${dev} : 'ubt\([0-9]\{1,\}\)'`
275 if [ -z "${unit}" ]; then
276 err 1 "Unable to get ubt unit number: ${dev}"
282 err 1 "Unsupported device: ${dev}"
286 # Be backward compatible and setup reasonable defaults
287 bluetooth_device_authentication_enable="0"
288 bluetooth_device_class="ff:01:0c"
289 bluetooth_device_connectable="1"
290 bluetooth_device_discoverable="1"
291 bluetooth_device_encryption_mode="0"
292 bluetooth_device_hci_debug_level="3"
293 bluetooth_device_l2cap_debug_level="3"
294 bluetooth_device_local_name="`/usr/bin/uname -n` (${dev})"
295 bluetooth_device_role_switch="1"
297 # Load default device configuration parameters
298 _file="/etc/defaults/bluetooth.device.conf"
300 if ! bluetooth_read_conf $_file bluetooth_device_ ; then
301 err 1 "Unable to read default Bluetooth configuration from $_file"
304 # Load device specific overrides
305 _file="/etc/bluetooth/$dev.conf"
307 if ! bluetooth_read_conf $_file bluetooth_device_ ; then
308 err 1 "Unable to read Bluetooth device configuration from $_file"
312 if ! bluetooth_setup_stack ${dev} ${hook} ; then
313 bluetooth_shutdown_stack $dev
314 err 1 "Unable to setup Bluetooth stack for device ${dev}"
320 ##############################################################################
322 ##############################################################################
328 # Try to figure out device type by looking at device name
330 # sioX - serial/UART Bluetooth device
332 if [ -f "/var/run/hcseriald.${dev}.pid" ]; then
333 kill `cat /var/run/hcseriald.${dev}.pid`
334 sleep 1 # wait a little bit
338 # 3Com Bluetooth Adapter 3CRWB60-A
342 # USB Bluetooth adapters
348 err 1 "Unsupported device: ${dev}"
352 bluetooth_shutdown_stack ${dev}
357 ##############################################################################
359 ##############################################################################
362 hccontrol="${bluetooth_hccontrol:-/usr/sbin/hccontrol}"
363 hcseriald="${bluetooth_hcseriald:-/usr/sbin/hcseriald}"