Все дело в том ,что устройство подключаемое к сети 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