Читаем Операционная система UNIX полностью

Системный вызовЗначениеЗапрос
close(2)Прекратить обмен даннымиPRU_ABORT
accept(2)Обработать запрос на установление связиPRU_ACCEPT
bind(2)Связать сокет с адресомPRU_BIND
connect(2)Установить связьPRU_CONNECT
listen(2)Разрешить обслуживание запросовPRU_LISTEN
send(2), sendto(2)Отправить данныеPRU_SEND
fstat(2)Определить состояние сокетаPRU_SENSE
getsockname(2)Получить адрес локального сокетаPRU_SOCKADDR
getpeername(2)Получить адрес удаленного сокетаPRU_PEERADDR
ioctl(2)Передать команду модулю протоколаPRU_CONTROL

Функции pr_input() и pr_output() определяют интерфейс взаимодействия протокол-протокол и служат для передачи данных между модулями соседних уровней. Аналогично для обмена управляющими командами между модулями протоколов используются функции pr_ctlinput() и pr_ctloutput(). Цепочка взаимодействующих протоколов производит размещение и освобождение памяти при обмене сообщениями, которые передаются посредством рассмотренных структур mbuf: при передаче сообщений от сети прикладному процессу за освобождение буферов mbuf отвечает модуль верхнего уровня и наоборот, при передаче сообщений в сеть память, занимаемая сообщением, освобождается на самом нижнем уровне.

Поле pr_flags определяет некоторые характеристики протокола и режим его функционирования, которые в основном относятся к уровню сокетов. Например, протоколы, предусматривающие предварительное установление связи, указывают это с помощью флага PR_CONNREQUIRED, не позволяя тем самым функциям сокета передавать данные модулю до создания виртуального канала. Если установлен флаг PR_WANTRCVD, соответствующие функции сокета будут уведомлять модуль протокола, когда прикладной процесс получает данные из буфера приема. Это может служить сигналом протоколу для отправления подтверждения о получении, а также для обновления значения окна в соответствии с освободившимся местом.

Заметим, что каждый модуль протокола имеет собственные очереди сообщений, используемые для приема и передачи данных.

Каждый сетевой интерфейс системы представлен структурой данных, показанной на рис. 6.23. Сетевой интерфейс обычно связан с соответствующим сетевым адаптером, хотя это не является обязательным условием. Например, внутренний сетевой интерфейс loopback представляет собой псевдоустройство, используемое для унифицированного взаимодействия сетевых процессов в рамках одного хоста, отладки и т.п.

Рис. 6.23. Сетевой интерфейс

Решение об использовании того или иного сетевого интерфейса для передачи сообщения базируется на таблице маршрутизации и производится модулем сетевого уровня. Интерфейс может обслуживать протоколы различных коммуникационных доменов. Соответственно, один и тот же интерфейс может иметь несколько адресов, определенных для каждого семейства протоколов. Структуры, определяющие локальный и широковещательный (broadcast) адреса интерфейса, а также сетевую маску, хранятся в виде связанного списка.

Каждый сетевой интерфейс имеет очередь, в которую помещаются сообщения для последующей передачи, выполняемой функцией if_output(). Интерфейс также может определить процедуры инициализации if_init(), сброса if_reset() и обработки таймера if_watchdog(). Последняя может использоваться для управления потенциально ненадежными устройствами или для периодического сбора статистики устройства.

Состояние интерфейса характеризуется флагами, хранящимися в поле if_flags. Возможные флаги приведены в табл. 6.8.

Таблица 6.8. Состояния интерфейса

ФлагЗначение
IFF_UPИнтерфейс доступен для использования
IFF_BROADCASTИнтерфейс поддерживает широковещательные адреса
IFF_MULTICASTИнтерфейс поддерживает групповые адреса
IFF_DEBUGИнтерфейс обеспечивает возможность отладки
IFF_LOOPBACKПрограммный внутренний интерфейс
IFF_POINTOPOINTИнтерфейс для канала точка-точка
IFF RUNNINGРесурсы интерфейса успешно размещены
IFF_NOARPИнтерфейс не использует протокол трансляции адреса
Перейти на страницу:

Похожие книги