Exemple #1
0
/**
 * Handle a IP address conflict after an ARP conflict detection
 */
static void
autoip_handle_arp_conflict(struct netif *netif)
{
  /* Somehow detect if we are defending or retreating */
  unsigned char defend = 1; /* tbd */

  if (defend) {
    if (netif->autoip->lastconflict > 0) {
      /* retreat, there was a conflicting ARP in the last
       * DEFEND_INTERVAL seconds
       */
      LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
        ("autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\n"));

      /* TODO: close all TCP sessions */
      autoip_restart(netif);
    } else {
      LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
        ("autoip_handle_arp_conflict(): we are defend, send ARP Announce\n"));
      autoip_arp_announce(netif);
      netif->autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND;
    }
  } else {
    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
      ("autoip_handle_arp_conflict(): we do not defend, retreating\n"));
    /* TODO: close all TCP sessions */
    autoip_restart(netif);
  }
}
/**
 * Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds
 */
void
autoip_tmr()
{
    struct netif *netif = netif_list;
    /* loop through netif's */
    while (netif != NULL) {
        /* only act on AutoIP configured interfaces */
        if (netif->autoip != NULL) {
            if(netif->autoip->lastconflict > 0) {
                netif->autoip->lastconflict--;
            }

            LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
                        ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n",
                         (u16_t)(netif->autoip->state), netif->autoip->ttw));

            switch(netif->autoip->state) {
            case AUTOIP_STATE_PROBING:
                if(netif->autoip->ttw > 0) {
                    netif->autoip->ttw--;
                } else {
                    if(netif->autoip->sent_num >= PROBE_NUM) {
                        netif->autoip->state = AUTOIP_STATE_ANNOUNCING;
                        netif->autoip->sent_num = 0;
                        netif->autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND;
                    } else {
                        autoip_arp_probe(netif);
                        LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
                                    ("autoip_tmr() PROBING Sent Probe\n"));
                        netif->autoip->sent_num++;
                        /* calculate time to wait to next probe */
                        netif->autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) %
                                                      ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) +
                                                     PROBE_MIN * AUTOIP_TICKS_PER_SECOND);
                    }
                }
                break;

            case AUTOIP_STATE_ANNOUNCING:
                if(netif->autoip->ttw > 0) {
                    netif->autoip->ttw--;
                } else {
                    if(netif->autoip->sent_num == 0) {
                        /* We are here the first time, so we waited ANNOUNCE_WAIT seconds
                         * Now we can bind to an IP address and use it.
                         *
                         * autoip_bind calls netif_set_up. This triggers a gratuitous ARP
                         * which counts as an announcement.
                         */
                        autoip_bind(netif);
                    } else {
                        autoip_arp_announce(netif);
                        LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
                                    ("autoip_tmr() ANNOUNCING Sent Announce\n"));
                    }
                    netif->autoip->ttw = ANNOUNCE_INTERVAL * AUTOIP_TICKS_PER_SECOND;
                    netif->autoip->sent_num++;

                    if(netif->autoip->sent_num >= ANNOUNCE_NUM) {
                        netif->autoip->state = AUTOIP_STATE_BOUND;
                        netif->autoip->sent_num = 0;
                        netif->autoip->ttw = 0;
                    }
                }
                break;
            }
        }
        /* proceed to next network interface */
        netif = netif->next;
    }
}
Exemple #3
0
/**
 * Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds
 */
void
autoip_tmr()
{
  struct netif *netif = netif_list;
  /* loop through netif's */
  while (netif != NULL) {
    /* only act on AutoIP configured interfaces */
    if (netif->autoip != NULL) {
      if (netif->autoip->lastconflict > 0) {
        netif->autoip->lastconflict--;
      }

      LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
        ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n",
        (u16_t)(netif->autoip->state), netif->autoip->ttw));

      switch(netif->autoip->state) {
        case AUTOIP_STATE_PROBING:
          if (netif->autoip->ttw > 0) {
            netif->autoip->ttw--;
          } else {
            if (netif->autoip->sent_num >= PROBE_NUM) {
              netif->autoip->state = AUTOIP_STATE_ANNOUNCING;
              netif->autoip->sent_num = 0;
              netif->autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND;
              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
                 ("autoip_tmr(): changing state to ANNOUNCING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
                  ip4_addr1_16(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr),
                  ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr)));
            } else {
              autoip_arp_probe(netif);
              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
                ("autoip_tmr() PROBING Sent Probe\n"));
              netif->autoip->sent_num++;
              /* calculate time to wait to next probe */
              netif->autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) %
                ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) +
                PROBE_MIN * AUTOIP_TICKS_PER_SECOND);
            }
          }
          break;

        case AUTOIP_STATE_ANNOUNCING:
          if (netif->autoip->ttw > 0) {
            netif->autoip->ttw--;
          } else {
            if (netif->autoip->sent_num == 0) {
             /* We are here the first time, so we waited ANNOUNCE_WAIT seconds
              * Now we can bind to an IP address and use it.
              *
              * autoip_bind calls netif_set_up. This triggers a gratuitous ARP
              * which counts as an announcement.
              */
              autoip_bind(netif);
            } else {
              autoip_arp_announce(netif);
	      /* Store announced IP address in a global variable, so that
	       * it can be retrieved in case of link-loss */
	      memcpy(&prev_llipaddr, &(netif->autoip->llipaddr),
			      sizeof(ip_addr_t));
              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,
                ("autoip_tmr() ANNOUNCING Sent Announce\n"));
            }
            netif->autoip->ttw = ANNOUNCE_INTERVAL * AUTOIP_TICKS_PER_SECOND;
            netif->autoip->sent_num++;

            if (netif->autoip->sent_num >= ANNOUNCE_NUM) {
                netif->autoip->state = AUTOIP_STATE_BOUND;
                netif->autoip->sent_num = 0;
                netif->autoip->ttw = 0;
				netif->autoip->tried_llipaddr = 0;
                netif_send_status(netif);
                 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,
                    ("autoip_tmr(): changing state to BOUND: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
                     ip4_addr1_16(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr),
                     ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr)));
            }
          }
          break;
      }
    }
    /* proceed to next network interface */
    netif = netif->next;
  }
}