xref: /minix/minix/lib/liblwip/dist/doc/mdns.txt (revision 9f81acbc)
1Multicast DNS for lwIP
2
3Author: Erik Ekman
4
5
6Note! The MDNS responder does not have all features required by the standards.
7See notes in src/apps/mdns/mdns.c for what is left. It is however usable in normal
8cases - but watch out if many devices on the same network try to use the same
9host/service instance names.
10
11
12How to enable:
13==============
14
15MDNS support does not depend on DNS.
16MDNS supports using IPv4 only, v6 only, or v4+v6.
17
18To enable MDNS responder, set
19  LWIP_MDNS_RESPONDER = 1
20in lwipopts.h and add src/apps/mdns/mdns.c to your list of files to build.
21
22The max number of services supported per netif is defined by MDNS_MAX_SERVICES,
23default is 1.
24
25Increase MEMP_NUM_UDP_PCB by 1. MDNS needs one PCB.
26Increase LWIP_NUM_NETIF_CLIENT_DATA by 1 (MDNS needs one entry on netif).
27
28MDNS with IPv4 requires LWIP_IGMP = 1, and preferably LWIP_AUTOIP = 1.
29MDNS with IPv6 requires LWIP_IPV6_MLD = 1, and that a link-local address is
30generated.
31
32The MDNS code puts its structs on the stack where suitable to reduce dynamic
33memory allocation. It may use up to 1kB of stack.
34
35MDNS needs a strncasecmp() implementation. If you have one, define
36LWIP_MDNS_STRNCASECMP to it. Otherwise the code will provide an implementation
37for you.
38
39
40How to use:
41===========
42
43Call mdns_resp_init() during system initialization.
44This opens UDP sockets on port 5353 for IPv4 and IPv6.
45
46
47To start responding on a netif, run
48  mdns_resp_add_netif(struct netif *netif, char *hostname, u32_t dns_ttl)
49
50The hostname will be copied. If this returns successfully, the netif will join
51the multicast groups and any MDNS/legacy DNS requests sent unicast or multicast
52to port 5353 will be handled:
53- <hostname>.local type A, AAAA or ANY returns relevant IP addresses
54- Reverse lookups (PTR in-addr.arpa, ip6.arpa) of netif addresses
55  returns <hostname>.local
56Answers will use the supplied TTL (in seconds)
57MDNS allows UTF-8 names, but it is recommended to stay within ASCII,
58since the default case-insensitive comparison assumes this.
59
60It is recommended to call this function after an IPv4 address has been set,
61since there is currently no check if the v4 address is valid.
62
63Call mdns_resp_netif_settings_changed() every time the IP address
64on the netif has changed.
65
66To stop responding on a netif, run
67  mdns_resp_remove_netif(struct netif *netif)
68
69
70Adding services:
71================
72
73The netif first needs to be registered. Then run
74  mdns_resp_add_service(struct netif *netif, char *name, char *service,
75      u16_t proto, u16_t port, u32_t dns_ttl,
76      service_get_txt_fn_t txt_fn, void *txt_userdata);
77
78The name and service pointers will be copied. Name refers to the name of the
79service instance, and service is the type of service, like _http
80proto can be DNSSD_PROTO_UDP or DNSSD_PROTO_TCP which represent _udp and _tcp.
81If this call returns successfully, the following queries will be answered:
82- _services._dns-sd._udp.local type PTR returns <service>.<proto>.local
83- <service>.<proto>.local type PTR returns <name>.<service>.<proto>.local
84- <name>.<service>.<proto>.local type SRV returns hostname and port of service
85- <name>.<service>.<proto>.local type TXT builds text strings by calling txt_fn
86  with the supplied userdata. The callback adds strings to the reply by calling
87  mdns_resp_add_service_txtitem(struct mdns_service *service, char *txt,
88   int txt_len). Example callback method:
89
90   static void srv_txt(struct mdns_service *service, void *txt_userdata)
91   {
92     res = mdns_resp_add_service_txtitem(service, "path=/", 6);
93     LWIP_ERROR("mdns add service txt failed\n", (res == ERR_OK), return);
94   }
95
96  Since a hostname struct is used for TXT storage each single item can be max
97  63 bytes long, and  the total max length (including length bytes for each
98  item) is 255 bytes.
99
100If your device runs a webserver on port 80, an example call might be:
101
102  mdns_resp_add_service(netif, "myweb", "_http"
103      DNSSD_PROTO_TCP, 80, 3600, srv_txt, NULL);
104
105which will publish myweb._http._tcp.local for any hosts looking for web servers,
106and point them to <hostname>.local:80
107
108Relevant information will be sent as additional records to reduce number of
109requests required from a client.
110
111Removing services is currently not supported. Services are removed when the
112netif is removed.
113
114