PB173 - Ovladače jádra - Linux XII. Jiří Slabý ITI, Fakulta Informatiky 14. 12. 2010 J. Slabý (ITI) PB173/01 14. 12. 2010 1 / 1 Síťové rozhraní LDD3 kap. 17 • Ovladač pro ethX • Poslední cvičení 14. 12. 2010 2/1 Teoretická síťová vrstva Example User y Application Fireľox Browser Application layer Transport layer HTTP TCP Network layer Link layer IP Ethernet driver Hardware layer Ethernet Zdroj: ldn . linuxf oundation . org 14. 12. 2010 3/1 Linuxová síťová vrstva User space Kernel apace Application layer System call interface Protocol agnostic interface Network protocols Device agnostic interface Device drivers Physical device hardware Zdroj: ldn . linuxf oundation . org 14. 12. 2010 4/1 Síťové rozhraní ovladače Ovladač síťové karty • Mezivrstva mezi HW a Linuxem (síťovou vrstvou) • Vytváří eth* apod. zařízení (tzv. netdevice) • Obsahuje háčky o Zařízení je UP, DOWN, změna MTU, pošli paket, ... API • linux/netdevice.h,struct net-device • Alokace: alloc-netdevo, f ree_netdev£) • Registrace: register_netdev, unregister_netdev • Háčky • Staré jádro: v netdevice přímo open, stop, ... 9 Nové jádro: net_device_ops (podobně jako znaková zařízení) J. Slabý (ITI) PB173/01 14. 12. 2010 5/1 net_device_ops struct net.device.ops { int (*ndo.open)(struct net.device *dev) ; /* ifup */ int (* ndo.stop)(struct net-device *dev) ; /* ifdown */ netdev.tx.t (* ndo.start.xmit) (struct sk.buff *skb, struct net.device *dev) ; /* send packet */ int (* ndo.change.mtu )( struct net.device *dev, int new.mtu); /* change MTU */ ... /* no receive packet */ }; J. Slaby (ITI) PB173/01 14. 12. 2010 6/1 Konkrétnější rozhraní • Místo aiiocnetdev se použije konkrétnější o Nastaví vnitřní položky netdevice • Ethernet: alloc_etherdev (linux/etherdevice.h) 8 IRDA: alloc_irdadev (net/irda/irda_device.h) • CAN: alloc_candev (linux/can/dev.h) • HDLC: alloc-hdlcdev (linux/hdlc.h) • ... J. Slabý (ITI) PB173/01 14. 12. 2010 7/1 Vytvoření eth* Postup vytvoření ethernetového zařízení v systému O Alokace (alloc_etherdev (priv.size)) O Vyplnění informací • Háčky (net_device_ops) • MAC adresa (dev->dev_addr) • Získání privátního ukazatele o velikosti priv.size (netdev.priv) Q Registrace (register_netdev) O Q Deregistrace (unregister_netdev) O Uvolnění (free_netdev) J. Slabý (ITI) PB173/01 14. 12. 2010 8/1 Úkol Vytvořit eth* O Dle postupu z předchozího slidu • Registrace v module-init • Deregistrace v module-exit • MAC: random_ether_addr • priv_size! sizeof (struct timer_list) — setup_timer O Vytvořit open, stop, start_xmit • Těla vypíšou jen název funkce O start_xmit vrátí NETDEV_TX_OK Q Vložit do systému, udělat ifup, if down, ping J. Slabý (ITI) PB173/01 14. 12. 2010 9/1 Pakety Tzv. socket buffery • linux/skbuff.h, struct sk_buff • dev_alloc_skbo (obecně), netdev_alloc_skbo (pro netdevice), dev_kf ree_skbo • Obsah: skb->data « Délka obsahu: skb->ien o Příjem z HW (např. z přerušení) • skb = netdev_alloc_skb (dev, len) 9 Naplnění daty z HW • Nastavení protokolu (skb->protocoi = eth_type_trans (skb, dev)) • netif_rx(skb) • Posílání do HW (parametr ve start_xmit) • Poslat paket • dev_kf ree_skb (skb) J. Slabý (ITI) PB173/01 14. 12. 2010 10/1 Úkol Posílání/příjem paketů O Doplnit kód TX • Vypsat Obsah paketu (print_hex_dump_bytes) • Uvolnit skb O Nastavit RX • V open nastavit periodický časovač, smazat v stop • V časovači volat netif_rx s paketem z pb173/12 • Inkrementovat v paketu 24. char O Vložit module do systému O Spustit tcpdump -ni na eth rozhraní J. Slabý (ITI) PB173/01 14. 12. 2010 11/1