uIP 1.0
|
Эти функции используются сетевым драйвером устройства, который работает совместно с uIP. Подробнее...
Макросы | |
#define | uip_input() |
Обрабатывает приходящий пакет. | |
#define | uip_periodic(conn) |
Периодическая обработка соединения, идентифицируемого по его номеру. | |
#define | uip_periodic_conn(conn) |
Выполняет периодические обработки соединения, идентифицируемого по указателю на его структуру. | |
#define | uip_poll_conn(conn) |
Запрашивает отдельное соединение, которое должно быть опрошено. | |
#define | uip_udp_periodic(conn) |
Периодическая обработка соединения UDP, идентифицированного по его номеру. | |
#define | uip_udp_periodic_conn(conn) |
Периодическая обработка соединения UDP, идентифицированного по указателю на его структуру. | |
Переменные | |
u8_t | uip_buf [UIP_BUFSIZE+2] |
Буфер пакета uIP. |
Эти функции используются сетевым драйвером устройства, который работает совместно с uIP.
#define uip_input | ( | ) |
Обрабатывает приходящий пакет.
Эта функция должна быть вызвана, когда драйвер устройства принял пакет через сеть. Пакет от драйвера устройства должен находиться в буфере uip_buf, и длина пакета должна быть помещена в переменную uip_len.
Когда функция делает возврат, она может поместить исходящий пакет в тот же буфер uip_buf. Если это так, то переменная uip_len устанавливается в значение длины этого пакета. Если нет пакета для отправки, то значение переменной uip_len устанавливается равным 0.
В коде ниже показан обычный способ вызова функции.
uip_len = devicedriver_poll(); if(uip_len > 0) { uip_input(); if(uip_len > 0) { devicedriver_send(); } }
#define BUF ((struct uip_eth_hdr *)&uip_buf[0]) uip_len = ethernet_devicedrver_poll(); if(uip_len > 0) { if(BUF->type == HTONS(UIP_ETHTYPE_IP)) { uip_arp_ipin(); uip_input(); if(uip_len > 0) { uip_arp_out(); ethernet_devicedriver_send(); } } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) { uip_arp_arpin(); if(uip_len > 0) { ethernet_devicedriver_send(); } }
#define uip_periodic | ( | conn | ) |
Периодическая обработка соединения, идентифицируемого по его номеру.
Эта функция делает необходимые периодические обработки (таймеры, поллинг) для соединения uIP TCP, и должна вызываться по срабатыванию периодического таймера uIP. Она должна быть вызвана для каждого соединения, назависимо от того - открыто это соединение или закрыто.
Когда функция делает возврат, она может поместить в буфер пакета uIP исходящий пакет, ожидающий отправки. Если это так, то переменная uip_len будет установлена в ненулевое значение. Чтобы отправить пакет, должен быть вызван драйвер устройства.
Обычно функция вызывается из цикла for() примерно так:
for(i = 0; i < UIP_CONNS; ++i) { uip_periodic(i); if(uip_len > 0) { devicedriver_send(); } }
for(i = 0; i < UIP_CONNS; ++i) { uip_periodic(i); if(uip_len > 0) { uip_arp_out(); ethernet_devicedriver_send(); } }
conn | Номер соединения, которое периодически опрашивается. |
#define uip_periodic_conn | ( | conn | ) |
Выполняет периодические обработки соединения, идентифицируемого по указателю на его структуру.
То же самое, что и uip_periodic(), однако принимает в аргументе указатель на реальную структуру uip_conn вместо целого числа. Эта функция может быть использована для принудиельной периодической обработки отдельного соединения.
conn | Указатель на структуру uip_conn для обрабатываемого соединения. |
#define uip_poll_conn | ( | conn | ) |
Запрашивает отдельное соединение, которое должно быть опрошено.
То же самое, что и uip_periodic_conn(), но не делает обработку по таймеру. Приложение опрашивает появление новых данных.
conn | Указатель на структуру uip_conn для обрабатываемого соединения. |
#define uip_udp_periodic | ( | conn | ) |
Периодическая обработка соединения UDP, идентифицированного по его номеру.
Эта функция точно такая же, как и uip_periodic(), но для соединений UDP. Она вызывается точно так же, как и функция uip_periodic():
for(i = 0; i < UIP_UDP_CONNS; i++) { uip_udp_periodic(i); if(uip_len > 0) { devicedriver_send(); } }
for(i = 0; i < UIP_UDP_CONNS; i++) { uip_udp_periodic(i); if(uip_len > 0) { uip_arp_out(); ethernet_devicedriver_send(); } }
conn | Номер обрабатываемого соединения UDP. |
#define uip_udp_periodic_conn | ( | conn | ) |
Периодическая обработка соединения UDP, идентифицированного по указателю на его структуру.
То же самое, что и uip_udp_periodic(), но в качестве аргумента вместо целого числа принимает указатель на реальную структуру uip_conn. Эта функция может использоваться для принудительной периодической обработки отдельного соединения.
conn | Указатель на структуру uip_udp_conn для обрабатываемого соединения. |
Буфер пакета uIP.
Массив uip_buf используется для того, чтобы хранить входящие и исходящие пакеты. Драйвер устройства должен поместить в этот буфер приходящие данные. Когда данные отправляются, драйвер устройства должен читать заголовки уровня линка и заголовки TCP/IP из этого буфера. Размер заголовков уровня линка конфигурируется дефайном UIP_LLH_LEN.
void devicedriver_send(void) { hwsend(&uip_buf[0], UIP_LLH_LEN); if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) { hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN); } else { hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN); hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN); } }
См. определение в файле uip.c строка 139
Используется в uip_arp_out().