Packet driver je typ ovladače síťového adaptéru, který poskytuje společné softwarové rozhraní pro přístup k linkové vrstvě OSI modelu, tedy k přímému generování a zachycování rámců. Důležité je, že společné softwarové rozhraní umožňuje odhlédnout od konkrétních hardwarových detailů způsobu ovládání jednotlivých síťových adaptérů, takže vyšší vrstvy již nejsou (nebo jen velmi málo) závislé na typu sítě, výrobci a modelu použitých síťových adaptérů.
Paketových driverů bylo poprvé v použito v programech firmy FTP Software a staly se velmi populární zejména z těchto důvodů:
Paketový driver umožňuje sdílení síťového interface více aplikacemi. Síťový interface je zde identifikován trojicí <třída,typ,číslo_interface> . Třída definuje typ sítě (DIX Ethernet, 802.3 Ethernet, X.25, Serial Line atd., viz specifikace Packet Driver Interface). Typ určuje konkrétní model adaptéru v rámci dané třídy. Čísla typů příděluje výrobcům firma FTP Software.
Číslo interface se během vývoje normy stalo nadbytečným, jak bude blíže vysvětleno později.
Rozeberme nyní ve stručnosti nejvýznamnější funkce, které paketový driver poskytuje a způsob komunikace aplikačního software s ním. Detailní popis je možné nalézt v Packet Driver Specification v. 1.11 .
Mechanismus volání služeb paketového driveru je obdobný jako u jiných typů driverů - prostřednictvím vektoru přerušení, který ukazuje na společný vstupní bod pro všechny služby. Číslo služby je určováno obsahem registru AH, význam obsahů zbývajících registrů je dán parametry, které jednotlivé služby očekávají. Volání funkce tedy aplikační program provede tak, že připraví parametry do registrů a vyvolá odpovídající softwarové přerušení. Po návratu je obsah registrů změnen podle výsledků služby. Chybový stav je indikován nastavením příznaku CARRY.
Vektor přerušení, pomocí něhož hodlá aplikace s paketovým driverem komunikovat, se určuje při jeho zavádění. U většiny implementací se předpokládá interval možných vektorů od 0x60 do 0x90.
Množina služeb poskytovaných driverem není sice přiliš rozsáhlá, avšak pro daný účel zcela postačující. Mimo funkcí informačních (driver_info(), get_parameters(), get_address()) je k dispozici služba pro vyslání paketu (send_pkt()) a pro registraci zájmu o určitý typ paketu (access_type()). Registrace spočívá v zadání hodnoty identifikátoru typu rámce, na kterou mají být přijímané rámce testovány a v případě shody posílány obslužné rutině. Například v případě DIX Ethernetu je srovnávacím kritériem pro demultiplexaci paketu hodnota pole type. Poznamenejme, že např. implementace Windows Sockets registrují zájem nejméně o dva typy rámců - ty, které nesou IP paket a rámce protokolu ARP. Protože způsob zpracování obou typů paketů je odlišný, jsou tyto samozřejmě předávány různým obslužným rutinám. Aplikace si může sama určovat, zda hodlá přijímat pouze rámce směřované přímo na její MAC adresu, nebo i broadcasty, multicasty či dokonce monitorovat celý provoz na síti bez ohledu na to, komu jsou procházející rámce určeny (tzv. promiscuous mode).
Novější verze specifikace dále zahrnují i asynchronní verze vysílání paketů (na odeslání se nečeká, vysílající je o okamžiku odeslání informován přerušením) a využití multicastingu. Určitou nevýhodou specifikace paketového driveru je to, že nepředpokládá spolupráci s více síťovými adaptéry současně. Je tomu tak přesto, že prvotní verze normy pracovaly s pojmem "číslo interface", avšak to nebylo v implementacích nikdy zahrnuto. Norma navrhuje řešit tento problém zavedení více paketových driverů pro jednotliví síťové adaptéry současně s tím, že pro každý z nich bude použito odlišného vektoru přerušení.
Poznamenejme, že zde uvedená jména funkcí jsou pouze symbolická, jelikož přístup k nim se děje pomocí softwarového přerušení a funkce je určena hodnotou příslušného registru.
handle=access_type(type*,type_len,void(*isr)()); ; ... od teto chvile bude pri kazdem prijeti ramce s prislusnym typem vyvolana rutina ISR ; (je-li type_len==0: vsechny typy) ; ;... jestlize dale ramce urciteho typu nechceme zachycovat: release_type(handle); ; ... coz se NESMI pred ukoncenim programu zapomenout ! ; (jinak by se skakalo na adresu s nedefinovanym obsahem)
Při přijetí rámce požadovaného typu se rutina přerušení volá dvakrát. Poprvé je aplikace informována, že je k dispozici rámec a je požadána, aby poskytla buffer určené délky pro jeho nakopírování. Jako přídavný parametr je zde ukazatel na "lookahead buffer", kde aplikace může do části rámce předem nahlédnout. Po návratu z rutiny provede packet driver překopírování rámce do poskytnutého bufferu a volá obslužnou rutinu podruhé, čimž informuje o předání rámce. Novější verze driverů také dovolují aplikaci stanovit, jak velká část rámce má být do bufferu nakopírována.
Je užitečné upozornit, že většina packet driverů není reentrantních.
Funkcí set_recv_mode() lze stanovit, zda mají být přijímány pouze rámce určené příslušnému adaptéru, boradcasty, multicasty či veškeré rámce včetně rámců pro jiné stanice. Režim lze zpětně přečíst funkcí get_recv_mode() .
Handle vrácený z access_type je požadován i některými (nesouvisejícími) funkcemi
struct param { unsigned char major_rev; /* Revision of Packet Driver spec */ unsigned char minor_rev; /* this driver conforms to. */ unsigned char length; /* Length of structure in bytes */ unsigned char addr_len; /* Length of a MAC-layer address */ unsigned short mtu; /* MTU, including MAC headers */ unsigned short multicast_aval; /* Buffer size for multicast addr */ unsigned short rcv_bufs; /* (# of back-to-back MTU rcvs) - 1 */ unsigned short xmt_bufs; /* (# of successive xmits) - 1 */ unsigned short int_num; /* Interrupt # to hook for post-EOI processing (0=none) */ };get_statistics():
struct statistics { unsigned long packets_in; /* Totals across all handles */ unsigned long packets_out; unsigned long bytes_in; /* Including MAC headers */ unsigned long bytes_out; unsigned long errors_in; /* Totals across all error types */ unsigned long errors_out; unsigned long packets_lost; /* No buffer from receiver(), card out of resources, etc.*/ };
Konfigurační parametry paketového driveru se zadávají zpravidla na příkazové řádce při jeho zavádění a musí být uvedeny v souladu s fyzickým nastavením komunikačního zařízení. U síťových adaptérů se nastavuje číslo přerušení, umístění karty v I/O prostoru a měkdy i oblast paměťového prostoru, do něhož mohou být namapovány buffery.
Packet driver je koncipován pro prostředí DOS; má-li být použit v prostředí MS-Windows (nejvyšší verze připadající v úvahu je 3.1), musí být "virtualizován" pro současné použití více VDM pomocí modulu WINPKT. Virtualizace spočívá zejména v dynamickém přemapovávání bufferů poskytovaných aplikacemi z adresového prostoru příslušné aplikace do oblasti pod 1 MB, kde jedině jsou dostupné paketovému ovladači běžícímu v reálném režimui. Podobně je nutné zajistit naplánování správné aplikace, když packet driver informuje o příchodu rámce vyvoláním obslužné rutiny přerušení.