bluez/btio: Added option BT_IO_OPT_TIMEOUT

pull/5/head
Olivier Martin 2016-05-01 23:31:13 +01:00
parent 36ff478c3e
commit ee58e4cb64
3 changed files with 27 additions and 3 deletions

View File

@ -65,6 +65,7 @@ struct set_opts {
uint8_t mode;
int flushable;
uint32_t priority;
int timeout;
};
struct connect {
@ -172,11 +173,27 @@ static int l2cap_bind(int sock, const bdaddr_t *src, uint16_t psm,
}
static int l2cap_connect(int sock, const bdaddr_t *dst, uint8_t dst_type,
uint16_t psm, uint16_t cid)
uint16_t psm, uint16_t cid, uint16_t timeout)
{
int err;
struct sockaddr_l2 addr;
if (timeout > 0) {
struct timeval timeout;
timeout.tv_sec = 2;
timeout.tv_usec = 0;
if (setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
fprintf(stderr, "l2cap_connect: Failed to setsockopt for receive timeout.\n");
return -1;
}
if (setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
fprintf(stderr, "l2cap_connect: Failed to setsockopt for sending timeout.\n");
return -1;
}
}
memset(&addr, 0, sizeof(addr));
addr.l2_family = AF_BLUETOOTH;
bacpy(&addr.l2_bdaddr, dst);
@ -599,6 +616,7 @@ static gboolean parse_set_opts(struct set_opts *opts, GError **err,
opts->flushable = -1;
opts->priority = 0;
opts->dst_type = BDADDR_BREDR;
opts->timeout = 0;
while (opt != BT_IO_OPT_INVALID) {
switch (opt) {
@ -660,6 +678,9 @@ static gboolean parse_set_opts(struct set_opts *opts, GError **err,
case BT_IO_OPT_PRIORITY:
opts->priority = va_arg(args, int);
break;
case BT_IO_OPT_TIMEOUT:
opts->timeout = va_arg(args, int);
break;
default:
g_set_error(err, BT_IO_ERROR, BT_IO_ERROR_INVALID_ARGS,
"Unknown option %d", opt);
@ -1245,12 +1266,12 @@ GIOChannel *bt_io_connect(BtIOType type, BtIOConnect connect,
switch (type) {
case BT_IO_L2RAW:
err = l2cap_connect(sock, &opts.dst, opts.dst_type, 0,
opts.cid);
opts.cid, opts.timeout);
break;
case BT_IO_L2CAP:
case BT_IO_L2ERTM:
err = l2cap_connect(sock, &opts.dst, opts.dst_type,
opts.psm, opts.cid);
opts.psm, opts.cid, opts.timeout);
break;
case BT_IO_RFCOMM:
err = rfcomm_connect(sock, &opts.dst, opts.channel);

View File

@ -70,6 +70,7 @@ typedef enum {
BT_IO_OPT_MODE,
BT_IO_OPT_FLUSHABLE,
BT_IO_OPT_PRIORITY,
BT_IO_OPT_TIMEOUT
} BtIOOption;
typedef enum {

View File

@ -207,6 +207,7 @@ static gatt_connection_t *initialize_gattlib_connection(const gchar *src, const
BT_IO_OPT_DEST_TYPE, dest_type,
BT_IO_OPT_CID, ATT_CID,
BT_IO_OPT_SEC_LEVEL, sec_level,
BT_IO_OPT_TIMEOUT, 2,
BT_IO_OPT_INVALID);
else
conn->io = bt_io_connect(BT_IO_L2CAP, io_connect_cb, io_connect_arg, NULL, &err,
@ -215,6 +216,7 @@ static gatt_connection_t *initialize_gattlib_connection(const gchar *src, const
BT_IO_OPT_PSM, psm,
BT_IO_OPT_IMTU, mtu,
BT_IO_OPT_SEC_LEVEL, sec_level,
BT_IO_OPT_TIMEOUT, 2,
BT_IO_OPT_INVALID);
if (err) {