freebsd-dev/share/examples/netgraph/bluetooth/rc.bluetooth
2004-11-02 20:06:33 +00:00

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