| BLUETOOTH(9) | Kernel Developer's Manual | BLUETOOTH(9) | 
BLUETOOTH —
#include <netbt/bluetooth.h>
#include <netbt/hci.h>
#include <netbt/l2cap.h>
#include <netbt/rfcomm.h>
struct hci_unit *
  
  hci_attach(const
    struct hci_if *hci_if,
    device_t dev,
    uint16_t flags);
void
  
  hci_detach(struct
    hci_unit *unit);
void
  
  hci_input_event(struct
    hci_unit *unit, struct
    mbuf *m);
void
  
  hci_input_acl(struct
    hci_unit *unit, struct
    mbuf *m);
void
  
  hci_input_sco(struct
    hci_unit *unit, struct
    mbuf *m);
int
  
  btproto_attach(btproto_handle
    *, const struct btproto
    *proto, void
  *ref);
int
  
  btproto_bind(btproto_handle,
    struct sockaddr_bt
    *addr);
int
  
  btproto_sockaddr(btproto_handle,
    struct sockaddr_bt
    *addr);
int
  
  btproto_connect(btproto_handle,
    struct sockaddr_bt
    *addr);
int
  
  btproto_peeraddr(btproto_handle,
    struct sockaddr_bt
    *addr);
int
  
  btproto_disconnect(btproto_handle,
    int linger);
int
  
  btproto_detach(btproto_handle
    *);
int
  
  btproto_listen(btproto_handle);
int
  
  btproto_send(btproto_handle,
    struct mbuf *mbuf);
int
  
  btproto_rcvd(btproto_handle,
    size_t space);
int
  
  btproto_setopt(btproto_handle,
    int optarg,
    void *arg);
int
  
  btproto_getopt(btproto_handle,
    int optarg,
    void *arg);
<netbt/hci.h> containing the
  driver information as follows:
struct hci_if {
	int	(*enable)(device_t);
	void	(*disable)(device_t);
	void	(*output_cmd)(device_t, struct mbuf *);
	void	(*output_acl)(device_t, struct mbuf *);
	void	(*output_sco)(device_t, struct mbuf *);
	void	(*get_stats)(device_t, struct bt_stats *, int);
	int	ipl;
};
Statistics counters should be updated by the device after packets have been transmitted or received, or when errors occur.
struct bt_stats {
	uint32_t	err_tx;
	uint32_t	err_rx;
	uint32_t	cmd_tx;
	uint32_t	evt_rx;
	uint32_t	acl_tx;
	uint32_t	acl_rx;
	uint32_t	sco_tx;
	uint32_t	sco_rx;
	uint32_t	byte_tx;
	uint32_t	byte_rx;
};
Bluetooth Protocol layers attaching above the Bluetooth Protocol
    Stack will make use of the struct btproto data type,
    which is defined in
    <netbt/bluetooth.h> and
    contains the following function callbacks which should be initialized by the
    protocol layer before attaching to the protocol which it uses:
struct btproto {
	void (*connecting)(void *);
	void (*connected)(void *);
	void (*disconnected)(void *, int);
	void *(*newconn)(void *, struct sockaddr_bt *, struct sockaddr_bt *);
	void (*complete)(void *, int);
	void (*linkmode)(void *, int);
	void (*input)(void *, struct mbuf *);
};
hci_attach(hci_if,
    dev)BTF_xxxx flag in the flags
      argument.
    hci_attach() will return a
        struct hci_unit handle to be passed to the
        protocol stack in other calls.
hci_detach(unit)hci_input_event(unit,
    mbuf)hci_input_acl(unit,
    mbuf)hci_input_sco(unit,
    mbuf)(*enable)(dev)(*disable)(dev)(*output_cmd)(dev,
    mbuf)(*output_acl)(dev,
    mbuf)(*output_sco)(dev,
    mbuf)hci_complete_sco() call.(*get_stats)(dev,
    dest, flush)The following function definitions are related to the Bluetooth
    Protocol API. Note that the "btproto" prefix is representative
    only, the protocol being used will have a more specific prefix with
    prototypes being declared in the appropriate
    <netbt/btproto.h> file.
btproto_attach(handle_ptr,
    proto, ref)btproto_bind(handle,
    addr)btproto_sockaddr(handle,
    addr)btproto_connect(handle,
    addr)proto->connected() or
      proto->disconnected(), and optionally
      proto->connecting() with the appropriate
      reference as given to btproto_attach().btproto_peeraddr(handle,
    addr)btproto_disconnect(handle,
    linger)proto->disconnected() with the appropriate
      reference when the connection is torn down. If linger is zero, the
      disconnection will be initiated immediately and any outstanding data may
      be lost.btproto_detach(handle_ptr)btproto_listen(handle)proto->newconn() function when incoming
      connections are detected.btproto_send(handle,
    mbuf)btproto_rcvd(handle,
    space)btproto_setopt(handle,
    optarg, arg)btproto_getopt(handle,
    optarg, arg)(*connecting)(ref)(*connected)(ref)(*disconnected)(ref,
    error)*(*newconn)(ref,
    laddr, raddr)(*complete)(ref,
    count)(*linkmode)(ref,
    mode)(*input)(ref,
    mbuf)The Bluetooth Device API as described above is contained in the sys/netbt/hci_unit.c file.
For examples of the Bluetooth Protocol API see the interaction between the L2CAP upper layer in sys/netbt/l2cap_upper.c and either the L2CAP socket layer in sys/netbt/l2cap_socket.c or the bthidev(4) pseudo-device in sys/dev/bluetooth/bthidev.c.
Also, the RFCOMM upper layer in sys/netbt/rfcomm_upper.c and the RFCOMM socket layer in sys/netbt/rfcomm_socket.c.
| November 20, 2007 | NetBSD 10.0 |