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