ИМЯ ddp - реализация протокола AppleTalk в Linux
ОБЗОР #include <sys/socket.h> #include <netatalk/at.h>
ddp_socket = socket(AF_APPLETALK, SOCK_DGRAM, 0); raw_socket = socket(AF_APPLETALK, SOCK_RAW, protocol);
ОПИСАНИЕ В Linux реализованы протоколы AppleTalk, описанные в Inside AppleTalk. В ядре есть лишь уровни DDP и AARP. Они проектировались с учётом того, что ими будут пользоваться через библиотеку протоколов netatalk. В этой странице описан интерфейс для тех, кому требуется использовать уровень DDP напрямую.
Связь между AppleTalk и пользовательской программой реализована через интерфейс сокетов, совместимых с BSD. Дополнительную информацию о сокетах можно найти в socket(7).
Сокет AppleTalk создаётся из вызова socket(2), которому в качестве аргумента семейства указывается значение AF_APPLETALK. Типом сокета может быть SOCK_DGRAM (чтобы открыть сокет ddp) или SOCK_RAW (для открытия сокета raw). Значением protocol устанавливается протокол приема-передачи AppleTalk. При SOCK_RAW необходимо указать значение ATPROTO_DDP.
Неструктурированные сокеты могут быть открыты только процессом с идентификатором эффективного пользователя, равным нулю, либо процессом, имеющим мандат CAP_NET_RAW.
Формат адреса Адрес сокета AppleTalk определяется как комбинация номера сети, номера узла и номера порта.
struct at_addr { unsigned short s_net; unsigned char s_node; };
struct sockaddr_atalk { sa_family_t sat_family; /* адресное семейство */ unsigned char sat_port; /* порт */ struct at_addr sat_addr; /* сеть/узел */ };
Значение sat_family всегда устанавливается в AF_APPLETALK. В sat_port содержится номер порта. Порты с номерами меньше 129 называются зарезервированными портами. Вызов bind(2) для этих сокетов допустим только для процессов, у которых идентификатор эффективного пользователя равен нулю, либо имеется мандат CAP_NET_BIND_SERVICE. В sat_addr указан адрес машины (host). Поле net структуры struct at_addr содержит адрес сети машины в сетевом порядке расположения байт. Значение AT_ANYNET является шаблоном, включающим в себя и “эту сеть”. Поле node структуры struct at_addr содержит номер узла машины. Значение AT_ANYNODE является шаблоном, включающим в себя и “этот узел”. Значение ATADDR_BCAST является ссылкой на локальный широковещательный адрес.
Параметры сокета
aarp-resolve-time Временной интервал (в секундах) до определения записи в кэше AARP.
aarp-retransmit-limit Количество повторных передач запроса AARP до того, как запись будет объявлена недействительной.
aarp-tick-time Скорость таймера управляющего AARP в секундах.
Значения по умолчанию соответствуют спецификации и никогда не должны меняться.
Вызовы ioctl Все вызовы ioctl, описанные в socket(7), применимы к DDP.
ОШИБКИ EACCES Пользователь попытался выполнить операцию, не имея на то соответствующих прав. Это относится к передаче информации по широковещательному адресу при сброшенном флаге широковещательной передачи, а также к попытке соединения с зарезервированным портом, когда идентификатор эффективного пользователя отличается от нуля или отсутствует мандат CAP_NET_BIND_SERVICE.
EADDRINUSE Попытка связать сокет с уже используемым адресом.
EADDRNOTAVAIL Был запрошен несуществующий интерфейс или запрошенный исходящий адрес не является локальным.
EAGAIN Действие над неблокирующим сокетом привело бы к его блокировке.
EALREADY Операция соединения на неблокирующем сокете уже находится в процессе выполнения.
ECONNABORTED Соединение закрыто во время accept(2).
EHOSTUNREACH Нет записи в таблице маршрутизации, указывающей на адрес назначения.
EINVAL Передан неверный аргумент.
EISCONN Вызов connect(2) запущен для сокета, уже установившего соединение.
EMSGSIZE Размер датаграммы больше размера DDP MTU.
ENODEV Сетевое устройство недоступно или неспособно посылать IP.
ENOENT Операция SIOCGSTAMP вызвана для сокета, который ещё не получил ни одного пакета.
ENOMEM и ENOBUFS Недостаточно памяти.
EPERM У пользователя нет достаточных полномочий, чтобы повысить приоритет, изменить настройку или послать сигнал запрашиваемому процессу или группе процессов.
EPIPE Соединение неожиданно закрылось или завершено (shut down) другой стороной.
ESOCKTNOSUPPORT Сокет не настроен или запрошен неизвестный тип сокета.
ВЕРСИИ AppleTalk поддерживается в Linux версии 2.0 и более поздних. Интерфейс /proc появился в Linux 2.2.
ЗАМЕЧАНИЯ Будьте очень осторожны при работе с параметром SO_BROADCAST: в Linux он не относится к привилегированным. Масштабная рассылка сообщений по широковещательному адресу может легко перегрузить сеть.
Совместимость Базовый интерфейс сокетов Appletalk совместим с netatalk в BSD-подобных системах. Многие системы BSD не проверяют SO_BROADCAST при посылке широковещательных кадров: это может привести к проблемам совместимости.
Режим неструктурированных сокетов поддерживается только в Linux и предназначен для облегчения поддержки альтернатив пакета CAP и утилит мониторинга AppleTalk.
ДЕФЕКТЫ Слишком много противоречий в значениях ошибок.
Вызовы ioctl для настройки таблиц маршрутизации, устройств, таблиц AARP и других устройств пока что не описаны.
СМОТРИТЕ ТАКЖЕ recvmsg(2), sendmsg(2), capabilities(7), socket(7)
|