1973136532
To switch the Secondary to Primary, we need to insert new filters before the filter-rewriter. Add the options insert= and position= to be able to insert filters anywhere in the filter list. position should be "head" or "tail" to insert at the head or tail of the filter list or it should be "id=<id>" to specify the id of another filter. insert should be either "before" or "behind" to specify where to insert the new filter relative to the one specified with position. Signed-off-by: Lukas Straub <lukasstraub2@web.de> Reviewed-by: Zhang Chen <chen.zhang@intel.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
88 lines
2.7 KiB
C
88 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2015 FUJITSU LIMITED
|
|
* Author: Yang Hongyang <yanghy@cn.fujitsu.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or
|
|
* later. See the COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#ifndef QEMU_NET_FILTER_H
|
|
#define QEMU_NET_FILTER_H
|
|
|
|
#include "qapi/qapi-types-net.h"
|
|
#include "qemu/queue.h"
|
|
#include "qom/object.h"
|
|
#include "net/queue.h"
|
|
|
|
#define TYPE_NETFILTER "netfilter"
|
|
#define NETFILTER(obj) \
|
|
OBJECT_CHECK(NetFilterState, (obj), TYPE_NETFILTER)
|
|
#define NETFILTER_GET_CLASS(obj) \
|
|
OBJECT_GET_CLASS(NetFilterClass, (obj), TYPE_NETFILTER)
|
|
#define NETFILTER_CLASS(klass) \
|
|
OBJECT_CLASS_CHECK(NetFilterClass, (klass), TYPE_NETFILTER)
|
|
|
|
typedef void (FilterSetup) (NetFilterState *nf, Error **errp);
|
|
typedef void (FilterCleanup) (NetFilterState *nf);
|
|
/*
|
|
* Return:
|
|
* 0: finished handling the packet, we should continue
|
|
* size: filter stolen this packet, we stop pass this packet further
|
|
*/
|
|
typedef ssize_t (FilterReceiveIOV)(NetFilterState *nc,
|
|
NetClientState *sender,
|
|
unsigned flags,
|
|
const struct iovec *iov,
|
|
int iovcnt,
|
|
NetPacketSent *sent_cb);
|
|
|
|
typedef void (FilterStatusChanged) (NetFilterState *nf, Error **errp);
|
|
|
|
typedef void (FilterHandleEvent) (NetFilterState *nf, int event, Error **errp);
|
|
|
|
typedef struct NetFilterClass {
|
|
ObjectClass parent_class;
|
|
|
|
/* optional */
|
|
FilterSetup *setup;
|
|
FilterCleanup *cleanup;
|
|
FilterStatusChanged *status_changed;
|
|
FilterHandleEvent *handle_event;
|
|
/* mandatory */
|
|
FilterReceiveIOV *receive_iov;
|
|
} NetFilterClass;
|
|
|
|
|
|
struct NetFilterState {
|
|
/* private */
|
|
Object parent;
|
|
|
|
/* protected */
|
|
char *netdev_id;
|
|
NetClientState *netdev;
|
|
NetFilterDirection direction;
|
|
bool on;
|
|
char *position;
|
|
bool insert_before_flag;
|
|
QTAILQ_ENTRY(NetFilterState) next;
|
|
};
|
|
|
|
ssize_t qemu_netfilter_receive(NetFilterState *nf,
|
|
NetFilterDirection direction,
|
|
NetClientState *sender,
|
|
unsigned flags,
|
|
const struct iovec *iov,
|
|
int iovcnt,
|
|
NetPacketSent *sent_cb);
|
|
|
|
/* pass the packet to the next filter */
|
|
ssize_t qemu_netfilter_pass_to_next(NetClientState *sender,
|
|
unsigned flags,
|
|
const struct iovec *iov,
|
|
int iovcnt,
|
|
void *opaque);
|
|
|
|
void colo_notify_filters_event(int event, Error **errp);
|
|
|
|
#endif /* QEMU_NET_FILTER_H */
|