/* Copyright (c) 2016 Google Inc
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * Network address translation for VM guests.
 *
 * There are two styles of addressing: qemu and real-addr.  qemu-style is what
 * you expect from Qemu's user-mode networking.  real-addr mode uses the same
 * addresses for the guest as the host uses.
 *
 * For qemu-style networking:
 * 		guest = 10.0.2.15, mask = 255.255.255.0, router = 10.0.2.2.
 * For real-addr networking:
 * 		guest = host_v4, mask = host_mask, router = host's_route
 *
 * Real-addr mode is useful for guests that statically config their address from
 * the nodes hard drive.  It might also help for apps that want to advertise
 * their IP address to external users (though that would require straight-thru
 * port-fowardarding set up by the VMM).
 *
 * As far as the guest is concerned, the host is the guest_v4_router.  If we
 * ever get a remote IP addr of 'router', that'll be redirected to the host's
 * loopback IP.  That means the guest can't reach the "real" router (in
 * real-addr mode).  The host can reach the guest via 127.0.0.1.  In either
 * case, use the host's side of a mapping.
 *
 * TODO:
 * - We're working with the IOVs that the guest gave us through virtio.  If we
 *   care, that whole thing is susceptible to time-of-check attacks.  The guest
 *   could be modifying the IOV that we're working on, so we need to not care
 *   too much about that.
 *
 * - Consider having the kernel proto bypass outbound path overwrite the src
 *   address and the proto port.  We don't care about the proto payload.  We
 *   might care about IP and proto headers.  o/w, the user could fake traffic
 *   for other ports - basically they can craft whatever packet they want (which
 *   is what they had previously with unrestricted access to devether).
 *
 * - Consider injecting packets to the guest from #srv/snoop-PID.
 *
 * - IPv6 support
 *
 * FAQ:
 * - Why are we using FD taps, instead of threads, to watch all the host FD?
 *   Couldn't we block a uthread on each FD?  I went back and forth on this.
 *   The final reason for this is to avoid copies and weird joins.  The
 *   concurrency with the guest is based on the number of IOVs they give us -
 *   not the number of host conversations open.  We could listen on 1000 convs,
 *   each with their own read buffer, but we'd then have to copy the entire
 *   packet into the IOVs the guest gave us.  We'd also need to synchronize on
 *   access to virtio and do some structural work (draw out how the packets
 *   would move around).  It'd be different if each uthread could just push
 *   packets into virtio-net (push vs the current pull model).
 *
 * - What's the deal with sending packets to broadcast domain targets?  Short
 *   answer: the host responds to every ARP request, regardless of the IP.  If
 *   the networking is done QEMU style, there's only one other host: the router,
 *   so that's not interesting.  If we are in real-addr mode and the guest is
 *   trying to reach someone in our broadcast, they'll be told that we
 *   (host_eth_addr) is the MAC for that addr.  Then the guest sends us an IP
 *   packet for that target.  Akaros will see an IP packet and will route it to
 *   its own broadcast (on the real network).  The guest's ARP only matters when
 *   it comes to getting the packet to us, not the actual network's broadcast
 *   domain.
 *
 * - Why is the RX path single threaded?  So it's possible to rewrite
 *   __poll_inbound() such that readv() is not called while holding the rx_mtx.
 *   To do so, we pop the first item off the inbound_todo list (so we have the
 *   ref), do the read, then put it back on the list if it hasn't been drained
 *   to empty.  The main issue, apart from being more complicated, is that since
 *   we're unlocking and relocking, any invariant that we had before calling
 *   __poll_inbound needs to be rechecked.  Specifically, we would need to check
 *   __poll_injection *after* returning from __poll_inbound.  Otherwise we could
 *   sleep with a packet waiting to be injected.  Whoops!  That could have been
 *   dealt with, but it's subtle.  There also might be races with FD taps
 *   firing, the fdtap_watcher not putting items on the list, and the thread
 *   then not putting it on the list.  Specifically:
 *   	fdtap_watcher:							__poll_inbound:
 *   	-------------------------------------------------------
 *   											yanks map off list
 *   											map tracked as "on inbound"
 *   											unlock mtx
 *   											readv, get -1 EAGAIN
 *   											decide to drop the item
 *   	packet arrives
 *   	FD tap fires
 *   	send event
 *   	lock mtx
 *   	see map is "on inbound"
 *   	ignore event
 *   	unlock mtx
 *   											lock mtx
 *   											clear "on inbound"
 *   											unlock + sleep on CV
 *   The FD has data, but we lost the event, and we'll never read it.
 *
 * - Why is the fdtap_watcher its own thread?  You can't kick a CV from vcore
 *   context, since you almost always want to hold the MTX while kicking the CV
 *   (see the lengthy comments in the CV code).  It's easier to blockon an event
 *   queue as a uthread.  But since the RX thread wants to sleep on two sources,
 *   it's simpler this way.  It also decouples the inbound_todo list from the
 *   evq.
 *
 * - Could we model the packet injection with an event queue?  Maybe with a UCQ
 *   or BCQ.  We'd need some support from the kernel (minor) and maybe
 *   user-level event posting (major) to do it right.  If we did that, we
 *   probably could get rid of the fdtap_watcher.  The RX checks inbound_todo,
 *   then blocks on two evqs (inbound and inject).  This way is simpler, for
 *   now.
 *
 * - Why do we rewrite IP addresses for the router to loopback, instead of
 *   host_v4_addr?  First off, you have to pick one: loopback or host_v4_addr,
 *   not both.  If we accept both (say, when the host connects to a static map),
 *   then on the other end (i.e. TX, response to an RX) will need to know which
 *   option we chose for its rewriting rule.  We have to be consistent with how
 *   we handle ROUTER_IP and do the same thing in both directions.  Given that
 *   we have to pick one of them, I opted for 127.0.0.1.  That way, any host
 *   users know how to connect to the guest without worrying about their actual
 *   IP address.  This also allows us to announce services on the host that are
 *   only available to loopback (i.e. not the main network) and let the guest
 *   reach those.
 *
 * - How can a guest reach the real host IP in qemu mode, but not in real-addr
 *   mode?  This comes up when someone uses a static map but connects with the
 *   host_v4_addr as the source (which you do by contacting host_v4_addr as the
 *   *destination* from akaros).  We don't rewrite those on the RX path.  When
 *   the guest responds, it responds to whatever the src was on the inbound
 *   path.  To the guest, our host_v4_addr is just another IP, which the host
 *   knows how to route to.  It'd be similar to the guest trying to reach an
 *   address that is in the broadcast domain of the host.  This doesn't work for
 *   real-addr mode, since the guest has the same IP as the host.  Most guests
 *   won't emit a packet that is sent to their own IP address.  If they did, the
 *   NAT code would remap it, but the guest just won't send it out.  Hence the
 *   warning.
 */

#include <vmm/net.h>
#include <parlib/iovec.h>
#include <iplib/iplib.h>
#include <parlib/ros_debug.h>
#include <parlib/uthread.h>
#include <ndblib/ndb.h>
#include <iplib/iplib.h>
#include <parlib/printf-ext.h>
#include <parlib/event.h>
#include <parlib/spinlock.h>
#include <parlib/kref.h>

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/queue.h>

/* Global control variables.  The main VMM sets these manually. */
bool vnet_snoop = FALSE;
bool vnet_real_ip_addrs = FALSE;
bool vnet_map_diagnostics = FALSE;
unsigned long vnet_nat_timeout = 200;

uint8_t host_v4_addr[IPV4_ADDR_LEN];
uint8_t host_v4_mask[IPV4_ADDR_LEN];
uint8_t host_v4_router[IPV4_ADDR_LEN];
uint8_t host_v4_dns[IPV4_ADDR_LEN];

uint8_t loopback_v4_addr[IPV4_ADDR_LEN];
uint8_t bcast_v4_addr[IPV4_ADDR_LEN];

uint8_t guest_v4_addr[IPV4_ADDR_LEN];
uint8_t guest_v4_mask[IPV4_ADDR_LEN];
uint8_t guest_v4_router[IPV4_ADDR_LEN];
uint8_t guest_v4_dns[IPV4_ADDR_LEN];

/* We'll use this in all our eth headers with the guest. */
uint8_t host_eth_addr[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x0a};
uint8_t guest_eth_addr[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x0b};
const char dhcp_hostname[] = "host";
const char dhcp_guestname[] = "guest";

int snoop_fd;

/* We map between host port and guest port for a given protocol.  We don't care
 * about confirming IP addresses or anything - we just swap ports. */
struct ip_nat_map {
	TAILQ_ENTRY(ip_nat_map)		lookup_tuple;
	TAILQ_ENTRY(ip_nat_map)		lookup_fd;
	struct kref					kref;
	uint8_t						protocol;
	uint16_t					guest_port;
	uint16_t					host_port;
	int							host_data_fd;
	bool						is_static;
	bool						is_stale;
	/* These fields are protected by the rx mutex */
	TAILQ_ENTRY(ip_nat_map)		inbound;
	bool						is_on_inbound;
};

#define NR_VNET_HASH 128
TAILQ_HEAD(ip_nat_map_tailq, ip_nat_map);
struct spin_pdr_lock maps_lock = SPINPDR_INITIALIZER;
/* Two hash tables: one for tuples (tx) and one for FD (rx).  There's one kref
 * for being in both tables; they are treated as a unit. */
struct ip_nat_map_tailq map_hash_tuple[NR_VNET_HASH];
struct ip_nat_map_tailq map_hash_fd[NR_VNET_HASH];

/* The todo list, used to track FDs that had activity but haven't told us EAGAIN
 * yet.  The list is protected by the rx_mtx */
struct ip_nat_map_tailq inbound_todo = TAILQ_HEAD_INITIALIZER(inbound_todo);

/* buf_pkt: tracks a packet, used for injecting packets (usually synthetic
 * responses) into the guest via receive_packet. */
struct buf_pkt {
	STAILQ_ENTRY(buf_pkt)		next;
	uint8_t						*buf;
	size_t						sz;
};
STAILQ_HEAD(buf_pkt_stailq, buf_pkt);

struct buf_pkt_stailq inject_pkts = STAILQ_HEAD_INITIALIZER(inject_pkts);
uth_mutex_t rx_mtx;
uth_cond_var_t rx_cv;
struct event_queue *inbound_evq;

static void tap_inbound_conv(int fd);

#define GOLDEN_RATIO_64 0x61C8864680B583EBull

static struct ip_nat_map_tailq *list_hash_tuple(uint8_t protocol,
                                                uint16_t guest_port)
{
	size_t idx;

	idx = ((protocol << 16 | guest_port) * GOLDEN_RATIO_64) % NR_VNET_HASH;
	return &map_hash_tuple[idx];
}

static struct ip_nat_map_tailq *list_hash_fd(int host_data_fd)
{
	size_t idx;

	idx = (host_data_fd * GOLDEN_RATIO_64) % NR_VNET_HASH;
	return &map_hash_fd[idx];
}

/* Returnes a refcnted map. */
static struct ip_nat_map *lookup_map_by_tuple(uint8_t protocol,
                                              uint16_t guest_port)
{
	struct ip_nat_map *i;

	spin_pdr_lock(&maps_lock);
	TAILQ_FOREACH(i, list_hash_tuple(protocol, guest_port), lookup_tuple) {
		if ((i->protocol == protocol) && (i->guest_port == guest_port)) {
			kref_get(&i->kref, 1);
			break;
		}
	}
	spin_pdr_unlock(&maps_lock);
	return i;
}

static struct ip_nat_map *lookup_map_by_hostfd(int host_data_fd)
{
	struct ip_nat_map *i;

	spin_pdr_lock(&maps_lock);
	TAILQ_FOREACH(i, list_hash_fd(host_data_fd), lookup_fd) {
		if (i->host_data_fd == host_data_fd) {
			kref_get(&i->kref, 1);
			break;
		}
	}
	spin_pdr_unlock(&maps_lock);
	return i;
}

/* Stores the ref to the map in the global lookup 'table.' */
static void add_map(struct ip_nat_map *map)
{
	spin_pdr_lock(&maps_lock);
	TAILQ_INSERT_HEAD(list_hash_tuple(map->protocol, map->guest_port),
	                  map, lookup_tuple);
	TAILQ_INSERT_HEAD(list_hash_fd(map->host_data_fd), map, lookup_fd);
	spin_pdr_unlock(&maps_lock);
}

static void map_release(struct kref *kref)
{
	struct ip_nat_map *map = container_of(kref, struct ip_nat_map, kref);

	close(map->host_data_fd);
	free(map);
}

/* Creates a reference counted ip_nat_map for protocol between guest_port and
 * host_port.  Static mappings are ones that never expire, such as a port
 * forwarding.  Caller should add it to the lookup structure.
 *
 * For the host port, pass "*" for any port, like in a dialstring. */
static struct ip_nat_map *create_map(uint8_t protocol, uint16_t guest_port,
                                     char *host_port, bool is_static)
{
	struct ip_nat_map *map;
	char dialstring[128];
	char conv_dir[NETPATHLEN];
	char *proto_str;
	int bypass_fd;
	bool port_check;

	map = malloc(sizeof(struct ip_nat_map));
	assert(map);
	kref_init(&map->kref, map_release, 1);
	map->protocol = protocol;
	map->guest_port = guest_port;
	map->is_static = is_static;
	map->is_stale = FALSE;
	map->is_on_inbound = FALSE;

	switch (protocol) {
	case IP_UDPPROTO:
		proto_str = "udp";
		break;
	case IP_TCPPROTO:
		proto_str = "tcp";
		break;
	default:
		panic("get_map for unsupported protocol %d!", protocol);
	}
	snprintf(dialstring, sizeof(dialstring), "%s!*!%s", proto_str, host_port);

	bypass_fd = bypass9(dialstring, conv_dir, 0);
	if (bypass_fd < 0) {
		fprintf(stderr, "Failed to clone a conv for %s:%d (%r), won't bypass!\n",
		        proto_str, guest_port);
		free(map);
		return NULL;
	}

	port_check = get_port9(conv_dir, "local", &map->host_port);
	parlib_assert_perror(port_check);

	map->host_data_fd = open_data_fd9(conv_dir, O_NONBLOCK);
	parlib_assert_perror(map->host_data_fd >= 0);

	tap_inbound_conv(map->host_data_fd);

	close(bypass_fd);
	return map;
}

/* Looks up or creates an ip_nat_map for the given proto/port tuple. */
static struct ip_nat_map *get_map_by_tuple(uint8_t protocol,
                                           uint16_t guest_port)
{
	struct ip_nat_map *map;

	map = lookup_map_by_tuple(protocol, guest_port);
	if (map)
		return map;
	map = create_map(protocol, guest_port, "*", FALSE);
	if (!map)
		return NULL;
	kref_get(&map->kref, 1);
	add_map(map);
	return map;
}

static void map_reaper(void *arg)
{
	struct ip_nat_map *i, *temp;
	struct ip_nat_map_tailq to_release;

	while (1) {
		uthread_sleep(vnet_nat_timeout);
		TAILQ_INIT(&to_release);
		spin_pdr_lock(&maps_lock);
		/* Only need to scan one map_hash, might as well be the tuple */
		for (int j = 0; j < NR_VNET_HASH; j++) {
			TAILQ_FOREACH_SAFE(i, &map_hash_tuple[j], lookup_tuple, temp) {
				if (i->is_static)
					continue;
				if (!i->is_stale) {
					i->is_stale = TRUE;
					continue;
				}
				/* Remove from both lists, hashing for the FD list */
				TAILQ_REMOVE(&map_hash_tuple[j], i, lookup_tuple);
				TAILQ_REMOVE(list_hash_fd(i->host_data_fd), i, lookup_fd);
				/* Use the lookup_tuple for the temp list */
				TAILQ_INSERT_HEAD(&to_release, i, lookup_tuple);
			}
		}
		spin_pdr_unlock(&maps_lock);
		TAILQ_FOREACH_SAFE(i, &to_release, lookup_tuple, temp)
			kref_put(&i->kref);
	}
}

static void map_dumper(void)
{
	struct ip_nat_map *i;

	fprintf(stderr, "\n\nVNET NAT maps:\n---------------\n");
	spin_pdr_lock(&maps_lock);
	for (int j = 0; j < NR_VNET_HASH; j++) {
		TAILQ_FOREACH(i, &map_hash_tuple[j], lookup_tuple) {
			fprintf(stderr, "\tproto %2d, host %5d, guest %5d, FD %4d, stale %d, static %d, ref %d\n",
			        i->protocol, i->host_port, i->guest_port, i->host_data_fd,
			        i->is_stale, i->is_static, i->kref.refcnt);
		}
	}
	spin_pdr_unlock(&maps_lock);
}

static void init_map_lookup(struct virtual_machine *vm)
{
	for (int i = 0; i < NR_VNET_HASH; i++)
		TAILQ_INIT(&map_hash_tuple[i]);
	for (int i = 0; i < NR_VNET_HASH; i++)
		TAILQ_INIT(&map_hash_fd[i]);
	vmm_run_task(vm, map_reaper, NULL);
}

static struct buf_pkt *zalloc_bpkt(size_t size)
{
	struct buf_pkt *bpkt;

	bpkt = malloc(sizeof(struct buf_pkt));
	assert(bpkt);
	bpkt->sz = size;
	bpkt->buf = malloc(bpkt->sz);
	assert(bpkt->buf);
	memset(bpkt->buf, 0, bpkt->sz);
	return bpkt;
}

static void free_bpkt(struct buf_pkt *bpkt)
{
	free(bpkt->buf);
	free(bpkt);
}

/* Queues a buf_pkt, which the rx thread will inject when it wakes. */
static void inject_buf_pkt(struct buf_pkt *bpkt)
{
	uth_mutex_lock(rx_mtx);
	STAILQ_INSERT_TAIL(&inject_pkts, bpkt, next);
	uth_mutex_unlock(rx_mtx);
	uth_cond_var_broadcast(rx_cv);
}

/* Helper for xsum_update, mostly for paranoia with integer promotion and
 * cleanly keeping variables as u16. */
static uint16_t ones_comp(uint16_t x)
{
	return ~x;
}

/* IP checksum updater.  If you change amt bytes in a packet from old to new,
 * this updates the xsum at xsum_off in the iov.
 *
 * Assumes a few things:
 * - there's a 16 byte xsum at xsum_off
 * - amt is a multiple of two
 * - the data at *old and *new is network (big) endian
 *
 * There's no assumption about the alignment of old and new, thanks to Plan 9's
 * sensible nhgets() (just byte accesses, not assuming u16 alignment).
 *
 * See RFC 1624 for the math.  I opted for Eqn 3, instead of 4, since I didn't
 * want to deal with subtraction underflow / carry / etc.  Also note that we
 * need to do the intermediate carry before doing the one's comp.  That wasn't
 * clear from the RFC either.  RFC 1141 didn't need to do that, since they
 * didn't complement the intermediate HC (xsum). */
static void xsum_update(struct iovec *iov, int iovcnt, size_t xsum_off,
                        uint8_t *old, uint8_t *new, size_t amt)
{
	uint32_t xsum;

	assert(amt % 2 == 0);
	xsum = iov_get_be16(iov, iovcnt, xsum_off);
	/* for each short: HC' = ~(~HC + ~m + m') (' == new, ~ == ones-comp) */
	for (int i = 0; i < amt / 2; i++, old += 2, new += 2) {
		xsum = ones_comp(xsum) + ones_comp(nhgets(old)) + nhgets(new);
		/* Need to deal with the carry for any additions, before the outer ~()
		 * operation.  (Not mentioned in the RFC, determined manually...) */
		while (xsum >> 16)
			xsum = (xsum & 0xffff) + (xsum >> 16);
		/* Yes, next time around the loop we ones comp right back.  Not worth
		 * optimizing. */
		xsum = ones_comp(xsum);
	}
	iov_put_be16(iov, iovcnt, xsum_off, xsum);
}

static void snoop_on_virtio(void)
{
	int ret;
	int srv_fd, pipe_dir_fd, pipe_ctl_fd, pipe_srv_fd, pipe_snoop_fd;
	const char cmd[] = "oneblock";
	char buf[MAX_PATH_LEN];

	pipe_dir_fd = open("#pipe", O_PATH);
	parlib_assert_perror(pipe_dir_fd >= 0);

	pipe_ctl_fd = openat(pipe_dir_fd, "ctl", O_RDWR);
	parlib_assert_perror(pipe_ctl_fd >= 0);
	ret = write(pipe_ctl_fd, cmd, sizeof(cmd));
	parlib_assert_perror(ret == sizeof(cmd));
	close(pipe_ctl_fd);

	pipe_snoop_fd = openat(pipe_dir_fd, "data", O_RDWR);
	parlib_assert_perror(pipe_snoop_fd >= 0);
	ret = fcntl(pipe_snoop_fd, F_SETFL, O_NONBLOCK);
	parlib_assert_perror(!ret);
	snoop_fd = pipe_snoop_fd;

	pipe_srv_fd = openat(pipe_dir_fd, "data1", O_RDWR);
	parlib_assert_perror(pipe_srv_fd >= 0);
	ret = snprintf(buf, sizeof(buf), "#srv/%s-%d", "snoop", getpid());
	/* We don't close srv_fd here.  When we exit, it'll close and remove. */
	srv_fd = open(buf, O_RDWR | O_EXCL | O_CREAT | O_REMCLO, 0444);
	parlib_assert_perror(srv_fd >= 0);
	ret = snprintf(buf, sizeof(buf), "%d", pipe_srv_fd);
	ret = write(srv_fd, buf, ret);
	parlib_assert_perror(ret > 0);
	close(pipe_srv_fd);
}

/* Gets the host's IPv4 information from iplib and ndb. */
static void get_host_ip_addrs(void)
{
	struct ndb *ndb;
	struct ndbtuple *nt;
	char *dns = "dns";
	char my_ip_str[40];
	char buf[128];
	struct ipifc *to_free;
	struct iplifc *lifc;
	int ret;
	uint8_t router_ip[IPaddrlen];

	register_printf_specifier('i', printf_ipaddr, printf_ipaddr_info);
	register_printf_specifier('M', printf_ipmask, printf_ipmask_info);

	lifc = get_first_noloop_iplifc(NULL, &to_free);
	if (!lifc) {
		fprintf(stderr, "IP addr lookup failed (%r), no VM networking\n");
		return;
	}
	snprintf(my_ip_str, sizeof(my_ip_str), "%i", lifc->ip);
	snprintf(buf, sizeof(buf), "%i%M", lifc->ip, lifc->mask);
	v4parsecidr(host_v4_addr, host_v4_mask, buf);
	free_ipifc(to_free);

	ret = my_router_addr(router_ip, NULL);
	if (ret) {
		fprintf(stderr, "Router lookup failed (%r), no VM networking\n");
		return;
	}
	v6tov4(host_v4_router, router_ip);

	ndb = ndbopen("/net/ndb");
	if (!ndb) {
		fprintf(stderr, "NDB open failed (%r), no VM networking\n");
		return;
	}
	nt = ndbipinfo(ndb, "ip", my_ip_str, &dns, 1);
	if (!nt) {
		fprintf(stderr, "DNS server lookup failed (%r), no VM networking\n");
		return;
	}
	v4parseip(host_v4_dns, nt->val);
	ndbfree(nt);
	ndbclose(ndb);
}

static void set_ip_addrs(void)
{
	get_host_ip_addrs();

	loopback_v4_addr[0] = 127;
	loopback_v4_addr[1] = 0;
	loopback_v4_addr[2] = 0;
	loopback_v4_addr[3] = 1;

	bcast_v4_addr[0] = 255;
	bcast_v4_addr[1] = 255;
	bcast_v4_addr[2] = 255;
	bcast_v4_addr[3] = 255;

	/* even in qemu mode, the guest gets the real DNS IP */
	memcpy(guest_v4_dns, host_v4_dns, IPV4_ADDR_LEN);

	if (vnet_real_ip_addrs) {
		memcpy(guest_v4_addr, host_v4_addr, IPV4_ADDR_LEN);
		memcpy(guest_v4_mask, host_v4_mask, IPV4_ADDR_LEN);
		memcpy(guest_v4_router, host_v4_router, IPV4_ADDR_LEN);
	} else {
		guest_v4_addr[0] = 10;
		guest_v4_addr[1] = 0;
		guest_v4_addr[2] = 2;
		guest_v4_addr[3] = 15;

		guest_v4_mask[0] = 255;
		guest_v4_mask[1] = 255;
		guest_v4_mask[2] = 255;
		guest_v4_mask[3] = 0;

		guest_v4_router[0] = 10;
		guest_v4_router[1] = 0;
		guest_v4_router[2] = 2;
		guest_v4_router[3] = 2;
	}
}

static void tap_inbound_conv(int fd)
{
	struct fd_tap_req tap_req = {0};
	int ret;

	tap_req.fd = fd;
	tap_req.cmd = FDTAP_CMD_ADD;
	tap_req.filter = FDTAP_FILT_READABLE;
	tap_req.ev_q = inbound_evq;
	tap_req.ev_id = fd;
	tap_req.data = NULL;
	ret = sys_tap_fds(&tap_req, 1);
	parlib_assert_perror(ret == 1);
}

/* For every FD tap that fires, make sure the map is on the inbound_todo list
 * and kick the receiver.
 *
 * A map who's FD fires might already be on the list - it's possible for an FD
 * to drain to 0 and get another packet (thus triggering a tap) before
 * __poll_inbound() notices and removes it from the list. */
static void fdtap_watcher(void *arg)
{
	struct event_msg msg[1];
	struct ip_nat_map *map;

	while (1) {
		uth_blockon_evqs(msg, NULL, 1, inbound_evq);
		map = lookup_map_by_hostfd(msg->ev_type);
		/* Could get an event for an FD/map that has since been reaped. */
		if (!map)
			continue;
		uth_mutex_lock(rx_mtx);
		if (!map->is_on_inbound) {
			map->is_on_inbound = TRUE;
			TAILQ_INSERT_TAIL(&inbound_todo, map, inbound);
			uth_cond_var_broadcast(rx_cv);
		} else {
			kref_put(&map->kref);
		}
		uth_mutex_unlock(rx_mtx);
	}
}

static struct event_queue *get_inbound_evq(void)
{
	struct event_queue *ceq;

	ceq = get_eventq_raw();
	ceq->ev_mbox->type = EV_MBOX_CEQ;
	ceq_init(&ceq->ev_mbox->ceq, CEQ_OR, NR_FILE_DESC_MAX, 128);
	/* As far as flags go, we might not want IPI in the future.  Depends on some
	 * longer range VMM/2LS changes.  Regarding INDIR, if you want to find out
	 * about the event (i.e. not poll) for non-VCPD mboxes (like this evq's
	 * mbox), then you need INDIR.  We need that for the wakeup/blockon. */
	ceq->ev_flags = EVENT_INDIR | EVENT_SPAM_INDIR | EVENT_WAKEUP | EVENT_IPI;
	evq_attach_wakeup_ctlr(ceq);
	return ceq;
}

void vnet_port_forward(char *protocol, char *host_port, char *guest_port)
{
	struct ip_nat_map *map;
	uint8_t proto_nr;

	if (!strcmp("udp", protocol)) {
		proto_nr = IP_UDPPROTO;
	} else if (!strcmp("tcp", protocol)) {
		proto_nr = IP_TCPPROTO;
	} else {
		fprintf(stderr, "Can't port forward protocol %s\n", protocol);
		return;
	}
	map = create_map(proto_nr, atoi(guest_port), host_port, TRUE);
	if (!map) {
		fprintf(stderr, "Failed to set up port forward!");
		exit(-1);
	}
	add_map(map);
}

static void ev_handle_diag(struct event_msg *ev_msg, unsigned int ev_type,
                           void *data)
{
	map_dumper();
}

void vnet_init(struct virtual_machine *vm, struct virtio_vq_dev *vqdev)
{
	set_ip_addrs();
	virtio_net_set_mac(vqdev, guest_eth_addr);
	rx_mtx = uth_mutex_alloc();
	rx_cv = uth_cond_var_alloc();
	if (vnet_snoop)
		snoop_on_virtio();
	init_map_lookup(vm);
	inbound_evq = get_inbound_evq();
	vmm_run_task(vm, fdtap_watcher, NULL);
	if (vnet_map_diagnostics)
		register_ev_handler(EV_FREE_APPLE_PIE, ev_handle_diag, NULL);
}

/* Good DHCP reference:
 * http://www.tcpipguide.com/free/t_TCPIPDynamicHostConfigurationProtocolDHCP.htm
 */
#define DHCP_MAX_OPT_LEN 200
#define DHCP_MAIN_BODY_LEN 236
#define DHCP_RSP_LEN (DHCP_MAIN_BODY_LEN + DHCP_MAX_OPT_LEN)
#define DHCP_LEASE_TIME 3600

#define DHCP_OP_REQ				1
#define DHCP_OP_RSP				2

#define DHCP_MSG_DISCOVER		1
#define DHCP_MSG_OFFER			2
#define DHCP_MSG_REQUEST		3
#define DHCP_MSG_DECLINE		4
#define DHCP_MSG_ACK			5
#define DHCP_MSG_NAK			6
#define DHCP_MSG_RELEASE		7
#define DHCP_MSG_INFORM			8

#define DHCP_MAGIC_COOKIE_1		0x63
#define DHCP_MAGIC_COOKIE_2		0x82
#define DHCP_MAGIC_COOKIE_3		0x53
#define DHCP_MAGIC_COOKIE_4		0x63

#define DHCP_OPT_PAD			0
#define DHCP_OPT_SUBNET			1
#define DHCP_OPT_ROUTER			3
#define DHCP_OPT_DNS			6
#define DHCP_OPT_HOSTNAME		12
#define DHCP_OPT_LEASE			51
#define DHCP_OPT_MSG_TYPE		53
#define DHCP_OPT_SERVER_ID		54
#define DHCP_OPT_END_OF_OPT		255

static int get_dhcp_req_type(struct iovec *iov, int iovcnt)
{
	size_t idx = ETH_HDR_LEN + IPV4_HDR_LEN + UDP_HDR_LEN + DHCP_MAIN_BODY_LEN;

	if (!iov_has_bytes(iov, iovcnt, idx + 4)) {
		fprintf(stderr, "DHCP request too short!\n");
		return -1;
	}
	/* Sanity checks */
	if ((iov_get_byte(iov, iovcnt, idx + 0) != DHCP_MAGIC_COOKIE_1) ||
	    (iov_get_byte(iov, iovcnt, idx + 1) != DHCP_MAGIC_COOKIE_2) ||
	    (iov_get_byte(iov, iovcnt, idx + 2) != DHCP_MAGIC_COOKIE_3) ||
	    (iov_get_byte(iov, iovcnt, idx + 3) != DHCP_MAGIC_COOKIE_4)) {
		fprintf(stderr, "DHCP request didn't have magic cookie!\n");
		return -1;
	}
	/* Some clients might ask us to look in sname or other locations, which is
	 * communicated by an option.  So far, the clients I've seen just use the
	 * main options to communicate the message type. */
	idx += 4;
	while (1) {
		if (!iov_has_bytes(iov, iovcnt, idx + 1)) {
			fprintf(stderr, "DHCP request too short!\n");
			return -1;
		}
		switch (iov_get_byte(iov, iovcnt, idx)) {
		case DHCP_OPT_MSG_TYPE:
			if (!iov_has_bytes(iov, iovcnt, idx + 3)) {
				fprintf(stderr, "DHCP request too short!\n");
				return -1;
			}
			return iov_get_byte(iov, iovcnt, idx + 2);
		case DHCP_OPT_PAD:
			idx += 1;
			break;
		case DHCP_OPT_END_OF_OPT:
			fprintf(stderr, "DHCP request without a type!\n");
			return -1;
		default:
			if (!iov_has_bytes(iov, iovcnt, idx + 2)) {
				fprintf(stderr, "DHCP request too short!\n");
				return -1;
			}
			/* idx + 1 is size of the payload.  Skip the opt, size, payload. */
			idx += 2 + iov_get_byte(iov, iovcnt, idx + 1);
			break;
		}
	}
}

static size_t build_dhcp_response(struct iovec *iov, int iovcnt, uint8_t *buf)
{
	uint8_t *p = buf;
	int req_type;

	*p++ = DHCP_OP_RSP;
	*p++ = ETH_HTYPE_ETH;
	*p++ = ETH_ADDR_LEN;
	*p++ = 0x00;	/* hops */
	/* TODO: copies XID; assumes the inbound packet had standard headers */
	iov_memcpy_from(iov, iovcnt, ETH_HDR_LEN + IPV4_HDR_LEN + UDP_HDR_LEN + 4,
	                p, 4);
	p += 4;
	p += 8;			/* secs, flags, CIADDR */
	memcpy(p, guest_v4_addr, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;
	memcpy(p, guest_v4_router, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;
	memcpy(p, guest_v4_router, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;
	iov_memcpy_from(iov, iovcnt, ETH_ADDR_LEN, p, ETH_ADDR_LEN);
	p += 16;	/* CHaddr has 16 bytes, we only use 6 */
	memcpy(p, dhcp_hostname, strlen(dhcp_hostname));
	p += 64;
	p += 128;

	req_type = get_dhcp_req_type(iov, iovcnt);

	/* DHCP options: Technically, we should be responding with whatever fields
	 * they asked for in their incoming message.  For the most part, there are a
	 * bunch of standard things we can just respond with. */

	*p++ = DHCP_MAGIC_COOKIE_1;
	*p++ = DHCP_MAGIC_COOKIE_2;
	*p++ = DHCP_MAGIC_COOKIE_3;
	*p++ = DHCP_MAGIC_COOKIE_4;

	*p++ = DHCP_OPT_MSG_TYPE;
	*p++ = 1;
	switch (req_type) {
	case DHCP_MSG_DISCOVER:
		*p++ = DHCP_MSG_OFFER;
		break;
	case DHCP_MSG_REQUEST:
		*p++ = DHCP_MSG_ACK;
		break;
	default:
		panic("Unexpected DHCP message type %d", req_type);
	}

	*p++ = DHCP_OPT_SUBNET;
	*p++ = 4;
	memcpy(p, guest_v4_mask, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;

	*p++ = DHCP_OPT_ROUTER;
	*p++ = 4;
	memcpy(p, guest_v4_router, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;

	*p++ = DHCP_OPT_DNS;
	*p++ = 4;
	memcpy(p, guest_v4_dns, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;

	*p++ = DHCP_OPT_HOSTNAME;
	*p++ = strlen(dhcp_guestname);	/* not null-terminated */
	memcpy(p, dhcp_guestname, strlen(dhcp_guestname));
	p += strlen(dhcp_guestname);

	if (req_type == DHCP_MSG_REQUEST) {
		*p++ = DHCP_OPT_LEASE;
		*p++ = 4;
		hnputl(p, DHCP_LEASE_TIME);
		p += 4;

		*p++ = DHCP_OPT_SERVER_ID;
		*p++ = 4;
		memcpy(p, guest_v4_dns, IPV4_ADDR_LEN);
		p += IPV4_ADDR_LEN;

	}

	*p++ = DHCP_OPT_END_OF_OPT;

	return p - buf;
}

/* Builds a UDP packet responding to IOV with buf of payload_sz.  Sent from
 * src_port to dst_port.  Returns the new size, including UDP headers. */
static size_t build_udp_response(struct iovec *iov, int iovcnt, uint8_t *buf,
                                 size_t payload_sz,
                                 uint16_t src_port, uint16_t dst_port)
{
	uint8_t *p = buf;

	hnputs(p, src_port);
	p += 2;
	hnputs(p, dst_port);
	p += 2;
	hnputs(p, payload_sz + UDP_HDR_LEN);
	p += 2;
	/* For v4, we don't need to do the xsum.  It's a minor pain too, since they
	 * xsum parts of the IP header too. */
	hnputs(p, 0);
	p += 2;

	return p - buf + payload_sz;
}

/* Builds an IP packet responding to iov with buf of payload_sz.  Sent from->to
 * with protocol.  Returns the new size, including IP headers.
 *
 * We take parameters for the IP, since some usages won't use the iov's IP (e.g.
 * DHCP). */
static size_t build_ip_response(struct iovec *iov, int iovcnt, uint8_t *buf,
                                size_t payload_sz, uint8_t *from, uint8_t *to,
                                uint8_t protocol)
{
	uint8_t *p = buf;
	uint8_t *xsum_addr;

	*p = 0x45;		/* version, etc */
	p += 2;
	hnputs(p, payload_sz + IPV4_HDR_LEN);
	p += 2;
	p += 4;
	*p = 255; 		/* TTL */
	p += 1;
	*p = protocol;
	p += 1;
	xsum_addr = p;
	p += 2;
	memcpy(p, from, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;
	memcpy(p, to, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;
	hnputs(xsum_addr, ip_calc_xsum(buf, IPV4_HDR_LEN));

	return p - buf + payload_sz;
}

/* Builds an ethernet response to iov from buf of payload_sz.  Returns the new
 * size, including ethernet headers. */
static size_t build_eth_response(struct iovec *iov, int iovcnt, uint8_t *buf,
                                 size_t payload_sz, uint16_t ether_type)
{
	uint8_t *p = buf;

	iov_memcpy_from(iov, iovcnt, ETH_OFF_SRC, p, ETH_ADDR_LEN);
	p += ETH_ADDR_LEN;
	memcpy(p, host_eth_addr, ETH_ADDR_LEN);
	p += ETH_ADDR_LEN;
	hnputs(p, ether_type);
	p += 2;

	return p - buf + payload_sz;
}

static void fake_dhcp_response(struct iovec *iov, int iovcnt)
{
	struct buf_pkt *bpkt;
	size_t payload_sz;

	switch (get_dhcp_req_type(iov, iovcnt)) {
	case DHCP_MSG_OFFER:
	case DHCP_MSG_DECLINE:
	case DHCP_MSG_ACK:
	case DHCP_MSG_NAK:
	case DHCP_MSG_RELEASE:
	case DHCP_MSG_INFORM:
		return;
	}
	bpkt = zalloc_bpkt(ETH_HDR_LEN + IPV4_HDR_LEN + UDP_HDR_LEN + DHCP_RSP_LEN);

	payload_sz = build_dhcp_response(iov, iovcnt, bpkt->buf + ETH_HDR_LEN
	                                              + IPV4_HDR_LEN + UDP_HDR_LEN);
	payload_sz = build_udp_response(iov, iovcnt,
	                                bpkt->buf + ETH_HDR_LEN + IPV4_HDR_LEN,
	                                payload_sz, 67, 68);
	/* For offers and initial requests, we definitely need to send it to
	 * 255.255.255.255 (bcast).  For renewals, it seems like that that also
	 * suffices, which seems reasonable. */
	payload_sz = build_ip_response(iov, iovcnt, bpkt->buf + ETH_HDR_LEN,
	                               payload_sz, guest_v4_router, bcast_v4_addr,
	                               IP_UDPPROTO);
	payload_sz = build_eth_response(iov, iovcnt, bpkt->buf, payload_sz,
	                                ETH_TYPE_IPV4);

	assert(payload_sz <= bpkt->sz);
	bpkt->sz = payload_sz;
	inject_buf_pkt(bpkt);
}

static size_t build_arp_response(struct iovec *iov, int iovcnt, uint8_t *buf)
{
	uint8_t *p = buf;

	hnputs(p, ETH_HTYPE_ETH);
	p += 2;
	hnputs(p, ETH_TYPE_IPV4);
	p += 2;
	*p++ = ETH_ADDR_LEN;
	*p++ = IPV4_ADDR_LEN;
	hnputs(p, ARP_OP_RSP);
	p += 2;
	/* SHA: addr they are looking for, which is always host's eth addr */
	memcpy(p, host_eth_addr, ETH_ADDR_LEN);
	p += ETH_ADDR_LEN;
	/* SPA: addr they are looking for, which was the request TPA */
	iov_memcpy_from(iov, iovcnt, ETH_HDR_LEN + ARP_OFF_TPA, p, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;
	/* THA was the SHA of the request */
	iov_memcpy_from(iov, iovcnt, ETH_HDR_LEN + ARP_OFF_SHA, p, ETH_ADDR_LEN);
	p += ETH_ADDR_LEN;
	/* TPA was the SPA of the request */
	iov_memcpy_from(iov, iovcnt, ETH_HDR_LEN + ARP_OFF_SPA, p, IPV4_ADDR_LEN);
	p += IPV4_ADDR_LEN;

	return p - buf;
}

static bool should_ignore_arp(struct iovec *iov, int iovcnt)
{
	size_t arp_off = ETH_HDR_LEN;

	if (iov_get_be16(iov, iovcnt, arp_off + ARP_OFF_OP) != ARP_OP_REQ)
		return TRUE;
	/* ARP probes set the SPA to 0.  Ignore these. */
	if (iov_get_be32(iov, iovcnt, arp_off + ARP_OFF_SPA) == 0)
		return TRUE;
	return FALSE;
}

static void handle_arp_tx(struct iovec *iov, int iovcnt)
{
	struct buf_pkt *bpkt;
	size_t payload_sz;

	if (should_ignore_arp(iov, iovcnt))
		return;
	bpkt = zalloc_bpkt(ETH_HDR_LEN + ARP_PKT_LEN);
	payload_sz = build_arp_response(iov, iovcnt, bpkt->buf + ETH_HDR_LEN);
	payload_sz = build_eth_response(iov, iovcnt, bpkt->buf, payload_sz,
	                                ETH_TYPE_ARP);
	assert(payload_sz <= bpkt->sz);
	bpkt->sz = payload_sz;
	inject_buf_pkt(bpkt);
}

/* Helper for protocols: updates an xsum, given a port number change */
static void xsum_changed_port(struct iovec *iov, int iovcnt, size_t xsum_off,
                              uint16_t old_port, uint16_t new_port)
{
	uint16_t old_port_be, new_port_be;

	/* xsum update expects to work on big endian */
	hnputs(&old_port_be, old_port);
	hnputs(&new_port_be, new_port);
	xsum_update(iov, iovcnt, xsum_off, (uint8_t*)&old_port_be,
	            (uint8_t*)&new_port_be, 2);
}

static struct ip_nat_map *handle_udp_tx(struct iovec *iov, int iovcnt,
                                        size_t udp_off)
{
	uint16_t src_port, dst_port;
	struct ip_nat_map *map;

	if (!iov_has_bytes(iov, iovcnt, udp_off + UDP_HDR_LEN)) {
		fprintf(stderr, "Short UDP header, dropping!\n");
		return NULL;
	}
	src_port = iov_get_be16(iov, iovcnt, udp_off + UDP_OFF_SRC_PORT);
	dst_port = iov_get_be16(iov, iovcnt, udp_off + UDP_OFF_DST_PORT);
	if (dst_port == 67) {
		fake_dhcp_response(iov, iovcnt);
		return NULL;
	}
	map = get_map_by_tuple(IP_UDPPROTO, src_port);
	if (!map)
		return NULL;
	xsum_changed_port(iov, iovcnt, udp_off + UDP_OFF_XSUM, src_port,
	                  map->host_port);
	iov_put_be16(iov, iovcnt, udp_off + UDP_OFF_SRC_PORT, map->host_port);
	return map;
}

static struct ip_nat_map *handle_tcp_tx(struct iovec *iov, int iovcnt,
                                        size_t tcp_off)
{
	uint16_t src_port, dst_port;
	struct ip_nat_map *map;

	if (!iov_has_bytes(iov, iovcnt, tcp_off + TCP_HDR_LEN)) {
		fprintf(stderr, "Short TCP header, dropping!\n");
		return NULL;
	}
	src_port = iov_get_be16(iov, iovcnt, tcp_off + TCP_OFF_SRC_PORT);
	dst_port = iov_get_be16(iov, iovcnt, tcp_off + TCP_OFF_DST_PORT);
	map = get_map_by_tuple(IP_TCPPROTO, src_port);
	if (!map)
		return NULL;
	xsum_changed_port(iov, iovcnt, tcp_off + TCP_OFF_XSUM, src_port,
	                  map->host_port);
	iov_put_be16(iov, iovcnt, tcp_off + TCP_OFF_SRC_PORT, map->host_port);
	return map;
}

static struct ip_nat_map *handle_icmp_tx(struct iovec *iov, int iovcnt,
                                         size_t icmp_off)
{
	/* TODO: we could respond to pings sent to us (router_ip).  For anything
	 * else, we'll need to work with the bypass (if possible, maybe ID it with
	 * the Identifier field and map that to the bypassed conv)). */
	return NULL;
}

/* Some protocols (like TCP and UDP) need to adjust their xsums whenever an IPv4
 * address changes. */
static void ipv4_proto_changed_addr(struct iovec *iov, int iovcnt,
                                    uint8_t protocol, size_t proto_hdr_off,
                                    uint8_t *old_addr, uint8_t *new_addr)
{
	switch (protocol) {
	case IP_UDPPROTO:
		xsum_update(iov, iovcnt, proto_hdr_off + UDP_OFF_XSUM, old_addr,
		            new_addr, IPV4_ADDR_LEN);
		break;
	case IP_TCPPROTO:
		xsum_update(iov, iovcnt, proto_hdr_off + TCP_OFF_XSUM, old_addr,
		            new_addr, IPV4_ADDR_LEN);
		break;
	}
}

/* Helper, changes a packet's IP address, updating xsums.  'which' controls
 * whether we're changing the src or dst address. */
static void ipv4_change_addr(struct iovec *iov, int iovcnt, size_t ip_off,
                             uint8_t protocol, uint8_t proto_hdr_off,
                             uint8_t *old_addr, uint8_t *new_addr, size_t which)
{
	xsum_update(iov, iovcnt, ip_off + IPV4_OFF_XSUM, old_addr, new_addr,
	            IPV4_ADDR_LEN);
	ipv4_proto_changed_addr(iov, iovcnt, protocol, proto_hdr_off, old_addr,
	                        new_addr);
	iov_memcpy_to(iov, iovcnt, ip_off + which, new_addr, IPV4_ADDR_LEN);
}

static size_t ipv4_get_header_len(struct iovec *iov, int iovcnt, size_t ip_off)
{
	/* First byte, lower nibble, times 4. */
	return (iov_get_byte(iov, iovcnt, ip_off + 0) & 0x0f) * 4;
}

static size_t ipv4_get_proto_off(struct iovec *iov, int iovcnt, size_t ip_off)
{
	return ipv4_get_header_len(iov, iovcnt, ip_off) + ip_off;
}

static uint8_t ipv4_get_version(struct iovec *iov, int iovcnt, size_t ip_off)
{
	/* First byte, upper nibble, but keep in the upper nibble location */
	return iov_get_byte(iov, iovcnt, ip_off + 0) & 0xf0;
}

static void handle_ipv4_tx(struct iovec *iov, int iovcnt)
{
	size_t ip_off = ETH_HDR_LEN;
	uint8_t protocol;
	size_t proto_hdr_off;
	struct ip_nat_map *map;
	uint8_t src_addr[IPV4_ADDR_LEN];
	uint8_t dst_addr[IPV4_ADDR_LEN];

	if (!iov_has_bytes(iov, iovcnt, ip_off + IPV4_HDR_LEN)) {
		fprintf(stderr, "Short IPv4 header, dropping!\n");
		return;
	}
	/* It's up to each protocol to give us the ip_nat_map matching the packet
	 * and to change the packet's src port. */
	protocol = iov_get_byte(iov, iovcnt, ip_off + IPV4_OFF_PROTO);
	proto_hdr_off = ipv4_get_proto_off(iov, iovcnt, ip_off);
	switch (protocol) {
	case IP_UDPPROTO:
		map = handle_udp_tx(iov, iovcnt, proto_hdr_off);
		break;
	case IP_TCPPROTO:
		map = handle_tcp_tx(iov, iovcnt, proto_hdr_off);
		break;
	case IP_ICMPPROTO:
		map = handle_icmp_tx(iov, iovcnt, proto_hdr_off);
		break;
	}
	/* If the protocol handler already dealt with it (e.g. via emulation), we
	 * bail out.  o/w, they gave us the remapping we should use to rewrite and
	 * send the packet. */
	if (!map)
		return;
	/* At this point, we have a refcnted map, which will keep the map alive and
	 * its FD open. */
	iov_memcpy_from(iov, iovcnt, ip_off + IPV4_OFF_SRC, src_addr,
	                IPV4_ADDR_LEN);
	iov_memcpy_from(iov, iovcnt, ip_off + IPV4_OFF_DST, dst_addr,
	                IPV4_ADDR_LEN);
	/* If the destination is the ROUTER_IP, then it's really meant to go to the
	 * host (loopback).  In that case, we also need the src to be loopback, so
	 * that the *host's* IP stack recognizes the connection (necessary for
	 * host-initiated connections via static maps). */
	if (!memcmp(dst_addr, guest_v4_router, IPV4_ADDR_LEN)) {
		ipv4_change_addr(iov, iovcnt, ip_off, protocol, proto_hdr_off,
		                 dst_addr, loopback_v4_addr, IPV4_OFF_DST);
		ipv4_change_addr(iov, iovcnt, ip_off, protocol, proto_hdr_off,
		                 src_addr, loopback_v4_addr, IPV4_OFF_SRC);
	} else {
		ipv4_change_addr(iov, iovcnt, ip_off, protocol, proto_hdr_off,
		                 src_addr, host_v4_addr, IPV4_OFF_SRC);
	}
	/* We didn't change the size of the packet, just a few fields.  So we
	 * shouldn't need to worry about iov[] being too big.  This is different
	 * than the receive case, where the guest should give us an MTU-sized iov.
	 * Here, they just gave us whatever they wanted to send.
	 *
	 * However, we still need to drop the ethernet header from the front of the
	 * packet, and just send the IP header + payload. */
	iov_strip_bytes(iov, iovcnt, ETH_HDR_LEN);
	/* As far as blocking goes, this is like blasting out a raw IP packet.  It
	 * shouldn't block, preferring to drop, though there might be some cases
	 * where a qlock is grabbed or the medium/NIC blocks. */
	writev(map->host_data_fd, iov, iovcnt);
	map->is_stale = FALSE;
	kref_put(&map->kref);
}

static void handle_ipv6_tx(struct iovec *iov, int iovcnt)
{
}

/* virtio-net calls this when the guest transmits a packet */
int vnet_transmit_packet(struct iovec *iov, int iovcnt)
{
	uint16_t ether_type;

	if (vnet_snoop)
		writev(snoop_fd, iov, iovcnt);
	if (!iov_has_bytes(iov, iovcnt, ETH_HDR_LEN)) {
		fprintf(stderr, "Short ethernet frame from the guest, dropping!\n");
		return -1;
	}
	ether_type = iov_get_be16(iov, iovcnt, ETH_OFF_ETYPE);
	switch (ether_type) {
	case ETH_TYPE_ARP:
		handle_arp_tx(iov, iovcnt);
		break;
	case ETH_TYPE_IPV4:
		handle_ipv4_tx(iov, iovcnt);
		break;
	case ETH_TYPE_IPV6:
		handle_ipv6_tx(iov, iovcnt);
		break;
	default:
		fprintf(stderr, "Unknown ethertype 0x%x, dropping!\n", ether_type);
		return -1;
	};
	return 0;
}

/* Polls for injected packets, filling the iov[iovcnt] on success and returning
 * the amount.  0 means 'nothing there.' */
static size_t __poll_injection(struct iovec *iov, int iovcnt)
{
	size_t ret;
	struct buf_pkt *bpkt;

	if (STAILQ_EMPTY(&inject_pkts))
		return 0;
	bpkt = STAILQ_FIRST(&inject_pkts);
	STAILQ_REMOVE_HEAD(&inject_pkts, next);
	iov_memcpy_to(iov, iovcnt, 0, bpkt->buf, bpkt->sz);
	ret = bpkt->sz;
	free_bpkt(bpkt);
	return ret;
}

static void handle_udp_rx(struct iovec *iov, int iovcnt, size_t len,
                          struct ip_nat_map *map, size_t udp_off)
{
	assert(len >= udp_off + UDP_HDR_LEN);
	xsum_changed_port(iov, iovcnt, udp_off + UDP_OFF_XSUM,
	                  iov_get_be16(iov, iovcnt, udp_off + UDP_OFF_DST_PORT),
	                  map->guest_port);
	iov_put_be16(iov, iovcnt, udp_off + UDP_OFF_DST_PORT, map->guest_port);
}

static void handle_tcp_rx(struct iovec *iov, int iovcnt, size_t len,
                          struct ip_nat_map *map, size_t tcp_off)
{
	assert(len >= tcp_off + TCP_HDR_LEN);
	xsum_changed_port(iov, iovcnt, tcp_off + TCP_OFF_XSUM,
	                  iov_get_be16(iov, iovcnt, tcp_off + TCP_OFF_DST_PORT),
	                  map->guest_port);
	iov_put_be16(iov, iovcnt, tcp_off + TCP_OFF_DST_PORT, map->guest_port);
}

/* Computes and stores the xsum for the ipv4 header in the iov. */
static void xsum_ipv4_header(struct iovec *iov, int iovcnt, size_t ip_off)
{
	size_t hdr_len = ipv4_get_header_len(iov, iovcnt, ip_off);
	uint8_t buf[hdr_len];

	iov_memcpy_from(iov, iovcnt, ip_off, buf, hdr_len);
	*(uint16_t*)&buf[IPV4_OFF_XSUM] = 0;
	iov_put_be16(iov, iovcnt, ip_off + IPV4_OFF_XSUM,
	             ip_calc_xsum(buf, IPV4_HDR_LEN));
}

static void handle_ipv4_rx(struct iovec *iov, int iovcnt, size_t len,
                           struct ip_nat_map *map)
{
	size_t ip_off = ETH_HDR_LEN;
	uint8_t protocol;
	size_t proto_hdr_off;
	uint8_t src_addr[IPV4_ADDR_LEN];
	uint8_t dst_addr[IPV4_ADDR_LEN];

	protocol = iov_get_byte(iov, iovcnt, ip_off + IPV4_OFF_PROTO);
	proto_hdr_off = ipv4_get_proto_off(iov, iovcnt, ip_off);
	switch (map->protocol) {
	case IP_UDPPROTO:
		handle_udp_rx(iov, iovcnt, len, map, proto_hdr_off);
		break;
	case IP_TCPPROTO:
		handle_tcp_rx(iov, iovcnt, len, map, proto_hdr_off);
		break;
	default:
		panic("Bad proto %d on map for conv FD %d\n", map->protocol,
		      map->host_data_fd);
	}
	iov_memcpy_from(iov, iovcnt, ip_off + IPV4_OFF_SRC, src_addr,
	                IPV4_ADDR_LEN);
	iov_memcpy_from(iov, iovcnt, ip_off + IPV4_OFF_DST, dst_addr,
	                IPV4_ADDR_LEN);
	/* If the src was the host (loopback), the guest thinks the remote is
	 * ROUTER_IP. */
	if (!memcmp(src_addr, loopback_v4_addr, IPV4_ADDR_LEN)) {
		ipv4_change_addr(iov, iovcnt, ip_off, map->protocol, proto_hdr_off,
		                 src_addr, guest_v4_router, IPV4_OFF_SRC);
	}
	/* Interesting case.  If we rewrite it to guest_v4_router, when the guest
	 * responds, *that* packet will get rewritten to loopback.  If we ignore it,
	 * and it's qemu mode, it'll actually work.  If it's real addr mode, the
	 * guest won't send an IP packet out that it thinks is for itself.  */
	if (vnet_real_ip_addrs && !memcmp(src_addr, host_v4_addr, IPV4_ADDR_LEN)) {
		fprintf(stderr, "VNET received packet from host_v4_addr.  Not translating, the guest cannot respond!\n");
	}
	/* Regardless, the dst changes from HOST_IP/loopback to GUEST_IP */
	ipv4_change_addr(iov, iovcnt, ip_off, map->protocol, proto_hdr_off,
	                 dst_addr, guest_v4_addr, IPV4_OFF_DST);
	/* Note we did the incremental xsum for the IP header, but also do a final
	 * xsum.  We need the final xsum in case the kernel's networking stack
	 * messed up the header. */
	xsum_ipv4_header(iov, iovcnt, ip_off);
}

/* NAT / translate an inbound packet iov[len], using map.  If a packet comes in
 * on a certain FD, then it's going to the guest at the appropriate port, no
 * questions asked.
 *
 * The iov has ETH_HDR_LEN bytes at the front.  The data actually read from the
 * conv starts at that offset.  len includes this frontal padding - it's the
 * full length of the real data in the iov + the ethernet header.  len may
 * include data beyond the IP packet length; we often get padding from the
 * kernel networking stack.  Returns the final size of the packet. */
static size_t handle_rx(struct iovec *iov, int iovcnt, size_t len,
                        struct ip_nat_map *map)
{
	size_t ip_off = ETH_HDR_LEN;
	uint8_t version;
	uint16_t ether_type;

	/* The conv is reading from a Qmsg queue.  We should always receive at least
	 * an IPv4 header from the kernel. */
	assert(len >= IPV4_HDR_LEN + ETH_HDR_LEN);
	version = ipv4_get_version(iov, iovcnt, ip_off);
	switch (version) {
	case IP_VER4:
		ether_type = ETH_TYPE_IPV4;
		handle_ipv4_rx(iov, iovcnt, len, map);
		break;
	case IP_VER6:
		ether_type = ETH_TYPE_IPV6;
		/* Technically, this could be a bad actor outside our node */
		panic("Got an IPv6 packet on FD %d!\n", map->host_data_fd);
	default:
		panic("Unexpected IP version 0x%x, probably a bug", version);
	}
	iov_memcpy_to(iov, iovcnt, ETH_OFF_DST, guest_eth_addr, ETH_ADDR_LEN);
	iov_memcpy_to(iov, iovcnt, ETH_OFF_SRC, host_eth_addr, ETH_ADDR_LEN);
	iov_put_be16(iov, iovcnt, ETH_OFF_ETYPE, ether_type);
	return len;
}

/* Polls for inbound packets on the host's FD, filling the iov[iovcnt] on
 * success and returning the amount.  0 means 'nothing there.'
 *
 * Notes on concurrency:
 * - The inbound_todo list is protected by the rx_mtx.  Since we're readv()ing
 *   while holding the mtx (because we're in a FOREACH), we're single threaded
 *   in the RX path.
 * - The inbound_todo list is filled by another thread that puts maps on the
 *   list whenever their FD tap fires.
 * - The maps on the inbound_todo list are refcounted.  It's possible for them
 *   to be reaped and removed from the mapping lookup, but the mapping would
 *   stay around until we drained all of the packets from the inbound conv. */
static size_t __poll_inbound(struct iovec *iov, int iovcnt)
{
	struct ip_nat_map *i, *temp;
	ssize_t pkt_sz = 0;
	struct iovec iov_copy[iovcnt];

	/* We're going to readv ETH_HDR_LEN bytes into the iov.  To do so, we'll use
	 * a separate iov to track this offset.  The iov and iov_copy both point to
	 * the same memory (minus the stripping). */
	memcpy(iov_copy, iov, sizeof(struct iovec) * iovcnt);
	iov_strip_bytes(iov_copy, iovcnt, ETH_HDR_LEN);
	TAILQ_FOREACH_SAFE(i, &inbound_todo, inbound, temp) {
		pkt_sz = readv(i->host_data_fd, iov_copy, iovcnt);
		if (pkt_sz > 0) {
			i->is_stale = FALSE;
			return handle_rx(iov, iovcnt, pkt_sz + ETH_HDR_LEN, i);
		}
		parlib_assert_perror(errno == EAGAIN);
		TAILQ_REMOVE(&inbound_todo, i, inbound);
		i->is_on_inbound = FALSE;
		kref_put(&i->kref);
	}
	return 0;
}

/* virtio-net calls this when it wants us to fill iov with a packet. */
int vnet_receive_packet(struct iovec *iov, int iovcnt)
{
	size_t rx_amt;

	uth_mutex_lock(rx_mtx);
	while (1) {
		rx_amt = __poll_injection(iov, iovcnt);
		if (rx_amt)
			break;
		rx_amt = __poll_inbound(iov, iovcnt);
		if (rx_amt)
			break;
		uth_cond_var_wait(rx_cv, rx_mtx);
	}
	uth_mutex_unlock(rx_mtx);
	iov_trim_len_to(iov, iovcnt, rx_amt);
	if (vnet_snoop)
		writev(snoop_fd, iov, iovcnt);
	return rx_amt;
}
