uIP 1.0
Структуры данных | Файлы | Функции
uIP Address Resolution Protocol
The uIP TCP/IP stack

Протокол разрешения адреса (Address Resolution Protocol, ARP) используется для определения соответствия между адресами IP и адресами уровня линка, такими как адреса Ethernet MAC. Подробнее...

Структуры данных

struct  uip_eth_hdr
 Заголовок Ethernet. Подробнее...

Файлы

файл  uip_arp.h
 

Макросы и определения для модуля ARP.


файл  uip_arp.c
 

Реализация ARP Address Resolution Protocol.


Функции

void uip_arp_init (void)
 Инициализирует модуль ARP.
void uip_arp_arpin (void)
 Обработка ARP для приходящих пакетов IP.
void uip_arp_out (void)
 Ожидается наличие присоединенного заголовка Ethernet к исходящему пакету IP, и делается проверка, нужно или нет отправить запрос ARP.
void uip_arp_timer (void)
 Функция периодической обработки ARP.

Подробное описание

Протокол разрешения адреса (Address Resolution Protocol, ARP) используется для определения соответствия между адресами IP и адресами уровня линка, такими как адреса Ethernet MAC.

ARP использует щироковещательные запросы (broadcast), чтобы запросить адрес уровня линка для известного адреса IP, и хост, который с конфигурирован на тот адрес IP, которому предназначен запрос, ответит на него своим адресом уровня линка (т. е. передаст свой MAC-адрес).

Заметки:
Эта реализация ARP поддерживает только Ethernet.

Функции

void uip_arp_arpin ( void  )

Обработка ARP для приходящих пакетов IP.

Эта функция должна вызваться драйвером устройства, когда принят пакет IP. Функция проверит, есть ли адрес в кэше (в таблице) ARP, и если это так, то запись ARP будет обновлена в кэше (в таблице ARP). Если запись ARP в кэше не найдена, то будет создана новая запись.

Эта функция подразумевает наличие в буфере uip_buf[] пакета IP с предварительно ожидаемым заголовком Ethernet, и длина пакета должна быть в глобальной переменной uip_len. Обработка ARP для приходящих пакетов ARP.

Эта функция должна быть вызвана драйвером устройства, когда принят пакет ARP. Функция будет работать по-разному, в зависимости от типа пакета ARP: если это ответ на запрос (ARP reply), который был отослан ранее, то кэш ARP будет заполнен значением из ответа. Если входящий ARP пакет является запросом (ARP request) на наш адрес IP, то будет создан пакет ответа (ARP reply) и помещен в буфер uip_buf[].

Когда функция делает возврат, значение глобальной переменной uip_len показывает, должен или нет драйвер устройства отправить пакет. Если uip_len равна 0, то пакет отправлять не нужно. Если uip_len не равна 0, то она содержит длину исходящего пакета, который находится в буфере uip_buf[].

Эта функция подразумевает на входе наличия пакета ARP с предварительно ожидаемым заголовком Ethernet в буфере uip_buf[], и длину пакета в глобальной переменной uip_len.

Примеры:
example-mainloop-with-arp.c.

См. определение в файле uip_arp.c строка 275

Перекрестные ссылки HTONS, uip_ipaddr_cmp и uip_len.

void uip_arp_out ( void  )

Ожидается наличие присоединенного заголовка Ethernet к исходящему пакету IP, и делается проверка, нужно или нет отправить запрос ARP.

Эта функция должна быть вызвана перед отправкой пакета IP. Функция проверяет адрес назначения (destination IP) пакета IP, чтобы посмотреть, какой адрес Ethernet MAC должен быть использован в качестве адреса назначения (destination MAC) в сети Ethernet.

Если адрес destination IP находится в локальной сети (это определяется путем операции логического И над сетевой маской и нашим адресом IP), функция проверит кэш ARP, чтобы посмотреть имеется ли в ней запись для адреса destination IP. Если есть, то функция вернет присоединенный заголовок Ethernet. Если в кэше ARP не найдена запись с адресом destination IP, то данные пакета в буфере uip_buf[] будут заменены на пакет запроса (ARP request) на адрес destination IP. Пакет IP отбрасывается, и подразумевается, что протоколы более высокого уровня (например TCP) по необходимости сделают повторную передачу отброшенного пакета.

Если адрес destination IP находится не в локальной сети, вместо этого будет использоваться адрес IP шлюза по умолчанию (default router).

Когда функция делает возврат, в буфере uip_buf[] находится пакет, и длина пакета находится в глобальной переменной uip_len.

Примеры:
example-mainloop-with-arp.c.

См. определение в файле uip_arp.c строка 350

Перекрестные ссылки HTONS, uip_appdata, UIP_ARPTAB_SIZE, uip_buf, uip_ipaddr_cmp, uip_ipaddr_copy, uip_ipaddr_maskcmp, uip_len и UIP_LLH_LEN.

void uip_arp_timer ( void  )

Функция периодической обработки ARP.

Эта функция выполняет периодические обработки по таймеру для модуля ARP, и она должна вызываться с регулярными интервалами. Рекомендованный интервал между вызовами 10 секунд.

Примеры:
example-mainloop-with-arp.c.

См. определение в файле uip_arp.c строка 145

Перекрестные ссылки UIP_ARP_MAXAGE и UIP_ARPTAB_SIZE.