X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=sidebyside;f=avahi-autoipd%2Fmain.c;h=edf2cd119817eae3af7c73a2b0c1f8e3f9603dbf;hb=c5ef344e39fd7e169a31e2353ba09a8870768502;hp=01ccc79ef9dd6d3bb6b0d7496f4b740d9be66e8d;hpb=872947dffb0d1e5b23658ef118799c0ed55d8b27;p=catta diff --git a/avahi-autoipd/main.c b/avahi-autoipd/main.c index 01ccc79..edf2cd1 100644 --- a/avahi-autoipd/main.c +++ b/avahi-autoipd/main.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of avahi. @@ -1144,9 +1142,13 @@ static int loop(int iface, uint32_t addr) { for (i = 0; i < ETHER_ADDRLEN; i++) a += hw_address[i]*i; + a = (a % 0xFE00) + 0x0100; + addr = htonl(IPV4LL_NETWORK | (uint32_t) a); } + assert(is_ll_address(addr)); + set_state(st, 1, addr); daemon_log(LOG_INFO, "Starting with address %s", inet_ntop(AF_INET, &addr, buf, sizeof(buf))); @@ -1240,9 +1242,14 @@ static int loop(int iface, uint32_t addr) { int conflict = 0; if (info.sender_ip_address == addr) { - /* Normal conflict */ - conflict = 1; - daemon_log(LOG_INFO, "Received conflicting normal ARP packet."); + + if (memcmp(hw_address, info.sender_hw_address, ETHER_ADDRLEN)) { + /* Normal conflict */ + conflict = 1; + daemon_log(LOG_INFO, "Received conflicting normal ARP packet."); + } else + daemon_log(LOG_DEBUG, "Received ARP packet back on source interface. Ignoring."); + } else if (state == STATE_WAITING_PROBE || state == STATE_PROBING || state == STATE_WAITING_ANNOUNCE) { /* Probe conflict */ conflict = info.target_ip_address == addr && memcmp(hw_address, info.sender_hw_address, ETHER_ADDRLEN); @@ -1277,7 +1284,7 @@ static int loop(int iface, uint32_t addr) { DEBUG(daemon_log(LOG_DEBUG, "Ignoring irrelevant ARP packet.")); } - } else if (event == EVENT_ROUTABLE_ADDR_CONFIGURED) { + } else if (event == EVENT_ROUTABLE_ADDR_CONFIGURED && !force_bind) { daemon_log(LOG_INFO, "A routable address has been configured."); @@ -1302,7 +1309,7 @@ static int loop(int iface, uint32_t addr) { elapse_time(&next_wakeup, 0, PROBE_WAIT*1000); next_wakeup_valid = 1; - } else if (event == EVENT_REFRESH_REQUEST && state == STATE_RUNNING && !force_bind) { + } else if (event == EVENT_REFRESH_REQUEST && state == STATE_RUNNING) { /* The user requested a reannouncing of the address by a SIGHUP */ daemon_log(LOG_INFO, "Reannouncing address.");