Index: etc/Makefile =================================================================== RCS file: /home/ncvs/src/etc/Makefile,v retrieving revision 1.347 diff -u -r1.347 Makefile --- etc/Makefile 26 Aug 2005 18:54:06 -0000 1.347 +++ etc/Makefile 1 Nov 2005 19:58:58 -0000 @@ -105,6 +105,7 @@ cd ${.CURDIR}/defaults; ${MAKE} install cd ${.CURDIR}/periodic; ${MAKE} install cd ${.CURDIR}/rc.d; ${MAKE} install + cd ${.CURDIR}/rc.conf.d; ${MAKE} install cd ${.CURDIR}/../gnu/usr.bin/send-pr; ${MAKE} etc-gnats-freefall cd ${.CURDIR}/../share/termcap; ${MAKE} etc-termcap cd ${.CURDIR}/../usr.sbin/rmt; ${MAKE} etc-rmt Index: etc/mtree/BSD.root.dist =================================================================== RCS file: /home/ncvs/src/etc/mtree/BSD.root.dist,v retrieving revision 1.74 diff -u -r1.74 BSD.root.dist --- etc/mtree/BSD.root.dist 30 May 2005 20:51:13 -0000 1.74 +++ etc/mtree/BSD.root.dist 1 Nov 2005 19:58:58 -0000 @@ -50,6 +50,8 @@ .. rc.d .. + rc.conf.d + .. security .. skel Index: etc/rc.conf.d/Makefile =================================================================== RCS file: etc/rc.conf.d/Makefile diff -N etc/rc.conf.d/Makefile --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ etc/rc.conf.d/Makefile 1 Nov 2005 19:58:58 -0000 @@ -0,0 +1,8 @@ +# $FreeBSD$ + +FILES= bluetooth.device.sample + +FILESDIR= /etc/rc.conf.d +FILESMODE= 644 + +.include Index: etc/rc.conf.d/bluetooth.device.sample =================================================================== RCS file: etc/rc.conf.d/bluetooth.device.sample diff -N etc/rc.conf.d/bluetooth.device.sample --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ etc/rc.conf.d/bluetooth.device.sample 1 Nov 2005 19:58:58 -0000 @@ -0,0 +1,112 @@ +# Copyright (c) 2005 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. +# +# $FreeBSD$ + +# The authentication_enable parameter controls if the device requires to +# authenticate the remote device at connection setup. At connection setup, +# only the devices with the authentication_enable parameter enabled will +# try to authenticate the other device. +# +# Possible values: +# +# NO or 0 authentication disabled (default); +# YES or 1 authentication enabled. + +# authentication_enable="NO" + +# The class parameter is used to indicate the capabilities of the device to +# other devices. +# +# For more details see +# https://www.bluetooth.org/foundry/assignnumb/document/baseband +# +# Possible value: +# +# xx:xx:xx where xx is a hex number + +# class="ff:01:0c" + +# The connectable parameter controls whether or not the device should +# periodically scan for page attempts from other devices. +# +# Possible values: +# +# NO or 0 do not scan for page attempts; +# YES or 1 scan for page attempts (default). + +# connectable="YES" + +# The discoverable parameter controls whether or not the device should +# periodically scan for inquiry requests from other devices. +# +# Possible values: +# +# NO or 0 do not scan for inquiry requests; +# YES or 1 scan for inquiry requests (default). + +# discoverable="YES" + +# The encryption_mode parameter controls if the device requires encryption +# to the remote device at connection setup. At connection setup, only the +# devices with the authentication_enable parameter enabled and encryption_mode +# parameter enabled will try to encrypt the connection to the other device. +# +# Possible values: +# +# NONE or 0 encryption disabled (default); +# P2P or 1 encryption only for point-to-point packets; +# ALL or 2 encryption for both point-to-point and broadcast packets. + +# encryption_mode="NONE" + +# HCI node debug level. Higher values mean more verbose output. +# +# Possible values: 0 - 4 + +# hci_debug_level="3" + +# L2CAP node debug level. Higher values mean more verbose output. +# +# Possible values: 0 - 4 + +# l2cap_debug_level="3" + +# The local_name parameter provides the ability to modify the user friendly +# name for the device. + +# local_name="My device" + +# The role_switch parameter controls whether the local device should perform +# role switch. By default, if role switch is supported, the local device will +# try to perform role switch and become Master on incoming connection. Some +# devices do not support role switch and thus incomming connections from such +# devices will fail. If role switch is disabled then accepting device will +# remain Slave. +# +# NO or 0 do not perform role switch; +# YES or 1 perform role switch (default). + +# role_switch="YES" + Index: etc/rc.d/Makefile =================================================================== RCS file: /home/ncvs/src/etc/rc.d/Makefile,v retrieving revision 1.58 diff -u -r1.58 Makefile --- etc/rc.d/Makefile 12 Oct 2005 00:45:58 -0000 1.58 +++ etc/rc.d/Makefile 1 Nov 2005 19:58:58 -0000 @@ -4,7 +4,7 @@ FILES= DAEMON LOGIN NETWORKING SERVERS \ abi accounting addswap adjkerntz amd \ apm apmd archdep atm1 atm2 atm3 \ - bgfsck bootparams bsnmpd \ + bgfsck bluetooth bootparams bsnmpd \ ccd cleanvar cleartmp cron \ devd devfs dhclient \ dmesg dumpon \ Index: etc/rc.d/bluetooth =================================================================== RCS file: etc/rc.d/bluetooth diff -N etc/rc.d/bluetooth --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ etc/rc.d/bluetooth 1 Nov 2005 19:58:58 -0000 @@ -0,0 +1,315 @@ +#!/bin/sh +# +# Copyright (c) 2005 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. +# +# $FreeBSD$ + +# PROVIDE: bluetooth +# REQUIRE: DAEMON +# KEYWORD: nojail nostart + +. /etc/rc.subr + +name="bluetooth" +rcvar= +start_cmd="bluetooth_start" +stop_cmd="bluetooth_stop" + +############################################################################## +# Setup Bluetooth stack. Create and connect nodes +############################################################################## + +setup_stack() +{ + dev=$1 + shift + hook=$1 + shift + + # Setup HCI + ngctl mkpeer ${dev}: hci ${hook} drv \ + > /dev/null 2>&1 || return 1 + + ngctl name ${dev}:${hook} ${dev}hci \ + > /dev/null 2>&1 || return 1 + + ngctl msg ${dev}hci: set_debug ${dev_hci_debug_level} \ + > /dev/null 2>&1 || return 1 + + # Setup L2CAP + ngctl mkpeer ${dev}hci: l2cap acl hci \ + > /dev/null 2>&1 || return 1 + + ngctl name ${dev}hci:acl ${dev}l2cap \ + > /dev/null 2>&1 || return 1 + + ngctl msg ${dev}l2cap: set_debug ${dev_l2cap_debug_level} \ + > /dev/null 2>&1 || return 1 + + # Connect HCI node to the Bluetooth sockets layer + ngctl connect ${dev}hci: btsock_hci_raw: raw ${dev}raw \ + > /dev/null 2>&1 || return 1 + + # Connect L2CAP node to Bluetooth sockets layer + ngctl connect ${dev}l2cap: btsock_l2c_raw: ctl ${dev}ctl \ + > /dev/null 2>&1 || return 1 + + ngctl connect ${dev}l2cap: btsock_l2c: l2c ${dev}l2c \ + > /dev/null 2>&1 || return 1 + + # Initilalize HCI node + ${hccontrol} -n ${dev}hci reset \ + > /dev/null 2>&1 || return 1 + + ${hccontrol} -n ${dev}hci read_bd_addr \ + > /dev/null 2>&1 || return 1 + + ${hccontrol} -n ${dev}hci read_local_supported_features \ + > /dev/null 2>&1 || return 1 + + ${hccontrol} -n ${dev}hci read_buffer_size \ + > /dev/null 2>&1 || return 1 + + if checkyesno dev_discoverable; then + if checkyesno dev_connectable; then + ${hccontrol} -n ${dev}hci write_scan_enable 3 \ + > /dev/null 2>&1 || return 1 + else + ${hccontrol} -n ${dev}hci write_scan_enable 1 \ + > /dev/null 2>&1 || return 1 + fi + else + if checkyesno dev_connectable; then + ${hccontrol} -n ${dev}hci write_scan_enable 2 \ + > /dev/null 2>&1 || return 1 + else + ${hccontrol} -n ${dev}hci write_scan_enable 0 \ + > /dev/null 2>&1 || return 1 + fi + fi + + + ${hccontrol} -n ${dev}hci write_class_of_device ${dev_class} \ + > /dev/null 2>&1 || return 1 + + if checkyesno dev_authentication_enable; then + ${hccontrol} -n ${dev}hci write_authentication_enable 1 \ + > /dev/null 2>&1 || return 1 + else + ${hccontrol} -n ${dev}hci write_authentication_enable 0 \ + > /dev/null 2>&1 || return 1 + fi + + case ${dev_encryption_mode} in + [Nn][Oo][Nn][Ee]|0) + ${hccontrol} -n ${dev}hci write_encryption_mode 0 \ + > /dev/null 2>&1 || return 1 + ;; + + [Pp][2][Pp]|1) + ${hccontrol} -n ${dev}hci write_encryption_mode 1 \ + > /dev/null 2>&1 || return 1 + ;; + + [Al][Ll][Ll]|2) + ${hccontrol} -n ${dev}hci write_encryption_mode 2 \ + > /dev/null 2>&1 || return 1 + ;; + + *) + ${logger} "Unsupported encryption mode ${dev_encryption_mode} for device ${dev}" + return 1 + ;; + esac + + if checkyesno dev_role_switch; then + ${hccontrol} -n ${dev}hci write_node_role_switch 1 \ + > /dev/null 2>&1 || return 1 + else + ${hccontrol} -n ${dev}hci write_node_role_switch 0 \ + > /dev/null 2>&1 || return 1 + fi + + ${hccontrol} -n ${dev}hci change_local_name "${dev_name}" \ + > /dev/null 2>&1 || return 1 + + ${hccontrol} -n ${dev}hci initialize \ + > /dev/null 2>&1 || return 1 + + return 0 +} # setup_stack + +############################################################################## +# Shutdown Bluetooth stack. Destroy all nodes +############################################################################## + +shutdown_stack() +{ + dev=$1 + + ngctl shutdown ${dev}hci: > /dev/null 2>&1 + ngctl shutdown ${dev}l2cap: > /dev/null 2>&1 + + return 0 +} # shutdown_stack + +############################################################################## +# bluetooth_start() +############################################################################## + +bluetooth_start() +{ + dev=$1 + + # Try to figure out device type by looking at device name + case ${dev} in + # sioX - serial/UART Bluetooth device + sio*) + hook="hook" + + # Obtain unit number from device. + unit=`expr ${dev} : 'sio\([0-9]\{1,\}\)'` + if [ -z ${unit} ]; then + ${logger} "Unable to get sio unit number: ${dev}" + return 1 + fi + + ${hcseriald} -f /dev/cuad${unit} -n ${dev} + sleep 1 # wait a little bit + + if [ ! -f "/var/run/hcseriald.${dev}.pid" ]; then + ${logger} "Unable to start hcseriald on ${dev}" + return 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}" + return 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}" + return 1 + fi + ;; + + # Unknown + *) + ${logger} "Unsupported device: ${dev}" + return 1 + ;; + esac + + # Load per device configuration parameters. To reduce rc.conf clutter + # keep these in separate files under /etc/rc.conf.d/bluetooth.$dev + # file + + load_rc_config "$name.$dev" + + # Be backward compatible and setup reasonable defaults for missing + # parameters + + dev_authentication_enable="${authentication_enable:-0}" + dev_class="${class:-ff:01:0c}" + dev_connectable="${connectable:-1}" + dev_discoverable="${discoverable:-1}" + dev_encryption_mode="${encryption_mode:-0}" + dev_hci_debug_level="${hci_debug_level:-3}" + dev_l2cap_debug_level="${l2cap_debug_level:-3}" + dev_name="${local_name:-`/usr/bin/uname -n` (${dev})}" + dev_role_switch="${role_switch:-1}" + + if ! setup_stack ${dev} ${hook} ; then + ${logger} "Unable to setup Bluetooth stack for device ${dev}" + shutdown_stack $dev + return 1 + fi + + return 0 +} + +############################################################################## +# bluetooth_stop() +############################################################################## + +bluetooth_stop() +{ + dev=$1 + + # 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}" + return 1 + ;; + esac + + shutdown_stack ${dev} + + return 0 +} + +############################################################################## +# Start here +############################################################################## + +load_rc_config $name +hccontrol="${bluetooth_hccontrol:-/usr/sbin/hccontrol}" +hcseriald="${bluetooth_hcseriald:-/usr/sbin/hcseriald}" +logger="${bluetooth_logger:-/usr/bin/logger -i -s -p user.err}" + +run_rc_command $* +