Протоколы Internet



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


/p>

NOBAD:

MOV AX, 1FFH

; Запрашиваем информацию о драйвере

MOV BX, _PARAM.HANDLES

; Устанавливаем указатель

call INT_PKT

JNC N_BAD

MOV _PARAM.ER_CODE, 272

; Ошибка при получении информации о драйвере

POP DS

JMP OKAY

N_BAD:

PUSH DS

PUSH SS

&nsp;

POP DS

MOV ES, SAFE

MOV _PARAM.L1, BX

; Версия драйвера

MOV _PARAM.L2, CX

; номер/класс

MOV _PARAM.L3, DX

; Тип

MOV _PARAM.L4, AX

; Функциональность

LEA BX, _PARAM._NAME

POP DS

MOV CX, 8

ZFIND:

CMP byte ptr [SI], 0

MOV AL, byte ptr [SI]

MOV byte ptr ES:[BX], AL

JE ZERO_

INC SI

INC BX

LOOP ZFIND

ZERO_:

POP DS

MOV AH, 21

; Запрашиваем код режима приема пакетов

MOV BX, _PARAM.HANDLES

call INT_PKT

MOV _PARAM.MODE, AX

; Записываем код режима

.........................

OKAY:

POP DS

POP ES

POP DI

POP SI

MOV SP, BP

POP BP

RET

RECEIVER:

; Подпрограмма RECEIVER, вызываемая при получении пакета

OR AX, AX

; Первый или второй вызов?

JNE RECV

MOV AX, seg _Q.beg

; Указатель буфера ES:DI

MOV ES, AX

MOV DI, offset _Q.beg

RECV:

RETF

2. Организация доступа для пакетов данного типа

access_type(if_class, if_type, if_number, type, typelen, receiver)

AH ==2 (код запроса)

Запрос access_type инициализирует доступ для пакетов определенного типа (type). Аргумент typelen – длина спецификации типа в байтах, для PC/TCP равна 5 (наименьшее значение - 2, для IP и ARP). Аргумент receiver является указателем на подпрограмму, которая вызывается при приеме пакета. Получая пакет, драйвер дважды обращается к этой программе. Первый раз (при AX==0) это делается с целью получения адреса буфера, куда должен быть положен пакет. Прикладная программа в этом случае должна выдать указатель буфера в регистры ES:DI. Если прикладной процесс не имеет свободного буфера,то возвращается значение 0:0. Пакет выбрасывается и повторное обращение к программе receiver отменяется. Форма реализации запроса аналогична приведенному для driver_info:

Int

if_class; AL

; класс интерфейса

Int

if_type; BX

; тип интерфейса

Int

if_number; DL

; номер интерфейса

Char

far *type; DS:SI

Unsigned

typelen; CX

Int

(far *receiver); ES:DI

<


Содержание  Назад  Вперед