Revision 4f1c942b hw/xen_nic.c
b/hw/xen_nic.c | ||
---|---|---|
243 | 243 |
return 1; |
244 | 244 |
} |
245 | 245 |
|
246 |
static void net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
246 |
static ssize_t net_rx_packet(VLANClientState *vc, const uint8_t *buf, size_t size)
|
|
247 | 247 |
{ |
248 | 248 |
struct XenNetDev *netdev = vc->opaque; |
249 | 249 |
netif_rx_request_t rxreq; |
... | ... | |
251 | 251 |
void *page; |
252 | 252 |
|
253 | 253 |
if (netdev->xendev.be_state != XenbusStateConnected) |
254 |
return; |
|
254 |
return -1;
|
|
255 | 255 |
|
256 | 256 |
rc = netdev->rx_ring.req_cons; |
257 | 257 |
rp = netdev->rx_ring.sring->req_prod; |
... | ... | |
259 | 259 |
|
260 | 260 |
if (rc == rp || RING_REQUEST_CONS_OVERFLOW(&netdev->rx_ring, rc)) { |
261 | 261 |
xen_be_printf(&netdev->xendev, 2, "no buffer, drop packet\n"); |
262 |
return; |
|
262 |
return -1;
|
|
263 | 263 |
} |
264 | 264 |
if (size > XC_PAGE_SIZE - NET_IP_ALIGN) { |
265 | 265 |
xen_be_printf(&netdev->xendev, 0, "packet too big (%lu > %ld)", |
266 | 266 |
(unsigned long)size, XC_PAGE_SIZE - NET_IP_ALIGN); |
267 |
return; |
|
267 |
return -1;
|
|
268 | 268 |
} |
269 | 269 |
|
270 | 270 |
memcpy(&rxreq, RING_GET_REQUEST(&netdev->rx_ring, rc), sizeof(rxreq)); |
... | ... | |
277 | 277 |
xen_be_printf(&netdev->xendev, 0, "error: rx gref dereference failed (%d)\n", |
278 | 278 |
rxreq.gref); |
279 | 279 |
net_rx_response(netdev, &rxreq, NETIF_RSP_ERROR, 0, 0, 0); |
280 |
return; |
|
280 |
return -1;
|
|
281 | 281 |
} |
282 | 282 |
memcpy(page + NET_IP_ALIGN, buf, size); |
283 | 283 |
xc_gnttab_munmap(netdev->xendev.gnttabdev, page, 1); |
284 | 284 |
net_rx_response(netdev, &rxreq, NETIF_RSP_OKAY, NET_IP_ALIGN, size, 0); |
285 |
|
|
286 |
return size; |
|
285 | 287 |
} |
286 | 288 |
|
287 | 289 |
/* ------------------------------------------------------------- */ |
Also available in: Unified diff