| @@ -0,0 +1,67 @@ | |||
| Testing FreeBSD ethernet Interfaces | |||
| =================================== | |||
| This project is on pause for now, but contains work that I've done in | |||
| late 2020 and early 2021 to try to create a test suite to make sure that | |||
| FreeBSD ethernet drivers are programmed correctly, and have the correct | |||
| behaviors. | |||
| It is easy to assume that if an interface passes traffic that things are | |||
| working properly, but there is much more to it than that. As far as I | |||
| can tell, there is no comprehensive test suite to validate that a driver | |||
| works as expected, and that the features it claims to implement are | |||
| properly implemented. | |||
| A non-exhaustive list of features that could be listed as supported, but | |||
| not working are jumbo frames (large MTU), hardware VLAN tagging, and | |||
| checksum offload. In the case of the last two, a driver can claim to | |||
| support these, but if the underlying bits in ifnet structure are not set, | |||
| nothing will happen. Another example is that a driver could just always | |||
| set that the checksum is valid, even when it is not. In most cases, this | |||
| won't be noticed, and with many protocols doing their own verification | |||
| (ssh and TLS), it will just result in a dropped connection, but in other | |||
| cases it will cause data corruption. | |||
| As part of this project, two sets of patches were developed, one is the | |||
| [kvm_ctf branch](https://www.funkthat.com/gitea/jmg/freebsd/src/branch/kvm_ctf) | |||
| which implements the begining of an ABI agnostic method for transfering | |||
| data from kernel to userland (and possibly back w/ some adaptations). | |||
| It uses [Compact C Type Format](https://www.freebsd.org/cgi/man.cgi?query=ctf&apropos=0&sektion=0&manpath=FreeBSD+12.2-RELEASE+and+Ports&arch=default&format=html) | |||
| to understand the layout of kernel data structures and the member sizes. | |||
| The good thing about this is that it can, and will work against core | |||
| dumps. It would allow for minimal changes existing programs that use | |||
| libkvm to get forwards compatibility. | |||
| The other part is a custom DLT for fetching the mbuf csum flags on | |||
| packets. This covers both TX and RX, so can be used to verify that | |||
| transmitted checksums are correctly updated AND verify that the | |||
| correct flags are set on received packets. The code for this is | |||
| available on the [dlt_mbuf branch](https://www.funkthat.com/gitea/jmg/freebsd/src/branch/dlt_mbuf). | |||
| The `bpf.py` file contains interface code for opening the BPF device | |||
| and returning the necessary information. | |||
| testinterfaces.sh | |||
| ================= | |||
| This is the initial shell script version. It uses a pair of FreeBSD | |||
| jails w/ vnets, one with the interface under test, and another interface | |||
| that is used to generate and receive the necessary test packets. This | |||
| has the advantage that it tests the full network stack, but due to | |||
| various bugs, both in the FreeBSD IP stack (IPv6 addresses don't always | |||
| get assigned properly), and possibly the driver (needing packets in the | |||
| opposite direction to happen before they flow), it makes this a bit | |||
| difficult to fully test. | |||
| testeth.py | |||
| ========== | |||
| This was started to allow direct inspection of the checksum flags. | |||
| One advantage is that as packets can be generated and sent w/ | |||
| scapy/BPF, jails+vnets are not required, nor is the IP stack involved. | |||
| The disadvantage is that it does not (currently) test the full network | |||
| stack. | |||
| Some progress has been made in replicating the features of the shell | |||
| script, but this program is not as nearly complete, nor tested as the | |||
| shell version. | |||