summaryrefslogtreecommitdiff
path: root/usr/src/man/man7p/ndp.7p
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/man/man7p/ndp.7p')
-rw-r--r--usr/src/man/man7p/ndp.7p355
1 files changed, 0 insertions, 355 deletions
diff --git a/usr/src/man/man7p/ndp.7p b/usr/src/man/man7p/ndp.7p
deleted file mode 100644
index 28d4d2a1d4..0000000000
--- a/usr/src/man/man7p/ndp.7p
+++ /dev/null
@@ -1,355 +0,0 @@
-.\"
-.\" This file and its contents are supplied under the terms of the
-.\" Common Development and Distribution License ("CDDL"), version 1.0.
-.\" You may only use this file in accordance with the terms of version
-.\" 1.0 of the CDDL.
-.\"
-.\" A full copy of the text of the CDDL should have accompanied this
-.\" source. A copy of the CDDL is also available via the Internet at
-.\" http://www.illumos.org/license/CDDL.
-.\"
-.\"
-.\" Copyright (c) 2015, Joyent, Inc. All rights reserved.
-.\"
-.Dd Sep 02, 2015
-.Dt NDP 7P
-.Os
-.Sh NAME
-.Nm ndp ,
-.Nm NDP
-.Nd Neighbor Discovery Protocol
-.Sh SYNOPSIS
-.In sys/socket.h
-.In sys/sockio.h
-.In netinet/in.h
-.In net/if.h
-.Bd -literal
-s = socket(PF_INET6, SOCK_DGRAM, 0);
-
-struct lifreq lifr;
-ioctl(s, SIOCLIFGETND, &lifr);
-ioctl(s, SIOCLIFSETND, &lifr);
-ioctl(s, SIOCLIFDELND, &lifr);
-.Ed
-.Sh DESCRIPTION
-The Neighbor Discovery Protocol (NDP) is a protocol used to distribute and
-request information about neighboring IPv6 systems on the local network, much
-like
-.Xr ARP 7P
-for IPv4.
-NDP is also responsible for spreading information about the network gateway and
-how hosts should configure themselves
-.Pq see Xr in.ndpd 1M for more on how this happens .
-.Sh APPLICATION PROGRAMMING INTERFACE
-The operating system provides several ioctls to help manipulate the mappings
-obtained through NDP.
-They are
-.Sy SIOCLIFGETND ,
-.Sy SIOCLIFSETND ,
-and
-.Sy SIOCLIFDELND ,
-for getting, setting, and deleting respectively.
-Each of these ioctls takes a
-.Vt struct lifreq
-.Pq see Xr if 7P for details ,
-where the
-.Fa lifr_lifru
-field is of type
-.Vt struct lif_nd_req :
-.Bd -literal -offset 2m
-typedef struct lif_nd_req {
- struct sockaddr_storage lnr_addr;
- uint8_t lnr_state_create;
- uint8_t lnr_state_same_lla;
- uint8_t lnr_state_diff_lla;
- int lnr_hdw_len;
- int lnr_flags;
- int lnr_pad0;
- char lnr_hdw_addr[ND_MAX_HDW_LEN];
-} lif_nd_req_t;
-.Ed
-.Pp
-The
-.Fa lnr_addr
-field should be filled in with an IPv6 address
-.Pq see Xr sockaddr_in6 3SOCKET ,
-and the
-.Fa lnr_hdw_addr
-is the link-layer address of length
-.Fa lnr_hdw_len .
-.Pp
-State flags for
-.Fa lnr_state_create ,
-.Fa lnr_state_same_lla ,
-and
-.Fa lnr_state_diff_lla
-can be set to one of the following values:
-.Bl -tag -offset indent -width 16m
-.It Sy ND_UNCHANGED
-For ioctls that don't modify state
-.It Sy ND_INCOMPLETE
-Address resolution is currently in progress
-.It Sy ND_REACHABLE
-The link-layer address has recently been reachable
-.It Sy ND_STALE
-The link-layer address may be unreachable, and the system shouldn't do anything
-.It Sy ND_DELAY
-This entry hasn't yet started sending Neighbor Solicitations
-.It Sy ND_PROBE
-The operating system is currently sending out Neighbor Solicitations for the address
-.It Sy ND_UNREACHABLE
-The link-layer address is unreachable, and this entry is going to be deleted.
-.El
-.sp
-When creating a new entry, the only valid values for
-.Fa lnr_state_create
-are
-.Sy ND_REACHABLE
-and
-.Sy ND_STALE .
-Any other value will return
-.Sy EINVAL .
-The
-.Fa lnr_state_same_lla
-and
-.Fa lnr_state_diff_lla
-fields are reserved for future use and can be safely set to
-.Sy ND_UNCHANGED
-and
-.Sy ND_STALE
-respectively.
-.Pp
-Flags that can be placed in
-.Fa lnr_flags
-are:
-.Bl -tag -offset indent -width 16m
-.It Sy NDF_ISROUTER_ON
-Mark this entry as being a router.
-This will cause Neighbor Advertisements for this address to be sent with the
-R-bit (Router).
-.It Sy NDF_ISROUTER_OFF
-If this entry was flagged as being a router, remove the flag.
-.It Sy NDF_ANYCAST_ON
-Mark this entry as being for an anycast address.
-This prevents sending Neighbor Advertisements with the O-bit (Override).
-.It Sy NDF_ANYCAST_OFF
-If this entry was flagged as an anycast address, remove the flag.
-.It Sy NDF_STATIC
-Prevent this entry from being deleted by the system.
-.El
-.sp
-When using
-.Sy SIOCLIFGETND ,
-these flags represent the current state of the corresponding Neighbor Cache
-Entry.
-When using
-.Sy SIOCLIFSETND ,
-these flags represent what changes should be applied to the underlying entry.
-.Pp
-The only fields that need to be set for the
-.Sy SIOCLIFGETND
-or
-.Sy SIOCLIFDELND
-ioctls are
-.Fa lifr_name
-and
-.Fa lnr_addr .
-All other fields should be zeroed out.
-After successfully getting an entry, the other fields will be filled in.
-When using
-.Sy SIOCLIFSETND ,
-all fields should be set to an appropriate value, as described above, with the
-exception of
-.Fa lnr_pad0 ,
-which is unused and only exists for padding purposes.
-.Pp
-After performing the ioctl, the following errors may be returned through the
-global
-.Sy errno
-variable:
-.Bl -tag -offset indent -width 16m
-.It Sy EAFNOSUPPORT
-A non-IPv6 socket was used to perform the ioctl.
-.It Sy EINVAL
-The request contents were bad.
-This could be because conflicting flags were used, the specified interface
-wasn't logical unit zero, or another reason.
-.It Sy ENOMEM
-The system ran out of memory for internal data structures.
-.It Sy ENXIO
-The specified interface does not exist.
-.It Sy EPERM
-The caller does not have permission to modify the Neighbor Cache Entries
-associated with this interface.
-They may be lacking the
-.Sy PRIV_SYS_NET_CONFIG
-privilege
-.Po see Xr privileges 5 Pc ,
-or the interface is managed by IPMP (IP Network Multipathing).
-.It Sy ESRCH
-There is no entry matching the specified address.
-.El
-.Sh EXAMPLES
-The following examples demonstrate how to get and set NDP mappings using the
-provided ioctls.
-They can be compiled by using a C compiler and linking against the sockets
-library.
-.Ss Example 1: Getting a mapping
-.Bd -literal -offset indent
-$ gcc -Wall -lsocket -o get get.c
-$ cat get.c
-/*
- * Example of getting a mapping for a node name.
- */
-#include <strings.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/socket.h>
-#include <sys/sockio.h>
-#include <unistd.h>
-#include <netdb.h>
-#include <net/if.h>
-
-int get(char *host) {
- struct lifreq lifr;
- struct addrinfo hints, *serverinfo, *p;
- int err, s;
-
- bzero(&hints, sizeof (struct addrinfo));
- hints.ai_family = PF_INET6;
- hints.ai_protocol = IPPROTO_IPV6;
-
- if ((err = getaddrinfo(host, NULL, &hints, &serverinfo)) != 0) {
- (void) fprintf(stderr, "Unable to lookup %s: %s\\n", host,
- gai_strerror(err));
- return (1);
- }
-
- s = socket(AF_INET6, SOCK_DGRAM, 0);
- if (s < 0) {
- perror("Failed to open IPv6 socket");
- return (1);
- }
-
- for (p = serverinfo; p != NULL; p = p->ai_next) {
- /* Zero out structure */
- bzero(&lifr, sizeof (struct lifreq));
- (void) strlcpy(lifr.lifr_name, "net0",
- sizeof (lifr.lifr_name));
- (void) memcpy(&lifr.lifr_nd.lnr_addr, p->ai_addr,
- sizeof (struct sockaddr_storage));
-
- /* Get mapping */
- if (ioctl(s, SIOCLIFGETND, &lifr) < 0) {
- perror("Unable to get NDP mapping");
- continue;
- }
-
- /*
- * lifr.lifr_nd.lnr_hdw_addr now contains the MAC address,
- * and can be used as desired.
- */
- }
-
- /*
- * Clean up linked list.
- */
- freeaddrinfo(serverinfo);
- return (0);
-}
-
-int main(int argc, char *argv[]) {
- if (argc < 2)
- exit(1);
- return (get(argv[1]));
-}
-.Ed
-.sp
-Deleting a mapping would work similarly, except that instead of using
-.Sy SIOCLIFGETND ,
-you would instead use the
-.Sy SIOCLIFDELND
-ioctl.
-.Ss Example 2: Adding a mapping
-.Bd -literal -offset indent
-$ gcc -Wall -lsocket -o set set.c
-$ cat set.c
-/*
- * Example of setting a mapping to an all-zero Ethernet address.
- */
-#include <strings.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/socket.h>
-#include <sys/sockio.h>
-#include <unistd.h>
-#include <netdb.h>
-#include <net/if.h>
-
-int set(char *host) {
- struct lifreq lifr;
- struct addrinfo hints, *serverinfo, *p;
- int err, s;
-
- bzero(&hints, sizeof (struct addrinfo));
- hints.ai_family = PF_INET6;
- hints.ai_protocol = IPPROTO_IPV6;
-
- if ((err = getaddrinfo(host, NULL, &hints, &serverinfo)) != 0) {
- (void) fprintf(stderr, "Unable to lookup %s: %s\\n", host,
- gai_strerror(err));
- return (1);
- }
-
- s = socket(AF_INET6, SOCK_DGRAM, 0);
- if (s < 0) {
- perror("Failed to open IPv6 socket");
- return (1);
- }
-
- for (p = serverinfo; p != NULL; p = p->ai_next) {
- /* Zero out structure */
- bzero(&lifr, sizeof (struct lifreq));
- (void) strlcpy(lifr.lifr_name, "net0",
- sizeof (lifr.lifr_name));
- (void) memcpy(&lifr.lifr_nd.lnr_addr, p->ai_addr,
- sizeof (struct sockaddr_storage));
-
- lifr.lifr_nd.lnr_state_create = ND_REACHABLE;
- lifr.lifr_nd.lnr_flags = NDF_STATIC;
-
- /* Get mapping */
- if (ioctl(s, SIOCLIFSETND, &lifr) < 0) {
- perror("Unable to set NDP mapping");
- continue;
- }
- }
-
- /*
- * Clean up linked list.
- */
- freeaddrinfo(serverinfo);
- return (0);
-}
-
-int main(int argc, char *argv[]) {
- if (argc < 2)
- exit(1);
- return (set(argv[1]));
-}
-.Ed
-.Sh SEE ALSO
-.Xr ifconfig 1M ,
-.Xr in.ndpd 1M ,
-.Xr ndp 1M ,
-.Xr sockaddr_in6 3SOCKET ,
-.Xr privileges 5
-.Rs
-.%A Narten, T.
-.%A Nordmark, E.
-.%A Simpson, W.
-.%A Soliman, H.
-.%R Neighbor Discovery for IP version 6
-.%T RFC 4861
-.%D September 2007
-.Re