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