• Maksim Krasnyanskiy's avatar
    TUN/TAP driver packet queuing fixes and improvements · 5ce8b230
    Maksim Krasnyanskiy authored
    
    
    Patch from Harald Roelle <harald.roelle@nm.ifi.lmu.de>
    
    Fixes for the following issues
    - "Kicking" packet behavior in case of kernel packet scheduler (! TUN_ONE_QUEUE):
      When the netif queue is stopped because of an overrun of the driver's queue,
      no new packets are delivered to the driver until a new packet arrives, not even
      when in the meantime there's again space in the driver's queue (gained by a
      reading user process). In short, whenever netif queue was stopped, one needs an
      additional packet to "kick" packet delivery to the driver.
      The reason for this is, that the netif queue is started but not woken up, i.e.
      the rest of the kernel is not signaled to resume packet delivery.
    
    - Adjustment of tx queue length by ifconfig has only effect when TUN_ONE_QUEUE
      is set.  Otherwise always constant TUN_READQ_SIZE queue length is used.
    
    - TX queue default length setting is not consistent:
      o TAP dev + TUN_ONE_QUEUE: 1000 (by ether_setup())
      o all other cases: 10
    
    - Default tx queue length is too short in many cases.
      IMHO it should be at least twice as long as the number of fragments needed
      for a maximum sized IP packet at a "typical" MTU size.
      This would ensure that at least one complete IP packet can be delivered
      to the attached user space process, even if the packet's fragments
      are "misaligned" in the buffer and the user process is not scheduled
      in time to read the queue.
    
    Additional modifications:
    
    - To signal that stopping of the queue has occurred, the tx fifo overrun
      counter is increased.
    
    - Implemented ethtool api. Primarily added to have a standard method requesting
      the driver version.
    Signed-off-by: default avatarMax Krasnyansky <maxk@qualcomm.com>
    5ce8b230
tun.c 15.8 KB