DHCP

Все дело в том ,что устройство подключаемое к сети Ethernet , например в хаб, роутер или к ПК не должно иметь еще своего ip адреса .
Почему? Потому , что у устройства есть MAC адрес (его уникальный паспорт), но ip адрес ему присваивает сеть Ethernet.

Мы создаем свой RNDIS сетевой адаптер (на STM32) и на его примере разбираемся с DHCP.

DHCP работает по схеме Ethernet II / UDP .


В примере lwip LRNDIS указано (эта информация предназначена для драйвера RNDIS компьютера)

#define RNDIS_HWADDR     0x20,0x89,0x84,0x6A,0x96,0xAB  
// MAC-address to set to host interface 
static const uint8_t station_hwaddr[6] = { RNDIS_HWADDR };
static const uint8_t permanent_hwaddr[6] = { RNDIS_HWADDR };


Ниже указанный код служит для реализации DHCP мини сервера в самом адаптере RNDIS :

#define NUM_DHCP_ENTRY 3
static dhcp_entry_t entries[NUM_DHCP_ENTRY] =
{
		/* mac    ip address        subnet mask        lease time */
		{ {0}, {192, 168, 7, 3}, {255, 255, 255, 0}, 24 * 60 * 60 },
		{ {0}, {192, 168, 7, 4}, {255, 255, 255, 0}, 24 * 60 * 60 },
		{ {0}, {192, 168, 7, 5}, {255, 255, 255, 0}, 24 * 60 * 60 }
};
static dhcp_config_t dhcp_config =
{
    {192, 168, 7, 1}, 67, // server address, port
    {192, 168, 7, 1},     // dns server
    "stm",                // dns suffix
    NUM_DHCP_ENTRY,       // num entry
    entries               // entries
};

Еще надо учесть в lwipopts.h ,что :

#define LWIP_DHCP 1

По умолчанию запросы от клиента делаются на 67 порт к серверу, сервер в свою очередь отвечает на порт 68 к клиенту, выдавая адрес IP и другую необходимую информацию, такую, как сетевую маску, маршрутизатор и серверы DNS

Примечание : программа Winshark для DHCP протокола использует фильтр bootp.

Консольные команды

ipconfig /release ethernet4* ( addr )
ipconfig /renew

< Discover 0.0.0.0 ff.ff.ff.ff
> Offer. server > 0.0.0.0
< Request. 0.0.0.0 ff.ff.ff.ff
> ACK