268 lines
7.3 KiB
Bash
268 lines
7.3 KiB
Bash
#!/bin/sh
|
|
#
|
|
# rc.bluetooth
|
|
#
|
|
# Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
# SUCH DAMAGE.
|
|
#
|
|
# $Id: rc.bluetooth,v 1.5 2003/03/30 04:03:16 max Exp $
|
|
# $FreeBSD$
|
|
#
|
|
|
|
logger="/usr/bin/logger -i -s -p user.err"
|
|
kldstat="/sbin/kldstat"
|
|
kldload="/sbin/kldload"
|
|
sysctl="/sbin/sysctl"
|
|
ngctl="/usr/sbin/ngctl"
|
|
hcseriald="/usr/sbin/hcseriald"
|
|
hccontrol="/usr/sbin/hccontrol"
|
|
hci_debug_level=3
|
|
l2cap_debug_level=3
|
|
|
|
##############################################################################
|
|
# Display usage info
|
|
##############################################################################
|
|
|
|
usage()
|
|
{
|
|
script=$1
|
|
shift
|
|
|
|
echo "Usage:"
|
|
echo " ${script} start device"
|
|
echo "or"
|
|
echo " ${script} stop device"
|
|
} # usage
|
|
|
|
##############################################################################
|
|
# Verify and load if required kernel module
|
|
##############################################################################
|
|
|
|
load_module()
|
|
{
|
|
module=$1
|
|
shift
|
|
|
|
${kldstat} -n ${module} > /dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
${kldload} ${module} > /dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
${logger} "Failed to load ${module}"
|
|
exit 1
|
|
fi
|
|
fi
|
|
} # load_module
|
|
|
|
##############################################################################
|
|
# Setup Bluetooth stack. Create and connect nodes
|
|
##############################################################################
|
|
|
|
setup_stack()
|
|
{
|
|
dev=$1
|
|
shift
|
|
hook=$1
|
|
shift
|
|
|
|
# Setup HCI
|
|
${ngctl} mkpeer ${dev}: hci ${hook} drv || exit 1
|
|
${ngctl} name ${dev}:${hook} ${dev}hci || exit 1
|
|
${ngctl} msg ${dev}hci: set_debug ${hci_debug_level} || exit 1
|
|
|
|
# Setup L2CAP
|
|
${ngctl} mkpeer ${dev}hci: l2cap acl hci || exit 1
|
|
${ngctl} name ${dev}hci:acl ${dev}l2cap || exit 1
|
|
${ngctl} msg ${dev}l2cap: set_debug ${l2cap_debug_level} || exit 1
|
|
|
|
# Connect HCI node to the Bluetooth sockets layer
|
|
${ngctl} connect ${dev}hci: btsock_hci_raw: raw ${dev}raw || exit 1
|
|
|
|
# Connect L2CAP node to Bluetooth sockets layer
|
|
${ngctl} connect ${dev}l2cap: btsock_l2c_raw: ctl ${dev}ctl || exit 1
|
|
${ngctl} connect ${dev}l2cap: btsock_l2c: l2c ${dev}l2c || exit 1
|
|
|
|
# Initilalize HCI node
|
|
${hccontrol} -n ${dev}hci reset || exit 1
|
|
# ${hccontrol} -n ${dev}hci read_local_name || exit 1
|
|
${hccontrol} -n ${dev}hci read_bd_addr || exit 1
|
|
${hccontrol} -n ${dev}hci read_local_supported_features || exit 1
|
|
${hccontrol} -n ${dev}hci read_buffer_size || exit 1
|
|
${hccontrol} -n ${dev}hci write_scan_enable 3 || exit 1
|
|
# ${hccontrol} -n ${dev}hci read_scan_enable || exit 1
|
|
|
|
# We need to write class of device here because of Service Class
|
|
# Filtering. For more info on Class_Of_Device field see
|
|
# http://www.bluetooth.org/assigned-numbers/baseband.htm
|
|
|
|
${hccontrol} -n ${dev}hci write_class_of_device ff:01:0c || exit 1
|
|
|
|
# Enable this if you have trouble with accepting incomming connections.
|
|
# By default we will try to perform role switch and become Master on
|
|
# incomming connection (if local device supports it). Some devices
|
|
# do not support role switch and thus incomming connection from such
|
|
# devices will fail.
|
|
|
|
# ${hccontrol} -n ${dev}hci write_node_role_switch 0 || exit 1
|
|
|
|
${hccontrol} -n ${dev}hci change_local_name "`uname -n` (${dev})" || exit 1
|
|
${hccontrol} -n ${dev}hci initialize || exit 1
|
|
} # setup_stack
|
|
|
|
##############################################################################
|
|
# Shutdown Bluetooth stack. Destroy all nodes
|
|
##############################################################################
|
|
|
|
shutdown_stack()
|
|
{
|
|
dev=$1
|
|
shift
|
|
|
|
${ngctl} shutdown ${dev}hci: > /dev/null 2>&1
|
|
${ngctl} shutdown ${dev}l2cap: > /dev/null 2>&1
|
|
echo -n ""
|
|
} # shutdown_stack
|
|
|
|
##############################################################################
|
|
# Start here
|
|
##############################################################################
|
|
|
|
if [ $# -lt 2 ]; then
|
|
usage $0
|
|
exit 1
|
|
fi
|
|
|
|
startstop=$1
|
|
shift
|
|
dev=$1
|
|
shift
|
|
|
|
case ${startstop} in
|
|
[Ss][Tt][Aa][Rr][Tt])
|
|
# Load required kernel modules
|
|
load_module ng_bluetooth
|
|
load_module ng_hci
|
|
load_module ng_l2cap
|
|
load_module ng_btsocket
|
|
|
|
$0 stop ${dev} || exit 1
|
|
|
|
# Try to figure out device type by looking at device name
|
|
case ${dev} in
|
|
# sioX - serial/UART Bluetooth device
|
|
sio*)
|
|
hook="hook"
|
|
|
|
load_module ng_h4
|
|
|
|
# Obtain unit number from device.
|
|
unit=`expr ${dev} : 'sio\([0-9]\{1,\}\)'`
|
|
if [ -z ${unit} ]; then
|
|
${logger} "Unable to get sio unit number: ${dev}"
|
|
exit 1
|
|
fi
|
|
|
|
${hcseriald} -f /dev/cuad${unit} -n ${dev}
|
|
sleep 1 # wait a little bit
|
|
|
|
if [ ! -f "/var/run/hcseriald.${dev}.pid" ]; then
|
|
${logger} "Failed to setup ${dev}"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
# 3Com Bluetooth Adapter 3CRWB60-A
|
|
btccc*)
|
|
hook="hook"
|
|
|
|
# Obtain unit number from device.
|
|
unit=`expr ${dev} : 'btccc\([0-9]\{1,\}\)'`
|
|
if [ -z ${unit} ]; then
|
|
${logger} "Unable to get bt3c unit number: ${dev}"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
# USB Bluetooth adapters
|
|
ubt*)
|
|
hook="hook"
|
|
|
|
# Obtain unit number from device.
|
|
unit=`expr ${dev} : 'ubt\([0-9]\{1,\}\)'`
|
|
if [ -z ${unit} ]; then
|
|
${logger} "Unable to get ubt unit number: ${dev}"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
# Unknown
|
|
*)
|
|
${logger} "Unsupported device: ${dev}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# ${sysctl} net.bluetooth.hci.sockets.raw.debug_level=9
|
|
# ${sysctl} net.bluetooth.l2cap.sockets.raw.debug_level=9
|
|
# ${sysctl} net.bluetooth.l2cap.sockets.seq.debug_level=9
|
|
# ${sysctl} net.bluetooth.rfcomm.sockets.stream.debug_level=9
|
|
|
|
setup_stack ${dev} ${hook}
|
|
;;
|
|
|
|
[Ss][Tt][Oo][Pp])
|
|
# Try to figure out device type by looking at device name
|
|
case ${dev} in
|
|
# sioX - serial/UART Bluetooth device
|
|
sio*)
|
|
if [ -f "/var/run/hcseriald.${dev}.pid" ]; then
|
|
kill `cat /var/run/hcseriald.${dev}.pid`
|
|
sleep 1 # wait a little bit
|
|
fi
|
|
;;
|
|
|
|
# 3Com Bluetooth Adapter 3CRWB60-A
|
|
btccc*)
|
|
;;
|
|
|
|
# USB Bluetooth adapters
|
|
ubt*)
|
|
;;
|
|
|
|
# Unknown
|
|
*)
|
|
${logger} "Unsupported device: ${dev}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
shutdown_stack ${dev}
|
|
;;
|
|
|
|
*)
|
|
usage $0
|
|
exit 1
|
|
;;
|
|
esac
|
|
|