• Magnus Karlsson's avatar
    selftests/xsk: transmit and receive multi-buffer packets · 17f1034d
    Magnus Karlsson authored
    Add the ability to send and receive packets that are larger than the
    size of a umem frame, using the AF_XDP /XDP multi-buffer
    support. There are three pieces of code that need to be changed to
    achieve this: the Rx path, the Tx path, and the validation logic.
    
    Both the Rx path and Tx could only deal with a single fragment per
    packet. The Tx path is extended with a new function called
    pkt_nb_frags() that can be used to retrieve the number of fragments a
    packet will consume. We then create these many fragments in a loop and
    fill the N-1 first ones to the max size limit to use the buffer space
    efficiently, and the Nth one with whatever data that is left. This
    goes on until we have filled in at the most BATCH_SIZE worth of
    descriptors and fragments. If we detect that the next packet would
    lead to BATCH_SIZE number of fragments sent being exceeded, we do not
    send this packet and finish the batch. This packet is instead sent in
    the next iteration of BATCH_SIZE fragments.
    
    For Rx, we loop over all fragments we receive as usual, but for every
    descriptor that we receive we call a new validation function called
    is_frag_valid() to validate the consistency of this fragment. The code
    then checks if the packet continues in the next frame. If so, it loops
    over the next packet and performs the same validation. once we have
    received the last fragment of the packet we also call the function
    is_pkt_valid() to validate the packet as a whole. If we get to the end
    of the batch and we are not at the end of the current packet, we back
    out the partial packet and end the loop. Once we get into the receive
    loop next time, we start over from the beginning of that packet. This
    so the code becomes simpler at the cost of some performance.
    
    The validation function is_frag_valid() checks that the sequence and
    packet numbers are correct at the start and end of each fragment.
    Signed-off-by: default avatarMagnus Karlsson <magnus.karlsson@intel.com>
    Link: https://lore.kernel.org/r/20230719132421.584801-19-maciej.fijalkowski@intel.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    17f1034d
xskxceiver.c 55.6 KB