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

Reply via email to