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
36 desc="Bluetooth setup script"
38 start_cmd="bluetooth_start"
39 stop_cmd="bluetooth_stop"
40 required_modules="ng_bluetooth ng_hci ng_l2cap ng_btsocket"
42 ##############################################################################
43 # Read and parse Bluetooth device configuration file
44 ##############################################################################
48 local _err _file _line _namespace
54 if [ ! -e $_file ]; then
58 if [ ! -f $_file -o ! -r $_file ]; then
59 err 1 "Bluetooth configuration file $_file is not a file or not readable"
70 if [ -z "$_line" ]; then
75 if expr "$_line" : "[a-zA-Z0-9_]*=" > /dev/null 2>&1; then
76 eval "${_namespace}${_line}"
78 warn "Unable to parse line \"$_line\" in $_file"
88 ##############################################################################
89 # Setup Bluetooth stack. Create and connect nodes
90 ##############################################################################
92 bluetooth_setup_stack()
100 ngctl mkpeer ${dev}: hci ${hook} drv \
101 > /dev/null 2>&1 || return 1
103 ngctl name ${dev}:${hook} ${dev}hci \
104 > /dev/null 2>&1 || return 1
106 ngctl msg ${dev}hci: set_debug ${bluetooth_device_hci_debug_level} \
107 > /dev/null 2>&1 || return 1
110 ngctl mkpeer ${dev}hci: l2cap acl hci \
111 > /dev/null 2>&1 || return 1
113 ngctl name ${dev}hci:acl ${dev}l2cap \
114 > /dev/null 2>&1 || return 1
116 ngctl msg ${dev}l2cap: set_debug ${bluetooth_device_l2cap_debug_level} \
117 > /dev/null 2>&1 || return 1
119 # Connect HCI node to the Bluetooth sockets layer
120 ngctl connect ${dev}hci: btsock_hci_raw: raw ${dev}raw \
121 > /dev/null 2>&1 || return 1
123 # Connect L2CAP node to Bluetooth sockets layer
124 ngctl connect ${dev}l2cap: btsock_l2c_raw: ctl ${dev}ctl \
125 > /dev/null 2>&1 || return 1
127 ngctl connect ${dev}l2cap: btsock_l2c: l2c ${dev}l2c \
128 > /dev/null 2>&1 || return 1
130 # Initilalize HCI node
131 ${hccontrol} -n ${dev}hci reset \
132 > /dev/null 2>&1 || return 1
134 ${hccontrol} -n ${dev}hci read_bd_addr \
135 > /dev/null 2>&1 || return 1
137 ${hccontrol} -n ${dev}hci read_local_supported_features \
138 > /dev/null 2>&1 || return 1
140 ${hccontrol} -n ${dev}hci read_buffer_size \
141 > /dev/null 2>&1 || return 1
143 if checkyesno bluetooth_device_discoverable; then
144 if checkyesno bluetooth_device_connectable; then
145 ${hccontrol} -n ${dev}hci write_scan_enable 3 \
146 > /dev/null 2>&1 || return 1
148 ${hccontrol} -n ${dev}hci write_scan_enable 1 \
149 > /dev/null 2>&1 || return 1
152 if checkyesno bluetooth_device_connectable; then
153 ${hccontrol} -n ${dev}hci write_scan_enable 2 \
154 > /dev/null 2>&1 || return 1
156 ${hccontrol} -n ${dev}hci write_scan_enable 0 \
157 > /dev/null 2>&1 || return 1
162 ${hccontrol} -n ${dev}hci write_class_of_device ${bluetooth_device_class} \
163 > /dev/null 2>&1 || return 1
165 if checkyesno bluetooth_device_authentication_enable; then
166 ${hccontrol} -n ${dev}hci write_authentication_enable 1 \
167 > /dev/null 2>&1 || return 1
169 ${hccontrol} -n ${dev}hci write_authentication_enable 0 \
170 > /dev/null 2>&1 || return 1
173 case "${bluetooth_device_encryption_mode}" in
175 ${hccontrol} -n ${dev}hci write_encryption_mode 0 \
176 > /dev/null 2>&1 || return 1
180 ${hccontrol} -n ${dev}hci write_encryption_mode 1 \
181 > /dev/null 2>&1 || return 1
185 ${hccontrol} -n ${dev}hci write_encryption_mode 2 \
186 > /dev/null 2>&1 || return 1
190 warn "Unsupported encryption mode ${bluetooth_device_encryption_mode} for device ${dev}"
195 if checkyesno bluetooth_device_role_switch; then
196 ${hccontrol} -n ${dev}hci write_node_role_switch 1 \
197 > /dev/null 2>&1 || return 1
199 ${hccontrol} -n ${dev}hci write_node_role_switch 0 \
200 > /dev/null 2>&1 || return 1
203 ${hccontrol} -n ${dev}hci change_local_name "${bluetooth_device_local_name}" \
204 > /dev/null 2>&1 || return 1
206 ${hccontrol} -n ${dev}hci initialize \
207 > /dev/null 2>&1 || return 1
212 ##############################################################################
213 # Shutdown Bluetooth stack. Destroy all nodes
214 ##############################################################################
216 bluetooth_shutdown_stack()
220 ngctl shutdown ${dev}hci: > /dev/null 2>&1
221 ngctl shutdown ${dev}l2cap: > /dev/null 2>&1
226 ##############################################################################
228 ##############################################################################
236 # Try to figure out device type by looking at device name
238 # uartX - serial/UART Bluetooth device
240 load_kld ng_h4 || return 1
244 # Obtain unit number from device.
245 unit=`expr ${dev} : 'uart\([0-9]\{1,\}\)'`
246 if [ -z "${unit}" ]; then
247 err 1 "Unable to get uart unit number: ${dev}"
250 ${hcseriald} -f /dev/cuau${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 # uartX - 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}"