Commit b664e3673c6c2ca228ce025292e32b34f73df5f5

Authored by Mark McLoughlin
Committed by Anthony Liguori
1 parent b9adce2c

net: add tap_read_poll() helper

Add a helper to enable/disable the read polling on tapfd.

We need this, because we want to start write polling on the tapfd too
and enable/disable both types of polling independently.

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing 1 changed file with 23 additions and 7 deletions
... ... @@ -1043,10 +1043,29 @@ typedef struct TAPState {
1043 1043 char down_script[1024];
1044 1044 char down_script_arg[128];
1045 1045 uint8_t buf[4096];
  1046 + unsigned int read_poll : 1;
1046 1047 } TAPState;
1047 1048  
1048 1049 static int launch_script(const char *setup_script, const char *ifname, int fd);
1049 1050  
  1051 +static int tap_can_send(void *opaque);
  1052 +static void tap_send(void *opaque);
  1053 +
  1054 +static void tap_update_fd_handler(TAPState *s)
  1055 +{
  1056 + qemu_set_fd_handler2(s->fd,
  1057 + s->read_poll ? tap_can_send : NULL,
  1058 + s->read_poll ? tap_send : NULL,
  1059 + NULL,
  1060 + s);
  1061 +}
  1062 +
  1063 +static void tap_read_poll(TAPState *s, int enable)
  1064 +{
  1065 + s->read_poll = !!enable;
  1066 + tap_update_fd_handler(s);
  1067 +}
  1068 +
1050 1069 static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
1051 1070 int iovcnt)
1052 1071 {
... ... @@ -1097,13 +1116,10 @@ static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1097 1116 }
1098 1117 #endif
1099 1118  
1100   -static void tap_send(void *opaque);
1101   -
1102 1119 static void tap_send_completed(VLANClientState *vc)
1103 1120 {
1104 1121 TAPState *s = vc->opaque;
1105   -
1106   - qemu_set_fd_handler2(s->fd, tap_can_send, tap_send, NULL, s);
  1122 + tap_read_poll(s, 1);
1107 1123 }
1108 1124  
1109 1125 static void tap_send(void *opaque)
... ... @@ -1119,7 +1135,7 @@ static void tap_send(void *opaque)
1119 1135  
1120 1136 size = qemu_send_packet_async(s->vc, s->buf, size, tap_send_completed);
1121 1137 if (size == 0) {
1122   - qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
  1138 + tap_read_poll(s, 0);
1123 1139 }
1124 1140 } while (size > 0);
1125 1141 }
... ... @@ -1133,7 +1149,7 @@ static void tap_cleanup(VLANClientState *vc)
1133 1149 if (s->down_script[0])
1134 1150 launch_script(s->down_script, s->down_script_arg, s->fd);
1135 1151  
1136   - qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
  1152 + tap_read_poll(s, 0);
1137 1153 close(s->fd);
1138 1154 qemu_free(s);
1139 1155 }
... ... @@ -1151,7 +1167,7 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
1151 1167 s->fd = fd;
1152 1168 s->vc = qemu_new_vlan_client(vlan, model, name, NULL, tap_receive,
1153 1169 tap_receive_iov, tap_cleanup, s);
1154   - qemu_set_fd_handler2(s->fd, tap_can_send, tap_send, NULL, s);
  1170 + tap_read_poll(s, 1);
1155 1171 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
1156 1172 return s;
1157 1173 }
... ...