<div dir="ltr"><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">I am running a compliance test that checks probe denials and address conflicts using ipv4ll.</div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><span style="color:rgb(33,33,33);font-size:13px">After my device acquires an address using ipv4ll, the compliance test issues two conflicting probes for the same address. I can see libsystemd-network following section 2.5 of RFC3927 correctly and taking option (b) where it tries to defend its address after the first conflict and then after the second conflict it abandons the address.</span><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">After abandoning the address (which is the right thing to do) the address acquisition state machine seems to die and I'm no long able to get an IP address. </div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">I've traced the behavior to the SD_IPV4ACD_EVENT_CONFLICT case in the ipv4ll_on_acd function of the systemd/src/libsystemd-network/sd-ipv4ll.c file.</div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">I understand that a higher level gets notified of the loss of the claimed address, but who is responsible for telling the ipv4ll state machine to try and pick a new address.</div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">I've been able to fix the issue and pass the compliance test by removing the 'else' clause of that case statement which chooses another address and starts the ipv4acd state machine up again after notifying the upper level of the address loss:</div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><div class="gmail_msg">       case SD_IPV4ACD_EVENT_CONFLICT:</div><div class="gmail_msg">                /* if an address was already bound we must call up to the</div><div class="gmail_msg">                   user to handle this, otherwise we just try again */</div><div class="gmail_msg">                if (ll->claimed_address != 0) {</div><div class="gmail_msg">                        ipv4ll_client_notify(ll, SD_IPV4LL_EVENT_CONFLICT);</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">                        ll->claimed_address = 0;</div><div class="gmail_msg">                }</div><div class="gmail_msg">                r = ipv4ll_pick_address(ll);</div><div class="gmail_msg">                if (r < 0)</div><div class="gmail_msg">                        goto error;</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">                r = sd_ipv4acd_start(ll->acd);</div><div class="gmail_msg">                if (r < 0)</div><div class="gmail_msg">                        goto error;</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">                break;</div></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">Is this the correct place to restart the ipv4acd address acquisition or is there some hook higher up that I am unaware of that should be used to restart?</div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">Jason Reeder</div></div>