PB173 - Ovladače jádra - Linux XII. Síťové rozhraní Jiri Slabý ITI, Fakulta informatiky 10. 12. 2013 Síťové rozhraní LDD3 kap. 17 • Ovladač pro ethX J. Slabý (ITI, Fl) Teoretická síťová vrstva Example User y Application Fireľox Browser Application layer HTTP Transport layer TCP Network layer IP Link layer Ethernet driver Hardware layer Ethernet Zdroj: ldn.linuxfoundation.org J. Slaby (ITI, Fl) 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.linuxfoundation.org J. Slaby (ITI, Fl) Síťové rozhraní ovladače Ovladač síťové karty • Mezivrstva mezi HW a Linuxem (síťovou vrstvou) • Vytváří eth* a podobná 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_netdev£), free_netdevo • Registrace: register_netdev, unregister_netdev a Háčky • Staré jádro: V netdevice přímo open, stop, . . . • Nové jádro: net_device_ops (podobně jako znaková zařízení) J. Slabý (ITI, Fl) PB173/02 10. 12. 2013 5/ 11 net_device_ops struct net.device.ops { int (*ndo.open)(struct net.device *dev);/* ifup */ int (*ndo.stop)(struct net-device *dev); /* ifdown */ /* send a packet */ netdev.tx.t (*ndO-StarLxmit) (struct sk.buff *skb, struct net-device *dev); /* change MTU */ int (*ndo.change.mtu)(struct net-device *dev, int new.mtu); ... /* no receive packet */ }; J. Slaby (ITI, Fl) PB173/02 10. 12. 2013 6/ 11 Konkrétnější rozhraní • Místo aiioc_netdev se použije konkrétnější aiioc_* • Inicializuje netdevice o Délku hlavičky, adresy, fronty, ... • Nastaví vnitřní položky netdevice • Ethernet. alloc_etherdev (linux/etherdevice .h) • IRDA: alloc_irdadev (net/irda/irda_device .h) • CAN: alloc_candev (linux/can/dev.h) • HDLC: alloc_hdlcdev(linux/hdlc.h) o . . . J. Slabý (ITI, Fl) PB173/02 10. 12. 2013 7/ 11 Vytvoření eth* Postup vytvoření ethernetového zařízení v systému O Alokace (alloc_etherdev(priv_size)) • priv_size může být 0 Q Inicializace informací • Nastavení háčků (net_device_ops) • Nastavení MAC adresy (dev->dev_addr) • Získání privátního ukazatele o velikosti priv_size • Funkce netdev_priv 0 Registrace (register_netdev) O O Deregistrace (unregister_netdev) O Uvolnění (free_netdev) J. Slabý (ITI, Fl) PB173/02_10. 12. 2013 8/ 11 Úkol Vytvoření eth* O Dle postupu z předchozího slajdu • Alokace+registrace v moduie_init • Deregistrace+uvolnění v moduie_exit • MAC: random_ether_addr • priv_size: sizeof(struct timer_list) • Nezapomeňte na setup_timer O Vytvořit open, stop, start_xmit • Těla vypíšou jen název funkce • start_xmit vrátí NETDEV_TX_OK O NEVKLÁDEJTE do systému • Nelze modul odebrat J. Slabý (ITI, Fl) Pakety Tzv. socket buffery a linux/skbuff.h, struct sk_buff • dev_alloc_skbo (obecně), netdev_alloc_skbo (pro netdevice), dev_kfree_skbo • Obsah:skb->data • Délka obsahu: skb->ien • Příjem z HW (např. z přerušení) • skb = netdev_alloc_skb(dev, len) » Naplnění daty z HW • Nastavení protokolu (skb->protocol = eth_type_trans(skb, dev)) • netif_rx(skb) • Posílání do HW (skb je parametr start_xmit) • Poslat paket • dev_kfree_skb(skb) J. Slabý (ITI, Fl) PB173/02 10. 12. 2013 10/11 Úkol Odesí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č, zrušit ve stop a V časovači volat netif _rx s paketem z pbl73/l2/ • Inkrementovat v paketu 24. znak o 1 O Vložit modul do systému O Spustit tcpdump -ni na eth rozhraní J. Slabý (ITI, Fl) PB173/02 10. 12. 2013 11/11