|
|
1.1 ! root 1: .\" Copyright (c) 1990 The Regents of the University of California. ! 2: .\" All rights reserved. ! 3: .\" ! 4: .\" Redistribution and use in source and binary forms are permitted ! 5: .\" provided that: (1) source distributions retain this entire copyright ! 6: .\" notice and comment, and (2) distributions including binaries display ! 7: .\" the following acknowledgement: ``This product includes software ! 8: .\" developed by the University of California, Berkeley and its contributors'' ! 9: .\" in the documentation or other materials provided with the distribution ! 10: .\" and in all advertising materials mentioning features or use of this ! 11: .\" software. Neither the name of the University nor the names of its ! 12: .\" contributors may be used to endorse or promote products derived ! 13: .\" from this software without specific prior written permission. ! 14: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 15: .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 16: .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 17: .\" ! 18: .\" @(#)route.4 6.2 (Berkeley) 5/30/90 ! 19: .\" ! 20: .TH ROUTE 4 "May 30, 1990" ! 21: .UC 5 ! 22: .SH NAME ! 23: .UC 4 ! 24: .SH NAME ! 25: ROUTE \- Kernel Packet Forwarding Database ! 26: .SH SYNOPSIS ! 27: .nf ! 28: \fB#include <sys/socket.h>\fR ! 29: \fB#include <net/if.h>\fR ! 30: \fB#include <net/route.h>\fR ! 31: .br ! 32: .B int family ! 33: .br ! 34: .B s = socket(PF_ROUTE, SOCK_RAW, family); ! 35: .SH DESCRIPTION ! 36: .PP ! 37: .UX ! 38: provides some packet routing facilities. ! 39: The kernel maintains a routing information database, which ! 40: is used in selecting the appropriate network interface when ! 41: transmitting packets. ! 42: .PP ! 43: A user process (or possibly multiple co-operating processes) ! 44: maintains this database by sending messages over a special kind ! 45: of socket. ! 46: This supplants fixed size ! 47: .IR ioctl 's ! 48: used in earlier releases. ! 49: Routing table changes may only be carried out by the super user. ! 50: .PP ! 51: The operating system may spontaneously emit routing messages in response ! 52: to external events, such as recipt of a re-direct, or failure to ! 53: locate a suitable route for a request. ! 54: The message types are described in greater detail below. ! 55: .PP ! 56: Routing database entries come in two flavors: for a specific ! 57: host, or for all hosts on a generic subnetwork (as specified ! 58: by a bit mask and value under the mask. ! 59: The effect of wildcard or default route may be achieved by using ! 60: a mask of all zeros, and there may be hierarchical routes. ! 61: .PP ! 62: When the system is booted and addresses are assigned ! 63: to the network interfaces, each protocol family ! 64: installs a routing table entry for each interface when it is ready for traffic. ! 65: Normally the protocol specifies the route ! 66: through each interface as a ``direct'' connection to the destination host ! 67: or network. If the route is direct, the transport layer of ! 68: a protocol family usually requests the packet be sent to the ! 69: same host specified in the packet. Otherwise, the interface ! 70: is requested to address the packet to the gateway listed in the routing entry ! 71: (i.e. the packet is forwarded). ! 72: .PP ! 73: When routing a packet, ! 74: the kernel will first attempt to find a route to the destination host. ! 75: Failing that, a search is made for a route to the network of the destination. ! 76: Finally, any route to a default (``wildcard'') gateway is chosen. ! 77: If no entry is found, the destination is declared to be unreachable, ! 78: and a routing\-miss message is generated if there are any ! 79: listers on the routing control socket described below. ! 80: .PP ! 81: A wildcard routing entry is specified with a zero ! 82: destination address value. Wildcard routes are used ! 83: only when the system fails to find a route to the ! 84: destination host and network. The combination of wildcard ! 85: routes and routing redirects can provide an economical ! 86: mechanism for routing traffic. ! 87: .PP ! 88: One opens the channel for passing routing control messasges ! 89: by using the socket call shown in the synopsis above: ! 90: .PP ! 91: The \fIfamily\fP paramter may be AF_UNSPEC which will provide ! 92: routing information for all address families, or can be restricted ! 93: to a specific address family by specifying which one is desired. ! 94: There can be more than one routing socket open per system. ! 95: .PP ! 96: Messages are formed by a header followed by a small ! 97: number of sockadders (now variable length particularly ! 98: in the ISO case), interpreted by position, and delimited ! 99: by the new length entry in the sockaddr. ! 100: An example of a message with four addresses might be an ISO redirect: ! 101: Destination, Netmask, Gateway, and Author of the redirect. ! 102: The interpretation of which address are present is given by a ! 103: bit mask within the header, and the sequence is least significant ! 104: to most significant bit within the vector. ! 105: .PP ! 106: Any messages sent to the kernel are returned, and copies are sent ! 107: to all interested listeners. The kernel will provide the process ! 108: id. for the sender, and the sender may use an additional sequence ! 109: field to distinguish between outstanding messages. However, ! 110: message replies may be lost when kernel buffers are exhausted. ! 111: .PP ! 112: The kernel may reject certain messages, and will indicate this ! 113: by filling in the rtm_errno field. ! 114: The routing code returns EEXIST if ! 115: requested to duplicate an existing entry, ESRCH if ! 116: requested to delete a non-existent entry, ! 117: or ENOBUFS if insufficient resources were available ! 118: to install a new route. ! 119: In the current implementation, all routing process run locally, ! 120: and the values for rtm_errno are available through the normal ! 121: errno mechanism, even if the routing reply message is lost. ! 122: .PP ! 123: A process may avoid the expense of reading replies to ! 124: its own messages by issuing a ! 125: .IR setsockopt () ! 126: call indicating that the SO_USELOOPBACK option ! 127: at the SOL_SOCKET level is to be turned off. ! 128: A process may ignore all messages from the routing socket ! 129: by doing a ! 130: .IR shutdown (2) ! 131: system call for further input. ! 132: .PP ! 133: If a route is in use when it is deleted, ! 134: the routing entry will be marked down and removed from the routing table, ! 135: but the resources associated with it will not ! 136: be reclaimed until all references to it are released. ! 137: User processes can obtain information about the routing ! 138: entry to a specific destination by using a RTM_GET message, ! 139: or by reading the ! 140: .I /dev/kmem ! 141: device, or by issuing a ! 142: .I getkerninfo () ! 143: system call. ! 144: .nf ! 145: ! 146: Messages include: ! 147: ! 148: .ta \w'#define 'u +\w'RTM_REDIRECT 'u +\w'0x7 'u ! 149: #define RTM_ADD 0x1 /* \fIAdd Route\fP */ ! 150: #define RTM_DELETE 0x2 /* \fIDelete Route\fP */ ! 151: #define RTM_CHANGE 0x3 /* \fIChange Metrics, Flags, or Gateway\fP */ ! 152: #define RTM_GET 0x4 /* \fIReport Information\fP */ ! 153: #define RTM_LOOSING 0x5 /* \fIKernel Suspects Partitioning\fP */ ! 154: #define RTM_REDIRECT 0x6 /* \fITold to use different route\fP */ ! 155: #define RTM_MISS 0x7 /* \fILookup failed on this address\fP */ ! 156: #define RTM_RESOLVE 0xb /* \fIrequest to resolve dst to LL addr\fP */ ! 157: ! 158: .ta \w'struct 'u +\w'u_short 'u +\w'rt_metrics rtm_rmx 'u ! 159: A message header consists of: ! 160: struct rt_msghdr { ! 161: u_short rmt_msglen; /* \fIto skip over non-understood messages\fP */ ! 162: u_char rtm_version; /* \fIfuture binary compatability\fP */ ! 163: u_char rtm_type; /* \fImessage type\fP */ ! 164: u_short rmt_index; /* \fIindex for associated ifp \fP */ ! 165: pid_t rmt_pid; /* \fIidentify sender\fP */ ! 166: int rtm_addrs; /* \fIbitmask identifying sockaddrs in msg\fP */ ! 167: int rtm_seq; /* \fIfor sender to identify action\fP */ ! 168: int rtm_errno; /* \fIwhy failed\fP */ ! 169: int rtm_flags; /* \fIflags, incl. kern & message, e.g. DONE\fP */ ! 170: int rtm_use; /* \fIfrom rtentry\fP */ ! 171: u_long rtm_inits; /* \fIwhich values we are initializing\fP */ ! 172: struct rt_metrics rtm_rmx; /* \fImetrics themselves\fP */ ! 173: }; ! 174: ! 175: where ! 176: ! 177: .ta \w'struct 'u +\w'u_long 'u +\w'rmx_hopcount 'u ! 178: struct rt_metrics { ! 179: u_long rmx_locks; /* \fIKernel must leave these values alone\fP */ ! 180: u_long rmx_mtu; /* \fIMTU for this path\fP */ ! 181: u_long rmx_hopcount; /* \fImax hops expected\fP */ ! 182: u_long rmx_expire; /* \fIlifetime for route, e.g. redirect\fP */ ! 183: u_long rmx_recvpipe; /* \fIinbound delay-bandwith product\fP */ ! 184: u_long rmx_sendpipe; /* \fIoutbound delay-bandwith product\fP */ ! 185: u_long rmx_ssthresh; /* \fIoutbound gateway buffer limit\fP */ ! 186: u_long rmx_rtt; /* \fIestimated round trip time\fP */ ! 187: u_long rmx_rttvar; /* \fIestimated rtt variance\fP */ ! 188: }; ! 189: ! 190: ! 191: Flags include the values: ! 192: ! 193: .ta \w'#define 'u +\w'RTF_MODIFIED 'u +\w'0x80 'u ! 194: #define RTF_UP 0x1 /* \fIroute useable\fP */ ! 195: #define RTF_GATEWAY 0x2 /* \fIdestination is a gateway\fP */ ! 196: #define RTF_HOST 0x4 /* \fIhost entry (net otherwise)\fP */ ! 197: #define RTF_NORMAL 0x8 /* \fIsubnet mask is cannonical\fP */ ! 198: #define RTF_DYNAMIC 0x10 /* \fIcreated dynamically (by redirect)\fP */ ! 199: #define RTF_MODIFIED 0x20 /* \fImodified dynamically (by redirect)\fP */ ! 200: #define RTF_DONE 0x40 /* \fImessage confirmed\fP */ ! 201: #define RTF_MASK 0x80 /* \fIsubnet mask present\fP */ ! 202: ! 203: Specfiers for metric values in rmx_locks and rtm_inits are: ! 204: ! 205: .ta \w'#define 'u +\w'RTF_HOPCOUNT 'u +\w'0x80 'u ! 206: #define RTV_SSTHRESH 0x1 /* \fIinit or lock _ssthresh\fP */ ! 207: #define RTV_RPIPE 0x2 /* \fIinit or lock _recvpipe\fP */ ! 208: #define RTV_SPIPE 0x4 /* \fIinit or lock _sendpipe\fP */ ! 209: #define RTV_HOPCOUNT 0x8 /* \fIinit or lock _hopcount\fP */ ! 210: #define RTV_RTT 0x10 /* \fIinit or lock _rtt\fP */ ! 211: #define RTV_RTTVAR 0x20 /* \fIinit or lock _rttvar\fP */ ! 212: #define RTV_MTU 0x40 /* \fIinit or lock _mtu\fP */ ! 213: ! 214: Specifiers for which addresses are present in the messages are: ! 215: ! 216: .ta \w'#define 'u +\w'RTA_GATEWAY 'u +\w'0x80 'u ! 217: #define RTA_DST 0x1 /* \fIdestination sockaddr present\fP */ ! 218: #define RTA_GATEWAY 0x2 /* \fIgateway sockaddr present\fP */ ! 219: #define RTA_NETMASK 0x4 /* \fInetmask sockaddr present\fP */ ! 220: #define RTA_GENMASK 0x8 /* \fIcloning mask sockaddr present\fP */ ! 221: #define RTA_IFP 0x10 /* \fIinterface name sockaddr present\fP */ ! 222: #define RTA_IFA 0x20 /* \fIinterface addr sockaddr present\fP */ ! 223: #define RTA_AUTHOR 0x40 /* \fIsockaddr for author of redirect\fP */ ! 224: ! 225: .fi ! 226:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.