diff --git a/btio/btio.c b/btio/btio.c index 825907dc..9781ec41 100644 --- a/btio/btio.c +++ b/btio/btio.c @@ -1161,6 +1161,7 @@ static gboolean get_valist(GIOChannel *io, BtIOType type, GError **err, switch (type) { case BT_IO_L2RAW: case BT_IO_L2CAP: + case BT_IO_L2ERTM: return l2cap_get(sock, err, opt1, args); case BT_IO_RFCOMM: return rfcomm_get(sock, err, opt1, args); @@ -1223,6 +1224,7 @@ gboolean bt_io_set(GIOChannel *io, BtIOType type, GError **err, switch (type) { case BT_IO_L2RAW: case BT_IO_L2CAP: + case BT_IO_L2ERTM: return l2cap_set(sock, opts.sec_level, opts.imtu, opts.omtu, opts.mode, opts.master, opts.flushable, opts.priority, err); @@ -1283,6 +1285,20 @@ static GIOChannel *create_io(BtIOType type, gboolean server, opts->priority, err)) goto failed; break; + case BT_IO_L2ERTM: + sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_L2CAP); + if (sock < 0) { + ERROR_FAILED(err, "socket(STREAM, L2CAP)", errno); + return NULL; + } + if (l2cap_bind(sock, &opts->src, server ? opts->psm : 0, + opts->cid, err) < 0) + goto failed; + if (!l2cap_set(sock, opts->sec_level, opts->imtu, opts->omtu, + opts->mode, opts->master, opts->flushable, + opts->priority, err)) + goto failed; + break; case BT_IO_RFCOMM: sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); if (sock < 0) { @@ -1353,6 +1369,7 @@ GIOChannel *bt_io_connect(BtIOType type, BtIOConnect connect, err = l2cap_connect(sock, &opts.dst, 0, opts.cid); break; case BT_IO_L2CAP: + case BT_IO_L2ERTM: err = l2cap_connect(sock, &opts.dst, opts.psm, opts.cid); break; case BT_IO_RFCOMM: diff --git a/btio/btio.h b/btio/btio.h index 7e3e130e..126d5d93 100644 --- a/btio/btio.h +++ b/btio/btio.h @@ -40,6 +40,7 @@ GQuark bt_io_error_quark(void); typedef enum { BT_IO_L2RAW, BT_IO_L2CAP, + BT_IO_L2ERTM, BT_IO_RFCOMM, BT_IO_SCO, } BtIOType;