Параметр msg является цепочкой mbuf, содержащей размер пакета для отправки, включая скелетный заголовок IP; opt является необязательным mbuf, содержащим опции IP для вставки после заголовка. Если дан маршрут он может содержать ссылку на элемент маршрутизации (структуру rtentry), который определяет маршрут до места назначения, оставшийся от предыдущего вызова, и в котором для будущего использования будет оставлен любой новый маршрут.
Мы уже видели соглашение по вызову для выходной процедуры IP, которая представляет собой:
int ip_output ( struct mbuf *msg, struct mbuf *opt, struct route *ro, int flags, struct ip_moptions *imo, struct inpcb *inp)
Поскольку в FreeBSD 5.2 из структуры inpcb были удалены копированные маршруты, этот кешированный маршрут используется редко. Поле flags может разрешить использовать широковещание или может указывать, что таблицы маршрутизации нужно игнорировать. Если выставлено поле imo, то оно включает опции для многоадресных передач. Управляющий блок протокола inp используется подсистемой IPSec для хранения данных об ассоциациях безопасности для пакета. Схема работы, выполняемой ipoutput(), следующая.
- Вставка всех IP-опций.
- Заполнение оставшихся полей заголовка (версия IP, нулевое смещение, размер заголовка и идентификация нового пакета, размер пакета), если пакет содержит псевдозаголовок IP.
- Определение маршрута (т.е. исходящего интерфейса и места назначения следующего транзитного участка).
- Проверка того, не является ли место назначения групповым адресом. Если да, определение исходящего интерфейса и числа транзитных участков.
- Проверка того, не является ли место назначения широковещательным адресом; если да, проверка того, разрешено ли широковещание.
- Выполнение всех необходимых пакету манипуляций IPSec, таких, как шифрование.
- Проверка наличия каких-нибудь правил фильтрования, которые изменили бы пакет или предотвратили его отправку.
- Если размер пакета не больше максимального размера пакета для исходящего интерфейса, вычисление контрольной суммы и вызов выходной процедуры интерфейса.
- Если размер пакета больше максимального размера пакета для исходящего интерфейса, разделение пакета на фрагменты и поочередная их отправка.
Шаг маршрутизации мы рассмотрим более подробно. Во-первых, если в качестве параметра не передано ссылки на маршрут, временно используется внутренняя структура для ссылки маршрутизации. Структура маршрута, которая передается от вызывающего, проверяется на предмет того, что это маршрут до того самого места назначения и что он по-прежнему действителен. Если любая из этих проверок неудачна, старый маршрут освобождается. После этих проверок, если маршрута нет, вызывается rtalloc_ign() для назначения маршрута.
Возвращенный маршрут включает указатель на исходящий интерфейс. Информация интерфейса включает максимальный размер пакета, флаги, включая возможности широковещания и многоадресной рассылки, и процедуру вывода. Если маршрут помечен флагом RTFGATEWAY, адрес маршрутизатора следующего транзитного участка дан в маршруте; в противном случае место назначения пакета является местом назначения следующего транзитного участка.
Если маршрутизацию следует проигнорировать из-за опции MSGDONTROUTE или опции SODONTROUTE, в этом случае находится непосредственно подсоединенная сеть, в которой находится место назначения; если непосредственно подсоединенной сети нет, возвращается ошибка. После обнаружения исходящего интерфейса и места назначения следующего транзитного участка для отправки пакета информации достаточно.
Выходная процедура интерфейса обычно проверяет адрес назначения и помещает пакет в выходную очередь, возвращая ошибку лишь если интерфейс выключен, выходная очередь заполнена или непонятен адрес назначения.
- 19/01/2010 14:04 - Таймеры. TCP Timer.
- 17/01/2010 12:06 - Алгоритмы TCP. Состояние соединения.
- 16/01/2010 11:38 - Отметка времени. Номер последовательности. Переменные последовательности
- 16/01/2010 11:25 - SYN. Состояния ТСР-соединения
- 16/01/2010 11:08 - TCP - Протокол управления передачей
- 16/01/2010 10:40 - Протокол Интернета IP (ШЗ)
- 15/01/2010 17:34 - Управляющие операции
- 15/01/2010 17:07 - Вывод и ввод UDP. Блок протокола.
- 14/01/2010 18:56 - UDP. Протокол пользовательских дейтаграмм
- 14/01/2010 11:41 - Управляющие блоки протоколов