xref: /titanic_50/usr/src/man/man7p/ndp.7p (revision 3a005aada8ac0e291c13cbc488ba9ae1473f0a96)
1e7df7762SCody Peter Mello.\"
2e7df7762SCody Peter Mello.\" This file and its contents are supplied under the terms of the
3e7df7762SCody Peter Mello.\" Common Development and Distribution License ("CDDL"), version 1.0.
4e7df7762SCody Peter Mello.\" You may only use this file in accordance with the terms of version
5e7df7762SCody Peter Mello.\" 1.0 of the CDDL.
6e7df7762SCody Peter Mello.\"
7e7df7762SCody Peter Mello.\" A full copy of the text of the CDDL should have accompanied this
8e7df7762SCody Peter Mello.\" source.  A copy of the CDDL is also available via the Internet at
9e7df7762SCody Peter Mello.\" http://www.illumos.org/license/CDDL.
10e7df7762SCody Peter Mello.\"
11e7df7762SCody Peter Mello.\"
12e7df7762SCody Peter Mello.\" Copyright (c) 2015, Joyent, Inc.  All rights reserved.
13e7df7762SCody Peter Mello.\"
14e7df7762SCody Peter Mello.Dd Sep 02, 2015
15e7df7762SCody Peter Mello.Dt NDP 7P
16e7df7762SCody Peter Mello.Os
17e7df7762SCody Peter Mello.Sh NAME
18e7df7762SCody Peter Mello.Nm ndp ,
19e7df7762SCody Peter Mello.Nm NDP
20e7df7762SCody Peter Mello.Nd Neighbor Discovery Protocol
21e7df7762SCody Peter Mello.Sh SYNOPSIS
22e7df7762SCody Peter Mello.In sys/socket.h
23e7df7762SCody Peter Mello.In sys/sockio.h
24e7df7762SCody Peter Mello.In netinet/in.h
25e7df7762SCody Peter Mello.In net/if.h
26e7df7762SCody Peter Mello.Bd -literal
27e7df7762SCody Peter Mellos = socket(PF_INET6, SOCK_DGRAM, 0);
28e7df7762SCody Peter Mello
29e7df7762SCody Peter Mellostruct lifreq lifr;
30e7df7762SCody Peter Melloioctl(s, SIOCLIFGETND, &lifr);
31e7df7762SCody Peter Melloioctl(s, SIOCLIFSETND, &lifr);
32e7df7762SCody Peter Melloioctl(s, SIOCLIFDELND, &lifr);
33e7df7762SCody Peter Mello.Ed
34e7df7762SCody Peter Mello.Sh DESCRIPTION
35e7df7762SCody Peter MelloThe Neighbor Discovery Protocol (NDP) is a protocol used to distribute and request
36e7df7762SCody Peter Melloinformation about neighboring IPv6 systems on the local network, much like
37e7df7762SCody Peter Mello.Xr ARP 7P
38e7df7762SCody Peter Mellofor IPv4. NDP is also responsible for spreading information about the network
39e7df7762SCody Peter Mellogateway and how hosts should configure themselves
40e7df7762SCody Peter Mello.Pq see Xr in.ndpd 1M for more on how this happens .
41e7df7762SCody Peter Mello.Sh APPLICATION PROGRAMMING INTERFACE
42e7df7762SCody Peter MelloThe operating system provides several ioctls to help manipulate the mappings
43e7df7762SCody Peter Melloobtained through NDP. They are
44e7df7762SCody Peter Mello.Sy SIOCLIFGETND ,
45e7df7762SCody Peter Mello.Sy SIOCLIFSETND ,
46e7df7762SCody Peter Melloand
47e7df7762SCody Peter Mello.Sy SIOCLIFDELND ,
48e7df7762SCody Peter Mellofor getting, setting, and deleting respectively. Each of these ioctls takes a
49e7df7762SCody Peter Mello.Vt struct lifreq
50e7df7762SCody Peter Mello.Pq see Xr if 7P for details ,
51e7df7762SCody Peter Mellowhere the
52e7df7762SCody Peter Mello.Fa lifr_lifru
53e7df7762SCody Peter Mellofield is of type
54e7df7762SCody Peter Mello.Vt struct lif_nd_req :
55e7df7762SCody Peter Mello.Bd -literal -offset 2m
56e7df7762SCody Peter Mellotypedef struct lif_nd_req {
57e7df7762SCody Peter Mello        struct sockaddr_storage lnr_addr;
58e7df7762SCody Peter Mello        uint8_t                 lnr_state_create;
59e7df7762SCody Peter Mello        uint8_t                 lnr_state_same_lla;
60e7df7762SCody Peter Mello        uint8_t                 lnr_state_diff_lla;
61e7df7762SCody Peter Mello        int                     lnr_hdw_len;
62e7df7762SCody Peter Mello        int                     lnr_flags;
63e7df7762SCody Peter Mello        int                     lnr_pad0;
64e7df7762SCody Peter Mello        char                    lnr_hdw_addr[ND_MAX_HDW_LEN];
65e7df7762SCody Peter Mello} lif_nd_req_t;
66e7df7762SCody Peter Mello.Ed
67e7df7762SCody Peter Mello.Pp
68e7df7762SCody Peter MelloThe
69e7df7762SCody Peter Mello.Fa lnr_addr
70e7df7762SCody Peter Mellofield should be filled in with an IPv6 address
71e7df7762SCody Peter Mello.Pq see Xr sockaddr_in6 3SOCKET ,
72e7df7762SCody Peter Melloand the
73e7df7762SCody Peter Mello.Fa lnr_hdw_addr
74e7df7762SCody Peter Mellois the link-layer address of length
75e7df7762SCody Peter Mello.Fa lnr_hdw_len .
76e7df7762SCody Peter Mello.Pp
77e7df7762SCody Peter MelloState flags for
78e7df7762SCody Peter Mello.Fa lnr_state_create ,
79e7df7762SCody Peter Mello.Fa lnr_state_same_lla ,
80e7df7762SCody Peter Melloand
81e7df7762SCody Peter Mello.Fa lnr_state_diff_lla
82e7df7762SCody Peter Mellocan be set to one of the following values:
83e7df7762SCody Peter Mello.Bl -tag -offset indent -width 16m
84e7df7762SCody Peter Mello.It Sy ND_UNCHANGED
85e7df7762SCody Peter MelloFor ioctls that don't modify state
86e7df7762SCody Peter Mello.It Sy ND_INCOMPLETE
87e7df7762SCody Peter MelloAddress resolution is currently in progress
88e7df7762SCody Peter Mello.It Sy ND_REACHABLE
89e7df7762SCody Peter MelloThe link-layer address has recently been reachable
90e7df7762SCody Peter Mello.It Sy ND_STALE
91e7df7762SCody Peter MelloThe link-layer address may be unreachable, and the system shouldn't do anything
92e7df7762SCody Peter Mello.It Sy ND_DELAY
93e7df7762SCody Peter MelloThis entry hasn't yet started sending Neighbor Solicitations
94e7df7762SCody Peter Mello.It Sy ND_PROBE
95e7df7762SCody Peter MelloThe operating system is currently sending out Neighbor Solicitations for the address
96e7df7762SCody Peter Mello.It Sy ND_UNREACHABLE
97e7df7762SCody Peter MelloThe link-layer address is unreachable, and this entry is going to be deleted.
98e7df7762SCody Peter Mello.El
99e7df7762SCody Peter Mello.sp
100e7df7762SCody Peter MelloWhen creating a new entry, the only valid values for
101e7df7762SCody Peter Mello.Fa lnr_state_create
102e7df7762SCody Peter Melloare
103e7df7762SCody Peter Mello.Sy ND_REACHABLE
104e7df7762SCody Peter Melloand
105e7df7762SCody Peter Mello.Sy ND_STALE .
106e7df7762SCody Peter MelloAny other value will return
107e7df7762SCody Peter Mello.Sy EINVAL .
108e7df7762SCody Peter MelloThe
109e7df7762SCody Peter Mello.Fa lnr_state_same_lla
110e7df7762SCody Peter Melloand
111e7df7762SCody Peter Mello.Fa lnr_state_diff_lla
112e7df7762SCody Peter Mellofields are reserved for future use and can be safely set to
113e7df7762SCody Peter Mello.Sy ND_UNCHANGED
114e7df7762SCody Peter Melloand
115e7df7762SCody Peter Mello.Sy ND_STALE
116e7df7762SCody Peter Mellorespectively.
117e7df7762SCody Peter Mello.Pp
118e7df7762SCody Peter MelloFlags that can be placed in
119e7df7762SCody Peter Mello.Fa lnr_flags
120e7df7762SCody Peter Melloare:
121e7df7762SCody Peter Mello.Bl -tag -offset indent -width 16m
122e7df7762SCody Peter Mello.It Sy NDF_ISROUTER_ON
123e7df7762SCody Peter MelloMark this entry as being a router. This will cause Neighbor Advertisements for
124e7df7762SCody Peter Mellothis address to be sent with the R-bit (Router).
125e7df7762SCody Peter Mello.It Sy NDF_ISROUTER_OFF
126e7df7762SCody Peter MelloIf this entry was flagged as being a router, remove the flag.
127e7df7762SCody Peter Mello.It Sy NDF_ANYCAST_ON
128e7df7762SCody Peter MelloMark this entry as being for an anycast address. This prevents sending Neighbor
129e7df7762SCody Peter MelloAdvertisements with the O-bit (Override).
130e7df7762SCody Peter Mello.It Sy NDF_ANYCAST_OFF
131e7df7762SCody Peter MelloIf this entry was flagged as an anycast address, remove the flag.
132e7df7762SCody Peter Mello.It Sy NDF_STATIC
133e7df7762SCody Peter MelloPrevent this entry from being deleted by the system.
134e7df7762SCody Peter Mello.El
135e7df7762SCody Peter Mello.sp
136e7df7762SCody Peter MelloWhen using
137e7df7762SCody Peter Mello.Sy SIOCLIFGETND ,
138e7df7762SCody Peter Mellothese flags represent the current state of the corresponding Neighbor Cache
139e7df7762SCody Peter MelloEntry. When using
140e7df7762SCody Peter Mello.Sy SIOCLIFSETND ,
141e7df7762SCody Peter Mellothese flags represent what changes should be applied to the underlying entry.
142e7df7762SCody Peter Mello.Pp
143e7df7762SCody Peter MelloThe only fields that need to be set for the
144e7df7762SCody Peter Mello.Sy SIOCLIFGETND
145e7df7762SCody Peter Melloor
146e7df7762SCody Peter Mello.Sy SIOCLIFDELND
147e7df7762SCody Peter Melloioctls are
148e7df7762SCody Peter Mello.Fa lifr_name
149e7df7762SCody Peter Melloand
150e7df7762SCody Peter Mello.Fa lnr_addr .
151e7df7762SCody Peter MelloAll other fields should be zeroed out. After successfully getting an entry, the
152e7df7762SCody Peter Melloother fields will be filled in. When using
153e7df7762SCody Peter Mello.Sy SIOCLIFSETND ,
154e7df7762SCody Peter Melloall fields should be set to an appropriate value, as described above, with the
155e7df7762SCody Peter Melloexception of
156e7df7762SCody Peter Mello.Fa lnr_pad0 ,
157e7df7762SCody Peter Mellowhich is unused and only exists for padding purposes.
158e7df7762SCody Peter Mello.Pp
159e7df7762SCody Peter MelloAfter performing the ioctl, the following errors may be returned through the
160e7df7762SCody Peter Melloglobal
161e7df7762SCody Peter Mello.Sy errno
162e7df7762SCody Peter Mellovariable:
163e7df7762SCody Peter Mello.Bl -tag -offset indent -width 16m
164e7df7762SCody Peter Mello.It Sy EAFNOSUPPORT
165e7df7762SCody Peter MelloA non-IPv6 socket was used to perform the ioctl.
166e7df7762SCody Peter Mello.It Sy EINVAL
167e7df7762SCody Peter MelloThe request contents were bad. This could be because conflicting flags were
168e7df7762SCody Peter Melloused, the specified interface wasn't logical unit zero, or another reason.
169e7df7762SCody Peter Mello.It Sy ENOMEM
170e7df7762SCody Peter MelloThe system ran out of memory for internal data structures.
171e7df7762SCody Peter Mello.It Sy ENXIO
172e7df7762SCody Peter MelloThe specified interface does not exist.
173e7df7762SCody Peter Mello.It Sy EPERM
174e7df7762SCody Peter MelloThe caller does not have permission to modify the Neighbor Cache Entries
175e7df7762SCody Peter Melloassociated with this interface. They may be lacking the
176e7df7762SCody Peter Mello.Sy PRIV_SYS_NET_CONFIG
177e7df7762SCody Peter Melloprivilege
178e7df7762SCody Peter Mello.Po see Xr privileges 5 Pc ,
179e7df7762SCody Peter Melloor the interface is managed by IPMP (IP Network Multipathing).
180e7df7762SCody Peter Mello.It Sy ESRCH
181e7df7762SCody Peter MelloThere is no entry matching the specified address.
182e7df7762SCody Peter Mello.El
183e7df7762SCody Peter Mello.Sh EXAMPLES
184e7df7762SCody Peter MelloThe following examples demonstrate how to get and set NDP mappings using the
185e7df7762SCody Peter Melloprovided ioctls. They can be compiled by using a C compiler and linking against
186e7df7762SCody Peter Mellothe sockets library.
187e7df7762SCody Peter Mello.Ss Example 1: Getting a mapping
188e7df7762SCody Peter Mello.Bd -literal -offset indent
189e7df7762SCody Peter Mello$ gcc -Wall -lsocket -o get get.c
190e7df7762SCody Peter Mello$ cat get.c
191e7df7762SCody Peter Mello/*
192e7df7762SCody Peter Mello * Example of getting a mapping for a node name.
193e7df7762SCody Peter Mello */
194e7df7762SCody Peter Mello#include <strings.h>
195e7df7762SCody Peter Mello#include <stdio.h>
196e7df7762SCody Peter Mello#include <stdlib.h>
197e7df7762SCody Peter Mello#include <sys/socket.h>
198e7df7762SCody Peter Mello#include <sys/sockio.h>
199e7df7762SCody Peter Mello#include <unistd.h>
200e7df7762SCody Peter Mello#include <netdb.h>
201e7df7762SCody Peter Mello#include <net/if.h>
202e7df7762SCody Peter Mello
203e7df7762SCody Peter Melloint get(char *host) {
204e7df7762SCody Peter Mello	struct lifreq lifr;
205e7df7762SCody Peter Mello	struct addrinfo hints, *serverinfo, *p;
206e7df7762SCody Peter Mello	int err, s;
207e7df7762SCody Peter Mello
208e7df7762SCody Peter Mello	bzero(&hints, sizeof (struct addrinfo));
209e7df7762SCody Peter Mello	hints.ai_family = PF_INET6;
210e7df7762SCody Peter Mello	hints.ai_protocol = IPPROTO_IPV6;
211e7df7762SCody Peter Mello
212e7df7762SCody Peter Mello	if ((err = getaddrinfo(host, NULL, &hints, &serverinfo)) != 0) {
213e7df7762SCody Peter Mello		(void) fprintf(stderr, "Unable to lookup %s: %s\\n", host,
214e7df7762SCody Peter Mello		    gai_strerror(err));
215e7df7762SCody Peter Mello		return (1);
216e7df7762SCody Peter Mello	}
217e7df7762SCody Peter Mello
218e7df7762SCody Peter Mello	s = socket(AF_INET6, SOCK_DGRAM, 0);
219e7df7762SCody Peter Mello	if (s < 0) {
220e7df7762SCody Peter Mello		perror("Failed to open IPv6 socket");
221e7df7762SCody Peter Mello		return (1);
222e7df7762SCody Peter Mello	}
223e7df7762SCody Peter Mello
224e7df7762SCody Peter Mello	for (p = serverinfo; p != NULL; p = p->ai_next) {
225e7df7762SCody Peter Mello		/* Zero out structure */
226e7df7762SCody Peter Mello		bzero(&lifr, sizeof (struct lifreq));
227e7df7762SCody Peter Mello		(void) strlcpy(lifr.lifr_name, "net0",
228e7df7762SCody Peter Mello		    sizeof (lifr.lifr_name));
229e7df7762SCody Peter Mello		(void) memcpy(&lifr.lifr_nd.lnr_addr, p->ai_addr,
230e7df7762SCody Peter Mello		    sizeof (struct sockaddr_storage));
231e7df7762SCody Peter Mello
232e7df7762SCody Peter Mello		/* Get mapping */
233e7df7762SCody Peter Mello		if (ioctl(s, SIOCLIFGETND, &lifr) < 0) {
234e7df7762SCody Peter Mello			perror("Unable to get NDP mapping");
235e7df7762SCody Peter Mello			continue;
236e7df7762SCody Peter Mello		}
237e7df7762SCody Peter Mello
238e7df7762SCody Peter Mello		/*
239e7df7762SCody Peter Mello		 * lifr.lifr_nd.lnr_hdw_addr now contains the MAC address,
240e7df7762SCody Peter Mello		 * and can be used as desired.
241e7df7762SCody Peter Mello		 */
242e7df7762SCody Peter Mello	}
243e7df7762SCody Peter Mello
244e7df7762SCody Peter Mello	/*
245e7df7762SCody Peter Mello	 * Clean up linked list.
246e7df7762SCody Peter Mello	 */
247e7df7762SCody Peter Mello	freeaddrinfo(serverinfo);
248e7df7762SCody Peter Mello	return (0);
249e7df7762SCody Peter Mello}
250e7df7762SCody Peter Mello
251e7df7762SCody Peter Melloint main(int argc, char *argv[]) {
252e7df7762SCody Peter Mello	if (argc < 2)
253e7df7762SCody Peter Mello		exit(1);
254e7df7762SCody Peter Mello	return (get(argv[1]));
255e7df7762SCody Peter Mello}
256e7df7762SCody Peter Mello.Ed
257e7df7762SCody Peter Mello.sp
258e7df7762SCody Peter MelloDeleting a mapping would work similarly, except that instead of using
259e7df7762SCody Peter Mello.Sy SIOCLIFGETND ,
260e7df7762SCody Peter Melloyou would instead use the
261e7df7762SCody Peter Mello.Sy SIOCLIFDELND
262e7df7762SCody Peter Melloioctl.
263e7df7762SCody Peter Mello.Ss Example 2: Adding a mapping
264e7df7762SCody Peter Mello.Bd -literal -offset indent
265e7df7762SCody Peter Mello$ gcc -Wall -lsocket -o set set.c
266e7df7762SCody Peter Mello$ cat set.c
267e7df7762SCody Peter Mello/*
268e7df7762SCody Peter Mello * Example of setting a mapping to an all-zero Ethernet address.
269e7df7762SCody Peter Mello */
270e7df7762SCody Peter Mello#include <strings.h>
271e7df7762SCody Peter Mello#include <stdio.h>
272e7df7762SCody Peter Mello#include <stdlib.h>
273e7df7762SCody Peter Mello#include <sys/socket.h>
274e7df7762SCody Peter Mello#include <sys/sockio.h>
275e7df7762SCody Peter Mello#include <unistd.h>
276e7df7762SCody Peter Mello#include <netdb.h>
277e7df7762SCody Peter Mello#include <net/if.h>
278e7df7762SCody Peter Mello
279e7df7762SCody Peter Melloint set(char *host) {
280e7df7762SCody Peter Mello	struct lifreq lifr;
281e7df7762SCody Peter Mello	struct addrinfo hints, *serverinfo, *p;
282e7df7762SCody Peter Mello	int err, s;
283e7df7762SCody Peter Mello
284e7df7762SCody Peter Mello	bzero(&hints, sizeof (struct addrinfo));
285e7df7762SCody Peter Mello	hints.ai_family = PF_INET6;
286e7df7762SCody Peter Mello	hints.ai_protocol = IPPROTO_IPV6;
287e7df7762SCody Peter Mello
288e7df7762SCody Peter Mello	if ((err = getaddrinfo(host, NULL, &hints, &serverinfo)) != 0) {
289e7df7762SCody Peter Mello		(void) fprintf(stderr, "Unable to lookup %s: %s\\n", host,
290e7df7762SCody Peter Mello		    gai_strerror(err));
291e7df7762SCody Peter Mello		return (1);
292e7df7762SCody Peter Mello	}
293e7df7762SCody Peter Mello
294e7df7762SCody Peter Mello	s = socket(AF_INET6, SOCK_DGRAM, 0);
295e7df7762SCody Peter Mello	if (s < 0) {
296e7df7762SCody Peter Mello		perror("Failed to open IPv6 socket");
297e7df7762SCody Peter Mello		return (1);
298e7df7762SCody Peter Mello	}
299e7df7762SCody Peter Mello
300e7df7762SCody Peter Mello	for (p = serverinfo; p != NULL; p = p->ai_next) {
301e7df7762SCody Peter Mello		/* Zero out structure */
302e7df7762SCody Peter Mello		bzero(&lifr, sizeof (struct lifreq));
303e7df7762SCody Peter Mello		(void) strlcpy(lifr.lifr_name, "net0",
304e7df7762SCody Peter Mello		    sizeof (lifr.lifr_name));
305e7df7762SCody Peter Mello		(void) memcpy(&lifr.lifr_nd.lnr_addr, p->ai_addr,
306e7df7762SCody Peter Mello		    sizeof (struct sockaddr_storage));
307e7df7762SCody Peter Mello
308e7df7762SCody Peter Mello		lifr.lifr_nd.lnr_state_create = ND_REACHABLE;
309e7df7762SCody Peter Mello		lifr.lifr_nd.lnr_flags = NDF_STATIC;
310e7df7762SCody Peter Mello
311e7df7762SCody Peter Mello		/* Get mapping */
312e7df7762SCody Peter Mello		if (ioctl(s, SIOCLIFSETND, &lifr) < 0) {
313e7df7762SCody Peter Mello			perror("Unable to set NDP mapping");
314e7df7762SCody Peter Mello			continue;
315e7df7762SCody Peter Mello		}
316e7df7762SCody Peter Mello	}
317e7df7762SCody Peter Mello
318e7df7762SCody Peter Mello	/*
319e7df7762SCody Peter Mello	 * Clean up linked list.
320e7df7762SCody Peter Mello	 */
321e7df7762SCody Peter Mello	freeaddrinfo(serverinfo);
322e7df7762SCody Peter Mello	return (0);
323e7df7762SCody Peter Mello}
324e7df7762SCody Peter Mello
325e7df7762SCody Peter Melloint main(int argc, char *argv[]) {
326e7df7762SCody Peter Mello	if (argc < 2)
327e7df7762SCody Peter Mello		exit(1);
328e7df7762SCody Peter Mello	return (set(argv[1]));
329e7df7762SCody Peter Mello}
330e7df7762SCody Peter Mello.Ed
331e7df7762SCody Peter Mello.Sh SEE ALSO
332*3a005aadSYuri Pankov.Xr ifconfig 1M ,
333e7df7762SCody Peter Mello.Xr in.ndpd 1M ,
334e7df7762SCody Peter Mello.Xr ndp 1M ,
335e7df7762SCody Peter Mello.Xr sockaddr_in6 3SOCKET ,
336e7df7762SCody Peter Mello.Xr privileges 5
337e7df7762SCody Peter Mello.Rs
338e7df7762SCody Peter Mello.%A Narten, T.
339e7df7762SCody Peter Mello.%A Nordmark, E.
340e7df7762SCody Peter Mello.%A Simpson, W.
341e7df7762SCody Peter Mello.%A Soliman, H.
342e7df7762SCody Peter Mello.%R Neighbor Discovery for IP version 6
343e7df7762SCody Peter Mello.%T RFC 4861
344e7df7762SCody Peter Mello.%D September 2007
345e7df7762SCody Peter Mello.Re
346