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 | QTAILQ_ENTRY(NetFilterState) next; |
66 | }; |
67 | |
68 | ssize_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 */ |
77 | ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, |
78 | unsigned flags, |
79 | const struct iovec *iov, |
80 | int iovcnt, |
81 | void *opaque); |
82 | |
83 | void colo_notify_filters_event(int event, Error **errp); |
84 | |
85 | #endif /* QEMU_NET_FILTER_H */ |
86 | |