Checked in (slightly modified) patch #6683: Customizable AUTOIP "seed" address. This should reduce AUTOIP conflicts if LWIP_AUTOIP_CREATE_SEED_ADDR is overridden.

This commit is contained in:
goldsimon 2008-12-03 15:13:21 +00:00
parent 1f3fe200df
commit 491b73d5f2
2 changed files with 43 additions and 15 deletions

View File

@ -19,6 +19,11 @@ HISTORY
++ New features: ++ New features:
2008-12-03 Simon Goldschmidt (base on patch from Luca Cereoli)
* autoip.c: checked in (slightly modified) patch #6683: Customizable AUTOIP
"seed" address. This should reduce AUTOIP conflicts if
LWIP_AUTOIP_CREATE_SEED_ADDR is overridden.
2008-10-02 Jonathan Larmour and Rishi Khan 2008-10-02 Jonathan Larmour and Rishi Khan
* sockets.c (lwip_accept): Return EWOULDBLOCK if would block on non-blocking * sockets.c (lwip_accept): Return EWOULDBLOCK if would block on non-blocking
socket. socket.

View File

@ -76,7 +76,12 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
/* Pseudo random macro based on netif informations. // 169.254.1.0
#define AUTOIP_RANGE_START 0xA9FE0100
// 169.254.254.255
#define AUTOIP_RANGE_END 0xA9FEFEFF
/** Pseudo random macro based on netif informations.
* You could use "rand()" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h */ * You could use "rand()" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h */
#ifndef LWIP_AUTOIP_RAND #ifndef LWIP_AUTOIP_RAND
#define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \ #define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \
@ -86,11 +91,21 @@
(netif->autoip?netif->autoip->tried_llipaddr:0)) (netif->autoip?netif->autoip->tried_llipaddr:0))
#endif /* LWIP_AUTOIP_RAND */ #endif /* LWIP_AUTOIP_RAND */
/**
* Macro that generates the initial IP address to be tried by AUTOIP.
* If you want to override this, define it to something else in lwipopts.h.
*/
#ifndef LWIP_AUTOIP_CREATE_SEED_ADDR
#define LWIP_AUTOIP_CREATE_SEED_ADDR(netif) \
(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(netif->hwaddr[4])) | \
((u32_t)((u8_t)(netif->hwaddr[5]))) << 8)))
#endif /* LWIP_AUTOIP_CREATE_SEED_ADDR */
/* static functions */ /* static functions */
static void autoip_handle_arp_conflict(struct netif *netif); static void autoip_handle_arp_conflict(struct netif *netif);
/* creates random LL IP-Address for a network interface */ /* creates random LL IP-Address for a network interface */
static void autoip_create_rand_addr(struct netif *netif, struct ip_addr *RandomIPAddr); static void autoip_create_addr(struct netif *netif, struct ip_addr *RandomIPAddr);
/* sends an ARP announce */ /* sends an ARP announce */
static err_t autoip_arp_announce(struct netif *netif); static err_t autoip_arp_announce(struct netif *netif);
@ -144,30 +159,38 @@ autoip_handle_arp_conflict(struct netif *netif)
* Create an IP-Address out of range 169.254.1.0 to 169.254.254.255 * Create an IP-Address out of range 169.254.1.0 to 169.254.254.255
* *
* @param netif network interface on which create the IP-Address * @param netif network interface on which create the IP-Address
* @param RandomIPAddr ip address to initialize * @param IPAddr ip address to initialize
*/ */
static void static void
autoip_create_rand_addr(struct netif *netif, struct ip_addr *RandomIPAddr) autoip_create_addr(struct netif *netif, struct ip_addr *IPAddr)
{ {
/* Here we create an IP-Address out of range 169.254.1.0 to 169.254.254.255 /* Here we create an IP-Address out of range 169.254.1.0 to 169.254.254.255
* compliant to RFC 3927 Section 2.1 * compliant to RFC 3927 Section 2.1
* We have 254 * 256 possibilities * We have 254 * 256 possibilities
*/ */
RandomIPAddr->addr = (0xA9FE0100 + ((u32_t)(((u8_t)(netif->hwaddr[4])) |
((u32_t)((u8_t)(netif->hwaddr[5]))) << 8)) + netif->autoip->tried_llipaddr);
if (RandomIPAddr->addr>0xA9FEFEFF) { u16_t seed = LWIP_AUTOIP_CREATE_SEED_ADDR(netif);
RandomIPAddr->addr = (0xA9FE0100 + (RandomIPAddr->addr-0xA9FEFEFF)); /* seed must be between .1.0 and .254.255 */
if(seed < 0x0100) {
seed += 0x0100;
} }
if (RandomIPAddr->addr<0xA9FE0100) { if(seed > 0xFEFF) {
RandomIPAddr->addr = (0xA9FEFEFF - (0xA9FE0100-RandomIPAddr->addr)); see -= 0x0100;
} }
RandomIPAddr->addr = htonl(RandomIPAddr->addr);
IPAddr->addr = (AUTOIP_RANGE_START + seed + netif->autoip->tried_llipaddr);
if (IPAddr->addr > AUTOIP_RANGE_END) {
IPAddr->addr = (AUTOIP_RANGE_START + (IPAddr->addr - AUTOIP_RANGE_END));
}
if (IPAddr->addr < AUTOIP_RANGE_START) {
IPAddr->addr = (AUTOIP_RANGE_END - (AUTOIP_RANGE_START - IPAddr->addr));
}
IPAddr->addr = htonl(IPAddr->addr);
LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | 1, LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | 1,
("autoip_create_rand_addr(): tried_llipaddr=%"U16_F", 0x%08"X32_F"\n", ("autoip_create_addr(): tried_llipaddr=%"U16_F", 0x%08"X32_F"\n",
(u16_t)(netif->autoip->tried_llipaddr), (u32_t)(RandomIPAddr->addr))); (u16_t)(netif->autoip->tried_llipaddr), (u32_t)(IPAddr->addr)));
} }
/** /**
@ -258,7 +281,7 @@ autoip_start(struct netif *netif)
autoip->lastconflict = 0; autoip->lastconflict = 0;
} }
autoip_create_rand_addr(netif, &(autoip->llipaddr)); autoip_create_addr(netif, &(autoip->llipaddr));
autoip->tried_llipaddr++; autoip->tried_llipaddr++;
autoip->state = AUTOIP_STATE_PROBING; autoip->state = AUTOIP_STATE_PROBING;
autoip->sent_num = 0; autoip->sent_num = 0;