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
Перевод на русский язык выполнил Владимир Ступин <wheelof@gmail.com>.
irattach(8), irdadump(8), irnet(4), irnetd(8).
irda-utils | IRDA (7) | 2 мая 2003 |