PB173 - Ovladače jádra - Linux XII. Síťové rozhraní Jiri Slabý Fakulta informatiky Masarykova univerzita 6. 12. 2016 Jiri Slabý (Fakulta informatiky, MU) PB173/04 6. 12. 2016 1 /14 Síťové rozhraní LDD3 kap. 17 • Ovladač pro ethX Jiri Slabý (Fakulta informatiky, MU) PB173/04 6. 12. 2016 2/14 Teoretická síťová vrstva > > User / Application Application layer Transport layer Network layer Link layer Hardware layer Firefox HTTP TCP IP Ethernet driver Ethernet Jiri Slabý (Fakulta informatiky, MU) PB173/04 6. 12. 2016 3/14 Linuxová síťová vrstva Userspace Kernelspace System call interface Protocol agnostic interface Network protocols Device agnostic interface í Device drivers Physical device hardware Jiri Slabý (Fakulta informatiky, MU) PB173/04 6. 12. 2016 4/14 Síťové rozhraní ovladače Ovladač síťové karty • Mezivrstva mezi HW a Linuxem (síťovou vrstvou) o 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 Q Alokace: alloc_netdev/}, f ree_netdev/} 9 Registrace: register_netdev, unregister_netdev • Háčky: struct net_device_ops (podobně jako znaková zařízení) Jiri Slabý (Fakulta informatiky, MU) PB173/04 6. 12. 2016 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/04 6. 12. 2016 6/14 Konkrétnější rozhraní • Místo aiioc_netdev se použije konkrétnější alloc_* • 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/04 6. 12. 2016 7/14 Vytvoření eth* Postup vytvoření ethernetového zařízení v systému O Alokace (alloc_etherdev(priv_size)) • Alokuje navíc paměť o velikosti priv_size • priv_size může být o O Inicializace informací • Nastavení háčků (net_device_ops do dev->netdev_ops) Nastavení MAC adresy (dev->dev_addr) • Získání ukazatele na paměť alokovanou navíc • Funkcínetdev_priv(dev) • Jen při alokaci s priv.size > 0 O Registrace (register.netdev) O O Deregistrace (unregister_netdev) O Uvolnění (free.netdev) Jiri Slabý (Fakulta informatiky, MU) PB173/04 6.12.2016 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řte 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 o Nelze modul odebrat Jiri Slabý (Fakulta informatiky, MU) PB173/04 6.12.2016 9/14 Pakety Tzv. socket buffery • linux/skbuff.h, struct sk_buff • Obecně:dev_alloc_skb o Pro A?eřc/ewce/netdev_alloc_skb Uvolnění: dev_kf ree_skb • Obsah: skb->data • Ukazuje na alokovanou paměť • Plní/čte se klasicky přes memcpy apod. • Délka obsahu: skb->ien • Protokol: skb->protocol • Při příjmu nutné nastavit před předáním systému! Jiri Slabý (Fakulta informatiky, MU) PB173/04 6.12.2016 10/14 Pakety Odesílání do HW skb je parametr start.xmit O Předat do HW data • skb->data O délce skb->len O Uvolnit skb • dev_kfree_skb(skb) O Vrátit stav • NETDEV_TX_OK • 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/04 6.12.2016 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 • -I vase_rozhrani nejaka_IP_adresa O Pozorujte dmesg Jiri Slabý (Fakulta informatiky MU) PB173/04 6. 12. 2016 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 o skb->len < len O Nastavení protokolu • skb->protocol = eth_type_trans(skb, dev) • Je to nutné! Q Předání skb jádru • netif_rx(skb) • Jádro skb uvolní Jiri Slabý (Fakulta informatiky, MU) PB173/04 6.12.2016 13/14 Úkol „Příjem" paketů O Emulujte příjem paketů • V open nastavte periodický časovač • Časovač zrušte ve stop • V časovači volejte netif _rx s paketem z pbi73/i2/ Inkrementujte o i 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/04 6. 12. 2016 14/14