Skip to content

Commit 933841d

Browse files
chengkai15xiaoxiang781216
authored andcommitted
bluetooth:support read imcompleted hci data from blueooth socket
hci data from bluetooth socket maybe imcompleted hci data. Signed-off-by: chengkai <[email protected]>
1 parent fee8b44 commit 933841d

File tree

1 file changed

+74
-20
lines changed

1 file changed

+74
-20
lines changed

arch/sim/src/sim/sim_hcisocket.c

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,29 @@
5050
* Pre-processor Definitions
5151
****************************************************************************/
5252

53-
#define SIM_BTHCI_RX_FRAMELEN 1024
53+
#define SIM_BTHCI_RX_FRAMELEN 2048
5454
#define SIM_BTHCI_WORK_DELAY USEC2TICK(1000)
5555

5656
/****************************************************************************
5757
* Private Types
5858
****************************************************************************/
5959

60+
union bt_hdr_u
61+
{
62+
struct bt_hci_cmd_hdr_s cmd;
63+
struct bt_hci_acl_hdr_s acl;
64+
struct bt_hci_evt_hdr_s evt;
65+
struct bt_hci_iso_hdr_s iso;
66+
};
6067
struct bthcisock_s
6168
{
6269
struct bt_driver_s drv;
6370
int id;
6471
int fd;
6572

73+
uint16_t rxlen;
74+
uint8_t rxbuf[SIM_BTHCI_RX_FRAMELEN];
75+
6676
/* Work queue for transmit */
6777

6878
struct work_s worker;
@@ -124,36 +134,80 @@ static void bthcisock_close(struct bt_driver_s *drv)
124134
static int bthcisock_receive(struct bt_driver_s *drv)
125135
{
126136
struct bthcisock_s *dev = (struct bthcisock_s *)drv;
127-
char data[SIM_BTHCI_RX_FRAMELEN];
128137
enum bt_buf_type_e type;
138+
union bt_hdr_u *hdr;
139+
uint16_t pktlen;
129140
int ret;
130141

131-
ret = host_bthcisock_receive(dev->fd, data, sizeof(data));
142+
ret = host_bthcisock_receive(dev->fd, &dev->rxbuf[dev->rxlen],
143+
sizeof(dev->rxbuf) - dev->rxlen);
132144
if (ret <= 0)
133145
{
134146
return ret;
135147
}
136148

137-
if (data[0] == H4_EVT)
138-
{
139-
type = BT_EVT;
140-
}
141-
else if (data[0] == H4_ACL)
142-
{
143-
type = BT_ACL_IN;
144-
}
145-
else if (data[0] == H4_ISO)
146-
{
147-
type = BT_ISO_IN;
148-
}
149-
else
149+
dev->rxlen += ret;
150+
151+
while (dev->rxlen)
150152
{
151-
return -EINVAL;
153+
hdr = (union bt_hdr_u *)&dev->rxbuf[H4_HEADER_SIZE];
154+
switch (dev->rxbuf[0])
155+
{
156+
case H4_EVT:
157+
{
158+
if (dev->rxlen < H4_HEADER_SIZE
159+
+ sizeof (struct bt_hci_evt_hdr_s))
160+
{
161+
return ret;
162+
}
163+
164+
type = BT_EVT;
165+
pktlen = H4_HEADER_SIZE + sizeof(struct bt_hci_evt_hdr_s)
166+
+ hdr->evt.len;
167+
}
168+
break;
169+
case H4_ACL:
170+
{
171+
if (dev->rxlen < H4_HEADER_SIZE
172+
+ sizeof(struct bt_hci_acl_hdr_s))
173+
{
174+
return ret;
175+
}
176+
177+
type = BT_ACL_IN;
178+
pktlen = H4_HEADER_SIZE + sizeof(struct bt_hci_acl_hdr_s)
179+
+ hdr->acl.len;
180+
}
181+
break;
182+
case H4_ISO:
183+
{
184+
if (dev->rxlen < H4_HEADER_SIZE
185+
+ sizeof(struct bt_hci_iso_hdr_s))
186+
{
187+
return ret;
188+
}
189+
190+
type = BT_ISO_IN;
191+
pktlen = H4_HEADER_SIZE + sizeof(struct bt_hci_iso_hdr_s)
192+
+ hdr->iso.len;
193+
}
194+
break;
195+
default:
196+
return -EINVAL;
197+
}
198+
199+
if (dev->rxlen < pktlen)
200+
{
201+
return ret;
202+
}
203+
204+
bt_netdev_receive(&dev->drv, type, dev->rxbuf + H4_HEADER_SIZE,
205+
pktlen - H4_HEADER_SIZE);
206+
dev->rxlen -= pktlen;
207+
memmove(dev->rxbuf, dev->rxbuf + pktlen, dev->rxlen);
152208
}
153209

154-
return bt_netdev_receive(&dev->drv, type,
155-
data + H4_HEADER_SIZE,
156-
ret - H4_HEADER_SIZE);
210+
return ret;
157211
}
158212

159213
static int bthcisock_open(struct bt_driver_s *drv)

0 commit comments

Comments
 (0)