irda − стек протокола Linux−IrDA
#include <linux/irda.h>
stream_s = socket(PF_INET, SOCK_STREAM, 0);
seqpkt_s = socket(PF_INET, SOCK_SEQPACKET, 0);
dgram_s = socket(PF_INET, SOCK_DGRAM, IRDAPROTO_UNITDATA);
ultra_s = socket(PF_INET, SOCK_DGRAM, IRDAPROTO_ULTRA);
Linux−IrDA − это полная реализация различных протоколов IrDA и драйверов IrDA для Linux.
Низкоуровневая настройка стека IrDA (портов IrDA) и различных драйверов IrDA описана в irattach(8).
Использование верхних слоёв стека IrDA (IrCOMM, IrLPT, IrNET, IrLAN, OBEX...) описано в соответствующих страницах руководства.
Ключевыми компонентами стека протокола Linux−IrDA являются протоколы IrLAP, IrLMP, IrTTP и IrIAS и они реализованы в виде модуля ядра. Интерфейс программиста к стеку IrDA основан на сокетах. За более подробной информацией по сокетам обратитесь к socket(7).
Отметим, что высокоуровневые протоколы IrDA могут предоставлять программистам другие интерфейсы. Например, IrCOMM предоставляет интерфейс основанный на TTY и OBEX, доступный через библиотеку, работающую в пространстве пользователя.
Интерфейс сокетов Linux−IrDA предоставляет 4 типа сокетов:
Потоковый сокет − SOCK_STREAM, 0
Потоковые сокеты предоставляют надёжные, ориентированные на потоки, двунаправленные соединения между двумя сокетами поверх
IrTTP, похожие на сокеты TCP. IrTTP гарантирует, что данные будут доставляться по порядку и сопровождаться управлением потоком, IrLAP повторно передаёт
потерянные пакеты.
Потоковые сокеты не сохраняют границы записей.
Сокет последовательных пакетов − SOCK_SEQPACKET, 0
Сокеты последовательных пакетов предоставляют надёжные, ориентированные на датаграммы, двунаправленные соединения между двумя
сокетами поверх IrTTP. IrTTP гарантирует, что данные будут доставляться по порядку и сопровождаться управлением потоком, IrLAP повторно передаёт
потерянные пакеты.
Сокеты последовательных пакетов сохраняют границы записей. Большие датаграммы фрагментируются необходимым образом.
Сокет дейтаграмм − SOCK_DGRAM, IRDAPROTO_UNITDATA
Сокеты последовательных пакетов предоставляют надёжные, ориентированные на датаграммы, двунаправленные соединения между двумя
сокетами поверх IrLMP. Не гарантируется, что данные поступят по порядку, управление потоком не осуществляется, однако IrLAP повторно передаёт потерянные
пакеты.
Сокеты последовательных пакетов сохраняют границы записей. Фрагментация не производится, датаграммы больше, чем MTU канала IrDA будут обрезаны либо
отброшены.
Ультра−сокет − SOCK_DGRAM, IRDAPROTO_ULTRA
Ультра−сокеты предоставляют сервис передачи датаграмм без соединений, без обеспечения надёжности доставки пакетов поверх
IrLAP−Ultra. Ультра−датаграммы отправляются и принимаются только если нет установленных соединений IrLAP, а иначе − отклоняются. Они всегда передаются
со скоростью 9600 бод. Датаграммы могут потеряться, прийти в другом порядке, управление потоком не осуществляется.
Ультра−сокеты сохраняют границы записей. Фрагментация не выполняется, датаграммы больше чем ультра−MTU (382 байт) будут обрезаны или отброшены.
Адрес сокета IrDA определяется сочетанием адреса интерфейса IrDA и имени службы. Имена служб автоматически решаются в lsap с помощью протокола IrIAP.
struct sockaddr_irda {
sa_family_t sir_family; /* AF_IRDA */
__u8 sir_lsap_sel; /* Селектор LSAP */
__u32 sir_addr; /* Адрес устройства */
char sir_name[25]; /* Обычно <служба>:IrDA:TinyTP */
};
sin_family всегда устанавливается в AF_IRDA. sir_lsap_sel обычно не используется. sir_addr − это адрес партнёра и он не обязателен (и в этом случае используется первый обнаруженный партнёр). sir_name − это имя службы сокета.
Сокеты IrDA поддерживают некоторые специфичные для протокола опции, которые могут быть заданы с помощью setsockopt(2) и прочитаны с помощью getsockopt(2). Уровень опций сокета для IrDA − это SOL_IRLMP.
Опции, которые могут быть заданы:
IRLMP_IAS_SET
Установить запись в локальную базу данных IAS.
IRLMP_IAS_DEL
Удалить запись из локальной базы данных IAS.
IRLMP_MAX_SDU_SIZE
Задать максимальный входящий MTU для сокетов последовательных пакетов.
IRLMP_HINTS_SET
Задать биты подсказок IrDA для передачи партнёрам.
IRLMP_HINT_MASK_SET
Задать фильтр битов подсказок IrDA, используемые в процессе обнаружения.
Опции, которые могут быть получены.
IRLMP_ENUMDEVICES
Произвести обнаружение на уровне канала и вернуть содержимое журнала обнаружения.
IRLMP_MAX_SDU_SIZE
Получить максимальный входящий MTU.
IRLMP_IAS_GET
Получить запись из локальной базы данных IAS.
IRLMP_IAS_QUERY
Запросить с помощью протокола IrLAP запись из базы данных IAS партнёра.
IRLMP_WAITDEVICE
Заблокирован до обнаружения нового устройства. Экспериментальная возможность, используйте осторожно.
Джин Туррилхес (Jean Tourrilhes) − jt@hpl.hp.com
Перевод на русский язык выполнил Владимир Ступин <vladimir@stupin.su>.
irattach(8), irdadump(8), irnet(4), irnetd(8).