<br><font size=2><tt>Hi,</tt></font>
<br>
<br><font size=2><tt>I've found a bug when using avahi-autoipd in its default
mode</tt></font>
<br><font size=2><tt>of operation (as described on the AvahiAutoipd page
in the Wiki):</tt></font>
<br>
<br><font size=2><tt>If a routeable address is configured, avahi-autoipd
goes to sleep without</tt></font>
<br><font size=2><tt>configuring the interface, but it is still listening
for ARP packets.</tt></font>
<br><font size=2><tt>If an ARP packet is seen from the LL address it chose
for itself</tt></font>
<br><font size=2><tt>at start-up, it acts on this ARP as if there was a
conflict and configures</tt></font>
<br><font size=2><tt>the network interface with an LL address.</tt></font>
<br>
<br><font size=2><tt>The following patch to main.c fixes this problem:</tt></font>
<br>
<br><font size=2><tt>{{{</tt></font>
<br><font size=2><tt>1267c1267,1280</tt></font>
<br><font size=2><tt>&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; daemon_log(LOG_INFO, &quot;Trying address %s&quot;,
inet_ntop(AF_INET, &amp;addr, buf, sizeof(buf)));</tt></font>
<br><font size=2><tt>---</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if (state == STATE_SLEEPING)</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; daemon_log(LOG_INFO, &quot;Selected
new address %s&quot;, inet_ntop(AF_INET, &amp;addr, buf, sizeof(buf)));</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; else {</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; daemon_log(LOG_INFO, &quot;Trying address
%s&quot;, inet_ntop(AF_INET, &amp;addr, buf, sizeof(buf)));</tt></font>
<br><font size=2><tt>&gt; </tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n_conflict++;</tt></font>
<br><font size=2><tt>&gt; </tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set_state(STATE_WAITING_PROBE, 1, addr);</tt></font>
<br><font size=2><tt>&gt; </tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (n_conflict &gt;= MAX_CONFLICTS)
{</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; daemon_log(LOG_WARNING,
&quot;Got too many conflicts, rate limiting new probes.&quot;);</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elapse_time(&amp;next_wakeup,
RATE_LIMIT_INTERVAL*1000, PROBE_WAIT*1000);</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elapse_time(&amp;next_wakeup,
0, PROBE_WAIT*1000);</tt></font>
<br><font size=2><tt>1269,1279c1282,1283</tt></font>
<br><font size=2><tt>&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; n_conflict++;</tt></font>
<br><font size=2><tt>&lt; </tt></font>
<br><font size=2><tt>&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; set_state(STATE_WAITING_PROBE, 1, addr);</tt></font>
<br><font size=2><tt>&lt; </tt></font>
<br><font size=2><tt>&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if (n_conflict &gt;= MAX_CONFLICTS) {</tt></font>
<br><font size=2><tt>&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; daemon_log(LOG_WARNING, &quot;Got too
many conflicts, rate limiting new probes.&quot;);</tt></font>
<br><font size=2><tt>&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elapse_time(&amp;next_wakeup, RATE_LIMIT_INTERVAL*1000,
PROBE_WAIT*1000);</tt></font>
<br><font size=2><tt>&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; } else</tt></font>
<br><font size=2><tt>&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elapse_time(&amp;next_wakeup, 0, PROBE_WAIT*1000);</tt></font>
<br><font size=2><tt>&lt; </tt></font>
<br><font size=2><tt>&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; next_wakeup_valid = 1;</tt></font>
<br><font size=2><tt>---</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; next_wakeup_valid = 1;</tt></font>
<br><font size=2><tt>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</tt></font>
<br><font size=2><tt>}}}</tt></font>
<br>
<br><font size=2><tt>Essentially, I'm just adding a state check right after
a new address is selected. &nbsp;If sleeping, the new address is just logged
and autoipd goes back to sleep, otherwise the conflict handling code that
was there before is executed.</tt></font>
<br>
<br><font size=2><tt>Thanks.</tt></font>
<br>
<br><font size=2><tt>--JT</tt></font>
<br>