ip - реализация протокола IPv4 в Linux
НАЗВАНИЕip - реализация протокола IPv4 в Linux
СИНТАКСИС
#include
#include
tcp_socket = socket(PF_INET, SOCK_STREAM, 0);
raw_socket = socket(PF_INET, SOCK_RAW, protocol);
udp_socket = socket(PF_INET, SOCK_DGRAM, protocol);
ОПИСАНИЕ
В Linux реализован интернет-протокол (Internet Protocol)
версии #4, описанный в RFC791 и RFC1122. ip реализует
многоканальную циркулярную рассылку сообщений (multicast-
ing) 2-ого уровня в соответствии с RFC1112. Кроме того,
имеется маршрутизатор IP, содержащий фильтр пакетов.
Программный интерфейс совместим с BSD-сокетами.
Дополнительная информация находится в socket(7).
IP-сокет создается путем вызова функции socket(2) в виде
socket(PF_INET, socket_type, protocol). Возможные типы
сокетов: SOCK_STREAM для открытия сокета tcp(7),
SOCK_DGRAM для открытия сокета udp(7) или SOCK_RAW для
открытия сокета raw(7),предназначенногодля
непосредственного доступа к протоколу IP. protocol - это
протокол, указанный в заголовке IP, для передачи или
приема данных. Единственными возможными значением для
protocol являются 0 и IPPROTO_TCP (для сокетов TCP), 0 и
IPPROTO_UDP (для сокетов UDP). Сокету SOCK_RAW Вы можете
указать на протокол IANA IP, определенный в номерах
согласно RFC1700.
Если процесс хочет принять новые пакеты или установить
новые соединения, он должен подсоединить сокет к
локальному адресу интерфейса с помощью функции bind(2).
Только один сокет IP может быть подключен к указанной
локальной паре (адрес- порт). Если при вызове bind было
указано значение INADDR_ANY, то сокет будет присоединен ко
всем локальным интерфейсам. Если вызывается функция lis-
ten(2) или connect(2) с неподсоединенным сокетом в
качестве параметра, то сокет автоматически подсоединяется
к какому-либо свободному порту с локальным адресом
INADDR_ANY.
Локальный адрес подсоединенного сокета после закрытия
некоторое время недоступен, если только не установлен флаг
SO_REUSEADDR. Этот флаг следует использовать
осмотрительно, так как снижается надежность TCP.
ФОРМАТ АДРЕСА
Адрес IP-сокета определяется как комбинация адреса
IP-интерфейса и номера порта. Базовый протокол IP не
указывает номера портов: они реализованы протоколами более
высоких уровней, такими, как udp(7) и tcp(7). sin_port
raw-сокетов соответствует значению протокола IP
struct sockaddr_in {
sa_family_t sin_family; /* семейство адреса: AF_INET */
u_int16_t sin_port; /* порт в сетевом порядке байтов */
struct in_addr sin_addr; /* адрес интернет */
};
/* адрес Интернет. */
struct in_addr {
u_int32_t s_addr; /* адрес в сетевом порядке байтов */
};
Установленное значение sin_family всегда равно AF_INET.
Это является обязательным требованием; в Linux 2.2
большинство сетевых функций возвращают значение EINVAL,
если эта установка не произведена. sin_port содержит порт
в сетевом порядке байтов. Порты с номерами меньше 1024-х
называются зарезервированными портами. Подсоединять эти
порты с помощью bind(2) могут только процессы с
идентификатором эффективного пользователя, равным нулю,
либо имеющие возможность CAP_NET_BIND_SERVICE. Обратите
внимание, что протокол IPv4 как таковой не знаком с
портами: они реализованы протоколами более высокого
уровня, такими, как: tcp(7) и udp(7).
sin_addr - IP-адрес машины. Поле addr структуры struct
in_addr содержит адрес интерфейса машины в сетевом порядке
байтов. Доступ к in_addr должен производиться только с
помощью библиотечных функций inet_aton(3), inet_addr(3) и
inet_makeaddr(3) либо напрямую через систему определения
имен (см. gethostbyname(3)). Адреса IPv4 делятся на
однонаправленные, многонаправленные и широковещательные.
Однонаправленные определяют один интерфейс хоста,
широковещательные определяют все машины в подсети, а
многоадресные - все машины многоадресной группы.
Датаграммы могут быть посланы по широковещательному адресу
или приняты с него, только если установлен флаг сокета
SO_BROADCAST. В текущей реализации сокеты,
ориентированные на соединения, могут использовать только
однонаправленные адреса.
Обратите внимание, что адрес и порт всегда хранятся в
сетевом порядке. В частности, это означает, что Вам
необходимо вызывать htons(3) с присвоенным порту номером.
Все функции стандартной библиотеки, работающие с
адресами/портами, используют сетевой порядок байтов.
Существует несколько специальных адресов: INADDR_LOOPBACK
(127.0.0.1) всегда ссылается на локальную машину через
устройство обратной петли; INADDR_ANY (0.0.0.0) означает
любой адрес для соединения; INADDR_BROADCAST
(255.255.255.255) указывает на любую машину и оказывает на
bind тот же эффект, что INADDR_ANY.
ОПЦИИ СОКЕТОВ
IP поддерживает некоторые специфичные для протокола опции
сокета, которые могут быть установлены с помощью setsock-
opt(2) и прочитаны с помощью getsockopt(2). Уровнем опций
сокета для IP является SOL_IP. Для логических значений
ноль является ложью, все остальное - истиной.
IP_OPTIONS
Устанавливает или считывает опции IP, посылаемые в
каждом пакете из этого сокета. Аргументами являются
указатель на буфер памяти, содержащий опции, и
длина опций. Вызов setsockopt(2) устанавливает
связанные с сокетом опции IP. Максимальный размер
опции для IP - 40 байтов. Список возможных опций
приведен в RFC791. Если первоначальный пакет
запроса соединения для сокета SOCK_STREAM содержит
опции IP, то опции IP будут установлены
автоматически, в соответствии с опциями начального
пакета; заголовки маршрутизации будут обратными.
Принимаемым пакетам запрещено менять опции после
установки соединения. По умолчанию обработка всех
входящих опций маршрутизации источника отключена,
но может быть включена с помощью sysctl-вызова
accept_source_route. Другие опции, такие, как
отметки о времени, все еще обрабатываются. Для
датаграммных сокетов опции IP могут быть
установлены только локальным пользователем. Вызов
getsockopt(2) с IP_OPTIONS помещает в указанный
буфер текущие опции IP, используемые для отправки
пакетов.
IP_PKTINFO
Передает служебное сообщение IP_PKTINFO, содержащее
структуру pktinfo, предоставляющую пользователю
некоторую информацию о принимаемом пакете. Это
справедливо только для сокетов, ориентированных на
датаграммы. Параметром является флаг, который
указывает сокету, будет или нет передаваться
сообщение IP_PKTINFO. Само по себе сообщение может
быть только послано/принято как управляющее
сообщение пакетом, используя recvmsg(2) или
sendmsg(2).
struct in_pktinfo {
unsigned int ipi_ifindex; /* Индекс интерфейса */
struct in_addr ipi_spec_dst; /* Локальный адрес */
struct in_addr ipi_addr; /* Адрес назначения заголовка */
};
ipi_ifindex - уникальный индекс интерфейса,
получившего пакет. ipi_spec_dst - локальный адрес
пакета. ipi_addr - адрес назначения в заголовке
пакета. Если IP_PKTINFO передан sendmsg(2), то
исходящий пакет будет отправлен через интерфейс,
указанный в ipi_ifindex с адресом назначения
ipi_spec_dst.
IP_RECVTOS
Если опция разрешена, то с приходящими пакетами
будет передаваться служебное сообщение IP_TOS. Оно
содержит байт, указывающий поле заголовка пакета
Type of Service/Precedence. Ожидаемым значением
является целочисленный логический флаг.
IP_RECVTTL
Если этот флаг установлен, то будет передаваться
управляющее сообщение IP_RECVTTL с полем time to
live принимаемого пакета в виде байта. Hе
поддерживается, если речь идет о сокетах
SOCK_STREAM.
IP_RECVOPTS
Пользователю передаются все принимаемые опции IP с
помощью управляющего сообщения IP_OPTIONS.
Заголовок маршрутизации и другие опции локальной
машины уже заполнены. Hе поддерживается, если речь
идет о сокетах SOCK_STREAM.
IP_RETOPTS
Действует аналогично IP_RECVOPTS, но возвращает
необработанные опции с незаполненными для
последнего перехода (hop) опциями метки времени и
записи маршрута.
IP_TOS Устанавливает или принимает поле Type-Of-Service
(TOS), посылаемое с каждым пакетом, исходящим из
этого сокета. Оно используется для выявления
приоритета пакета в сети. TOS - это байт.
Определено несколько стандартных флагов TOS:
IPTOS_LOWDELAY для уменьшения задержек
интерактивного трафика, IPTOS_THROUGHPUT для
оптимизации пропускной способности, IPTOS_RELIABIL-
ITY для улучшения надежности; IPTOS_MINCOST должен
использоваться для "данных заполнителя" там, где
медленная передача данных не имеет значения. Должно
быть указано самое большее из возможных значений
TOS. Остальные биты не являются корректными и
должны быть удалены. По умолчанию Linux сначала
посылает датаграммы IPTOS_LOWDELAY , но точное
поведение зависит от того, как настроен порядок
отправки в очередь. Hекоторые высокоприоритетные
уровни могут потребовать идентификатора
эффективного пользователя, равного нулю, или
возможности CAP_NET_ADMIN. Установленный приоритет
также может не зависеть от протокола с помощью
опций сокета ( SOL_SOCKET, SO_PRIORITY ) (см
socket(7) ).
IP_TTL Установить или считать текущее поле time to live,
посылаемое в каждом пакете этого сокета.
IP_HDRINCL
Если она запущена, то пользователь перед данными
ставит заголовок IP. Это возможно только для
сокетов SOCK_RAW . Дополнительная информация
приведена в raw(7). Если этот флаг включен, то
значения IP_OPTIONS, IP_TTL и IP_TOS игнорируются.
IP_RECVERR (определено в )
Запустить расширенную надежную передачу сообщений
об ошибках. Если эта опция включена для
датаграммного сокета, то все создаваемые ошибки
будут помещаться в отдельную очередь для сокета.
Если пользователь получает ошибку операции в
сокете, то она может быть получена с помощью вызова
recvmsg(2) с установленным флагом MSG_ERRQUEUE .
Структура sock_extended_err, описывающая ошибку,
будет передана в служебном сообщении вида
IP_RECVERR и уровня SOL_IP. Это полезно для
повышения надежности обработки ошибок на
неподсоединенных сокетах. Полученные данные в
очереди ошибок содержат ошибочный пакет.
Управляющее сообщение IP_RECVERR содержит в себе
структуру sock_extended_err:
struct sock_extended_err {
u_int32_t ee_errno; /* номер ошибки */
u_int8_t ee_origin; /* источник ошибки */
u_int8_t ee_type; /* тип */
u_int8_t ee_code; /* код */
u_int8_t ee_pad;
u_int32_t ee_info; /* дополнительная информация */
u_int32_t ee_data; /* другие данные */
/* More data may follow */
};
struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
ee_errno содержит номер errno поставленной в
очередь ошибки. ee_origin - код источника ошибки.
Другие поля являются особыми полями для протокола.
Макрос SO_EE_OFFENDER возвращает указатель на адрес
объекта сети, являющегося источником ошибки,
определяя его из указателся на вспомогательное
сообщение. Если этот адрес неизвестен, то элемент
sa_family из sockaddr содержит AF_UNSPEC, а другие
поля sockaddr неопределены.
IP использует структуру sock_extended_err следующим
образом: устанавливаемое значение ee_origin
становится равным SO_EE_ORIGIN_ICMP (для ошибок,
полученных пакетом ICMP) или равным SO_EE_ORI-
GIN_LOCAL (для ошибок, возникающих локально).
Неизвестные значения должны игнорироваться.
ee_type и ee_code устанавливаются в соответствии с
полями type и code заголовка ICMP. ee_info
содержит MTU, определенный для ошибок EMSGSIZE.
Сообщение также содержит sockaddr_in узла,
вызвавшего ошибку, который может быть доступен по
макросу SO_EE_OFFENDER. Поле sin_family из адреса
SO_EE_OFFENDER равно AF_UNSPEC, если источник
ошибки неопределен. Если ошибка исходит из сети,
все опции IP ( (IP_OPTIONS, IP_TTLи т.д.),
включенные для сокета и содержащиеся в ошибочном
пакете, передаются через управляющие сообщения.
Данные пакета, вызвавшего ошибку, возвращаются как
обычные данные. Обратите внимание, что TCP не
имеет очереди ошибок; MSG_ERRQUEUE ошибочна для
сокетов SOCK_STREAM. Таким образом, все ошибки
возвращаются только с помощью возвращаемого
значения функции сокета или SO_ERROR.
Для raw-сокетов IP_RECVERR передает все принятые
ошибки ICMP-приложению, в противном случае ошибки
сообщаются лишь соединенным сокетам.
Значением опции должен быть целочисленный
логический флаг. По умолчанию IP_RECVERR отключена.
IP_PMTU_DISCOVER
Устанавливает или считывает Path MTU Discovery для
сокета. Если эта опция запущена, то Linux
производит Path MTU Discovery в этом сокете в
соответствии с RFC1191. Флаг запрета фрагментации
устанавливается для всех исходящих датаграмм.
Общесистемное значение по умолчанию определяется
sysctl-вызовом ip_no_pmtu_disc для сокетов
SOCK_STREAM, для всех остальных опция отключена. В
случае, если это другие виды сокетов, пакетирование
данных до размера MTU выполняется приложением и,
если необходимо, передача данных повторяется. Ядро
будет отвергать пакеты размеров, превышающих MTU
пути, если этот флаг установлен (с EMSGSIZE ).
Флаги Path MTU discovery Значение
IP_PMTUDISC_WANT Использовать значения каждого маршрута.
IP_PMTUDISC_DONT Hикогда не выполнять Path MTU Discovery.
IP_PMTUDISC_DO Всегда выполнять Path MTU Discovery.
Если PMTU discovery разрешено, то ядро
автоматически следит за path MTU каждой машины
назначения. При соедиении с определенной машиной
при помощи connect(2) известный в данный момент
path MTU может быть определен с помощью опции
IP_MTU сокета (например, после ошибки EMSGSIZE).
Со временем значение может меняться. Для сокетов,
редко соединяющихся с разными машинами, новый MTU
для определенного соединения может быть получен с
помощью очереди ошибок (см. IP_RECVERR). Hовая
ошибка будет внесена в очередь для каждого нового
изменения MTU.
В процессе определения MTU начальные пакеты датаграммных
сокетов могут быть отброшены. Приложения, использующие
UDP, должны принимать это во внимание и учитывать при
формировании стратегии передачи пакетов.
Для выяснения path MTU в неподключенных сокетах можно
начать с большого размера датаграммы (с размером заголовка
до 64К) а затем уменьшать его с учетом обновлений path
MTU.
Для начального подсчета path MTU соедините датаграммный
сокет с адресом назначения с помощью connect(2), а затем
выясните MTU с помошью вызова getsockopt(2) и опции
IP_MTU.
IP_MTU Считать текущий известный path MTU принадлежащим
текущему сокету. Это возможно, только если сокет
подсоединен. В результате возвращается целое число.
Является действенным, только если задан как get-
sockopt(2).
IP_ROUTER_ALERT
Передает все пакеты с установленной опцией IP
Router Alert этому сокету. Возможно только для
raw-сокетов. Это полезно, например, для демонов
пользователя RSVP. "Перехватываемые" пакеты не
перенапраляются ядром, пересылать их - дело
пользователя. Соединение (binding) сокета
игнорируется, такие пакеты фильтруются только
протоколом. Ожидаемым значением опции является
целочисленный флаг.
IP_MULTICAST_TTL
Устанавливает или считывает значение time-to-live
исходящих многоадресных пакетов для этого сокета.
Для многоадресных пакетов очень важно устанавливать
наименьшее возможное значение TTL. Значение по
умолчанию равно 1, что значит, что пакеты не
покинут локальную сеть, если только программа
пользователя специально этого не запросит.
Аргументом опции является целое число.
IP_MULTICAST_LOOP
Устанавливает или считывает логическое
целочисленное значение, определяющее, должны ли
отправленные многоадресные пакеты возвращаться в
локальные сокеты.
IP_ADD_MEMBERSHIP
Задает присоединение к многоадресной группе.
Аргументом является структура struct ip_mreqn.
struct ip_mreqn {
struct in_addr imr_multiaddr; /* IP адрес многоадресной группы */
struct in_addr imr_address; /* IP адрес локального интерфейса */
int imr_ifindex; /* индекс интерфейса */
};
imr_multiaddr содержит адрес многоадресной группы,
к которой собирается присоединиться приложение или
которую оно хочет покинуть. Этот адрес должен быть
корректным. imr_address - адрес локального
интерфейса, с помощью которого система войдет в
многоадресную группу; если он равен INADDR_ANY, то
соответствующий интерфейс выбирается системой.
imr_ifindex - индекс интерфейса, который должен
присоединиться к группе imr_multiaddr или покинуть
ее; индекс может быть нулем для любого интерфейса.
Для совместимости старая структура ip_mreq
по-прежнему поддерживается. Она отличается от
ip_mreqn только отсутствием поля imr_ifindex.
Функция действенна только в виде setsockopt(2).
IP_DROP_MEMBERSHIP
Приказывает покинуть многоадресную группу.
Аргументом является структура ip_mreqn или ip_mreq
(подобно IP_ADD_MEMBERSHIP).
IP_MULTICAST_IF
Hазначает локальное устройство многоадресному
сокету. Аргументом является структура ip_mreqn или
ip_mreq (подобно IP_ADD_MEMBERSHIP).
Если указана неправильная опция сокета, то
возвращается значение ENOPROTOOPT.
РАБОТА С ИНТЕРФЕЙСОМ SYSCTLS
Протокол IP поддерживает интерфейс sysctl для настройки
некоторых общих опций. Доступ к sysctl можно получить
путем записи или чтения файлов /proc/sys/net/ipv4/* или
через интерфейс sysctl(2).
ip_default_ttl
Устанавливает значение time-to-live исходящих
пакетов по умолчанию. Его можно поменять для любого
сокета с помощью опции IP_TTL.
ip_forward
Разрешает перенаправление IP. Перенаправление IP
может быть также установлено для каждого
интерфейса.
ip_dynaddr
Разрешает использование динамических адресов сокета
и повторную запись маскирования при изменении
адреса интерфейса. Это может быть полезно для
интерфейсов dialup с меняющимися адресами IP. 0
означает запрет перезаписи, 1 разрешает ее, а 2
включает режим проверки.
ip_autoconfig
Hе описана.
ip_local_port_range
Содержит два целых числа, определяющих диапазон
локальных портов, выделенных сокетам. Выделение
начинается с первого числа и заканчивается вторым.
Обратите внимание, что числа не должны
конфликтовать с портами, используемыми для
маскирования (хотя этот случай предусматривается).
Кроме того, произвольные значения могут привести к
проблемам с некоторыми пакетными фильтрами сетевых
экранов (firewall), которые делают заключение об
используемых локальных портах. Первое число должно
быть, как минимум, >1024, а лучше >4096 во
избежание конфликтов с известными портами и
уменьшения количества проблем с сетевыми экранами.
ip_no_pmtu_disc
Если она запущена по умолчанию, не следует
производить Path MTU Discovery для сокетов TCP.
Path MTU Discovery невозможно выполнить, если на
пути следования пакетов встречаются неправильно
настроенные сетевые экраны (firewall),
отбрасывающие все ICMP-пакеты, или неправильно
настроенные интерфейсы (например, point-to-point
соединение, при котором стороны не пришли к
соглашению об MTU). Вместо отключения Path MTU
Discovery лучше правильно настроить маршрутизаторы,
так как отстутствие Path MTU Discovery дорого
обходится сети.
ipfrag_high_thresh, ipfrag_low_thresh
Если количество поставленных в очередь
IP-фрагментов достигнет ipfrag_high_thresh , то
очередь укорачивается до значения ipfrag_low_thresh
, которое содержит целочисленные байты.
ip_always_defrag
[Появилось в ядре 2.2.13; в ранних версиях ядра
этот параметр настраивался при компиляции опцией
CONFIG_IP_ALWAYS_DEFRAG]
Если этот логический флаг установлен (и не равен нулю), то
принимаемые фрагменты (части пакетов IP, появляющиеся,
если какая-либо машина на пути между источником и
приемником решила, что пакетов слишком велик, и разбила
его на части) будут собраны (дефрагментированы) перед
обработкой, даже если они должны быть перенаправлены
дальше.
Запускайте эту возможность только при наличии сетевого
экрана (firewall) на единственно возможном пути в вашу
сеть или при наличии "прозрачного" прокси-сервера; никогда
не запускайте ее в обычном маршрутизаторе или в обычной
машине. В противном случае, если фрагментированые пакеты
могут прийти в конечный пункт назначения и другим путем,
Вам не удастся собрать пакет полностью. Кроме того,
дефрагментация ипользует много памяти и времени
процессора.
Эта возможность автоматически включается, если настроено
маскирование или "прозрачное" прокси-кэширование.
neigh/*
См. arp(7).
ВЫЗОВЫ IOCTL
Все вызовы ioctl, описанные в socket(7), являются
действенными и для ip.
Вызовы ioctl для настройки сетевого экранирования (fire-
walling) описаны в ipfw(7) пакета ipchains.
Вызовы ioctl для настройки общих параметров устройств
описаны в netdevice(7).
ЗАМЕЧАНИЯ
Будьте очень внимательны при работе с опцией SO_BROADCAST:
она не является привилегированной в Linux. Можно легко
перегрузить сеть, если осуществлять широковещательную
передачу невнимательно. Для новых протоколов приложений
лучше создать многоадресную группу, а не использовать
широковещательную передачу.
Hекоторые реализации BSD-сокетов предоставляют
пользователям опции сокетов IP_RCVDSTADDR и IP_RECVIF для
того, чтобы получить адреса назначения и интерфейса
полученной датаграммы. В Linux для этой цели используется
IP_PKTINFO более общего назначения.
КОДЫ ОШИБОК
ENOTCONN
Операция определена только для соединенного сокета,
а сокет не был подсоединен.
EINVAL Передан неправильный аргумент. Во время выполнения
операций передачи эта ошибка может возникнуть, если
аргумент был послан по маршруту, называемому black-
hole("чернойдырой").
EMSGSIZE
Размер датаграммы больше пути MTU, и она не может
быть фрагментирована.
EACCES Пользователь попытался выполнить операцию, не имея
на то соответствующих прав. Включает в себя:
возможность посылать пакет по широковещательному
адресу при сброшенном флаге SO_BROADCAST;
возможность посылать пакет по маршруту pro-
hibit(запрещенному); возможность попытки изменить
настройки сетевого экрана (firewall) без наличия
CAP_NET_ADMIN или идентификатора эффективного
пользователя, равного нулю; возможность попытки
установить соединение (binding) с зарезервированным
портом без CAP_NET_BIND_SERVICE или идентификатора
эффективного пользователя, равного нулю;
EADDRINUSE
возможность попытки установить соединение с уже
используемым адресом.
ENOPROTOOPT and EOPNOTSUPP
Передана неправильная опция сокета.
EPERM Пользователь не имеет прав на то, чтобы устанвить
высокий приоритет процесса или группы, изменить их
конфигурацию или послать им сигналы.
EADDRNOTAVAIL
Был запрошен несуществующий интерфейс, или
запрошенный адрес источника не является локальным.
EAGAIN Операция на неблокируемом сокете будет блокирована.
ESOCKTNOSUPPORT
Сокет не настроен, или запрошен неизвестный тип
сокета.
EISCONN
Вызов connect(2) уже соединенного сокета.
EALREADY
Операция соединения на неблокируемом сокете уже
производится.
ECONNABORTED
Соединение было закрыто во время работы accept(2).
EPIPE Соединение было неожиданно разорвано другой
стороной.
ENOENT SIOCGSTAMP было вызвано на сокет, не принявший
пакет.
EHOSTUNREACH
Hет корректных записей в таблице маршрутизации для
адреса назначения. Эта ошибка может быть вызвана
сообщением ICMP от удаленной машины или для
локальной таблицы маршрутизации.
ENODEV Сетевое устройство недоступно или не может посылать
пакеты IP.
ENOPKG Подсистема ядра не настроена.
ENOBUFS, ENOMEM
Hедостаточно свободной памяти. Часто это означает,
что выделение памяти ограничено лимитами буфера
сокетов, а не осутствием системной памяти, однако,
на 100% быть уверенным нельзя.
Остальные ошибки могут быть определены протоколами более
высоких уровней; см.: tcp(7), raw(7), udp(7) и socket(7).
ВЕРСИИ
Опции IP_PKTINFO, IP_MTU, IP_PMTU_DISCOVER, IP_PKTINFO,
IP_RECVERR и IP_ROUTER_ALERT появились в Linux версии
использоваться в программах, предназначаемых для переноса
на другие системы.
Структура struct ip_mreqn появилась в Linux 2.2. Linux 2.0
поддерживала только ip_mreq.
Вызовы sysctl появились в Linux 2.2.
СОВМЕСТИМОСТЬ
Для совместимости с Linux 2.0 и для открытия сокета
packet(7) поддерживается устаревший синтаксис
socket(PF_INET, SOCK_RAW, protocol). Вместо него должен
использоваться синтаксис socket(PF_PACKET, SOCK_RAW, pro-
tocol). Основное отличие - это новая структура адреса
sockaddr_ll для информации общего уровня соединения вместо
sockaddr_pkt.
НАЙДЕННЫЕ ОШИБКИ
Существует множество непоследовательных значений ошибок.
Hе описаны вызовы ioctl для настройки специфичных для IP
опций интерфейсов и таблиц ARP.
Некоторые версии glibc забывают определять in_pktinfo.
Рабочее окружение должно сейчас скопировать это в вашу
программу из этой страницы руководства.
Получение исходный адреса назначения через MSG_ERRQUEUE в
msg_name по recvmsg(2) не работает в некоторых ядрах
версий 2.2.
АВТОРЫ
Эта страница руководства была написана Энди Клином (Andi
Kleen).