xref: /qemu/include/net/filter.h (revision db1015e92e04835c9eb50c29625fe566d1202dbd)
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 typedef struct NetFilterClass NetFilterClass;
19 #define NETFILTER(obj) \
20     OBJECT_CHECK(NetFilterState, (obj), TYPE_NETFILTER)
21 #define NETFILTER_GET_CLASS(obj) \
22     OBJECT_GET_CLASS(NetFilterClass, (obj), TYPE_NETFILTER)
23 #define NETFILTER_CLASS(klass) \
24     OBJECT_CLASS_CHECK(NetFilterClass, (klass), TYPE_NETFILTER)
25 
26 typedef void (FilterSetup) (NetFilterState *nf, Error **errp);
27 typedef void (FilterCleanup) (NetFilterState *nf);
28 /*
29  * Return:
30  *   0: finished handling the packet, we should continue
31  *   size: filter stolen this packet, we stop pass this packet further
32  */
33 typedef ssize_t (FilterReceiveIOV)(NetFilterState *nc,
34                                    NetClientState *sender,
35                                    unsigned flags,
36                                    const struct iovec *iov,
37                                    int iovcnt,
38                                    NetPacketSent *sent_cb);
39 
40 typedef void (FilterStatusChanged) (NetFilterState *nf, Error **errp);
41 
42 typedef void (FilterHandleEvent) (NetFilterState *nf, int event, Error **errp);
43 
44 struct NetFilterClass {
45     ObjectClass parent_class;
46 
47     /* optional */
48     FilterSetup *setup;
49     FilterCleanup *cleanup;
50     FilterStatusChanged *status_changed;
51     FilterHandleEvent *handle_event;
52     /* mandatory */
53     FilterReceiveIOV *receive_iov;
54 };
55 
56 
57 struct NetFilterState {
58     /* private */
59     Object parent;
60 
61     /* protected */
62     char *netdev_id;
63     NetClientState *netdev;
64     NetFilterDirection direction;
65     bool on;
66     char *position;
67     bool insert_before_flag;
68     QTAILQ_ENTRY(NetFilterState) next;
69 };
70 
71 ssize_t qemu_netfilter_receive(NetFilterState *nf,
72                                NetFilterDirection direction,
73                                NetClientState *sender,
74                                unsigned flags,
75                                const struct iovec *iov,
76                                int iovcnt,
77                                NetPacketSent *sent_cb);
78 
79 /* pass the packet to the next filter */
80 ssize_t qemu_netfilter_pass_to_next(NetClientState *sender,
81                                     unsigned flags,
82                                     const struct iovec *iov,
83                                     int iovcnt,
84                                     void *opaque);
85 
86 void colo_notify_filters_event(int event, Error **errp);
87 
88 #endif /* QEMU_NET_FILTER_H */
89