For each UDP socket, Onload creates both an accelerated socket and a kernel socket. There is usually no file descriptor for the kernel socket visible in the user’s file descriptor table. When a UDP process is ready to transmit data, Onload will check a cached ARP table which maps IP addresses to MAC addresses. A cache ‘hit’ results in sending via the Onload accelerated socket. A cache ‘miss’ results in a syscall to populate the user mode cached ARP table. If no MAC address can be identified via this process the packet is sent via the kernel stack to provoke ARP resolution. Therefore, it is possible that some UDP traffic will be sent occasionally via the kernel stack.
The preceding figure illustrates the UDP send and receive paths. Dark gray arrows indicate the accelerated ‘kernel bypass’ path. Light gray arrows identify fragmented UDP packets received by the supported adapter and UDP packets received from an unsupported adapter. UDP packets arriving at the supported adapter are filtered on source and destination address and port number to identify a VNIC the packet will be delivered to. Fragmented UDP packets are received by the application via the kernel UDP socket. UDP packets received by an unsupported adapter are always received via the kernel UDP socket.