1/*
2 * Copyright (c) 2015 FUJITSU LIMITED
3 * Author: Yang Hongyang <yanghy@cn.fujitsu.com>
4 *
5 * This work is licensed under the terms of the GNU GPL, version 2 or
6 * later. See the COPYING file in the top-level directory.
7 */
8
9#ifndef QEMU_NET_FILTER_H
10#define QEMU_NET_FILTER_H
11
12#include "qapi/qapi-types-net.h"
13#include "qemu/queue.h"
14#include "qom/object.h"
15#include "net/queue.h"
16
17#define TYPE_NETFILTER "netfilter"
18#define NETFILTER(obj) \
19 OBJECT_CHECK(NetFilterState, (obj), TYPE_NETFILTER)
20#define NETFILTER_GET_CLASS(obj) \
21 OBJECT_GET_CLASS(NetFilterClass, (obj), TYPE_NETFILTER)
22#define NETFILTER_CLASS(klass) \
23 OBJECT_CLASS_CHECK(NetFilterClass, (klass), TYPE_NETFILTER)
24
25typedef void (FilterSetup) (NetFilterState *nf, Error **errp);
26typedef void (FilterCleanup) (NetFilterState *nf);
27/*
28 * Return:
29 * 0: finished handling the packet, we should continue
30 * size: filter stolen this packet, we stop pass this packet further
31 */
32typedef ssize_t (FilterReceiveIOV)(NetFilterState *nc,
33 NetClientState *sender,
34 unsigned flags,
35 const struct iovec *iov,
36 int iovcnt,
37 NetPacketSent *sent_cb);
38
39typedef void (FilterStatusChanged) (NetFilterState *nf, Error **errp);
40
41typedef void (FilterHandleEvent) (NetFilterState *nf, int event, Error **errp);
42
43typedef struct NetFilterClass {
44 ObjectClass parent_class;
45
46 /* optional */
47 FilterSetup *setup;
48 FilterCleanup *cleanup;
49 FilterStatusChanged *status_changed;
50 FilterHandleEvent *handle_event;
51 /* mandatory */
52 FilterReceiveIOV *receive_iov;
53} NetFilterClass;
54
55
56struct NetFilterState {
57 /* private */
58 Object parent;
59
60 /* protected */
61 char *netdev_id;
62 NetClientState *netdev;
63 NetFilterDirection direction;
64 bool on;
65 QTAILQ_ENTRY(NetFilterState) next;
66};
67
68ssize_t qemu_netfilter_receive(NetFilterState *nf,
69 NetFilterDirection direction,
70 NetClientState *sender,
71 unsigned flags,
72 const struct iovec *iov,
73 int iovcnt,
74 NetPacketSent *sent_cb);
75
76/* pass the packet to the next filter */
77ssize_t qemu_netfilter_pass_to_next(NetClientState *sender,
78 unsigned flags,
79 const struct iovec *iov,
80 int iovcnt,
81 void *opaque);
82
83void colo_notify_filters_event(int event, Error **errp);
84
85#endif /* QEMU_NET_FILTER_H */
86