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