61 #if LWIP_IPV4 && LWIP_AUTOIP
75 #ifndef LWIP_AUTOIP_RAND
76 #define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \
77 ((u32_t)((netif->hwaddr[3]) & 0xff) << 16) | \
78 ((u32_t)((netif->hwaddr[2]) & 0xff) << 8) | \
79 ((u32_t)((netif->hwaddr[4]) & 0xff))) + \
80 (netif_autoip_data(netif)? netif_autoip_data(netif)->tried_llipaddr : 0))
87 #ifndef LWIP_AUTOIP_CREATE_SEED_ADDR
88 #define LWIP_AUTOIP_CREATE_SEED_ADDR(netif) \
89 lwip_htonl(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(netif->hwaddr[4])) | \
90 ((u32_t)((u8_t)(netif->hwaddr[5]))) << 8)))
95 static void autoip_start_probing(
struct netif *
netif);
106 autoip_set_struct(
struct netif *
netif,
struct autoip *autoip)
110 LWIP_ASSERT(
"netif already has a struct autoip set",
114 memset(autoip, 0,
sizeof(
struct autoip));
116 netif_set_client_data(
netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP, autoip);
126 struct autoip* autoip = netif_autoip_data(
netif);
127 autoip->tried_llipaddr++;
135 autoip_handle_arp_conflict(
struct netif *
netif)
137 struct autoip* autoip = netif_autoip_data(
netif);
146 if (autoip->lastconflict > 0) {
149 (
"autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\n"));
152 autoip_restart(
netif);
155 (
"autoip_handle_arp_conflict(): we are defend, send ARP Announce\n"));
156 autoip_arp_announce(
netif);
168 autoip_create_addr(
struct netif *
netif, ip4_addr_t *ipaddr)
170 struct autoip* autoip = netif_autoip_data(
netif);
177 addr += autoip->tried_llipaddr;
193 (
u16_t)(autoip->tried_llipaddr), ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr),
194 ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));
205 struct autoip* autoip = netif_autoip_data(
netif);
207 return etharp_request(
netif, &autoip->llipaddr);
218 return etharp_gratuitous(
netif);
229 struct autoip* autoip = netif_autoip_data(
netif);
230 ip4_addr_t sn_mask, gw_addr;
235 ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),
236 ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));
238 IP4_ADDR(&sn_mask, 255, 255, 0, 0);
239 IP4_ADDR(&gw_addr, 0, 0, 0, 0);
241 netif_set_addr(
netif, &autoip->llipaddr, &sn_mask, &gw_addr);
256 struct autoip* autoip = netif_autoip_data(
netif);
264 netif_set_addr(
netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);
269 if (autoip ==
NULL) {
272 (
"autoip_start(): starting new AUTOIP client\n"));
273 autoip = (
struct autoip *)
mem_malloc(
sizeof(
struct autoip));
274 if (autoip ==
NULL) {
276 (
"autoip_start(): could not allocate autoip\n"));
279 memset(autoip, 0,
sizeof(
struct autoip));
281 netif_set_client_data(
netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP, autoip);
286 autoip->sent_num = 0;
287 ip4_addr_set_zero(&autoip->llipaddr);
288 autoip->lastconflict = 0;
291 autoip_create_addr(
netif, &(autoip->llipaddr));
292 autoip_start_probing(
netif);
300 struct autoip* autoip = netif_autoip_data(
netif);
303 autoip->sent_num = 0;
306 ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),
307 ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));
334 struct autoip* autoip = netif_autoip_data(
netif);
337 autoip_start_probing(
netif);
350 struct autoip* autoip = netif_autoip_data(
netif);
352 if (autoip !=
NULL) {
354 if (ip4_addr_islinklocal(netif_ip4_addr(
netif))) {
355 netif_set_addr(
netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);
370 struct autoip* autoip = netif_autoip_data(
netif);
372 if (autoip !=
NULL) {
373 if (autoip->lastconflict > 0) {
374 autoip->lastconflict--;
378 (
"autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n",
379 (
u16_t)(autoip->state), autoip->ttw));
381 if (autoip->ttw > 0) {
385 switch(autoip->state) {
387 if (autoip->ttw == 0) {
394 autoip->sent_num = 1;
398 ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),
399 ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));
401 autoip_arp_probe(
netif);
409 autoip->ttw = (
u16_t)((LWIP_AUTOIP_RAND(
netif) %
418 if (autoip->ttw == 0) {
419 autoip_arp_announce(
netif);
426 autoip->sent_num = 0;
430 ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),
431 ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));
455 struct autoip* autoip = netif_autoip_data(
netif);
464 ip4_addr_t sipaddr, dipaddr;
471 IPADDR2_COPY(&sipaddr, &hdr->sipaddr);
472 IPADDR2_COPY(&dipaddr, &hdr->dipaddr);
481 if ((ip4_addr_cmp(&sipaddr, &autoip->llipaddr)) ||
482 (ip4_addr_isany_val(sipaddr) &&
483 ip4_addr_cmp(&dipaddr, &autoip->llipaddr) &&
486 (
"autoip_arp_reply(): Probe Conflict detected\n"));
487 autoip_restart(
netif);
494 if (ip4_addr_cmp(&sipaddr, &autoip->llipaddr) &&
497 (
"autoip_arp_reply(): Conflicting ARP-Packet detected\n"));
498 autoip_handle_arp_conflict(
netif);
511 autoip_supplied_address(
const struct netif *
netif)
514 struct autoip* autoip = netif_autoip_data(
netif);
521 autoip_accept_packet(
struct netif *
netif,
const ip4_addr_t *addr)
523 struct autoip* autoip = netif_autoip_data(
netif);
524 return (autoip !=
NULL) && ip4_addr_cmp(addr, &(autoip->llipaddr));