title: What is eth_addr_t and friends in libdnet
body: <p>I'm attempting to create a wrapper around <a href="http://libdnet.sourceforge.net/" rel="nofollow noreferrer">libdnet</a> for the D programming
  language. The issue I have run into is not knowing what the
  underlining types for eth_addr_t, ip_addr_t, and ip6_addr_t while
  converting <a href="http://www.google.com/codesearch/p?hl=en#uBwkDcB0O2A/honeyd-src-1.1.1/libdnet-1.10/include/dnet/addr.h" rel="nofollow noreferrer">addr.h</a>. The last mystery type is sockaddr</p>
  
  <p>And I'm also interest in why there is a do while loop that is always false.</p>
  
  <pre><code>#define addr_pack(addr, type, bits, data, len) do { \
      (addr)-&gt;addr_type = type; \
      (addr)-&gt;addr_bits = bits; \
      memmove((addr)-&gt;addr_data8, (char *)data, len); \
  } while (0)
  </code></pre>
  
  <p>is it required for C to execute the code in the macro?</p>