Implementation

This page describes the implementation of xllmnrd briefly.

Single UDP socket

xllmnrd uses a single UDP socket for all the IPv6 interfaces. It reduces the number of file descriptors used for UDP sockets on a host with many network interfaces, in contrast to binding one socket for each interface.

To operate with only one socket, xllmnrd uses the IPV6_RECVPKTINFO socket option, which enables a program to know from which interface a packet is received. xllmnrd uses the information to get the interface address to be answered.

Interface-to-address mapping

xllmnrd uses a RTNETLINK socket to keep track of address changes on network interfaces on GNU/Linux platforms.

[To be described more.]

Limitations

The current implementation has several limitations:

  1. It does not listen any IPv4 queries,
  2. It does not listen on any TCP port, and
  3. It does not handle name collisions.

No IPv4 queries

This limitation is merely a design decision. There are several reasons:

  1. The currently known operating systems that supports LLMNR sends queries both in IPv6 and in IPv4,
  2. For IPv4 networks, we already have NetBIOS over TCP/IP working, and
  3. Socket API’s for IPv4 multicasts are not well standardized.

No TCP port

[To be described.]

References

  • ISO/IEC 9899:1999 is the second edition of the (standard) C programming language, also known as C99, in which xllmnrd is written. Note it is not the latest standard as ISO/IEC 9899:2011 revised it.
  • RFC 3542 describes the advanced IPv6 sockets API, which includes the IPV6_RECVPKTINFO socket option.