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