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));