Introduction: This file describes the differences between the original Alpine implementation and Alpine4Linux. The original Alpine is referred to as Alpine4BSD henceforth. Differences: Alpine4Linux needs a unique IP address separate from the host OS. Alpine4BSD shares the IP address already assigned to the host OS. I chose this approach because: 1. It is simpler (I did not have to write code to share the port-space with the host kernel) 2. Alpine4Linux will be used in a research environment where assigning the host OS an additional IP address should not be difficult. As long as the host OS does not send RSTs or ICMP unreach messages to the sender, we should be fine. Such a "blackhole" behavior can be configured on a Linux box using iptables. Alpine4Linux provides a helper script - "run_alpine_server.sh" - that configures iptables before starting alpine_server. It also cleans up when alpine_server exits. Alpine4Linux support fork()! This is probably the biggest difference from Alpine4BSD. Alpine4BSD uses a faux-ethernet device that was newly written to inject packets into and get packets from the FreeBSD stack. I leveraged the "tap" pseudo-device already present in the FreeBSD stack to achieve identical functionality. No code change were made to the "tap" driver. Alpine4BSD requires support for BPF devices to be compiled in the host OS. Alpine4Linux requires support for PF_PACKET sockets in the host OS. Alpine4BSD simulates interrupts by polling pcap once every 1ms by using SIGALRM. We don't have to do that since we put the 'linux_pcap_fd' in select(), so alpine_server is woken up every time a packet is available to read on the pcap_fd. In this sense Alpine4Linux is a true interrupt driven stack.