mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 18:05:37 +00:00
filter: Add handle_event method for NetFilterClass
Filter needs to process the event of checkpoint/failover or other event passed by COLO frame. Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> Signed-off-by: Zhang Chen <zhangckid@gmail.com> Signed-off-by: Zhang Chen <chen.zhang@intel.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
d1955d2219
commit
5fbba3d659
|
@ -38,6 +38,8 @@ typedef ssize_t (FilterReceiveIOV)(NetFilterState *nc,
|
|||
|
||||
typedef void (FilterStatusChanged) (NetFilterState *nf, Error **errp);
|
||||
|
||||
typedef void (FilterHandleEvent) (NetFilterState *nf, int event, Error **errp);
|
||||
|
||||
typedef struct NetFilterClass {
|
||||
ObjectClass parent_class;
|
||||
|
||||
|
@ -45,6 +47,7 @@ typedef struct NetFilterClass {
|
|||
FilterSetup *setup;
|
||||
FilterCleanup *cleanup;
|
||||
FilterStatusChanged *status_changed;
|
||||
FilterHandleEvent *handle_event;
|
||||
/* mandatory */
|
||||
FilterReceiveIOV *receive_iov;
|
||||
} NetFilterClass;
|
||||
|
@ -77,4 +80,6 @@ ssize_t qemu_netfilter_pass_to_next(NetClientState *sender,
|
|||
int iovcnt,
|
||||
void *opaque);
|
||||
|
||||
void colo_notify_filters_event(int event, Error **errp);
|
||||
|
||||
#endif /* QEMU_NET_FILTER_H */
|
||||
|
|
17
net/filter.c
17
net/filter.c
|
@ -17,6 +17,8 @@
|
|||
#include "net/vhost_net.h"
|
||||
#include "qom/object_interfaces.h"
|
||||
#include "qemu/iov.h"
|
||||
#include "net/colo.h"
|
||||
#include "migration/colo.h"
|
||||
|
||||
static inline bool qemu_can_skip_netfilter(NetFilterState *nf)
|
||||
{
|
||||
|
@ -245,11 +247,26 @@ static void netfilter_finalize(Object *obj)
|
|||
g_free(nf->netdev_id);
|
||||
}
|
||||
|
||||
static void default_handle_event(NetFilterState *nf, int event, Error **errp)
|
||||
{
|
||||
switch (event) {
|
||||
case COLO_EVENT_CHECKPOINT:
|
||||
break;
|
||||
case COLO_EVENT_FAILOVER:
|
||||
object_property_set_str(OBJECT(nf), "off", "status", errp);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void netfilter_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
|
||||
NetFilterClass *nfc = NETFILTER_CLASS(oc);
|
||||
|
||||
ucc->complete = netfilter_complete;
|
||||
nfc->handle_event = default_handle_event;
|
||||
}
|
||||
|
||||
static const TypeInfo netfilter_info = {
|
||||
|
|
19
net/net.c
19
net/net.c
|
@ -1335,6 +1335,25 @@ void hmp_info_network(Monitor *mon, const QDict *qdict)
|
|||
}
|
||||
}
|
||||
|
||||
void colo_notify_filters_event(int event, Error **errp)
|
||||
{
|
||||
NetClientState *nc;
|
||||
NetFilterState *nf;
|
||||
NetFilterClass *nfc = NULL;
|
||||
Error *local_err = NULL;
|
||||
|
||||
QTAILQ_FOREACH(nc, &net_clients, next) {
|
||||
QTAILQ_FOREACH(nf, &nc->filters, next) {
|
||||
nfc = NETFILTER_GET_CLASS(OBJECT(nf));
|
||||
nfc->handle_event(nf, event, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void qmp_set_link(const char *name, bool up, Error **errp)
|
||||
{
|
||||
NetClientState *ncs[MAX_QUEUE_NUM];
|
||||
|
|
Loading…
Reference in a new issue