PB173 - Ovladače jádra - Linux XII. Síťové rozhraní Jiri Slabý Fakulta informatiky Masarykova univerzita 9. 12. 2014 Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 1/14 Síťové rozhraní LDD3 kap. 17 • Ovladač pro ethX Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 2/ 14 Teoretická síťová vrstva Example User I Application Firefox browser Application layer Transport layer HTTP TCP Network layer Link layer Hardware layer IP Ethernet driver Ethernet Zdroj: ldn.linuxfoundation.org Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 3/ 14 Linuxová síťová vrstva Us&r space Kernel space Application layer System call interface Protocol agnostic interface Wetwork protocols Device agnostic interface Device drivers Physical device hardware Zdroj: ldn.linuxfoundation.org Jiri Slabý (Fakulta informatiky, MU) 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 Zařízení je UR DOWN, změna MTU, pošli paket, ... API • linux/netdevice.h, struct net_device • Alokace: alloc_netdevD,free_netdevo • Registrace:register_netdev, unregister_netdev • Háčky: struct net_device_ops (podobně jako znaková zařízení) Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 5/ 14 ; net_device_ops ; net_device_ops int (*ndo_open)(struct net_device *dev);/* ip link set up*/ int (*ndo_stop)(struct net_device *dev);/* ip link set down*/ /* send a packet */ netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb, struct net_device *dev); /* change MTU */ int (*ndo_change_mtu)(struct net_device *dev, int new_mtu); ... /* no receive packet */ Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 6/ 14 Konkrétnější rozhraní • Místo aiioc_netdev se použije konkrétnější aiioc_* • Inicializuje netdevice • Délku hlavičky, adresy, fronty, ... • Příklady • 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) • ... Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 7/ 14 Vytvoření eth* Postup vytvoření ethernetového zařízení v systému 0 Alokace (alloc_etherdev(priv_size)) • Alokuje navíc paměť o velikosti priv_size • priv_size může být o 0 Inicializace informací • Nastavení háčků (net_device_ops do dev->netdev_ops) • Nastavení MAC adresy (dev->dev_addr) 9 Získání ukazatele na paměť alokovanou navíc • Funkcínetdev_priv • Jen při alokaci s priv_size > 0 0 Registrace (register_netdev) O 0 Deregistrace (unregister_netdev) 0 Uvolnění (f ree_netdev) Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 8/ 14 Ú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 o Těla vypíšou jen název funkce • start_xmit vrátí NETDEV_TX_QK 0 NEVKLÁDEJTE do systému • Nelze modul odebrat Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 9/ 14 Pakety Tzv. socket buffery • linux/skbuff.h, struct sk_buff a Obecně:dev_alloc_skbo a Pro /ieřc/ewce.'netdev_alloc_skbD a Uvolnění: dev_kf ree_skbD a Obsah:skb->data • Ukazuje na alokovanou paměť • Plní/čte se klasicky přes memcpy apod. a Délka obsahu: skb->len a Protokol: skb->protocol 9 Při příjmu nutno nastavit! Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 10/14 Pakety Odesílání do HW skb je parametr start_xmit O Předat do HW data • skb->dataO délce skb->len O Uvolnit skb • dev_kfree_skb(skb) O Vrátit stav • NETDEV_TX_QK • NETDEV_TX_BUSY O Lze pozastavit odesílání • Při zaplněném HW • netif_stop_queue • Při volném HW později: netif _wake_queue Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 11/14 Úkol „Odesílání" paketů O Doplňte kód pro odesílání (start_xmit) • Vypište obsah paketu (print_hex_dump) » Uvolněte skb (dev_kf ree_skb) O Vložte modul do systému O Pusťte Si arping O Pozorujte dmesg Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 12/14 Pakety Příjem z HW Např. z přerušení O skb = netdev_alloc_skb(dev, len) • len např. MTU nebo přesná velikost Q Naplnění daty z HW do skb->data o délce max. len O Nastavení skb->ien • skb->len < len O Nastavení protokolu o skb->protocol = eth_type_trans(skb, dev) O Předání skb jádru • netif_rx(skb) • Jádro skb uvolní Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 13/14 Úkol „Příjem" paketů O Emulujte příjem paketů • V open nastavte periodický časovač • Časovač zrušte ve stop o V časovači volejte netif _rx s paketem z pbl73/l2/ o Inkrementujte o 1 v paketu 24. znak O Vložte modul do systému O Spusťte tcpdump -ni na eth rozhraní Jiri Slabý (Fakulta informatiky, MU) PB173/02 9.12.2014 14/14