ddp - реализация протокола AppleTalk в Linux
НАЗВАНИЕddp - реализация протокола AppleTalk в Linux
СИНТАКСИС
#include
#include
ddp_socket = socket(PF_APPLETALK, SOCK_DGRAM, 0);
raw_socket = socket(PF_APPLETALK, SOCK_RAW, protocol);
ОПИСАНИЕ
В Linux реализован протокол Appletalk, описанный в Inside
Appletalk. В ядре есть лишь уровни DDP и AARP. Они
рассчитаны на использование библиотеками протоколов
netatalk. Эта страница описывает интерфейс желающим
использовать уровень DDP непосредственно.
Связь между Appletalk и программой пользователя
реализована через интерфейс сокетов, совместимых с BSD.
Дополнительную информацию о сокетах можно найти в
socket(7).
Сокет Appletalk создается путем вызова функции socket(2),
которой в качестве аргумента семьи (family) сокета указано
значение PF_APPLETALK. Тип сокета может быть SOCK_DGRAM
(чтобы открыть сокет ddp) или SOCK_RAW для сокета raw.
protocol устанавливает протокол приема-передачи Appletalk.
SOCK_RAW необходимо указать значение ATPROTO_DDP.
Сокеты Raw могут быть открыты только процессом с
идентификатором эффективного пользователя, равным нулю,
либо процессом, имеющим возможность CAP_NET_RAW.
ФОРМАТ АДРЕСА
Адрес сокета Appletalk определяется как комбинация номера
сети, номера узла (node) и номера порта.
struct at_addr {
u_short s_net;
u_char s_node;
};
struct sockaddr_atalk {
sa_family_t sat_family; /* address family */
u_char sat_port; /* port */
struct at_addr sat_addr; /* net/node */
};
Установленное значение sat_family всегда равно
AF_APPLETALK. sat_port содержит номер порта. Порты с
номерами меньше 129-и известны как зарезервированные
порты. Вызывать этим сокетам функцию bind(2) может только
процесс, имеющий либо идентификатор эффективного
пользователя, равный нулю, либо возможность
CAP_NET_BIND_SERVICE. sat_addr является адресом машины.
Поле net структуры struct at_addr содержит адрес сети
машины (в сетевом порядке расположения байт). Значение
AT_ANYNET является шаблоном, включающим в себя и "эту
сеть". Поле node структуры struct at_addr содержит номер
узла машины. Значение AT_ANYNODE является шаблоном,
включающим в себя и "этот узел". Значение ATADDR_BCAST
является ссылкой на локальный широковещательный адрес.
ОПЦИИ СОКЕТОВ
Опции сокета, специфичные для протокола, не
поддерживаются.
РАБОТА С ИНТЕРФЕЙСОМ SYSCTLS
IP поддерживает интерфейс sysctl для настройки некоторых
общих параметров Appletalk. Доступ к sysctl можно получить
путем чтения или записи файлов /proc/sys/net/atalk/* или с
помощью интерфейса sysctl(2).
aarp-expiry-time
Временной интервал (в секундах) до момента
устаревания записи в кэше AARP.
aarp-resolve-time
Временной интервал (в секундах) до определения
записи в кэше AARP.
aarp-retransmit-limit
Количество повторных передач запроса AARP, до того,
как запись будет объявлена недействительной.
aarp-tick-time
Скорость таймера, управляющего AARP, в секундах.
Значения по умолчанию соответствуют описанию и никогда не
должны меняться.
ВЫЗОВЫ IOCTL
Все вызовы ioctl, описанные в socket(7), относятся и к
ddp.
ЗАМЕЧАНИЯ
Будьте очень осторожны при работе с опцией SO_BROADCAST:
она не относится к привилегированным в Linux. При
невнимательной рассылке сообщений по широковещательному
адресу легко перегрузить сеть.
ВЕРСИИ
Appletalk поддерживается Linux версии 2.0 и более поздних.
Интерфейс sysctl появился в Linux 2.2.
КОДЫ ОШИБОК
ENOTCONN
Операция предназначена только для соединенного
сокета, а сокет не был соединен.
EINVAL Передан неправильный аргумент.
EMSGSIZE
Размер датаграммы больше размера DDP MTU.
EACCES Пользователь попытался выполнить операцию, не имея
на то соответствующих прав. Это относится к
передаче информации по широковещательному адресу
при сброшенном флаге широковещательной передачи, а
также к попытке соединения с зарезервированным
портом, когда идентификатор эффективного
пользователя отличается от нуля или отсутствует
возможность CAP_NET_BIND_SERVICE.
EADDRINUSE
Попытка соединения с уже используемым адресом.
ENOMEM and ENOBUFS
Hедостаточно памяти в системе для выполнения данной
операции.
ENOPROTOOPT and EOPNOTSUPP
Передана неправильная опция сокета.
EPERM Пользователь не имеет прав на установку высокого
приоритета, изменение конфигурации или посылку
сигналов определенному процессу или группе.
EADDRNOTAVAIL
Был запрошен несуществующий интерфейс, или
запрошенный адрес источника не являлся локальным.
EAGAIN Операция на неблокируемом сокете блокируется.
ESOCKTNOSUPPORT
Сокет не был настроен, или был запрошен неизвестный
тип сокета.
EISCONN
Был произведен вызов connect(2) в уже соединенном
сокете.
EALREADY
Операция соединения в неблокируемом сокете уже
производится.
ECONNABORTED
Соединение было закрыто во время accept(2).
EPIPE Соединение было неожиданно закрыто другой стороной.
ENOENT Был произведен вызов SIOCGSTAMP при отсутствии
прибывшего в сокет пакета.
EHOSTUNREACH
Hет записи таблицы маршрутизации, указывающей на
адрес назначения.
ENODEV Сетевое устройство недоступно или не имеет
возможности посылать IP.
ENOPKG Подсистема ядра не была настроена.
СОВМЕСТИМОСТЬ
Базовый интерфейс сокетов Appletalk совместим с netatalk в
BSD-подобных системах. Многие системы BSD не проверяют
SO_BROADCAST при посылке широковещательных кадров: это
может привести к проблемам совместимости.
Режим сокетов raw поддерживается только в Linux и
предназначен для облегчения поддержки альтернативных
пакетов CAP и утилит мониторинга AppleTalk.
НАЙДЕННЫЕ ОШИБКИ
Слишком много противоречивых ошибок.
Вызовы ioctl для настройки таблиц маршрутизации,
устройств, таблиц AARP и других устройств пока что не
описаны.