Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of F7_Ethernet by
autoip.c
00001 /** 00002 * @file 00003 * AutoIP Automatic LinkLocal IP Configuration 00004 * 00005 */ 00006 00007 /* 00008 * 00009 * Copyright (c) 2007 Dominik Spies <kontakt@dspies.de> 00010 * All rights reserved. 00011 * 00012 * Redistribution and use in source and binary forms, with or without modification, 00013 * are permitted provided that the following conditions are met: 00014 * 00015 * 1. Redistributions of source code must retain the above copyright notice, 00016 * this list of conditions and the following disclaimer. 00017 * 2. Redistributions in binary form must reproduce the above copyright notice, 00018 * this list of conditions and the following disclaimer in the documentation 00019 * and/or other materials provided with the distribution. 00020 * 3. The name of the author may not be used to endorse or promote products 00021 * derived from this software without specific prior written permission. 00022 * 00023 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 00024 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00025 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 00026 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00027 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 00028 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00029 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00030 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 00031 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 00032 * OF SUCH DAMAGE. 00033 * 00034 * Author: Dominik Spies <kontakt@dspies.de> 00035 * 00036 * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform 00037 * with RFC 3927. 00038 * 00039 * 00040 * Please coordinate changes and requests with Dominik Spies 00041 * <kontakt@dspies.de> 00042 */ 00043 00044 /******************************************************************************* 00045 * USAGE: 00046 * 00047 * define LWIP_AUTOIP 1 in your lwipopts.h 00048 * 00049 * If you don't use tcpip.c (so, don't call, you don't call tcpip_init): 00050 * - First, call autoip_init(). 00051 * - call autoip_tmr() all AUTOIP_TMR_INTERVAL msces, 00052 * that should be defined in autoip.h. 00053 * I recommend a value of 100. The value must divide 1000 with a remainder almost 0. 00054 * Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 .... 00055 * 00056 * Without DHCP: 00057 * - Call autoip_start() after netif_add(). 00058 * 00059 * With DHCP: 00060 * - define LWIP_DHCP_AUTOIP_COOP 1 in your lwipopts.h. 00061 * - Configure your DHCP Client. 00062 * 00063 */ 00064 00065 #include "lwip/opt.h" 00066 00067 #if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */ 00068 00069 #include "lwip/mem.h" 00070 #include "lwip/udp.h" 00071 #include "lwip/ip_addr.h" 00072 #include "lwip/netif.h" 00073 #include "lwip/autoip.h" 00074 #include "netif/etharp.h" 00075 00076 #include <stdlib.h> 00077 #include <string.h> 00078 00079 /* 169.254.0.0 */ 00080 #define AUTOIP_NET 0xA9FE0000 00081 /* 169.254.1.0 */ 00082 #define AUTOIP_RANGE_START (AUTOIP_NET | 0x0100) 00083 /* 169.254.254.255 */ 00084 #define AUTOIP_RANGE_END (AUTOIP_NET | 0xFEFF) 00085 00086 00087 /** Pseudo random macro based on netif informations. 00088 * You could use "rand()" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h */ 00089 #ifndef LWIP_AUTOIP_RAND 00090 #define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \ 00091 ((u32_t)((netif->hwaddr[3]) & 0xff) << 16) | \ 00092 ((u32_t)((netif->hwaddr[2]) & 0xff) << 8) | \ 00093 ((u32_t)((netif->hwaddr[4]) & 0xff))) + \ 00094 (netif->autoip?netif->autoip->tried_llipaddr:0)) 00095 #endif /* LWIP_AUTOIP_RAND */ 00096 00097 /** 00098 * Macro that generates the initial IP address to be tried by AUTOIP. 00099 * If you want to override this, define it to something else in lwipopts.h. 00100 */ 00101 #ifndef LWIP_AUTOIP_CREATE_SEED_ADDR 00102 #define LWIP_AUTOIP_CREATE_SEED_ADDR(netif) \ 00103 htonl(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(netif->hwaddr[4])) | \ 00104 ((u32_t)((u8_t)(netif->hwaddr[5]))) << 8))) 00105 #endif /* LWIP_AUTOIP_CREATE_SEED_ADDR */ 00106 00107 /* static functions */ 00108 static void autoip_handle_arp_conflict(struct netif *netif); 00109 00110 /* creates a pseudo random LL IP-Address for a network interface */ 00111 static void autoip_create_addr(struct netif *netif, ip_addr_t *ipaddr); 00112 00113 /* sends an ARP probe */ 00114 static err_t autoip_arp_probe(struct netif *netif); 00115 00116 /* sends an ARP announce */ 00117 static err_t autoip_arp_announce(struct netif *netif); 00118 00119 /* configure interface for use with current LL IP-Address */ 00120 static err_t autoip_bind(struct netif *netif); 00121 00122 /* start sending probes for llipaddr */ 00123 static void autoip_start_probing(struct netif *netif); 00124 00125 00126 /** Set a statically allocated struct autoip to work with. 00127 * Using this prevents autoip_start to allocate it using mem_malloc. 00128 * 00129 * @param netif the netif for which to set the struct autoip 00130 * @param dhcp (uninitialised) dhcp struct allocated by the application 00131 */ 00132 void 00133 autoip_set_struct(struct netif *netif, struct autoip *autoip) 00134 { 00135 LWIP_ASSERT("netif != NULL", netif != NULL); 00136 LWIP_ASSERT("autoip != NULL", autoip != NULL); 00137 LWIP_ASSERT("netif already has a struct autoip set", netif->autoip == NULL); 00138 00139 /* clear data structure */ 00140 memset(autoip, 0, sizeof(struct autoip)); 00141 /* autoip->state = AUTOIP_STATE_OFF; */ 00142 netif->autoip = autoip; 00143 } 00144 00145 /** Restart AutoIP client and check the next address (conflict detected) 00146 * 00147 * @param netif The netif under AutoIP control 00148 */ 00149 static void 00150 autoip_restart(struct netif *netif) 00151 { 00152 netif->autoip->tried_llipaddr++; 00153 autoip_start(netif); 00154 } 00155 00156 /** 00157 * Handle a IP address conflict after an ARP conflict detection 00158 */ 00159 static void 00160 autoip_handle_arp_conflict(struct netif *netif) 00161 { 00162 /* Somehow detect if we are defending or retreating */ 00163 unsigned char defend = 1; /* tbd */ 00164 00165 if (defend) { 00166 if (netif->autoip->lastconflict > 0) { 00167 /* retreat, there was a conflicting ARP in the last 00168 * DEFEND_INTERVAL seconds 00169 */ 00170 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, 00171 ("autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\n")); 00172 00173 /* TODO: close all TCP sessions */ 00174 autoip_restart(netif); 00175 } else { 00176 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, 00177 ("autoip_handle_arp_conflict(): we are defend, send ARP Announce\n")); 00178 autoip_arp_announce(netif); 00179 netif->autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND; 00180 } 00181 } else { 00182 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, 00183 ("autoip_handle_arp_conflict(): we do not defend, retreating\n")); 00184 /* TODO: close all TCP sessions */ 00185 autoip_restart(netif); 00186 } 00187 } 00188 00189 /** 00190 * Create an IP-Address out of range 169.254.1.0 to 169.254.254.255 00191 * 00192 * @param netif network interface on which create the IP-Address 00193 * @param ipaddr ip address to initialize 00194 */ 00195 static void 00196 autoip_create_addr(struct netif *netif, ip_addr_t *ipaddr) 00197 { 00198 /* Here we create an IP-Address out of range 169.254.1.0 to 169.254.254.255 00199 * compliant to RFC 3927 Section 2.1 00200 * We have 254 * 256 possibilities */ 00201 00202 u32_t addr = ntohl(LWIP_AUTOIP_CREATE_SEED_ADDR(netif)); 00203 addr += netif->autoip->tried_llipaddr; 00204 addr = AUTOIP_NET | (addr & 0xffff); 00205 /* Now, 169.254.0.0 <= addr <= 169.254.255.255 */ 00206 00207 if (addr < AUTOIP_RANGE_START) { 00208 addr += AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1; 00209 } 00210 if (addr > AUTOIP_RANGE_END) { 00211 addr -= AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1; 00212 } 00213 LWIP_ASSERT("AUTOIP address not in range", (addr >= AUTOIP_RANGE_START) && 00214 (addr <= AUTOIP_RANGE_END)); 00215 ip4_addr_set_u32(ipaddr, htonl(addr)); 00216 00217 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, 00218 ("autoip_create_addr(): tried_llipaddr=%"U16_F", %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", 00219 (u16_t)(netif->autoip->tried_llipaddr), ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), 00220 ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr))); 00221 } 00222 00223 /** 00224 * Sends an ARP probe from a network interface 00225 * 00226 * @param netif network interface used to send the probe 00227 */ 00228 static err_t 00229 autoip_arp_probe(struct netif *netif) 00230 { 00231 return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, 00232 (struct eth_addr *)netif->hwaddr, IP_ADDR_ANY, ðzero, 00233 &netif->autoip->llipaddr, ARP_REQUEST); 00234 } 00235 00236 /** 00237 * Sends an ARP announce from a network interface 00238 * 00239 * @param netif network interface used to send the announce 00240 */ 00241 static err_t 00242 autoip_arp_announce(struct netif *netif) 00243 { 00244 return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, 00245 (struct eth_addr *)netif->hwaddr, &netif->autoip->llipaddr, ðzero, 00246 &netif->autoip->llipaddr, ARP_REQUEST); 00247 } 00248 00249 /** 00250 * Configure interface for use with current LL IP-Address 00251 * 00252 * @param netif network interface to configure with current LL IP-Address 00253 */ 00254 static err_t 00255 autoip_bind(struct netif *netif) 00256 { 00257 struct autoip *autoip = netif->autoip; 00258 ip_addr_t sn_mask, gw_addr; 00259 00260 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, 00261 ("autoip_bind(netif=%p) %c%c%"U16_F" %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", 00262 (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num, 00263 ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), 00264 ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); 00265 00266 IP4_ADDR(&sn_mask, 255, 255, 0, 0); 00267 IP4_ADDR(&gw_addr, 0, 0, 0, 0); 00268 00269 netif_set_ipaddr(netif, &autoip->llipaddr); 00270 netif_set_netmask(netif, &sn_mask); 00271 netif_set_gw(netif, &gw_addr); 00272 00273 /* bring the interface up */ 00274 netif_set_up(netif); 00275 00276 return ERR_OK; 00277 } 00278 00279 /** 00280 * Start AutoIP client 00281 * 00282 * @param netif network interface on which start the AutoIP client 00283 */ 00284 err_t 00285 autoip_start(struct netif *netif) 00286 { 00287 struct autoip *autoip = netif->autoip; 00288 err_t result = ERR_OK; 00289 00290 if (netif_is_up(netif)) { 00291 netif_set_down(netif); 00292 } 00293 00294 /* Set IP-Address, Netmask and Gateway to 0 to make sure that 00295 * ARP Packets are formed correctly 00296 */ 00297 ip_addr_set_zero(&netif->ip_addr); 00298 ip_addr_set_zero(&netif->netmask); 00299 ip_addr_set_zero(&netif->gw); 00300 00301 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, 00302 ("autoip_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], 00303 netif->name[1], (u16_t)netif->num)); 00304 if (autoip == NULL) { 00305 /* no AutoIP client attached yet? */ 00306 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, 00307 ("autoip_start(): starting new AUTOIP client\n")); 00308 autoip = (struct autoip *)mem_malloc(sizeof(struct autoip)); 00309 if (autoip == NULL) { 00310 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, 00311 ("autoip_start(): could not allocate autoip\n")); 00312 return ERR_MEM; 00313 } 00314 memset(autoip, 0, sizeof(struct autoip)); 00315 /* store this AutoIP client in the netif */ 00316 netif->autoip = autoip; 00317 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): allocated autoip")); 00318 } else { 00319 autoip->state = AUTOIP_STATE_OFF; 00320 autoip->ttw = 0; 00321 autoip->sent_num = 0; 00322 ip_addr_set_zero(&autoip->llipaddr); 00323 autoip->lastconflict = 0; 00324 } 00325 00326 autoip_create_addr(netif, &(autoip->llipaddr)); 00327 autoip_start_probing(netif); 00328 00329 return result; 00330 } 00331 00332 static void 00333 autoip_start_probing(struct netif *netif) 00334 { 00335 struct autoip *autoip = netif->autoip; 00336 00337 autoip->state = AUTOIP_STATE_PROBING; 00338 autoip->sent_num = 0; 00339 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, 00340 ("autoip_start_probing(): changing state to PROBING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", 00341 ip4_addr1_16(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr), 00342 ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr))); 00343 00344 /* time to wait to first probe, this is randomly 00345 * choosen out of 0 to PROBE_WAIT seconds. 00346 * compliant to RFC 3927 Section 2.2.1 00347 */ 00348 autoip->ttw = (u16_t)(LWIP_AUTOIP_RAND(netif) % (PROBE_WAIT * AUTOIP_TICKS_PER_SECOND)); 00349 00350 /* 00351 * if we tried more then MAX_CONFLICTS we must limit our rate for 00352 * accquiring and probing address 00353 * compliant to RFC 3927 Section 2.2.1 00354 */ 00355 if (autoip->tried_llipaddr > MAX_CONFLICTS) { 00356 autoip->ttw = RATE_LIMIT_INTERVAL * AUTOIP_TICKS_PER_SECOND; 00357 } 00358 } 00359 00360 /** 00361 * Handle a possible change in the network configuration. 00362 * 00363 * If there is an AutoIP address configured, take the interface down 00364 * and begin probing with the same address. 00365 */ 00366 void 00367 autoip_network_changed(struct netif *netif) 00368 { 00369 if (netif->autoip && netif->autoip->state != AUTOIP_STATE_OFF) { 00370 netif_set_down(netif); 00371 autoip_start_probing(netif); 00372 } 00373 } 00374 00375 /** 00376 * Stop AutoIP client 00377 * 00378 * @param netif network interface on which stop the AutoIP client 00379 */ 00380 err_t 00381 autoip_stop(struct netif *netif) 00382 { 00383 netif->autoip->state = AUTOIP_STATE_OFF; 00384 netif_set_down(netif); 00385 return ERR_OK; 00386 } 00387 00388 /** 00389 * Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds 00390 */ 00391 void 00392 autoip_tmr() 00393 { 00394 struct netif *netif = netif_list; 00395 /* loop through netif's */ 00396 while (netif != NULL) { 00397 /* only act on AutoIP configured interfaces */ 00398 if (netif->autoip != NULL) { 00399 if (netif->autoip->lastconflict > 0) { 00400 netif->autoip->lastconflict--; 00401 } 00402 00403 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, 00404 ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n", 00405 (u16_t)(netif->autoip->state), netif->autoip->ttw)); 00406 00407 switch(netif->autoip->state) { 00408 case AUTOIP_STATE_PROBING: 00409 if (netif->autoip->ttw > 0) { 00410 netif->autoip->ttw--; 00411 } else { 00412 if (netif->autoip->sent_num >= PROBE_NUM) { 00413 netif->autoip->state = AUTOIP_STATE_ANNOUNCING; 00414 netif->autoip->sent_num = 0; 00415 netif->autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND; 00416 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, 00417 ("autoip_tmr(): changing state to ANNOUNCING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", 00418 ip4_addr1_16(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr), 00419 ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr))); 00420 } else { 00421 autoip_arp_probe(netif); 00422 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, 00423 ("autoip_tmr() PROBING Sent Probe\n")); 00424 netif->autoip->sent_num++; 00425 /* calculate time to wait to next probe */ 00426 netif->autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) % 00427 ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) + 00428 PROBE_MIN * AUTOIP_TICKS_PER_SECOND); 00429 } 00430 } 00431 break; 00432 00433 case AUTOIP_STATE_ANNOUNCING: 00434 if (netif->autoip->ttw > 0) { 00435 netif->autoip->ttw--; 00436 } else { 00437 if (netif->autoip->sent_num == 0) { 00438 /* We are here the first time, so we waited ANNOUNCE_WAIT seconds 00439 * Now we can bind to an IP address and use it. 00440 * 00441 * autoip_bind calls netif_set_up. This triggers a gratuitous ARP 00442 * which counts as an announcement. 00443 */ 00444 autoip_bind(netif); 00445 } else { 00446 autoip_arp_announce(netif); 00447 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, 00448 ("autoip_tmr() ANNOUNCING Sent Announce\n")); 00449 } 00450 netif->autoip->ttw = ANNOUNCE_INTERVAL * AUTOIP_TICKS_PER_SECOND; 00451 netif->autoip->sent_num++; 00452 00453 if (netif->autoip->sent_num >= ANNOUNCE_NUM) { 00454 netif->autoip->state = AUTOIP_STATE_BOUND; 00455 netif->autoip->sent_num = 0; 00456 netif->autoip->ttw = 0; 00457 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, 00458 ("autoip_tmr(): changing state to BOUND: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", 00459 ip4_addr1_16(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr), 00460 ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr))); 00461 } 00462 } 00463 break; 00464 } 00465 } 00466 /* proceed to next network interface */ 00467 netif = netif->next; 00468 } 00469 } 00470 00471 /** 00472 * Handles every incoming ARP Packet, called by etharp_arp_input. 00473 * 00474 * @param netif network interface to use for autoip processing 00475 * @param hdr Incoming ARP packet 00476 */ 00477 void 00478 autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr) 00479 { 00480 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_arp_reply()\n")); 00481 if ((netif->autoip != NULL) && (netif->autoip->state != AUTOIP_STATE_OFF)) { 00482 /* when ip.src == llipaddr && hw.src != netif->hwaddr 00483 * 00484 * when probing ip.dst == llipaddr && hw.src != netif->hwaddr 00485 * we have a conflict and must solve it 00486 */ 00487 ip_addr_t sipaddr, dipaddr; 00488 struct eth_addr netifaddr; 00489 ETHADDR16_COPY(netifaddr.addr, netif->hwaddr); 00490 00491 /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without 00492 * structure packing (not using structure copy which breaks strict-aliasing rules). 00493 */ 00494 IPADDR2_COPY(&sipaddr, &hdr->sipaddr); 00495 IPADDR2_COPY(&dipaddr, &hdr->dipaddr); 00496 00497 if ((netif->autoip->state == AUTOIP_STATE_PROBING) || 00498 ((netif->autoip->state == AUTOIP_STATE_ANNOUNCING) && 00499 (netif->autoip->sent_num == 0))) { 00500 /* RFC 3927 Section 2.2.1: 00501 * from beginning to after ANNOUNCE_WAIT 00502 * seconds we have a conflict if 00503 * ip.src == llipaddr OR 00504 * ip.dst == llipaddr && hw.src != own hwaddr 00505 */ 00506 if ((ip_addr_cmp(&sipaddr, &netif->autoip->llipaddr)) || 00507 (ip_addr_cmp(&dipaddr, &netif->autoip->llipaddr) && 00508 !eth_addr_cmp(&netifaddr, &hdr->shwaddr))) { 00509 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, 00510 ("autoip_arp_reply(): Probe Conflict detected\n")); 00511 autoip_restart(netif); 00512 } 00513 } else { 00514 /* RFC 3927 Section 2.5: 00515 * in any state we have a conflict if 00516 * ip.src == llipaddr && hw.src != own hwaddr 00517 */ 00518 if (ip_addr_cmp(&sipaddr, &netif->autoip->llipaddr) && 00519 !eth_addr_cmp(&netifaddr, &hdr->shwaddr)) { 00520 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, 00521 ("autoip_arp_reply(): Conflicting ARP-Packet detected\n")); 00522 autoip_handle_arp_conflict(netif); 00523 } 00524 } 00525 } 00526 } 00527 00528 #endif /* LWIP_AUTOIP */
Generated on Wed Jul 13 2022 02:45:40 by
1.7.2
