Любой пакетный драйвер имеет блок исходных данных (MS-DOS), напр.:
EADDR_LEN |
equ 6 |
; длина физического адреса |
|
init_block |
struc |
||
init_mode |
dw |
0 |
|
init_addr |
db |
eaddr_len dup(?) |
; ethernet-адрес |
init_filter |
db |
8 dup(0) |
; Логический адресный фильтр (multicast filter). |
init_receive |
dw |
?,? |
; Указатель входного кольцевого буфера |
init_transmit |
dw |
?,? |
; Указатель выходного кольцевого буфера. |
init_block |
ends |
Структура переменных init_mode (смещение = 0) имеет вид
Рис. 7.2.2. Структура переменных init_mode
Drx |
запрет приема; |
Dtx |
запрет передачи; |
Loop |
цикл; |
Dtcr |
запрет передачи crc; |
Coll |
столкновение; |
Drty |
запрет повторов; |
Intl |
внутренний цикл; |
Prom |
режим приема всех пакетов (promiscuous mode). |
Кольцевой входной буфер имеет следующую структуру:
rcv_msg_dscp |
struc |
|
rd_addr |
dw ? |
; Младшая часть адреса входного буфера |
rd_stat |
dw ? |
; Статусная часть + старшая часть адреса |
rd_bcnt |
dw ? |
; Размер буфера в байтах |
rd_mcnt |
dw ? |
; Длина сообщения в байтах |
rcv_msg_dscp |
ends |
Структура переменных rd_stat имеет вид
Рис. 7.2.3. Структура переменных rd_stat
Enp |
конец пакета; |
Stp |
начало пакета; |
Buff |
ошибка в буфере; |
CRC |
CRC-ошибка; |
Oflo |
переполнение буфера; |
Fram |
ошибка при записи в буфер; |
Err |
наличие ошибки; |
Own |
0 = полное заполнение. |
Выходной буфер имеет сходную структуру.
Я не буду описывать здесь то, как следует писать системные драйверы (Исчерпывающую информацию по написанию таких драйверов читатель может найти в книге "Написание драйверов для 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). Ниже приведен пример описания основных параметров драйвера:
BLUEBOOK |
equ |
1 |
|
IEEE8023 |
equ |
11 |
|
ADDR_LEN |
equ |
6 |
; размер Ethernet-адреса |
MAX_M_CAST |
equ |
8 |
; максимальное число мультикаст-адресов. |