%Network Subsystem %Thadeu Cascardo # Socket Buffers * include linux/skbuff.h * struct sk\\_buff - struct net\\_device *dev * alloc\\_skb(len, gfp) * dev\\_alloc\\_skb(len) - uses ATOMIC, reserves PAD * netdev\\_alloc\\_skb(netdev, len) - uses ATOMIC, since 2.6.18 * kfree\\_skb, dev\\_kfree\\_skb # Diagram * head - start of allocated buffer * end - end of allocated buffer * data - start of data, giving space after headroom * tail - end of used space * headroom - space between head and data * tailroom - space between tail and end # Socket Buffers operations * skb\\_put(skb, len) - adds data to end of skb * skb\\_push(skb, len) - adds data to start of skb * skb\\_pull(skb, len) - allocates headroom * skb\\_headroom and skb\\_tailroom * skb\\_reserve - only allowed for empty buffer, reserves headroom * skb\\_orphan - release it from its socket holder # Network Device * include linux/netdevice.h * struct net\\_device - char name[] - features - stats - netdev\\_ops - ethtool\\_ops - header\\_ops - flags - mtu - type - hard\\_header\\_len # Network Device Setup * alloc\\_netdev(szpriv, name, setup) * setup function * include linux/etherdevice.h * ether\\_setup * alloc\\_etherdev * register\\_netdev * unregister\\_netdev * free\\_netdev # Network Device Operations * struct net\\_device\\_ops * ndo\\_init * ndo\\_open - should call netif\\_start\\_queue * ndo\\_stop - should call netif\\_stop\\_queue # Network Device Address * struct net\\_device - dev\\_addr * random\\_ether\\_addr * struct net\\_device\\_ops - ndo\\_set\\_mac\\_address * eth\\_mac\\_addr # Transmission * ndo\\_start\\_xmit * called with a held lock # Limits on transmission * When TX buffers are full, xmit may call netif\\_stop\\_queue * Should arrange to get netif\\_wake\\_queue called after TX buffers are free again # Transmission timeout # NAPI # Changes in net device * Use netdev\\_priv, no priv anymore * struct net\\_device\\_ops introduced in 2.6.29, with compatibility provided for drivers * Compatibility removed in 2.6.31 * netdev\\_tx\\_t: NETDEV\\_TX\\_OK, NETDEV\\_TX\\_BUSY, NETDEV\\_TX\\_LOCKED # Other recent changes * Some members moved to netdev\\_queue to increase cache-line usage * GRO/GSO * Multi-queue support * RPS - Packet Steering