net/queue.c has logic to send/queue/flush packets but a
qemu_deliver_packet() call is hardcoded.
Maybe you can extend qemu_new_net_queue() like this:
/* Returns:
* >0 - success
* 0 - queue packet for future redelivery
* <0 - failure (discard packet)
*/
typedef ssize_t NetQueueDeliverFunc(NetClientState *sender,
unsigned flags,
const struct iovec *iov,
int iovcnt,
void *opaque);
NetQueue *qemu_new_net_queue(NetQueueDeliverFunc deliver,
void *opaque);
Now net/net.c:qemu_net_client_setup() needs to call:
nc->incoming_queue = qemu_new_net_queue(qemu_deliver_packet_iov, nc);
And the filter code can use qemu_net_queue_send_iov() and
qemu_net_queue_flush(). The filter just needs to provide its own
NetQueueDeliveryFunc.
I haven't checked the details (e.g. non-iov delivery, etc) but the idea
is to use the net/queue.c API instead of duplicating similar logic in
the filter code.