mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-12-24 22:13:52 +01:00
socket_zep: only report size of single datagram
This commit is contained in:
parent
8a80e70e5e
commit
3dedfb7a17
@ -244,7 +244,7 @@ static void _socket_isr(int fd, void *arg)
|
||||
} else {
|
||||
/* discard frame */
|
||||
uint8_t tmp;
|
||||
real_read(fd, &tmp, sizeof(tmp));
|
||||
real_recv(fd, &tmp, sizeof(tmp), 0);
|
||||
_continue_reading(zepdev);
|
||||
}
|
||||
}
|
||||
@ -445,23 +445,25 @@ static int _confirm_transmit(ieee802154_dev_t *dev, ieee802154_tx_info_t *info)
|
||||
|
||||
int _len(ieee802154_dev_t *dev)
|
||||
{
|
||||
size_t size;
|
||||
socket_zep_t *zepdev = dev->priv;
|
||||
|
||||
int res = real_ioctl(zepdev->sock_fd, FIONREAD, &size);
|
||||
zep_v2_data_hdr_t hdr;
|
||||
|
||||
int res = real_recv(zepdev->sock_fd, &hdr, sizeof(hdr), MSG_TRUNC | MSG_PEEK);
|
||||
if (res < 0) {
|
||||
DEBUG("socket_zep::len: error reading FIONREAD: %s", strerror(errno));
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEBUG("socket_zep::len %zu bytes on %d\n", size, zepdev->sock_fd);
|
||||
|
||||
if (size < sizeof(zep_v2_data_hdr_t)) {
|
||||
if (res < (int)sizeof(zep_v2_data_hdr_t)) {
|
||||
DEBUG("socket_zep::len discard short frame (%zu bytes)\n", res);
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEBUG("socket_zep::len %u bytes on %d\n", hdr.length, zepdev->sock_fd);
|
||||
|
||||
/* report size without ZEP header and checksum */
|
||||
return size - (sizeof(zep_v2_data_hdr_t) + 2);
|
||||
return hdr.length - 2;
|
||||
}
|
||||
|
||||
static void _send_ack(socket_zep_t *zepdev, const void *frame)
|
||||
@ -495,18 +497,23 @@ static int _read(ieee802154_dev_t *dev, void *buf, size_t max_size,
|
||||
{
|
||||
int res;
|
||||
socket_zep_t *zepdev = dev->priv;
|
||||
size_t frame_len = max_size + sizeof(zep_v2_data_hdr_t) + 2;
|
||||
|
||||
DEBUG("socket_zep::read: reading up to %u bytes into %p\n", max_size, buf);
|
||||
|
||||
if (max_size + sizeof(zep_v2_data_hdr_t) > sizeof(zepdev->rcv_buf)) {
|
||||
return 0;
|
||||
if (frame_len > sizeof(zepdev->rcv_buf)) {
|
||||
DEBUG("socket_zep::read: frame size (%zu) exceeds RX buffer (%zu bytes)\n",
|
||||
frame_len, sizeof(zepdev->rcv_buf));
|
||||
res = -ENOBUFS;
|
||||
goto out;
|
||||
}
|
||||
|
||||
res = real_read(zepdev->sock_fd, zepdev->rcv_buf, max_size + sizeof(zep_v2_data_hdr_t));
|
||||
res = real_recv(zepdev->sock_fd, zepdev->rcv_buf, frame_len, MSG_TRUNC);
|
||||
|
||||
DEBUG("socket_zep::read: got %d bytes\n", res);
|
||||
DEBUG("socket_zep::read: got %d/%zu bytes\n", res, frame_len);
|
||||
|
||||
if (res <= (int)sizeof(zep_v2_data_hdr_t)) {
|
||||
if (res <= (int)sizeof(zep_v2_data_hdr_t) || res > (int)frame_len) {
|
||||
DEBUG("socket_zep::read: %s\n", strerror(errno));
|
||||
res = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user