diff options
Diffstat (limited to 'share/examples/netgraph')
-rw-r--r-- | share/examples/netgraph/bluetooth/rc.bluetooth | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/share/examples/netgraph/bluetooth/rc.bluetooth b/share/examples/netgraph/bluetooth/rc.bluetooth new file mode 100644 index 0000000..6d11c81a --- /dev/null +++ b/share/examples/netgraph/bluetooth/rc.bluetooth @@ -0,0 +1,267 @@ +#!/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/cuaa${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 + |