For COLO or MC FT, We need a function to release all the buffered packets actively.
Signed-off-by: zhanghailiang <zhang.zhanghaili...@huawei.com> Cc: Jason Wang <jasow...@redhat.com> --- v10: new patch --- include/net/filter.h | 1 + include/net/net.h | 4 ++++ net/filter-buffer.c | 15 +++++++++++++++ net/net.c | 24 ++++++++++++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/include/net/filter.h b/include/net/filter.h index 2deda36..5a09607 100644 --- a/include/net/filter.h +++ b/include/net/filter.h @@ -73,5 +73,6 @@ ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, const struct iovec *iov, int iovcnt, void *opaque); +void filter_buffer_release_all(void); #endif /* QEMU_NET_FILTER_H */ diff --git a/include/net/net.h b/include/net/net.h index 7af3e15..5c65c45 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -125,6 +125,10 @@ NetClientState *qemu_find_vlan_client_by_name(Monitor *mon, int vlan_id, const char *client_str); typedef void (*qemu_nic_foreach)(NICState *nic, void *opaque); void qemu_foreach_nic(qemu_nic_foreach func, void *opaque); +typedef void (*qemu_netfilter_foreach)(NetFilterState *nf, void *opaque, + Error **errp); +void qemu_foreach_netfilter(qemu_netfilter_foreach func, void *opaque, + Error **errp); int qemu_can_send_packet(NetClientState *nc); ssize_t qemu_sendv_packet(NetClientState *nc, const struct iovec *iov, int iovcnt); diff --git a/net/filter-buffer.c b/net/filter-buffer.c index 57be149..b344901 100644 --- a/net/filter-buffer.c +++ b/net/filter-buffer.c @@ -14,6 +14,7 @@ #include "qapi/qmp/qerror.h" #include "qapi-visit.h" #include "qom/object.h" +#include "net/net.h" #define TYPE_FILTER_BUFFER "filter-buffer" @@ -163,6 +164,20 @@ out: error_propagate(errp, local_err); } +static void filter_buffer_release_packets(NetFilterState *nf, void *opaque, + Error **errp) +{ + if (!strcmp(object_get_typename(OBJECT(nf)), TYPE_FILTER_BUFFER)) { + filter_buffer_flush(nf); + } +} + +/* public APIs */ +void filter_buffer_release_all(void) +{ + qemu_foreach_netfilter(filter_buffer_release_packets, NULL, NULL); +} + static void filter_buffer_init(Object *obj) { object_property_add(obj, "interval", "int", diff --git a/net/net.c b/net/net.c index a3e9d1a..a333b01 100644 --- a/net/net.c +++ b/net/net.c @@ -259,6 +259,30 @@ static char *assign_name(NetClientState *nc1, const char *model) return g_strdup_printf("%s.%d", model, id); } +void qemu_foreach_netfilter(qemu_netfilter_foreach func, void *opaque, + Error **errp) +{ + NetClientState *nc; + NetFilterState *nf; + + QTAILQ_FOREACH(nc, &net_clients, next) { + if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) { + continue; + } + QTAILQ_FOREACH(nf, &nc->filters, next) { + if (func) { + Error *local_err = NULL; + + func(nf, opaque, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + } + } + } +} + static void qemu_net_client_destructor(NetClientState *nc) { g_free(nc); -- 1.8.3.1