uIP 1.0
Макросы | Переменные
Функции драйвера устройства uIP
The uIP TCP/IP stack

Эти функции используются сетевым драйвером устройства, который работает совместно с 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();
    }
  }
Заметки:
Если Вы пишете драйвер устройства uIP, которому нужен ARP (Address Resolution Protocol), например когда uIP работает через Ethernet, то Вам нужно перед вызовом этой функции вызвать код uIP ARP:
  #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();
      }
    }
Примеры:
example-mainloop-with-arp.c и example-mainloop-without-arp.c.

См. определение в файле uip.h строка 255

#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();
    }
  }
Заметки:
Если Вы пишете драйвер устройства uIP, которому нужен ARP (Address Resolution Protocol), например когда uIP работает через Ethernet, то Вам нужно вызвать функцию uip_arp_out() перед вызовом драйвера устройства:
  for(i = 0; i < UIP_CONNS; ++i) {
    uip_periodic(i);
    if(uip_len > 0) {
      uip_arp_out();
      ethernet_devicedriver_send();
    }
  }
Аргументы:
connНомер соединения, которое периодически опрашивается.
Примеры:
example-mainloop-with-arp.c и example-mainloop-without-arp.c.

См. определение в файле uip.h строка 298

#define uip_periodic_conn (   conn)

Выполняет периодические обработки соединения, идентифицируемого по указателю на его структуру.

То же самое, что и uip_periodic(), однако принимает в аргументе указатель на реальную структуру uip_conn вместо целого числа. Эта функция может быть использована для принудиельной периодической обработки отдельного соединения.

Аргументы:
connУказатель на структуру uip_conn для обрабатываемого соединения.

См. определение в файле uip.h строка 319

#define uip_poll_conn (   conn)

Запрашивает отдельное соединение, которое должно быть опрошено.

То же самое, что и uip_periodic_conn(), но не делает обработку по таймеру. Приложение опрашивает появление новых данных.

Аргументы:
connУказатель на структуру uip_conn для обрабатываемого соединения.

См. определение в файле uip.h строка 333

#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();
    }
  }
Заметки:
Как и при использовании функции uip_periodic(), нужно позаботиться taken о том, как использовать её при задействовании uIP вместе с ARP и Ethernet:
  for(i = 0; i < UIP_UDP_CONNS; i++) {
    uip_udp_periodic(i);
    if(uip_len > 0) {
      uip_arp_out();
      ethernet_devicedriver_send();
    }
  }
Аргументы:
connНомер обрабатываемого соединения UDP.
Примеры:
example-mainloop-with-arp.c и example-mainloop-without-arp.c.

См. определение в файле uip.h строка 368

#define uip_udp_periodic_conn (   conn)

Периодическая обработка соединения UDP, идентифицированного по указателю на его структуру.

То же самое, что и uip_udp_periodic(), но в качестве аргумента вместо целого числа принимает указатель на реальную структуру uip_conn. Эта функция может использоваться для принудительной периодической обработки отдельного соединения.

Аргументы:
connУказатель на структуру uip_udp_conn для обрабатываемого соединения.

См. определение в файле uip.h строка 385


Переменные

u8_t uip_buf[UIP_BUFSIZE+2]

Буфер пакета uIP.

Массив uip_buf используется для того, чтобы хранить входящие и исходящие пакеты. Драйвер устройства должен поместить в этот буфер приходящие данные. Когда данные отправляются, драйвер устройства должен читать заголовки уровня линка и заголовки TCP/IP из этого буфера. Размер заголовков уровня линка конфигурируется дефайном UIP_LLH_LEN.

Заметки:
Данные приложения должны быть помещены в этот буфер, так что драйвер устройства должен читать их с места, указанного через указатель uip_appdata, как это показано в следующем примере:
 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().