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:
- It does not listen any IPv4 queries,
- It does not listen on any TCP port, and
- It does not handle name collisions.
No IPv4 queries
This limitation is merely a design decision. There are several reasons:
- The currently known operating systems that supports LLMNR sends queries both in IPv6 and in IPv4,
- For IPv4 networks, we already have NetBIOS over TCP/IP working, and
- 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.