uIP 1.0
|
00001 /** 00002 * \addtogroup uip 00003 * @{ 00004 */ 00005 00006 /** 00007 * \addtogroup uiparp 00008 * @{ 00009 */ 00010 00011 /** 00012 * \file 00013 * Макросы и определения для модуля ARP. 00014 * \author Adam Dunkels <adam@dunkels.com> 00015 */ 00016 00017 00018 /* 00019 * Copyright (c) 2001-2003, Adam Dunkels. 00020 * Все права зарезервированы. * 00021 * Повторное распространение, использование в исходном и двоичном виде, 00022 * с модификацией или без - разрешается, если выполняются следующие 00023 * условия: 00024 * 1. Распространение исходного кода должно сохранить вышеуказанную пометку 00025 * копирайта, этот список условий и следующую правовую оговорку. 00026 * 2. Распространение исходного кода должно сохранить вышеуказанную пометку 00027 * копирайта, этот список условий и следующую правовую оговорку в 00028 * документации и/или других материалах, которые будут предоставлены 00029 * вместе с распространяемыми материалами. 00030 * 3. Имя автора не может использоваться, чтобы подтвердить или продвинуть 00031 * продукты, написанные с использованием этого программного обеспечения 00032 * без специального на то разрешения. 00033 * 00034 * ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ АВТОРОМ ``КАК ЕСТЬ'', БЕЗ 00035 * КАКОЙ-ЛИБО ЛЮБОЙ РАСШИРЕННОЙ ИЛИ ПОДРАЗУМЕВАЕМОЙ ГАРАНТИИ, ВКЛЮЧАЯ, 00036 * НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ГАРАНТИИ ВЫСОКОГО СПРОСА И ПРИГОДНОСТИ 00037 * ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. АВТОР НИ ПРИ КАКИХ УСЛОВИЯХ НЕ ОТВЕТСТВЕНЕН 00038 * ЗА ЛЮБЫЕ УБЫТКИ - ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ОБРАЗЦОВЫЕ 00039 * ИЛИ ПОСЛЕДОВАТЕЛЬНЫЕ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ТРЕБОВАНИЯ 00040 * ЗАМЕНЫ ТОВАРА ИЛИ СЕРВИСА; ПОТЕРИ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ВЫГОДЫ; 00041 * ИЛИ ПРЕКРАЩЕНИЕ БИЗНЕСА), ОДНАКО ВЫЗВАННЫЕ ПО ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, 00042 * ЛИБО В КОНТРАКТЕ, ПРЯМОЙ ОТВЕТСТВЕННОСТИ, ЛИБО В НАРУШЕНИИ ЗАКОННЫХ ПРАВ 00043 * (ВКЛЮЧАЯ ТАК ИЛИ ИНАЧЕ НЕБРЕЖНОСТЬ), ВОЗНИКАЮЩИЕ ВСЕГДА ИЗ ИСПОЛЬЗОВАНИЯ 00044 * ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫЛО ПРЕДУПРЕЖДЕНИЕ О ВОЗМОЖНОСТИ 00045 * ТАКОГО ПОВРЕЖДЕНИЯ. 00046 * 00047 * Этот файл является частью стека uIP TCP/IP. 00048 * 00049 * $Id: uip_arp.h,v 1.5 2006/06/11 21:46:39 adam Exp $ 00050 * 00051 */ 00052 00053 #ifndef __UIP_ARP_H__ 00054 #define __UIP_ARP_H__ 00055 00056 #include "uip.h" 00057 00058 00059 extern struct uip_eth_addr uip_ethaddr; 00060 00061 /** 00062 * Заголовок Ethernet. 00063 */ 00064 struct uip_eth_hdr { 00065 struct uip_eth_addr dest; 00066 struct uip_eth_addr src; 00067 u16_t type; 00068 }; 00069 00070 #define UIP_ETHTYPE_ARP 0x0806 00071 #define UIP_ETHTYPE_IP 0x0800 00072 #define UIP_ETHTYPE_IP6 0x86dd 00073 00074 00075 /* Функция uip_arp_init() должна быть вызвана перед любыми вызовами 00076 всех других функций ARP. */ 00077 void uip_arp_init(void); 00078 00079 /* Функция uip_arp_ipin() должна быть вызвана всякий раз, когда пакет 00080 IP поступает через из Ethernet. Эта функция обновляет таблицу ARP 00081 или вставляет в неё новую привязку, если в таблице её пока нет. 00082 Функция подразумевает, что пакет IP с заголовком Ethernet 00083 находится в буфере uip_buf, и длина пакета находится в переменной 00084 uip_len. */ 00085 /*void uip_arp_ipin(void);*/ 00086 #define uip_arp_ipin() 00087 00088 /* Функция uip_arp_arpin() должна быть вызвана, когда драйвером 00089 Ethernet был принят пакет ARP. Эта функция также подразумевает, 00090 что фрейм Ethernet находится в буфере uip_buf. Когда функция 00091 uip_arp_arpin() делает возврат, содержимое буфера uip_buf 00092 должно быть отправлено через Ethernet, если значение переменной 00093 uip_len > 0. */ 00094 void uip_arp_arpin(void); 00095 00096 /* Функция uip_arp_out() должна быть вызвана, когда пакет IP должнен 00097 быть отправлен через Ethernet. Эта функция создает заголовок 00098 Ethernet перед заголовком IP в буфере uip_buf. Заголовок Ethernet 00099 будет иметь корректный заполненный адрес назначения Ethernet MAC, 00100 если в таблице ARP имеется првязка по MAC к адресу назначения IP 00101 (или IP адреса роутера по умолчанию). Если такая запись привязки 00102 в таблице ARP не найдена, то пакет IP будет перезаписан запросом 00103 ARP и мы полагаемся на ретрансмит TCP для пакета, который был 00104 перезаписан. В любом случае переменная uip_len содержит длину 00105 фрейма Ethernet, который должен быть передан. */ 00106 void uip_arp_out(void); 00107 00108 /* Функция uip_arp_timer() должна быть вызвана каждые 10 секунд. Она 00109 отвечает за сброс старых записей в таблице ARP. */ 00110 void uip_arp_timer(void); 00111 00112 /** @} */ 00113 00114 /** 00115 * \addtogroup uipconffunc 00116 * @{ 00117 */ 00118 00119 00120 /** 00121 * Указывает адрес Ethernet MAC. 00122 * 00123 * Коду ARP нужно знать MAC-адрес карты Ethernet, чтобы можно было 00124 * отвечать на запросы ARP и генерировать рабочие заголовки Ethernet. 00125 * 00126 * \note Этот макрос только указывает адрес Ethernet MAC для кода ARP. 00127 * Его нельзя использовать для изменения MAC-адреса карты Ethernet. 00128 * 00129 * \param eaddr Указатель на структуру uip_eth_addr, содержащую 00130 * адрес Ethernet MAC карты Ethernet. 00131 * 00132 * \hideinitializer 00133 */ 00134 #define uip_setethaddr(eaddr) do {uip_ethaddr.addr[0] = eaddr.addr[0]; \ 00135 uip_ethaddr.addr[1] = eaddr.addr[1];\ 00136 uip_ethaddr.addr[2] = eaddr.addr[2];\ 00137 uip_ethaddr.addr[3] = eaddr.addr[3];\ 00138 uip_ethaddr.addr[4] = eaddr.addr[4];\ 00139 uip_ethaddr.addr[5] = eaddr.addr[5];} while(0) 00140 00141 /** @} */ 00142 /** @} */ 00143 00144 #endif /* __UIP_ARP_H__ */