MirrorState *s = FILTER_REDIRECTOR(nf);
switch (event) {
+ case CHR_EVENT_OPENED:
+ if (nf->on) {
+ qemu_chr_fe_set_handlers_full(&s->chr_in, redirector_chr_can_read,
+ redirector_chr_read, redirector_chr_event,
+ NULL, nf, NULL, false, false);
+ }
+ break;
case CHR_EVENT_CLOSED:
- qemu_chr_fe_set_handlers(&s->chr_in, NULL, NULL, NULL,
- NULL, NULL, NULL, true);
+ qemu_chr_fe_set_handlers_full(&s->chr_in, NULL, NULL, redirector_chr_event,
+ NULL, nf, NULL, false, false);
break;
default:
break;
return;
}
- qemu_chr_fe_set_handlers(&s->chr_in, redirector_chr_can_read,
- redirector_chr_read, redirector_chr_event,
- NULL, nf, NULL, true);
+ if (nf->on) {
+ qemu_chr_fe_set_handlers(&s->chr_in, redirector_chr_can_read,
+ redirector_chr_read, redirector_chr_event,
+ NULL, nf, NULL, true);
+ }
}
if (s->outdev) {
}
}
+static void filter_redirector_status_changed(NetFilterState *nf, Error **errp)
+{
+ MirrorState *s = FILTER_REDIRECTOR(nf);
+
+ if (!s->indev) {
+ return;
+ }
+
+ if (nf->on) {
+ qemu_chr_fe_set_handlers(&s->chr_in, redirector_chr_can_read,
+ redirector_chr_read, redirector_chr_event,
+ NULL, nf, NULL, true);
+ } else {
+ qemu_chr_fe_set_handlers(&s->chr_in, NULL, NULL, NULL,
+ NULL, NULL, NULL, true);
+ }
+}
+
static char *filter_redirector_get_indev(Object *obj, Error **errp)
{
MirrorState *s = FILTER_REDIRECTOR(obj);
nfc->setup = filter_redirector_setup;
nfc->cleanup = filter_redirector_cleanup;
nfc->receive_iov = filter_redirector_receive_iov;
+ nfc->status_changed = filter_redirector_status_changed;
}
static void filter_mirror_init(Object *obj)