Bluetooth: Bring in some definitions from NetBSD. Update some usage and naming to be more consistent.

This commit is contained in:
Gregory Nutt
2018-03-31 16:31:51 -06:00
parent 0c007be4bd
commit f7bcad502a
7 changed files with 324 additions and 66 deletions
+139 -7
View File
@@ -49,7 +49,140 @@
* Pre-processor Definitions * Pre-processor Definitions
****************************************************************************/ ****************************************************************************/
/* Well known addresses */ /* Well known addresses: */
#define BDADDR_ANY {0, 0, 0, 0, 0, 0}
#define BDADDR_LOCAL {0, 0, 0, 0xff, 0xff, 0xff}
/* Socket protocols.
*
* All Bluetooth sockets should select address family = AF_BLUETOOTH and
* type = SOCK_RAW. Protocol options are listed here (from NetBSD):
*
* BTPROTO_HCI
* This gives raw access to the Host Controller Interface of local devices
* using the HCI protocol as described in the Bluetooth Core Specification.
* The local address specified by bind() may be used to select the device
* that the socket will receive packets from. If BDADDR_ANY is specified
* then the socket will receive packets from all devices on the system.
* connect() may be used to create connections such that packets sent with
* send() will be delivered to the specified device, otherwise sendto()
* should be used.
* BTPROTO_L2CAP
* L2CAP sockets give sequential packet access over channels to other
* Bluetooth devices and make use of the bt_psm field in the sockaddr_bt_s
* structure to select the Protocol/Sevice Multiplexer to specify when
* making connections. If the special value of L2CAP_PSM_ANY is bound
* when the listen() call is made, the next available PSM from the
* dynamic range above 0x1001 will be selected and may be discovered
* using the getsockname() call.
* BTPROTO_RFCOMM
* RFCOMM sockets provide streamed data over Bluetooth connection and
* make use of the bt_psm, and bt_channel fields in the sockaddr_bt_s
* structure. The channel number must be between 1 and 30 inclusive
* except that if the special value RFCOMM_CHANNEL_ANY is bound, when
* the listen() call is made, the first unused channel for the relevant
* bdaddr will be allocated and may be discovered using the
* getsockname(2) call. If no PSM is specified, a default value of
* L2CAP_PSM_RFCOMM (0x0003) will be used.
*
* NOTE: All protocol values currently ignored. Only BTPROTO_L2CAP is
* supported by default.
*/
#define BTPROTO_L2CAP 0
#define BTPROTO_HCI 1
#define BTPROTO_SCO 2
#define BTPROTO_RFCOMM 3
#define BTPROTO_BNEP 4
#define BTPROTO_CMTP 5
#define BTPROTO_HIDP 6
#define BTPROTO_AVDTP 7
/* HCI socket options:
*
* SO_HCI_EVT_FILTER
* Controls which events will be received at the socket. By default,
* Command_Complete and Command_Status events only are enabled.
* SO_HCI_PKT_FILTER [struct hci_filter]
* This filter controls the type of packets that will be received at
* the socket. By default, Event packets only are enabled.
* SO_HCI_DIRECTION [int]
* When set, this enables control messages on packets received at the
* socket indicating the direction of travel of the packet.
*/
#define SO_HCI_EVT_FILTER (__SO_PROTOCOL + 0)
#define SO_HCI_PKT_FILTER (__SO_PROTOCOL + 1)
#define SO_HCI_DIRECTION (__SO_PROTOCOL + 2)
/* L2CAP socket options:
* SO_L2CAP_IMTU [uint16_t]
* Incoming MTU
* SO_L2CAP_OMTU [uint16_t]
* Outgoing MTU (read-only)
* SO_L2CAP_LM [int]
* Link Mode. The following bits may be set:
*
* L2CAP_LM_AUTH Request authentication (pairing).
* L2CAP_LM_ENCRYPT Request encryption (includes authentication).
* L2CAP_LM_SECURE Request secured link (encryption, plus
* change link key).
*
* Link mode settings will be applied to the baseband link during L2CAP
* connection establishment. If the L2CAP connection is already
* established, EINPROGRESS may be returned, and it is not possible to
* guarantee that data already queued (from either end) will not be
* delivered. If the mode change fails, the L2CAP connection will be
* aborted.
*/
#define SO_L2CAP_IMTU (__SO_PROTOCOL + 3)
#define SO_L2CAP_OMTU (__SO_PROTOCOL + 4)
#define SO_L2CAP_LM (__SO_PROTOCOL + 5)
# define L2CAP_LM_AUTH (1 << 0)
# define L2CAP_LM_ENCRYPT (1 << 1)
# define L2CAP_LM_SECURE (1 << 2)
/* RFCOMM socket options:
*
* SO_RFCOMM_MTU [uint16_t]
* Maximum Frame Size to use for this link.
* SO_RFCOMM_LM [int]
* Link Mode. The following bits may be set at any time:
*
* RFCOMM_LM_AUTH Request authentication (pairing).
* RFCOMM_LM_ENCRYPT Request encryption (includes authentication).
* RFCOMM_LM_SECURE Request secured link (encryption, plus
* change link key).
*
* Link mode settings will be applied to the baseband link during RFCOMM
* connection establishment. If the RFCOMM connection is already
* established, EINPROGRESS may be returned, and it is not possible to
* guarantee that data already queued (from either end) will not be
* delivered. If the mode change fails, the RFCOMM connection will be
* aborted.
*/
#define SO_RFCOMM_MTU (__SO_PROTOCOL + 6)
#define SO_RFCOMM_LM (__SO_PROTOCOL + 7)
# define RFCOMM_LM_AUTH (1 << 0)
# define RFCOMM_LM_ENCRYPT (1 << 1)
# define RFCOMM_LM_SECURE (1 << 2)
/* SCO socket options:
*
* SO_SCO_MTU [uint16_t]
* Maximum packet size for use on this link. This is read-only and will
* be set by the protocol code when a connection is made.
* SO_SCO_HANDLE [uint16_t]
* Connection handle for this link. This is read-only and provided for
* informational purposes only.
*/
#define SO_SCO_MTU (__SO_PROTOCOL + 8)
#define SO_SCO_HANDLE (__SO_PROTOCOL + 9)
/**************************************************************************** /****************************************************************************
* Public Type Definitions * Public Type Definitions
@@ -66,15 +199,14 @@
* sendto() - Send to specified remote address * sendto() - Send to specified remote address
* recvfrom()- Receive from indicated remote address. * recvfrom()- Receive from indicated remote address.
* *
* The 'rc' in the naming derives from RFCCOMM as used in Linux. The * REVISIT: Some protocols would require a bt_psm field as well.
* resemblances are superficial beyond that, however.
*/ */
struct sockaddr_rc_s struct sockaddr_bt_s
{ {
sa_family_t rc_family; sa_family_t bt_family;
bt_addr_t rc_bdaddr; bt_addr_t bt_bdaddr;
uint8_t rc_channel; uint8_t bt_channel;
}; };
/**************************************************************************** /****************************************************************************
+136 -13
View File
@@ -53,12 +53,55 @@
* Pre-processor Definitions * Pre-processor Definitions
****************************************************************************/ ****************************************************************************/
#define HCI_DEVNAME_SIZE 32 /* Maximum size of node name */
#define HCI_FEATURES_SIZE 8 /* LMP features */
/* Bluetooth network device IOCTL commands. */ /* Bluetooth network device IOCTL commands. */
#ifndef WL_BLUETOOTHCMDS != 5 #ifndef WL_BLUETOOTHCMDS != 14
# error Incorrect setting for number of Bluetooth IOCTL commands # error Incorrect setting for number of Bluetooth IOCTL commands
#endif #endif
/* All of the following use an argument of type struct btreg_s:
*
* SIOCGBTINFO
* Get Bluetooth device Info. Given the device name, fill in the btreq_s
* structure including the address field for use with socket addressing as
* above.
* SIOCGBTINFOA
* Get Bluetooth device Info from Address. Given the device address, fill
* in the btreq_s structure including the name field.
* SIOCNBTINFO
* Next Bluetooth device Info. If name field is empty, the first device
* will be returned. Otherwise, the next device will be returned until
* no more devices are found when the call will fail, with error ENXIO.
* Thus, you can cycle through all devices in the system.
* SIOCSBTFLAGS
* Set Bluetooth device Flags. Not all flags are settable.
* SIOCGBTFEAT
* Get Bluetooth device Features. This returns the cached basic (page 0)
* and extended (page 1 & 2) features.
* SIOCSBTPOLICY
* Set Bluetooth device Link Policy bits.
* SIOCSBTPTYPE
* Set Bluetooth device Packet Types. You can only set packet types that
* the device supports.
* SIOCGBTSTATS
* Read device statistics.
* SIOCZBTSTATS
* Read device statistics, and zero them.
*/
#define SIOCGBTINFO _WLIOC(WL_BLUETOOTHFIRST + 0)
#define SIOCGBTINFOA _WLIOC(WL_BLUETOOTHFIRST + 1)
#define SIOCNBTINFO _WLIOC(WL_BLUETOOTHFIRST + 2)
#define SIOCSBTFLAGS _WLIOC(WL_BLUETOOTHFIRST + 3)
#define SIOCGBTFEAT _WLIOC(WL_BLUETOOTHFIRST + 4)
#define SIOCSBTPOLICY _WLIOC(WL_BLUETOOTHFIRST + 5)
#define SIOCSBTPTYPE _WLIOC(WL_BLUETOOTHFIRST + 6)
#define SIOCGBTSTATS _WLIOC(WL_BLUETOOTHFIRST + 7)
#define SIOCZBTSTATS _WLIOC(WL_BLUETOOTHFIRST + 8)
/* SIOCBT_ADVERTISESTART /* SIOCBT_ADVERTISESTART
* Description: Set advertisement data, scan response data, * Description: Set advertisement data, scan response data,
* advertisement parameters and start advertising. * advertisement parameters and start advertising.
@@ -67,7 +110,7 @@
* Output: None * Output: None
*/ */
#define SIOCBT_ADVERTISESTART _WLIOC(WL_BLUETOOTHFIRST + 0) #define SIOCBT_ADVERTISESTART _WLIOC(WL_BLUETOOTHFIRST + 9)
/* SIOCBT_ADVERTISESTOP /* SIOCBT_ADVERTISESTOP
* Description: Stop advertising. * Description: Stop advertising.
@@ -75,7 +118,7 @@
* Output: None * Output: None
*/ */
#define SIOCBT_ADVERTISESTOP _WLIOC(WL_BLUETOOTHFIRST + 1) #define SIOCBT_ADVERTISESTOP _WLIOC(WL_BLUETOOTHFIRST + 10)
/* SIOCBT_SCANSTART /* SIOCBT_SCANSTART
* Description: Start LE scanning. Buffered scan results may be * Description: Start LE scanning. Buffered scan results may be
@@ -84,7 +127,7 @@
* Output: None * Output: None
*/ */
#define SIOCBT_SCANSTART _WLIOC(WL_BLUETOOTHFIRST + 2) #define SIOCBT_SCANSTART _WLIOC(WL_BLUETOOTHFIRST + 11)
/* SIOCBT_SCANGET /* SIOCBT_SCANGET
* Description: Return scan results buffered since the call time that * Description: Return scan results buffered since the call time that
@@ -95,7 +138,7 @@
* provided buffer space. * provided buffer space.
*/ */
#define SIOCBT_SCANGET _WLIOC(WL_BLUETOOTHFIRST + 3) #define SIOCBT_SCANGET _WLIOC(WL_BLUETOOTHFIRST + 12)
/* SIOCBT_SCANSTOP /* SIOCBT_SCANSTOP
* Description: Stop LE scanning and discard any buffered results. * Description: Stop LE scanning and discard any buffered results.
@@ -103,18 +146,96 @@
* Output: None * Output: None
*/ */
#define SIOCBT_SCANSTOP _WLIOC(WL_BLUETOOTHFIRST + 4) #define SIOCBT_SCANSTOP _WLIOC(WL_BLUETOOTHFIRST + 13)
/* struct btreq_s union field accessors */
#define btr_flags btru.btri.btri_flags
#define btr_bdaddr btru.btri.btri_bdaddr
#define btr_num_cmd btru.btri.btri_num_cmd
#define btr_num_acl btru.btri.btri_num_acl
#define btr_num_sco btru.btri.btri_num_sco
#define btr_acl_mtu btru.btri.btri_acl_mtu
#define btr_sco_mtu btru.btri.btri_sco_mtu
#define btr_link_policy btru.btri.btri_link_policy
#define btr_packet_type btru.btri.btri_packet_type
#define btr_max_acl btru.btri.btri_max_acl
#define btr_max_sco btru.btri.btri_max_sco
#define btr_features0 btru.btrf.btrf_page0
#define btr_features1 btru.btrf.btrf_page1
#define btr_features2 btru.btrf.btrf_page2
#define btr_stats btru.btrs
/* btr_flags */
#define BTF_UP (1 << 0) /* unit is up */
#define BTF_RUNNING (1 << 1) /* unit is running */
#define BTF_XMIT_CMD (1 << 2) /* transmitting CMD packets */
#define BTF_XMIT_ACL (1 << 3) /* transmitting ACL packets */
#define BTF_XMIT_SCO (1 << 4) /* transmitting SCO packets */
#define BTF_INIT_BDADDR (1 << 5) /* waiting for bdaddr */
#define BTF_INIT_BUFFER_SIZE (1 << 6) /* waiting for buffer size */
#define BTF_INIT_FEATURES (1 << 7) /* waiting for features */
#define BTF_NOOP_ON_RESET (1 << 8) /* wait for No-op on reset */
#define BTF_INIT_COMMANDS (1 << 9) /* waiting for supported commands */
#define BTF_MASTER (1 << 10) /* request Master role */
/**************************************************************************** /****************************************************************************
* Public Types * Public Types
****************************************************************************/ ****************************************************************************/
/* Common structure for Bluetooth IOCTL commands */
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;
};
struct btreq_s
{
char btr_name[HCI_DEVNAME_SIZE]; /* Device name */
union
{
struct
{
bt_addr_t btri_bdaddr; /* Device bdaddr */
uint16_t btri_flags; /* flags */
uint16_t btri_num_cmd; /* # of free cmd buffers */
uint16_t btri_num_acl; /* # of free ACL buffers */
uint16_t btri_num_sco; /* # of free SCO buffers */
uint16_t btri_acl_mtu; /* ACL mtu */
uint16_t btri_sco_mtu; /* SCO mtu */
uint16_t btri_link_policy; /* Link Policy */
uint16_t btri_packet_type; /* Packet Type */
uint16_t btri_max_acl; /* max ACL buffers */
uint16_t btri_max_sco; /* max SCO buffers */
} btri;
struct
{
uint8_t btrf_page0[HCI_FEATURES_SIZE]; /* basic */
uint8_t btrf_page1[HCI_FEATURES_SIZE]; /* extended page 1 */
uint8_t btrf_page2[HCI_FEATURES_SIZE]; /* extended page 2 */
} btrf;
struct bt_stats btrs; /* unit stats */
} btru;
};
/* Read-only data that accompanies the SIOCBT_ADVERTISESTART IOCTL command. /* Read-only data that accompanies the SIOCBT_ADVERTISESTART IOCTL command.
* Advertising types are defined in bt_hci.h. * Advertising types are defined in bt_hci.h.
*/ */
struct bt_advertisestart_s struct bt_advertisestart_s
{ {
char as_name[HCI_DEVNAME_SIZE]; /* Device name */
uint8_t as_type; /* Advertising type */ uint8_t as_type; /* Advertising type */
FAR const struct bt_eir_s as_ad; /* Data for advertisement packets */ FAR const struct bt_eir_s as_ad; /* Data for advertisement packets */
FAR const struct bt_eir_s as_sd; /* Data for scan response packets */ FAR const struct bt_eir_s as_sd; /* Data for scan response packets */
@@ -124,17 +245,19 @@ struct bt_advertisestart_s
struct bt_scanresponse_s struct bt_scanresponse_s
{ {
bt_addr_le_t sr_addr; /* Advertiser LE address and type */ char sr_name[HCI_DEVNAME_SIZE]; /* Device name */
int8_t sr_rssi; /* Strength of advertiser signal */ bt_addr_le_t sr_addr; /* Advertiser LE address and type */
uint8_t sr_type; /* Type of advertising response */ int8_t sr_rssi; /* Strength of advertiser signal */
uint8_t sr_len; /* Length of advertiser data */ uint8_t sr_type; /* Type of advertising response */
uint8_t sr_data[CONFIG_BLUETOOTH_MAXSCANDATA]; uint8_t sr_len; /* Length of advertiser data */
uint8_t sr_data[CONFIG_BLUETOOTH_MAXSCANDATA];
}; };
struct bt_scanresult_s struct bt_scanresult_s
{ {
uint8_t sc_nrsp; /* Input: Max number of responses char sr_name[HCI_DEVNAME_SIZE]; /* Device name */
* Return: Actual number of responses */ uint8_t sc_nrsp; /* Input: Max number of responses
* Return: Actual number of responses */
struct bt_scanresponse_s sc_rsp[1]; struct bt_scanresponse_s sc_rsp[1];
}; };
+1 -1
View File
@@ -162,7 +162,7 @@
/* Reserved for Bluetooth network devices (see bt_ioctls.h) */ /* Reserved for Bluetooth network devices (see bt_ioctls.h) */
#define WL_BLUETOOTHFIRST (WL_NETFIRST + WL_NNETCMDS) #define WL_BLUETOOTHFIRST (WL_NETFIRST + WL_NNETCMDS)
#define WL_BLUETOOTHCMDS (5) #define WL_BLUETOOTHCMDS (14)
#define WL_IBLUETOOTHCMD(cmd) (_WLIOCVALID(cmd) && \ #define WL_IBLUETOOTHCMD(cmd) (_WLIOCVALID(cmd) && \
_IOC_NR(cmd) >= WL_BLUETOOTHFIRST && \ _IOC_NR(cmd) >= WL_BLUETOOTHFIRST && \
_IOC_NR(cmd) < (WL_BLUETOOTHFIRST + WL_BLUETOOTHCMDS)) _IOC_NR(cmd) < (WL_BLUETOOTHFIRST + WL_BLUETOOTHCMDS))
+4
View File
@@ -158,6 +158,10 @@
#define SOL_IPV6 2 /* See options in include/netinet/ip6.h */ #define SOL_IPV6 2 /* See options in include/netinet/ip6.h */
#define SOL_TCP 3 /* See options in include/netinet/tcp.h */ #define SOL_TCP 3 /* See options in include/netinet/tcp.h */
#define SOL_UDP 4 /* See options in include/netinit/udp.h */ #define SOL_UDP 4 /* See options in include/netinit/udp.h */
#define SOL_HCI 5 /* See options in include/netpacket/bluetooth.h */
#define SOL_L2CAP 6 /* See options in include/netpacket/bluetooth.h */
#define SOL_SCO 7 /* See options in include/netpacket/bluetooth.h */
#define SOL_RFCOMM 8 /* See options in include/netpacket/bluetooth.h */
/* Protocol-level socket options may begin with this value */ /* Protocol-level socket options may begin with this value */
+7 -7
View File
@@ -134,7 +134,7 @@ static ssize_t bluetooth_recvfrom_rxqueue(FAR struct radio_driver_s *radio,
FAR struct bluetooth_recvfrom_s *pstate) FAR struct bluetooth_recvfrom_s *pstate)
{ {
FAR struct bluetooth_container_s *container; FAR struct bluetooth_container_s *container;
FAR struct sockaddr_rc_s *iaddr; FAR struct sockaddr_bt_s *iaddr;
FAR struct bluetooth_conn_s *conn; FAR struct bluetooth_conn_s *conn;
FAR struct iob_s *iob; FAR struct iob_s *iob;
size_t copylen; size_t copylen;
@@ -190,10 +190,10 @@ static ssize_t bluetooth_recvfrom_rxqueue(FAR struct radio_driver_s *radio,
if (pstate->ir_from != NULL) if (pstate->ir_from != NULL)
{ {
iaddr = (FAR struct sockaddr_rc_s *)pstate->ir_from; iaddr = (FAR struct sockaddr_bt_s *)pstate->ir_from;
iaddr->rc_family = AF_BLUETOOTH; iaddr->bt_family = AF_BLUETOOTH;
BLUETOOTH_ADDRCOPY(&iaddr->rc_bdaddr, &container->bn_raddr); BLUETOOTH_ADDRCOPY(&iaddr->bt_bdaddr, &container->bn_raddr);
iaddr->rc_channel = container->bn_channel; iaddr->bt_channel = container->bn_channel;
} }
/* Free both the IOB and the container */ /* Free both the IOB and the container */
@@ -332,12 +332,12 @@ ssize_t bluetooth_recvfrom(FAR struct socket *psock, FAR void *buf,
* enough to hold this address family. * enough to hold this address family.
*/ */
if (from != NULL && *fromlen < sizeof(struct sockaddr_rc_s)) if (from != NULL && *fromlen < sizeof(struct sockaddr_bt_s))
{ {
return -EINVAL; return -EINVAL;
} }
if (psock->s_type != SOCK_DGRAM) if (psock->s_type != SOCK_RAW)
{ {
nerr("ERROR: Unsupported socket type: %d\n", psock->s_type); nerr("ERROR: Unsupported socket type: %d\n", psock->s_type);
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
+3 -3
View File
@@ -247,7 +247,7 @@ ssize_t psock_bluetooth_sendto(FAR struct socket *psock, FAR const void *buf,
size_t len, int flags, size_t len, int flags,
FAR const struct sockaddr *to, socklen_t tolen) FAR const struct sockaddr *to, socklen_t tolen)
{ {
FAR struct sockaddr_rc_s *destaddr; FAR struct sockaddr_bt_s *destaddr;
FAR struct radio_driver_s *radio; FAR struct radio_driver_s *radio;
FAR struct bluetooth_conn_s *conn; FAR struct bluetooth_conn_s *conn;
struct bluetooth_sendto_s state; struct bluetooth_sendto_s state;
@@ -307,8 +307,8 @@ ssize_t psock_bluetooth_sendto(FAR struct socket *psock, FAR const void *buf,
/* Copy the destination address */ /* Copy the destination address */
destaddr = (FAR struct sockaddr_rc_s *)to; destaddr = (FAR struct sockaddr_bt_s *)to;
memcpy(&state.is_destaddr, &destaddr->rc_bdaddr, memcpy(&state.is_destaddr, &destaddr->bt_bdaddr,
sizeof(bt_addr_t)); sizeof(bt_addr_t));
if (len > 0) if (len > 0)
+34 -35
View File
@@ -180,10 +180,10 @@ static int bluetooth_setup(FAR struct socket *psock, int protocol)
* the connection structure is is unallocated at this point. It will * the connection structure is is unallocated at this point. It will
* not actually be initialized until the socket is connected. * not actually be initialized until the socket is connected.
* *
* Only SOCK_DGRAM is supported (since the MAC header is stripped) * Only SOCK_RAW is supported
*/ */
if (psock->s_type == SOCK_DGRAM) if (psock->s_type == SOCK_RAW)
{ {
return bluetooth_sockif_alloc(psock); return bluetooth_sockif_alloc(psock);
} }
@@ -233,7 +233,7 @@ static void bluetooth_addref(FAR struct socket *psock)
FAR struct bluetooth_conn_s *conn; FAR struct bluetooth_conn_s *conn;
DEBUGASSERT(psock != NULL && psock->s_conn != NULL && DEBUGASSERT(psock != NULL && psock->s_conn != NULL &&
psock->s_type == SOCK_DGRAM); psock->s_type == SOCK_RAW);
conn = (FAR struct bluetooth_conn_s *)psock->s_conn; conn = (FAR struct bluetooth_conn_s *)psock->s_conn;
DEBUGASSERT(conn->bc_crefs > 0 && conn->bc_crefs < 255); DEBUGASSERT(conn->bc_crefs > 0 && conn->bc_crefs < 255);
@@ -249,17 +249,11 @@ static void bluetooth_addref(FAR struct socket *psock)
* specifies the size of 'addr'. The format of the address in 'addr' is * specifies the size of 'addr'. The format of the address in 'addr' is
* determined by the address space of the socket 'psock'. * determined by the address space of the socket 'psock'.
* *
* If the socket 'psock' is of type SOCK_DGRAM then 'addr' is the address
* to which datagrams are sent by default, and the only address from which
* datagrams are received. If the socket is of type SOCK_STREAM or
* SOCK_SEQPACKET, this call attempts to make a connection to the socket
* that is bound to the address specified by 'addr'.
*
* Generally, connection-based protocol sockets may successfully * Generally, connection-based protocol sockets may successfully
* bluetooth_connect() only once; connectionless protocol sockets may use * bluetooth_connect() only once; connectionless protocol sockets may use
* bluetooth_connect() multiple times to change their association. * bluetooth_connect() multiple times to change their association.
* Connectionless sockets may dissolve the association by connecting to * Connectionless sockets may dissolve the association by connecting to
* an address with the rc_family member of sockaddr set to AF_UNSPEC. * an address with the bt_family member of sockaddr set to AF_UNSPEC.
* *
* Input Parameters: * Input Parameters:
* psock Pointer to a socket structure initialized by psock_socket() * psock Pointer to a socket structure initialized by psock_socket()
@@ -277,7 +271,7 @@ static int bluetooth_connect(FAR struct socket *psock,
socklen_t addrlen) socklen_t addrlen)
{ {
FAR struct bluetooth_conn_s *conn; FAR struct bluetooth_conn_s *conn;
FAR struct sockaddr_rc_s *btaddr; FAR struct sockaddr_bt_s *btaddr;
int ret; int ret;
DEBUGASSERT(psock != NULL || addr != NULL); DEBUGASSERT(psock != NULL || addr != NULL);
@@ -290,9 +284,9 @@ static int bluetooth_connect(FAR struct socket *psock,
{ {
/* Save the "connection" address */ /* Save the "connection" address */
btaddr = (FAR struct sockaddr_rc_s *)addr; btaddr = (FAR struct sockaddr_bt_s *)addr;
memcpy(&conn->bc_raddr, &btaddr->rc_bdaddr, sizeof(bt_addr_t)); memcpy(&conn->bc_raddr, &btaddr->bt_bdaddr, sizeof(bt_addr_t));
conn->bc_channel = btaddr->rc_channel; conn->bc_channel = btaddr->bt_channel;
/* Mark the socket as connected. */ /* Mark the socket as connected. */
@@ -386,7 +380,7 @@ static int bluetooth_accept(FAR struct socket *psock,
static int bluetooth_bind(FAR struct socket *psock, static int bluetooth_bind(FAR struct socket *psock,
FAR const struct sockaddr *addr, socklen_t addrlen) FAR const struct sockaddr *addr, socklen_t addrlen)
{ {
FAR const struct sockaddr_rc_s *iaddr; FAR const struct sockaddr_bt_s *iaddr;
FAR struct radio_driver_s *radio; FAR struct radio_driver_s *radio;
FAR struct bluetooth_conn_s *conn; FAR struct bluetooth_conn_s *conn;
@@ -395,16 +389,19 @@ static int bluetooth_bind(FAR struct socket *psock,
/* Verify that a valid address has been provided */ /* Verify that a valid address has been provided */
if (addr->sa_family != AF_BLUETOOTH || if (addr->sa_family != AF_BLUETOOTH ||
addrlen < sizeof(struct sockaddr_rc_s)) addrlen < sizeof(struct sockaddr_bt_s))
{ {
nerr("ERROR: Invalid family: %u or address length: %d < %d\n", nerr("ERROR: Invalid family: %u or address length: %d < %d\n",
addr->sa_family, addrlen, sizeof(struct sockaddr_ll)); addr->sa_family, addrlen, sizeof(struct sockaddr_ll));
return -EBADF; return -EBADF;
} }
/* Bind a PF_BLUETOOTH socket to an network device. */ /* Bind a PF_BLUETOOTH socket to an network device.
*
* Only SOCK_RAW is supported
*/
if (psock->s_type != SOCK_DGRAM) if (psock->s_type != SOCK_RAW)
{ {
nerr("ERROR: Invalid socket type: %u\n", psock->s_type); nerr("ERROR: Invalid socket type: %u\n", psock->s_type);
return -EBADF; return -EBADF;
@@ -418,7 +415,7 @@ static int bluetooth_bind(FAR struct socket *psock,
return -EINVAL; return -EINVAL;
} }
iaddr = (FAR const struct sockaddr_rc_s *)addr; iaddr = (FAR const struct sockaddr_bt_s *)addr;
/* Very that some address was provided */ /* Very that some address was provided */
/* REVISIT: Currently and explict address must be assigned. Should we /* REVISIT: Currently and explict address must be assigned. Should we
@@ -429,7 +426,7 @@ static int bluetooth_bind(FAR struct socket *psock,
/* Find the device associated with the requested address */ /* Find the device associated with the requested address */
radio = bluetooth_find_device(conn, &iaddr->rc_bdaddr); radio = bluetooth_find_device(conn, &iaddr->bt_bdaddr);
if (radio == NULL) if (radio == NULL)
{ {
nerr("ERROR: No radio at this address\n"); nerr("ERROR: No radio at this address\n");
@@ -438,7 +435,7 @@ static int bluetooth_bind(FAR struct socket *psock,
/* Save the address as the socket's local address */ /* Save the address as the socket's local address */
memcpy(&conn->bc_laddr, &iaddr->rc_bdaddr, sizeof(bt_addr_t)); memcpy(&conn->bc_laddr, &iaddr->bt_bdaddr, sizeof(bt_addr_t));
/* Mark the socket bound */ /* Mark the socket bound */
@@ -479,7 +476,7 @@ static int bluetooth_getsockname(FAR struct socket *psock,
socklen_t *addrlen) socklen_t *addrlen)
{ {
FAR struct bluetooth_conn_s *conn; FAR struct bluetooth_conn_s *conn;
FAR struct sockaddr_rc_s tmp; FAR struct sockaddr_bt_s tmp;
socklen_t copylen; socklen_t copylen;
DEBUGASSERT(psock != NULL && addr != NULL && addrlen != NULL); DEBUGASSERT(psock != NULL && addr != NULL && addrlen != NULL);
@@ -489,12 +486,12 @@ static int bluetooth_getsockname(FAR struct socket *psock,
/* Create a copy of the full address on the stack */ /* Create a copy of the full address on the stack */
tmp.rc_family = AF_BLUETOOTH; tmp.bt_family = AF_BLUETOOTH;
memcpy(&tmp.rc_bdaddr, &conn->bc_laddr, sizeof(bt_addr_t)); memcpy(&tmp.bt_bdaddr, &conn->bc_laddr, sizeof(bt_addr_t));
/* Copy to the user buffer, truncating if necessary */ /* Copy to the user buffer, truncating if necessary */
copylen = sizeof(struct sockaddr_rc_s); copylen = sizeof(struct sockaddr_bt_s);
if (copylen > *addrlen) if (copylen > *addrlen)
{ {
copylen = *addrlen; copylen = *addrlen;
@@ -591,7 +588,7 @@ static int bluetooth_poll_local(FAR struct socket *psock,
static ssize_t bluetooth_send(FAR struct socket *psock, FAR const void *buf, static ssize_t bluetooth_send(FAR struct socket *psock, FAR const void *buf,
size_t len, int flags) size_t len, int flags)
{ {
struct sockaddr_rc_s to; struct sockaddr_bt_s to;
FAR struct bluetooth_conn_s *conn; FAR struct bluetooth_conn_s *conn;
ssize_t ret; ssize_t ret;
@@ -599,9 +596,9 @@ static ssize_t bluetooth_send(FAR struct socket *psock, FAR const void *buf,
conn = (FAR struct bluetooth_conn_s *)psock->s_conn; conn = (FAR struct bluetooth_conn_s *)psock->s_conn;
DEBUGASSERT(conn != NULL); DEBUGASSERT(conn != NULL);
/* Only SOCK_DGRAM is supported (because the MAC header is stripped) */ /* Only SOCK_RAW is supported */
if (psock->s_type == SOCK_DGRAM) if (psock->s_type == SOCK_RAW)
{ {
/* send() may be used only if the socket is has been connected. */ /* send() may be used only if the socket is has been connected. */
@@ -611,15 +608,15 @@ static ssize_t bluetooth_send(FAR struct socket *psock, FAR const void *buf,
} }
else else
{ {
to.rc_family = AF_BLUETOOTH; to.bt_family = AF_BLUETOOTH;
memcpy(&to.rc_bdaddr, &conn->bc_raddr, sizeof(bt_addr_t)); memcpy(&to.bt_bdaddr, &conn->bc_raddr, sizeof(bt_addr_t));
to.rc_channel = conn->bc_channel; to.bt_channel = conn->bc_channel;
/* Then perform the send() as sendto() */ /* Then perform the send() as sendto() */
ret = psock_bluetooth_sendto(psock, buf, len, flags, ret = psock_bluetooth_sendto(psock, buf, len, flags,
(FAR const struct sockaddr *)&to, (FAR const struct sockaddr *)&to,
sizeof(struct sockaddr_rc_s)); sizeof(struct sockaddr_bt_s));
} }
} }
else else
@@ -662,9 +659,9 @@ static ssize_t bluetooth_sendto(FAR struct socket *psock, FAR const void *buf,
{ {
ssize_t ret; ssize_t ret;
/* Only SOCK_DGRAM is supported (because the MAC header is stripped) */ /* Only SOCK_RAW is supported */
if (psock->s_type == SOCK_DGRAM) if (psock->s_type == SOCK_RAW)
{ {
/* Raw packet send */ /* Raw packet send */
@@ -704,7 +701,9 @@ static int bluetooth_close(FAR struct socket *psock)
switch (psock->s_type) switch (psock->s_type)
{ {
case SOCK_DGRAM: /* Only SOCK_RAW is supported */
case SOCK_RAW:
{ {
FAR struct bluetooth_conn_s *conn = psock->s_conn; FAR struct bluetooth_conn_s *conn = psock->s_conn;