скрытое меню

UDP

Программируем под Atollic True Studio на STM32. Делаем RNDIS адаптер. По сути это сетевая карта.

Фишка в том , что по умолчанию в LWIP запросы по UDP не отрабатываются, то есть на все запросы мы не отвечаем (for_us = 0). Нам надо указать какой порт мы хотим отрабатывать.

Чтобы включить отработку запросов по udp делаем примерно так (udp_new , udp_bind , udp_recv) , один раз при инициализации :

struct udp_pcb *pcb = udp_new();

err = udp_bind(pcb, IP_ADDR_ANY, c->port);

udp_recv(pcb, udp_recv_proc, NULL);
// назначает коллбек функцию 
// для обработки пришедшего пакета на наш порт

pcb - Program Control Block .

Когда мы втыкает такое устройство как сетевой адаптер куда-нибудь в ПК, ОС ПК делает запрос на порт 67 к предполагаемому серверу DHCP . Потому , что ОС должна решить вопрос с выделением IP новому сетевому устройству . Но поскольку это устройство сетевой адаптер, то ОС предполагает , что за ним есть сеть , а там скорее всего может быть DHCP сервер, который по мнению ОС и выделит нашему адаптеру IP.

То есть решается вопрос , кто будет выделять IP адаптеру.

После создания обработчика upd пакетов (67 порта) влетаем в его обработку по стандартному пути :

main()
  usb_polling()
    ethernet_input()
      ip4_input()
        udp_input()
          for_us = 1; // на 67 порту 
          pcb->recv //переход на коллбек = udp_recv_proc []
            DHCP_DISCOVER // приходит первым к нам
              udp_sendto()
    .... // ловим следующих пакет , 
            DHCP_REQUEST
              udp_sendto()