xref: /qemu/include/net/filter.h (revision 61e7a0d27c1336bade78c08e898801e8e93e0bde)
1fdccce45SYang Hongyang /*
2fdccce45SYang Hongyang  * Copyright (c) 2015 FUJITSU LIMITED
3fdccce45SYang Hongyang  * Author: Yang Hongyang <yanghy@cn.fujitsu.com>
4fdccce45SYang Hongyang  *
5fdccce45SYang Hongyang  * This work is licensed under the terms of the GNU GPL, version 2 or
6fdccce45SYang Hongyang  * later.  See the COPYING file in the top-level directory.
7fdccce45SYang Hongyang  */
8fdccce45SYang Hongyang 
9fdccce45SYang Hongyang #ifndef QEMU_NET_FILTER_H
10fdccce45SYang Hongyang #define QEMU_NET_FILTER_H
11fdccce45SYang Hongyang 
12*8bf69544SMarkus Armbruster #include "qapi/qapi-types-common.h"
13dc5e9ac7SMarkus Armbruster #include "qemu/queue.h"
14fdccce45SYang Hongyang #include "qom/object.h"
15fdccce45SYang Hongyang #include "net/queue.h"
16fdccce45SYang Hongyang 
17fdccce45SYang Hongyang #define TYPE_NETFILTER "netfilter"
18a489d195SEduardo Habkost OBJECT_DECLARE_TYPE(NetFilterState, NetFilterClass, NETFILTER)
19fdccce45SYang Hongyang 
20fdccce45SYang Hongyang typedef void (FilterSetup) (NetFilterState *nf, Error **errp);
21fdccce45SYang Hongyang typedef void (FilterCleanup) (NetFilterState *nf);
22fdccce45SYang Hongyang /*
23fdccce45SYang Hongyang  * Return:
24fdccce45SYang Hongyang  *   0: finished handling the packet, we should continue
25fdccce45SYang Hongyang  *   size: filter stolen this packet, we stop pass this packet further
26fdccce45SYang Hongyang  */
27fdccce45SYang Hongyang typedef ssize_t (FilterReceiveIOV)(NetFilterState *nc,
28fdccce45SYang Hongyang                                    NetClientState *sender,
29fdccce45SYang Hongyang                                    unsigned flags,
30fdccce45SYang Hongyang                                    const struct iovec *iov,
31fdccce45SYang Hongyang                                    int iovcnt,
32fdccce45SYang Hongyang                                    NetPacketSent *sent_cb);
33fdccce45SYang Hongyang 
34338d3f41Szhanghailiang typedef void (FilterStatusChanged) (NetFilterState *nf, Error **errp);
35338d3f41Szhanghailiang 
365fbba3d6SZhang Chen typedef void (FilterHandleEvent) (NetFilterState *nf, int event, Error **errp);
375fbba3d6SZhang Chen 
38db1015e9SEduardo Habkost struct NetFilterClass {
39fdccce45SYang Hongyang     ObjectClass parent_class;
40fdccce45SYang Hongyang 
41fdccce45SYang Hongyang     /* optional */
42fdccce45SYang Hongyang     FilterSetup *setup;
43fdccce45SYang Hongyang     FilterCleanup *cleanup;
44338d3f41Szhanghailiang     FilterStatusChanged *status_changed;
455fbba3d6SZhang Chen     FilterHandleEvent *handle_event;
46fdccce45SYang Hongyang     /* mandatory */
47fdccce45SYang Hongyang     FilterReceiveIOV *receive_iov;
48db1015e9SEduardo Habkost };
49fdccce45SYang Hongyang 
50fdccce45SYang Hongyang 
51fdccce45SYang Hongyang struct NetFilterState {
52fdccce45SYang Hongyang     /* private */
53fdccce45SYang Hongyang     Object parent;
54fdccce45SYang Hongyang 
55fdccce45SYang Hongyang     /* protected */
56fdccce45SYang Hongyang     char *netdev_id;
57fdccce45SYang Hongyang     NetClientState *netdev;
58fdccce45SYang Hongyang     NetFilterDirection direction;
59338d3f41Szhanghailiang     bool on;
6019731365SLukas Straub     char *position;
6119731365SLukas Straub     bool insert_before_flag;
62fdccce45SYang Hongyang     QTAILQ_ENTRY(NetFilterState) next;
63fdccce45SYang Hongyang };
64fdccce45SYang Hongyang 
65e64c770dSYang Hongyang ssize_t qemu_netfilter_receive(NetFilterState *nf,
66e64c770dSYang Hongyang                                NetFilterDirection direction,
67e64c770dSYang Hongyang                                NetClientState *sender,
68e64c770dSYang Hongyang                                unsigned flags,
69e64c770dSYang Hongyang                                const struct iovec *iov,
70e64c770dSYang Hongyang                                int iovcnt,
71e64c770dSYang Hongyang                                NetPacketSent *sent_cb);
72e64c770dSYang Hongyang 
737ef7bc85SYang Hongyang /* pass the packet to the next filter */
747ef7bc85SYang Hongyang ssize_t qemu_netfilter_pass_to_next(NetClientState *sender,
757ef7bc85SYang Hongyang                                     unsigned flags,
767ef7bc85SYang Hongyang                                     const struct iovec *iov,
777ef7bc85SYang Hongyang                                     int iovcnt,
787ef7bc85SYang Hongyang                                     void *opaque);
797ef7bc85SYang Hongyang 
805fbba3d6SZhang Chen void colo_notify_filters_event(int event, Error **errp);
815fbba3d6SZhang Chen 
82fdccce45SYang Hongyang #endif /* QEMU_NET_FILTER_H */
83