<!DOCTYPE html>
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Simon,</p>
    <p>looking at dhcp.c as of this commit, and I see it's unchanged
      from v2.91:<br>
    </p>
    <p>
      <blockquote type="cite">
        <span style="font-family:monospace"><span
            style="color:#b26818;background-color:#ffffff;">commit
            ee09f0655c0a4347a72d2bf9b7231ff158a13f53 (</span><span
style="font-weight:bold;color:#54ffff;background-color:#ffffff;">HEAD</span><span
            style="color:#b26818;background-color:#ffffff;"> -> </span><span
style="font-weight:bold;color:#54ff54;background-color:#ffffff;">master</span><span
            style="color:#b26818;background-color:#ffffff;">, </span><span
style="font-weight:bold;color:#ff5454;background-color:#ffffff;">origin/master</span><span
            style="color:#b26818;background-color:#ffffff;">, </span><span
style="font-weight:bold;color:#ff5454;background-color:#ffffff;">origin/HEAD</span><span
            style="color:#b26818;background-color:#ffffff;">)</span><span
            style="color:#000000;background-color:#ffffff;">
          </span><br>
          <span style="color:#000000;background-color:#ffffff;">Author:
            Simon Kelley <a class="moz-txt-link-rfc2396E" href="mailto:simon@thekelleys.org.uk"><simon@thekelleys.org.uk></a></span><span
            style="color:#000000;background-color:#ffffff;">
          </span><br>
          <span style="color:#000000;background-color:#ffffff;">Date:
              Mon Sep 1 22:35:02 2025 +0100</span><span
            style="color:#000000;background-color:#ffffff;">
          </span><br>
          <br>
          <span style="color:#000000;background-color:#ffffff;">
               Optimise tftp.</span><br>
          <span style="color:#000000;background-color:#ffffff;">
          </span><br>
        </span>
      </blockquote>
      <br>
    </p>
    <p>I wonder if the if() clause (next to last line below) is correct,
      or is in the right place.<br>
      That's currently line #699.</p>
    <p>The concern is that everything in the </p>
    <p><span style="color: #3b3b3b;"></span><span
        style="color: #af00db;">    if</span><span
        style="color: #3b3b3b;"> (</span><span style="color: #001080;">taddr</span><span
        style="color: #3b3b3b;">.</span><span style="color: #001080;">s_addr</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">==</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">context</span><span
        style="color: #3b3b3b;">-></span><span
        style="color: #001080;">router</span><span
        style="color: #3b3b3b;">.</span><span style="color: #001080;">s_addr</span><span
        style="color: #3b3b3b;">) </span></p>
    <p><span style="color: #3b3b3b;">expression is</span> independent
      from tmp in the enlosing for(;;) loop, and I cannot fathom how
      this would make sense.</p>
    <p>I suppose a reasonable compiler can decide the first <span
        style="color: #3b3b3b;"> </span><span style="color: #af00db;">for</span><span
        style="color: #3b3b3b;"> (</span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">=</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">context</span><span
        style="color: #3b3b3b;">; </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">; </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">=</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">-></span><span
        style="color: #001080;">current</span><span
        style="color: #3b3b3b;">) does not cause observable effects
        (unless undefined behavior) and just discard the for loop.<br>
      </span></p>
    <p><span style="color: #3b3b3b;">Either we want to look at just the
        context->router.s_addr, then we don't need the for(),<br>
        or the if() clause needs to look at something with "tmp"<br>
        to make sense for both lines.<br>
      </span></p>
    <p><span style="color: #3b3b3b;">Also, I am confused reading the
        undocumented fields of struct dhcp_context {} without reading
        more than the declaration - it has one "current" and one "next"
        pointer and we iterate through "current", which isn't very
        typical from just reading it, but done in many places inside the
        code so I presume the pointer fields are only named confusingly,
        so I cannot assess what impact this inconsistency has.<br>
      </span></p>
    <p><br>
      <blockquote type="cite">
        <div
style="color: #3b3b3b;background-color: #ffffff;font-family: 'Cascadia Code', 'Droid Sans Mono', Consolas, 'Courier New', monospace, 'Droid Sans Mono', 'monospace', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;"><div><span
        style="color: #0000ff;">struct</span><span
        style="color: #3b3b3b;"> </span><span style="color: #267f99;">dhcp_context</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">*</span><span
        style="color: #795e26;">address_available</span><span
        style="color: #3b3b3b;">(</span><span style="color: #0000ff;">struct</span><span
        style="color: #3b3b3b;"> </span><span style="color: #267f99;">dhcp_context</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">*</span><span
        style="color: #001080;">context</span><span
        style="color: #3b3b3b;">, </span></div><div><span
        style="color: #3b3b3b;">                                       </span><span
        style="color: #0000ff;">struct</span><span
        style="color: #3b3b3b;"> </span><span style="color: #267f99;">in_addr</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">taddr</span><span
        style="color: #3b3b3b;">,</span></div><div><span
        style="color: #3b3b3b;">                                       </span><span
        style="color: #0000ff;">struct</span><span
        style="color: #3b3b3b;"> </span><span style="color: #267f99;">dhcp_netid</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">*</span><span
        style="color: #001080;">netids</span><span
        style="color: #3b3b3b;">)</span></div><div><span
        style="color: #3b3b3b;">{</span></div><div><span
        style="color: #008000;">  /* Check is an address is OK for this network, check all</span></div><div><span
        style="color: #008000;">     possible ranges. Make sure that the address isn't in use</span></div><div><span
        style="color: #008000;">     by the server itself. */</span></div><div><span
        style="color: #3b3b3b;">  </span></div><div><span
        style="color: #3b3b3b;">  </span><span style="color: #0000ff;">unsigned</span><span
        style="color: #3b3b3b;"> </span><span style="color: #0000ff;">int</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">start</span><span
        style="color: #3b3b3b;">, </span><span style="color: #001080;">end</span><span
        style="color: #3b3b3b;">, </span><span style="color: #001080;">addr</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">=</span><span
        style="color: #3b3b3b;"> </span><span style="color: #0000ff;">ntohl</span><span
        style="color: #3b3b3b;">(</span><span style="color: #001080;">taddr</span><span
        style="color: #3b3b3b;">.</span><span style="color: #001080;">s_addr</span><span
        style="color: #3b3b3b;">);</span></div><div><span
        style="color: #3b3b3b;">  </span><span style="color: #0000ff;">struct</span><span
        style="color: #3b3b3b;"> </span><span style="color: #267f99;">dhcp_context</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">*</span><span
        style="color: #001080;">tmp</span><span style="color: #3b3b3b;">;</span></div>
<div><span style="color: #3b3b3b;">  </span><span
        style="color: #af00db;">for</span><span style="color: #3b3b3b;"> (</span><span
        style="color: #001080;">tmp</span><span style="color: #3b3b3b;"> </span><span
        style="color: #000000;">=</span><span style="color: #3b3b3b;"> </span><span
        style="color: #001080;">context</span><span
        style="color: #3b3b3b;">; </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">; </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">=</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">-></span><span
        style="color: #001080;">current</span><span
        style="color: #3b3b3b;">)</span></div><div><span
        style="color: #3b3b3b;">    </span><span style="color: #af00db;">if</span><span
        style="color: #3b3b3b;"> (</span><span style="color: #001080;">taddr</span><span
        style="color: #3b3b3b;">.</span><span style="color: #001080;">s_addr</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">==</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">context</span><span
        style="color: #3b3b3b;">-></span><span
        style="color: #001080;">router</span><span
        style="color: #3b3b3b;">.</span><span style="color: #001080;">s_addr</span><span
        style="color: #3b3b3b;">)      // <- QUESTIONABLE for/if VARIABLE CONCORD</span></div><div><span
        style="color: #3b3b3b;">      </span><span
        style="color: #af00db;">return</span><span
        style="color: #3b3b3b;"> </span><span style="color: #0000ff;">NULL</span><span
        style="color: #3b3b3b;">;
</span><div
style="color: #3b3b3b;background-color: #ffffff;font-family: 'Cascadia Code', 'Droid Sans Mono', Consolas, 'Courier New', monospace, 'Droid Sans Mono', 'monospace', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;"><div><span
        style="color: #3b3b3b;">  </span></div><div><span
        style="color: #3b3b3b;">  </span><span style="color: #af00db;">for</span><span
        style="color: #3b3b3b;"> (</span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">=</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">context</span><span
        style="color: #3b3b3b;">; </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">; </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">=</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">-></span><span
        style="color: #001080;">current</span><span
        style="color: #3b3b3b;">)</span></div><div><span
        style="color: #3b3b3b;">    {</span></div><div><span
        style="color: #3b3b3b;">      </span><span
        style="color: #001080;">start</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">=</span><span
        style="color: #3b3b3b;"> </span><span style="color: #0000ff;">ntohl</span><span
        style="color: #3b3b3b;">(</span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">-></span><span
        style="color: #001080;">start</span><span
        style="color: #3b3b3b;">.</span><span style="color: #001080;">s_addr</span><span
        style="color: #3b3b3b;">);</span></div><div><span
        style="color: #3b3b3b;">      </span><span
        style="color: #001080;">end</span><span style="color: #3b3b3b;"> </span><span
        style="color: #000000;">=</span><span style="color: #3b3b3b;"> </span><span
        style="color: #0000ff;">ntohl</span><span
        style="color: #3b3b3b;">(</span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">-></span><span
        style="color: #001080;">end</span><span style="color: #3b3b3b;">.</span><span
        style="color: #001080;">s_addr</span><span
        style="color: #3b3b3b;">);</span></div>
<div><span style="color: #3b3b3b;">      </span><span
        style="color: #af00db;">if</span><span style="color: #3b3b3b;"> (</span><span
        style="color: #000000;">!</span><span style="color: #3b3b3b;">(</span><span
        style="color: #001080;">tmp</span><span style="color: #3b3b3b;">-></span><span
        style="color: #001080;">flags</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">&</span><span
        style="color: #3b3b3b;"> (</span><span style="color: #0000ff;">CONTEXT_STATIC</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">|</span><span
        style="color: #3b3b3b;"> </span><span style="color: #0000ff;">CONTEXT_PROXY</span><span
        style="color: #3b3b3b;">)) </span><span style="color: #000000;">&&</span></div><div><span
        style="color: #3b3b3b;">          </span><span
        style="color: #001080;">addr</span><span style="color: #3b3b3b;"> </span><span
        style="color: #000000;">>=</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">start</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">&&</span></div><div><span
        style="color: #3b3b3b;">          </span><span
        style="color: #001080;">addr</span><span style="color: #3b3b3b;"> </span><span
        style="color: #000000;"><=</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">end</span><span
        style="color: #3b3b3b;"> </span><span style="color: #000000;">&&</span></div><div><span
        style="color: #3b3b3b;">          </span><span
        style="color: #795e26;">match_netid</span><span
        style="color: #3b3b3b;">(</span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">-></span><span
        style="color: #001080;">filter</span><span
        style="color: #3b3b3b;">, </span><span style="color: #001080;">netids</span><span
        style="color: #3b3b3b;">, </span><span style="color: #098658;">1</span><span
        style="color: #3b3b3b;">))</span></div><div><span
        style="color: #3b3b3b;">        </span><span
        style="color: #af00db;">return</span><span
        style="color: #3b3b3b;"> </span><span style="color: #001080;">tmp</span><span
        style="color: #3b3b3b;">;</span></div><div><span
        style="color: #3b3b3b;">    }</span></div>
<div><span style="color: #3b3b3b;">  </span><span
        style="color: #af00db;">return</span><span
        style="color: #3b3b3b;"> </span><span style="color: #0000ff;">NULL</span><span
        style="color: #3b3b3b;">;</span></div><div><span
        style="color: #3b3b3b;">}</span></div></div></div></div>
      </blockquote>
    </p>
    <p><br>
    </p>
  </body>
</html>