diff --git a/cpu/native/socket_zep/socket_zep.c b/cpu/native/socket_zep/socket_zep.c index 6e2a846abc..22b49aee2b 100644 --- a/cpu/native/socket_zep/socket_zep.c +++ b/cpu/native/socket_zep/socket_zep.c @@ -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; }