anchao opened a new pull request, #7616: URL: https://github.com/apache/incubator-nuttx/pull/7616
## Summary net/l2/l3/l4: add support of iob offload 1. Add new config CONFIG_NET_LL_GRUARDSIZE to isolation of l2 stack, which will benefit l3(IP) layer for multi-MAC(l2) implementation, especially in some NICs such as celluler net driver. new configuration options: CONFIG_NET_LL_GRUARDSIZE CONFIG_NET_LL_GRUARDSIZE will reserved l2 buffer header size of network buffer to isolate the L2/L3 (MAC/IP) data on network layer, which will be beneficial to L3 network layer protocol transparent transmission and forwarding ------------------------------------------------------------ Layout of frist iob entry: ``` iob_data (aligned by CONFIG_IOB_ALIGNMENT) | | io_offset(CONFIG_NET_LL_GRUARDSIZE) | | ------------------------------------------------- iob | Reserved | io_len | ------------------------------------------------- ``` ------------------------------------------------------------- Layout of different NICs implementation: ``` iob_data (aligned by CONFIG_IOB_ALIGNMENT) | | io_offset(CONFIG_NET_LL_GRUARDSIZE) | | ------------------------------------------------- Ethernet | Reserved | ETH_HDRLEN | io_len | ---------------------------------|--------------- 8021Q | Reserved | ETH_8021Q_HDRLEN | io_len | ---------------------------------|--------------- ipforward | Reserved | io_len | ------------------------------------------------- ``` -------------------------------------------------------------------- 2. Support iob offload to l2 driver to avoid unnecessary memory copy Support send/receive iob vectors directly between the NICs and l3/l4 stack to avoid unnecessary memory copies, especially on hardware that supports Scatter/gather, which can greatly improve performance. new interface to support iob offload: ``` ------------------------------------------ | IOB version | original | |----------------------------------------| | devif_iob_poll() | devif_poll() | | ipv4_iob_input() | ipv4_input() | | ipv6_iob_input() | ipv6_input() | | pkt_iob_input() | pkt_input() | | ... | ... | ------------------------------------------ ``` -------------------------------------------------------------------- 1> NIC hardware support Scatter/gather transfer TX: ``` tcp_poll()/udp_poll()/pkt_poll()/...(l2/l3) / \ / \ devif_poll_[l2/l3]_connections() devif_iob_send() (nocopy:udp/icmp/...) / \ (copy:tcp) / \ devif_iob_poll("NIC"_txpoll) callback() // "NIC"_txpoll | dev->d_iob: | --------------- --------------- io_data iob1 | | | iob3 | | | \ --------------- --------------- --------------- | --------------- | iob0 | | | | iob2 | | | | --------------- | --------------- | \ | / / \ | / / ---------------------------------------------- NICs io vector | | | | | | | | | | ---------------------------------------------- ``` RX: ``` [tcp|udp|icmp|...]ipv[4|6]_data_handler()(iob_concat/append to readahead) | | [tcp|udp|icmp|...]_ipv[4|6]_input() | | pkt/ipv[4/6]_iob_input()/... | | NICs io vector receive(iov_base to each iobs) ``` -------------------------------------------------------------------- 2> CONFIG_IOB_BUFSIZE is greater than MTU: TX: "(CONFIG_IOB_BUFSIZE) > (MAX_NETDEV_PKTSIZE + CONFIG_NET_GUARDSIZE + CONFIG_NET_LL_GRUARDSIZE)" ``` tcp_poll()/udp_poll()/pkt_poll()/...(l2/l3) / \ / \ devif_poll_[l2/l3]_connections() devif_iob_send() (nocopy:udp/icmp/...) / \ (copy:tcp) / \ devif_iob_poll("NIC"_txpoll) callback() // "NIC"_txpoll | "NIC"_send() (dev->d_iob->io_data[CONFIG_NET_LL_GRUARDSIZE - NET_LL_HDRLEN(dev)]) ``` RX: ``` [tcp|udp|icmp|...]ipv[4|6]_data_handler()(iob_concat/append to readahead) | | [tcp|udp|icmp|...]_ipv[4|6]_input()/... | | pkt/ipv[4/6]_iob_input()/... | | NICs io vector receive(iov_base to io_data) ``` -------------------------------------------------------------------- 3> Compatible with all old flat buffer NICs TX: ``` tcp_poll()/udp_poll()/pkt_poll()/...(l2/l3) / \ / \ devif_poll_[l2/l3]_connections() devif_iob_send() (nocopy:udp/icmp/...) / \ (copy:tcp) / \ devif_iob_poll(devif_poll_callback()) devif_poll_callback() /* new interface, gather iobs to flat buffer */ / \ / \ devif_poll("NIC"_txpoll) "NIC"_send()(dev->d_buf) ``` RX: ``` [tcp|udp|icmp|...]ipv[4|6]_data_handler()(iob_concat/append to readahead) | | [tcp|udp|icmp|...]_ipv[4|6]_input() | | pkt/ipv[4/6]_iob_input()/... | | netdev_input() /* new interface, Scatter/gather flat/iob buffer */ | | pkt/ipv[4|6]_input()/... | | NICs io vector receive(Orignal flat buffer) ``` 3. Iperf passthrough on NuttX simulator: ``` ------------------------------------------------- | Protocol | Server | Client | | |-----------------------------------------------| | TCP | 813 | 834 | Mbits/sec | | TCP(Offload) | 1720 | 1100 | Mbits/sec | | UDP | 22 | 757 | Mbits/sec | | UDP(Offload) | 25 | 1250 | Mbits/sec | ------------------------------------------------- ``` Change-Id: I537b3f0330b4f3c859246c7003a3f38aa6266845 Signed-off-by: chao an <anc...@xiaomi.com> ## Impact NuttX net stack ## Testing iperf passthrough test on simulator -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@nuttx.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org