Dear hackers,

now that MirageOS 3.4.1 is released, which separated the ethernet and
the arp layer into distinct opam packages and git repositories, I hereby
propose changes to the layering of the TCP/IP stack in MirageOS. The
motivation behind this is further decoupling of the layers to support
802.1q etc. more easily. The changes do not modify the receive path.

A brief list of changes:

- Ethernet encapsulation is done in Ethernet - currently done in Arp and
IPv4 and IPv6 libraries
- MTU is passed from the network interface upwards - currently passed
into the Ethernet layer
- Write buffer allocation is done by the network interface, which knows
best about page boundary restrictions, etc. - currently done in IPv4,
IPv6, ARP using Io_page.get 1
- write functions signature change throughout the stack up to Ip: the
buffer to send is no longer given directly, instead a size argument and
a fill function of type (buffer -> int).
- IPv4 applies fragmentation!
- no longer used function are removed


I did performance evaluation as follows (I'm pretty sure this is not
exhaustive, and likely others have better ideas on how to actually do
such a benchmark):
- Server: the MirageOS unikernel iperf_server (TCP, thanks to Taka),
https://github.com/hannesm/mirage_iperf, virtualized with Solo5/hvt,
deployed on a PC Engines (AMD Embedded G series GX-412TC, 1 GHz quad
Jaguar core)
- Client: iperf on Unix running on my Lenovo X250, arguments -i 1 -t 20
- Connection was a 1 GBit/s copper cable (a switch was in between the
devices)

The latest released opam packages (mirage 3.4.1, tcpip 3.7.0):
Throughput = 16.97 [MBs/sec]
gc minor words 214425271.000000 promoted words 4421898.000000 major
words 4428911.000000 minor collections 884 major collections 131
heap_words 61440

With the changes above:
Throughput = 16.85 [MBs/sec]
gc minor words 212194711.000000 promoted words 4286488.000000 major
words 4293501.000000 minor collections 876 major collections 132
heap_words 61440


These changes already span over several opam packages, a PR that tracks
all changes is https://github.com/mirage/mirage/pull/968. Initial
discussion of the adjusted mirage-net interface is at
https://github.com/mirage/mirage-net/pull/13 (now superseeded).

A consistent repository of opam packages is available at
https://github.com/mirage/mirage-dev#layering for your convenience (you
can test this by opam repo add layering <url> followed by opam install
mirage).

A CI run using mirage-skeleton has been completed successfully at
https://travis-ci.org/mirage/mirage-dev/builds/491058735

I'd be happy to get these PRs merged rather sooner than later. If you're
interested in the API changes, please take a look at the changes to
mirage-net and mirage-protocols.
The mirage-net-xen changes have not been tested (they compile, though).
It also lacks a way to retrieve the MTU from Xenstore.
I extended tuntap to provide the MTU information, and mirage-net-unix to
use that information.


best,

hannes

_______________________________________________
MirageOS-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/mirageos-devel

Reply via email to