Протоколы Internet


Сетевые драйверы - часть 10


/p>


access:

mov ah, 2

 

 

mov al, ch

; установка класса; здесь предполагается, что содержимое регистров соответствует тому, что получено в результате обращения к driver_info

 

mov bx, dx

; устанавливаем параметр type

 

mov dl, cl

; устанавливаем параметр number, при одном интерфейсе number=0

 

xor cx, cx

; длина type равна нулю

 

push cs

; устанавливаем сегментный регистр receiver

 

pop es

 

 

mov di, offset RECEIVER

; вызов подпрограммы receiver

 

call int_pkt

; обращение к пакетному драйверу

В случае ошибки флаг carry=1, а в регистр DH заносится код ошибки. Возможные ошибки:

2

NO_CLASS не найдено интерфейса указанного класса;

3

NO_TYPE не найдено интерфейса указанного типа;

4

NO_NUMBER не найдено интерфейса с указанным номером;

5

BAD_TYPE специфицирован неправильный тип пакета;

9

NO_SPACE недостаточно места в памяти;

10

TYPE_INUSE было обращение к данному типу и он пока занят.

При успешном выполнении запроса флаг carry=0, а в регистр AX занесен указатель (handle).

Обращение к приемнику (receiver):

(*receiver)(handle, flag, len [, buffer])

int handle;

BX

; указатель

int flag;

AX

; флаг вызова(0/1)

unsigned len;

CX

; целое без знака - длина пакета

if AX == 1,

char far *buffer;

DS:SI

; адрес буфера

Если параметр typelen равен нулю, прикладной процесс готов получать все пакеты. Очень важно, чтобы при первом обращении к receiver (AX==0) CX (длина пакета) была указана правильно, что позволит выделить нужное место в памяти. CX должна включать в себя длину MAC-заголовка и размер самого сообщения без контрольной суммы (CRC). Повторный вызов (AX==1) программы receiver указывает на то,что пакет записан в буфер и прикладная программа может с ним работать. Адрес буфера будет указан в регистрах DS:SI.

3. Завершение доступа пакетов данного типа release_type

int release_type(handle) AH == 3;

код запроса int handle;




Начало  Назад  Вперед