xref: /qemu/include/net/filter.h (revision 27a4a30e)
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 
25 typedef void (FilterSetup) (NetFilterState *nf, Error **errp);
26 typedef 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  */
32 typedef ssize_t (FilterReceiveIOV)(NetFilterState *nc,
33                                    NetClientState *sender,
34                                    unsigned flags,
35                                    const struct iovec *iov,
36                                    int iovcnt,
37                                    NetPacketSent *sent_cb);
38 
39 typedef void (FilterStatusChanged) (NetFilterState *nf, Error **errp);
40 
41 typedef void (FilterHandleEvent) (NetFilterState *nf, int event, Error **errp);
42 
43 typedef 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 
56 struct NetFilterState {
57     /* private */
58     Object parent;
59 
60     /* protected */
61     char *netdev_id;
62     NetClientState *netdev;
63     NetFilterDirection direction;
64     bool on;
65     char *position;
66     bool insert_before_flag;
67     QTAILQ_ENTRY(NetFilterState) next;
68 };
69 
70 ssize_t qemu_netfilter_receive(NetFilterState *nf,
71                                NetFilterDirection direction,
72                                NetClientState *sender,
73                                unsigned flags,
74                                const struct iovec *iov,
75                                int iovcnt,
76                                NetPacketSent *sent_cb);
77 
78 /* pass the packet to the next filter */
79 ssize_t qemu_netfilter_pass_to_next(NetClientState *sender,
80                                     unsigned flags,
81                                     const struct iovec *iov,
82                                     int iovcnt,
83                                     void *opaque);
84 
85 void colo_notify_filters_event(int event, Error **errp);
86 
87 #endif /* QEMU_NET_FILTER_H */
88