Телекоммуникационные технологии. Том 1

       

Сетевые драйверы


Семёнов Ю.А. (ГНЦ ИТЭФ), book.itep.ru

Читатели, знакомые с телекоммуникационными протоколами, могут заинтересоваться тем, как писать прикладные программы для работы с пакетами. Прикладная программа взаимодействует с драйвером сетевого интерфейса. Ethernet-интерфейс, как и всякий другой, содержит несколько статусных управляющих регистров (CSR) и один или несколько регистров данных. Запись (чтение) в эти регистры выполняется в IBM/PC с помощью команд IN (OUT). Каждому регистру ставится в соответствие определенный номер порта. Блок номеров портов задается с помощью переключателей на интерфейсе или в процессе постановки пакетного драйвера. В последнем случае в AUTOEXEC-файле должна присутствовать строка, например (для DOS):

NE2000 0x60 0x5 0x300, (если ваша ЭВМ снабжена интерфейсом типа NE2000).

Здесь предполагается, что интерфейс будет использовать номер прерывания 0x60, аппаратное прерывание 0x5 и блок портов, начиная с шестнадцатеричного адреса 0x300 (io_addr). Следует иметь в виду, что разные интерфейсы могут иметь разное число CSR-регистров и отличные от приведенных ниже функции (NE2100). Интерфейс характеризуется тремя целыми числами: класс (8 бит), тип (16 бит) и номер. Класс говорит о том, для какой из сетевых сред предназначен данный прибор (PPP, DIX Ethernet, IEEE 802.3, IEEE 802.5, Pronet-10, Appletalk и т.д.). Тип описывает конкретную реализацию интерфейса (NE2000, NI5210, 3C501 и т.д.). Тип 0xffff соответствует всем интерфейсам данного класса. В случае, когда ЭВМ оснащена более чем одним интерфейсом идентичного типа, для их идентификации используется номер. На рис. 7.2.1 показана структура управляющего (CSR) регистра сетевого интерфейса. В таблице 7.2.1 приведен перечень основных классов с примерами определенных типов интерфейсов.

Рис. 7.2.1.А Структура CSR-регистра интерфейса (CSR0)

Initинициализация (initialize);
Strtстарт;
Stopстоп;
Tdndзапрос передачи (transmit demand);
Txonвключение передачи;
Rxonвключение приема;
Ineaразрешение прерываний (interrupt enable);
Intrпрерывание;
Idonинициализация выполнена (стирание записью 1);
Tintпрерывание при передаче (стирание записью 1);
Rintпрерывание при чтении (стирание записью 1);
Merrошибка при тайм-ауте на шине (стирание записью 1);
Missнет буфера для приема (стирание записью 1);
Cerrошибка из-за столкновения (стирание записью 1);
Lablтайм-аут при передаче (стирание записью 1);
Errошибка типа Babl, Cerr, Miss, Merr (только для чтения).


CSR1 (доступ разрешен при CSR0[stop] = 1)



Рис. 7.2.1.Б. CSR1

CSR2 (доступ разрешен при CSR0[stop] = 1)



Рис. 7.2.1В. CSR2
Bcon0 = <0:7> перестановка байтов адресов
Acon0 = ale, 1 = /as
Bswp0 = /bm1, bm0, /hold;


csr3 (доступ разрешен при CSR0[stop] = 1)



Рис. 7.2.1.Г. CSR3

Таблица 7.2.1.
Сетевая средаКлассФирма, интерфейсТип интерфейса
dec/intel/Xerox13com 3C500/3C5011
"Bluebook" ethernet3com 3C5052
Interlan NI50103
Micom-Interlan NP6006
Ungermann-bass PC-nic8
Univation NC-5169
TRW PC-200010
Interlan NI521011
3com 3C50312
3com 3C52313
Western digital WD800314
Spider systems S415
Torus frame level16
10net communications17
Gateway PC-bus18
Gateway at-bus19
Gateway MCA-bus20
IMC PCnic21
1IMC PCnic II22
Micromatic research25
Clarkson "multiplexor"26
D-link 16-bit28
D-link ps/229
Research machines 1631
Research machines MCA32
Interlan NI921034
Interlan NI651035
Novell NE200036
Allied telesis pc/xt/at38
Allied telesis NEC PC-9839
Ungermann-bass NIC/PS241
Tiara lancard/E AT42
Tiara Lancard/E MC43
Tiara Lancard/E TP44
AT&T Starlan NAU47
AT&T Starlan-10 NAU48
AT&T Ethernet NAU49
Pronet-102Proteon P13001
Proteon P18002


IEEE 802.5/pronet-4
IBM Token Ring интерфейс
3Proteon P13402
Proteon P13443
Gateway PC-bus4
Gateway AT-bus5
Gateway MCA-bus6
Omninet4  
Appletalk5  
Последовательный интерфейс6Clarkson 8250-slip1
Clarkson "multiplexor"2
Starlan7  
Arcnet8Datapoint RIM1
AX.259  
KISS10  
IEEE 802.3 w/802.2 HDRS11  
FDDI W/802.2 HDRS12  
Internet X.2513Western Digital1
N.T. Lanstar (encap. dix)14NT Lanstar/81
NT Lanstar/mc2
SLFP15  
Netrom16  
Nclass17  
Любой пакетный драйвер имеет блок исходных данных (MS-DOS), напр.:
EADDR_LENequ 6 ; длина физического адреса
init_blockstruc  
init_modedw0 
init_addrdbeaddr_len dup(?); ethernet-адрес
init_filterdb8 dup(0); Логический адресный фильтр (multicast filter).
init_receivedw?,?; Указатель входного кольцевого буфера
init_transmitdw?,?; Указатель выходного кольцевого буфера.
init_blockends  


Структура переменных init_mode (смещение = 0) имеет вид



Рис. 7.2.2. Структура переменных init_mode
Drxзапрет приема;
Dtxзапрет передачи;
Loopцикл;
Dtcrзапрет передачи crc;
Collстолкновение;
Drtyзапрет повторов;
Intlвнутренний цикл;
Promрежим приема всех пакетов (promiscuous mode).
Кольцевой входной буфер имеет следующую структуру:
rcv_msg_dscpstruc
rd_addrdw ?; Младшая часть адреса входного буфера
rd_statdw ?; Статусная часть + старшая часть адреса
rd_bcntdw ?; Размер буфера в байтах
rd_mcntdw ?; Длина сообщения в байтах
rcv_msg_dscpends
Структура переменных rd_stat имеет вид



Рис. 7.2.3. Структура переменных rd_stat
Enpконец пакета;
Stpначало пакета;
Buffошибка в буфере;
CRCCRC-ошибка;
Ofloпереполнение буфера;
Framошибка при записи в буфер;
Errналичие ошибки;
Own0 = полное заполнение.
Выходной буфер имеет сходную структуру.

Я не буду описывать здесь то, как следует писать системные драйверы (Исчерпывающую информацию по написанию таких драйверов читатель может найти в книге "Написание драйверов для MS-DOS" Р.Лея и "Уэйт Груп", Москва "Мир", 1995), тем более что существует достаточное их количество в депозитариях общего доступа (Например, анонимное FTP по адресам ftp.funet.fi, ftp.switch.ch или oak.oakland.edu, депозитарий SimTel ). Приведенное выше описание регистров интерфейса не является единственно возможным (см. также руководство по сетевому контроллеру 8390 и файл NE2.ASM из ссылки ftp.funet.fi. Структура драйверов варьируется для разных операционных систем. Для системных программистов полезно иметь возможность настраивать драйвер или непосредственно интерфейс на определенный режим, например, на прием всех пакетов, проходящих по кабельному сегменту. Последнее может представлять интерес в диагностических целях, так как вслед за пакетным драйвером загружается Etherdrv, Winsock или winpkt и т.д., блокирующие режим приема всех пакетов (mode=6). Ниже приведен пример описания основных параметров драйвера:
BLUEBOOKequ1 
IEEE8023equ11 
ADDR_LENequ6; размер Ethernet-адреса
MAX_M_CASTequ8; максимальное число мультикаст-адресов.


Publicint_no,io_addr 
int_nodb2,0,0,0; должно иметь 4 байта для get_number.
io_addrdw0300h,0; I/O адрес карты (переключатели)
publicdriver_classdriver_type,driver_name,driver_function,parameter_list
driver_classdbBLUEBOOK, IEEE8023, 0; из спецификации интерфейса
driver_typedw54; из спецификации интерфейса
driver_namedb'NE2000',0; имя драйвера.
driver_functiondb2 
parameter_listlabelbyte 
 db1;
 db9;
 db14; длина списка параметров в байтах
 dbADDR_LEN; длина адреса MAC-уровня в байтах
 dwGIANT; MTU, включая MAC-заголовок
 dwMAX_M_CAST * ADDR_LEN 
; размер буфера для мультикаст-адресов
 dw0;(# принимаемых подряд пакетов с; размером MTU) - 1
 dw0; (# посылаемых подряд пакетов) - 1
int_numdw0; Номер прерывания
Работа с пакетным драйвером в MS-DOS

Существует множество пакетных драйверов. Можно обнаружить несколько модификаций для одного и того же типа интерфейса. Эти драйверы могут быть ориентированы на работу в разных программных средах (Novell, UNIX, MS-DOS и т.д.) и иметь разные возможности. Для MS-DOS сложился неофициальный стандарт, который позволяет использовать драйвер для самых разных приложений. Драйвер может использовать минимум возможностей интерфейса (базовый уровень), реализовать более широкий набор функций (мультикастинг, сбор статистики и т.д.) или поддерживать практически все, на что способен данный прибор. В последнем случае он занимает больше места в памяти. Описания операций с пакетными драйверами, приведенные ниже, выполнены в нотации ассемблера IBM/PC. При написании программы следует помнить, что порядок байтов в Ethernet противоположен тому, который используется в вашей IBM/PC.

Пакетные драйверы используют программные прерывания в интервале 0x60 - 0x80. Следует сразу заметить, что не все прерывания из этого списка свободны и при конфигурировании системы следует проявлять осмотрительность. Для того чтобы избежать конфликтов с другими внешними устройствами, предусматривается возможность реконфигурации прерываний.


Предполагается, что программа обработки прерываний начинается с команды безусловной передачи управления (JMP), за которой следует текстовая строка "PKT DRVR". Именно эта строка служит указателем при поиске адреса пакетного прерывания. Практически все драйверы могут работать с различными протоколами (TCP/IP, OSI и др.). Решить задачу мультиплексирования на связном уровне помогает процедура access_type, которая обеспечивает доступ для пакетов определенного типа.

Все функции реализуются с помощью обращения к драйверу с набором определенных параметров. При этом значение регистра AH определяет тип запроса. Каждому типу используемого сетевого протокола, с которым работает интерфейс, ставится в соответствие целочисленный указатель (handle), получаемый с помощью процедуры access_type. Выполнимость драйвером тех или иных операций может быть выяснена с помощью запроса driver_info.

При работе с драйвером следует проявлять осторожность и спасать нужные вам регистры. Следует также помнить, что порядок байтов в PC и в некоторых сетях, включая Ethernet, не совпадает. Описание основных запросов, посылаемых пакетному драйверу:


Содержание раздела