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