When a hypercall-initiated read on a network device returns 0 (EOF) the tender returns SOLO5_R_AGAIN. In mirage-net-solo5 this results in listen retrying the read. If the file descriptor is really closed this will end in an infinite loop.
|
ret = read(e->b.hostfd, HVT_CHECKED_GPA_P(hvt, rd->data, rd->len), rd->len); |
|
if ((ret == 0) || |
|
(ret == -1 && errno == EAGAIN)) { |
|
rd->ret = SOLO5_R_AGAIN; |
|
return; |
|
} |
The spt target does not do anything special in the case of read(2) returns 0 as far as I can tell.
It is unclear to me if a file descriptor for a tap device could ever return EOF. I observe this by abusing the file descriptor mechanism for passing network devices in https://github.com/reynir/mirage-cat
When a hypercall-initiated read on a network device returns 0 (EOF) the tender returns
SOLO5_R_AGAIN. In mirage-net-solo5 this results inlistenretrying the read. If the file descriptor is really closed this will end in an infinite loop.solo5/tenders/hvt/hvt_module_net.c
Lines 77 to 82 in bf29b8a
The spt target does not do anything special in the case of
read(2)returns 0 as far as I can tell.It is unclear to me if a file descriptor for a tap device could ever return EOF. I observe this by abusing the file descriptor mechanism for passing network devices in https://github.com/reynir/mirage-cat