#!/bin/sh # # rc.bluetooth # # Copyright (c) 2001-2002 Maksim Yevmenkin # 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