Re: [PATCH 3/3] emulator/bthost: Add initial rfcomm handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Marcin,

> This is initial rfcomm handling in bthost. It also adds
> rfcomm.h to monitor directory
> ---
> emulator/bthost.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> monitor/rfcomm.h  | 53 +++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 119 insertions(+), 1 deletion(-)
> create mode 100644 monitor/rfcomm.h

split this out. I rather not intermix them if not needed.

> 
> diff --git a/emulator/bthost.c b/emulator/bthost.c
> index 83bfdee..e142038 100644
> --- a/emulator/bthost.c
> +++ b/emulator/bthost.c
> @@ -36,6 +36,7 @@
> #include "bluetooth/bluetooth.h"
> 
> #include "monitor/bt.h"
> +#include "monitor/rfcomm.h"
> #include "bthost.h"
> 
> /* ACL handle and flags pack/unpack */
> @@ -1173,6 +1174,64 @@ static struct cid_hook *find_cid_hook(struct btconn *conn, uint16_t cid)
> 	return NULL;
> }
> 
> +static void rfcomm_sabm_recv(struct bthost *bthost, struct btconn *conn,
> +				struct l2conn *l2conn, const void *data,
> +				uint16_t len)
> +{
> +}
> +
> +static void rfcomm_disc_recv(struct bthost *bthost, struct btconn *conn,
> +				struct l2conn *l2conn, const void *data,
> +				uint16_t len)
> +{
> +}
> +
> +static void rfcomm_ua_recv(struct bthost *bthost, struct btconn *conn,
> +				struct l2conn *l2conn, const void *data,
> +				uint16_t len)
> +{
> +}
> +
> +static void rfcomm_dm_recv(struct bthost *bthost, struct btconn *conn,
> +				struct l2conn *l2conn, const void *data,
> +				uint16_t len)
> +{
> +}
> +
> +static void rfcomm_uih_recv(struct bthost *bthost, struct btconn *conn,
> +				struct l2conn *l2conn, const void *data,
> +				uint16_t len)
> +{
> +}
> +
> +static void process_rfcomm(struct bthost *bthost, struct btconn *conn,
> +				struct l2conn *l2conn, const void *data,
> +				uint16_t len)
> +{
> +	const struct rfcomm_hdr *hdr = data;
> +
> +	switch (GET_TYPE(hdr->control)) {
> +	case RFCOMM_SABM:
> +		rfcomm_sabm_recv(bthost, conn, l2conn, data, len);
> +		break;
> +	case RFCOMM_DISC:
> +		rfcomm_disc_recv(bthost, conn, l2conn, data, len);
> +		break;
> +	case RFCOMM_UA:
> +		rfcomm_ua_recv(bthost, conn, l2conn, data, len);
> +		break;
> +	case RFCOMM_DM:
> +		rfcomm_dm_recv(bthost, conn, l2conn, data, len);
> +		break;
> +	case RFCOMM_UIH:
> +		rfcomm_uih_recv(bthost, conn, l2conn, data, len);
> +		break;
> +	default:
> +		printf("Unknown frame type\n");
> +		break;
> +	}
> +}
> +
> static void process_acl(struct bthost *bthost, const void *data, uint16_t len)
> {
> 	const struct bt_hci_acl_hdr *acl_hdr = data;
> @@ -1180,6 +1239,7 @@ static void process_acl(struct bthost *bthost, const void *data, uint16_t len)
> 	uint16_t handle, cid, acl_len, l2_len;
> 	struct cid_hook *hook;
> 	struct btconn *conn;
> +	struct l2conn *l2conn;
> 	const void *l2_data;
> 
> 	if (len < sizeof(*acl_hdr) + sizeof(*l2_hdr))
> @@ -1218,7 +1278,12 @@ static void process_acl(struct bthost *bthost, const void *data, uint16_t len)
> 		l2cap_le_sig(bthost, conn, l2_data, l2_len);
> 		break;
> 	default:
> -		printf("Packet for unknown CID 0x%04x (%u)\n", cid, cid);
> +		l2conn = btconn_find_l2cap_conn_by_scid(conn, cid);
> +		if (l2conn->psm == 0x0003)
> +			process_rfcomm(bthost, conn, l2conn, l2_data, l2_len);
> +		else
> +			printf("Packet for unknown CID 0x%04x (%u)\n", cid,
> +									cid);
> 		break;
> 	}
> }
> diff --git a/monitor/rfcomm.h b/monitor/rfcomm.h
> new file mode 100644
> index 0000000..a8266e7
> --- /dev/null
> +++ b/monitor/rfcomm.h
> @@ -0,0 +1,53 @@
> +/*
> + *
> + *  BlueZ - Bluetooth protocol stack for Linux
> + *
> + *  Copyright (C) 2013 Intel Corporation
> + *
> + *
> + *  This library is free software; you can redistribute it and/or
> + *  modify it under the terms of the GNU Lesser General Public
> + *  License as published by the Free Software Foundation; either
> + *  version 2.1 of the License, or (at your option) any later version.
> + *
> + *  This library is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + *  Lesser General Public License for more details.
> + *
> + *  You should have received a copy of the GNU Lesser General Public
> + *  License along with this library; if not, write to the Free Software
> + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> + *
> + */
> +
> +#define RFCOMM_SABM    0x2f
> +#define RFCOMM_DISC    0x43
> +#define RFCOMM_UA      0x63
> +#define RFCOMM_DM      0x0f
> +#define RFCOMM_UIH     0xef
> +
> +#define GET_TYPE(control)      ((control & 0xef))
> +#define GET_DLCI(address)      ((address & 0xfc) >> 2)
> +#define GET_CHANNEL(address)   ((address & 0xf8) >> 3)
> +#define GET_DIR(address)       ((address & 0x04) >> 2)

	((control) & 0xef)

and so on ..

You might also prefix these with RFCOMM_

> +
> +#define TEST_EA(length)      ((length & 0x01))
> +
> +#define ADDR(cr, dlci) (((dlci & 0x3f) << 2) | (cr << 1) | 0x01)
> +#define CTRL(type, pf) (((type & 0xef) | (pf << 4)))
> +#define LEN8(len)       (((len) << 1) | 1)
> +#define LEN16(len)      ((len) << 1)
> +
> +struct rfcomm_hdr {
> +	uint8_t address_field;

Just call it address;

> +	uint8_t control;
> +	uint8_t length;
> +} __attribute__((packed));
> +
> +struct rfcomm_cmd {
> +	uint8_t address_field;
> +	uint8_t control;
> +	uint8_t length;
> +	uint8_t fcs;
> +} __attribute__((packed));

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux