sys/usb/usbus/cdc_ecm_netdev: fix _recv() return values

Previously, the function would always return the max_len parameter.
This poses two issues:

1. the API requires to return the actual packet size
2. the API requires that if the packet is larger than max_len, the
   packet is flushed and -ENOBUFS is returned
3. this basically bypasses the packet flushing, consequtive _recv()
   would return the last packet again

This commit fixes those issues.
This commit is contained in:
Kaspar Schleiser 2020-09-18 21:00:16 +02:00
parent a301e81b47
commit 70d480c301

View File

@ -128,19 +128,23 @@ static int _send(netdev_t *netdev, const iolist_t *iolist)
static int _recv(netdev_t *netdev, void *buf, size_t max_len, void *info)
{
(void)info;
usbus_cdcecm_device_t *cdcecm = _netdev_to_cdcecm(netdev);
(void)info;
size_t pktlen = cdcecm->len;
if (max_len == 0 && buf == NULL) {
return cdcecm->len;
return pktlen;
}
if (max_len && buf == NULL) {
_signal_rx_flush(cdcecm);
return cdcecm->len;
return pktlen;
}
if (pktlen <= max_len) {
memcpy(buf, cdcecm->in_buf, pktlen);
}
memcpy(buf, cdcecm->in_buf, max_len);
_signal_rx_flush(cdcecm);
return max_len;
return (pktlen <= max_len) ? (int)pktlen : -ENOBUFS;
}
static int _init(netdev_t *netdev)