Revision e19eb224 net.c
b/net.c | ||
---|---|---|
1079 | 1079 |
} |
1080 | 1080 |
#endif |
1081 | 1081 |
|
1082 |
static void tap_send(void *opaque); |
|
1083 |
|
|
1084 |
static void tap_send_completed(VLANClientState *vc) |
|
1085 |
{ |
|
1086 |
TAPState *s = vc->opaque; |
|
1087 |
|
|
1088 |
qemu_set_fd_handler2(s->fd, tap_can_send, tap_send, NULL, s); |
|
1089 |
} |
|
1090 |
|
|
1082 | 1091 |
static void tap_send(void *opaque) |
1083 | 1092 |
{ |
1084 | 1093 |
TAPState *s = opaque; |
1085 | 1094 |
int size; |
1086 | 1095 |
|
1087 |
size = tap_read_packet(s->fd, s->buf, sizeof(s->buf)); |
|
1088 |
if (size > 0) { |
|
1089 |
qemu_send_packet(s->vc, s->buf, size); |
|
1090 |
} |
|
1096 |
do { |
|
1097 |
size = tap_read_packet(s->fd, s->buf, sizeof(s->buf)); |
|
1098 |
if (size <= 0) { |
|
1099 |
break; |
|
1100 |
} |
|
1101 |
|
|
1102 |
size = qemu_send_packet_async(s->vc, s->buf, size, tap_send_completed); |
|
1103 |
if (size == 0) { |
|
1104 |
qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); |
|
1105 |
} |
|
1106 |
} while (size > 0); |
|
1091 | 1107 |
} |
1092 | 1108 |
|
1093 | 1109 |
static void tap_cleanup(VLANClientState *vc) |
Also available in: Unified diff