Packet Driver

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 .

Přístup ke službám packet driveru

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.

Služby packet driveru

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.

Nalezení packet driveru v paměti

Projít vektory 0x20-0xFF, na adrese, kam vektor ukazuje + 3 (za instrukcí JMP) je text "PKT DRVR"

Žádost o zachytávání rámců s určitým protokolem. Rutina přerušení

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

Vyslání rámce

Funkce send_pkt() očekává ukazatel na buffer a jeho délku. V bufferu musí být připraven rámec celý, včetně informací MAC (a LLC) vrstvy. Jde tedy přinejmenším o adresy cíle a zdroje, pole typu/délky a data. CRC přidává síťový adaptér nebo jeho ovladač.

Pomocné funkce

get_address(), [ set_address() ]
reset_interface() - uvedení ovladače do definovaného stavu, zruší přenosy, vyprázdní multicast list, nastaví implicitní adresu

Úroveň funkcí poskytovaných packet driverem

Specifikace definuje 4 třídy úrovní implementace, které mohou packet drivery poskytovat. Jedná se o to, jak široká množina funkcí je k dispozici. V tomto textu se odkazujeme na základní úroveň. Úroveň funkčnosti lze zjistit funkcí driver_info() .

Asynchronní funkce

as_send_pkt(struct iocb) asyncronní vyslání rámce. Adresa a délka je součástí struktury, stejně jako kód informující o ukončení a volitelně adresa rutiny, která má být při ukončení vyvolána. Požadavek lze zrušit před dokončením funkcí drop_pkt(struct iocb).

Definice multicast adres adaptéru

Lze zadefinovat, které multicast adresy mají být síťovým adaptérem akceptovány (set_multicast_list(), get_multicast_list()).

Zjišťování informací a statistik

driver_info() - vrací class, type, interface number, name, version, functionality
get_parameters():
  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.*/
  };

Konfigurace paketového driveru

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 a MS-Windows

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í.

Příklad komunikace s využitím paketového driveru

Prostředí: DOS; jazyk: C a assembler; Překladač: Borland C++ 3.1

pktfunc.h Funkce packet driveru - header
pktfunc.cpp "Obalení" funkcí packet driveru - C funkce
packet.cpp "Ukázkový program (Talk pomocí packet driveru)

Užitečné packet drivery

slip8250.com Packet driver využívající UART 8250. (zapojení kabelu RS232)
pktnull.com "Null" packet driver (pro ladění vyšších vrstev bez přítomnosti síťového adaptéru)