route(4)
NAME
route - kernel packet forwarding database
SYNOPSIS
#include <sys/types.h> #include <sys/time.h> #include <sys/socket.h> #include <net/if.h> #include <net/route.h> int socket(PF_ROUTE, SOCK_RAW, int family);
DESCRIPTION
- FreeBSD provides some packet routing facilities.  The kernel
 - maintains a
routing information database, which is used in selecting the - appropriate
network interface when transmitting packets. - A user process (or possibly multiple co-operating processes)
 - maintains
this database by sending messages over a special kind of - socket.  This
supplants fixed size ioctl(2)'s used in earlier releases. - Routing table
changes may only be carried out by the super user. - The operating system may spontaneously emit routing messages
 - in response
to external events, such as receipt of a re-direct, or fail - ure to locate
a suitable route for a request. The message types are de - scribed in
greater detail below. - Routing database entries come in two flavors: for a specific
 - host, or for
all hosts on a generic subnetwork (as specified by a bit - mask and value
under the mask. The effect of wildcard or default route may - be achieved
by using a mask of all zeros, and there may be hierarchical - routes.
 - When the system is booted and addresses are assigned to the
 - network
interfaces, each protocol family installs a routing table - entry for each
interface when it is ready for traffic. Normally the proto - col specifies
the route through each interface as a ``direct'' connection - to the destination host or network. If the route is direct, the trans
 - port layer of a
protocol family usually requests the packet be sent to the - same host
specified in the packet. Otherwise, the interface is re - quested to
address the packet to the gateway listed in the routing en - try (i.e., the
packet is forwarded). - When routing a packet, the kernel will attempt to find the
 - most specific
route matching the destination. (If there are two different - mask and
value-under-the-mask pairs that match, the more specific is - the one with
more bits in the mask. A route to a host is regarded as be - ing supplied
with a mask of as many ones as there are bits in the desti - nation).  If no
entry is found, the destination is declared to be unreach - able, and a
routing-miss message is generated if there are any listeners - on the routing control socket described below.
 - A wildcard routing entry is specified with a zero destina
 - tion address
value, and a mask of all zeroes. Wildcard routes will be - used when the
system fails to find other routes matching the destination. - The combination of wildcard routes and routing redirects can provide an
 - economical
mechanism for routing traffic. - One opens the channel for passing routing control messages
 - by using the
socket call shown in the synopsis above: - The family parameter may be AF_UNSPEC which will provide
 - routing information for all address families, or can be restricted to a
 - specific address
family by specifying which one is desired. There can be - more than one
routing socket open per system. - Messages are formed by a header followed by a small number
 - of sockaddrs
(now variable length particularly in the ISO case), inter - preted by position, and delimited by the new length entry in the sockaddr.
 - An example
of a message with four addresses might be an ISO redirect: - Destination,
Netmask, Gateway, and Author of the redirect. The interpre - tation of
which address are present is given by a bit mask within the - header, and
the sequence is least significant to most significant bit - within the vector.
 - Any messages sent to the kernel are returned, and copies are
 - sent to all
interested listeners. The kernel will provide the process - ID for the
sender, and the sender may use an additional sequence field - to distinguish between outstanding messages. However, message
 - replies may be lost
when kernel buffers are exhausted. - The kernel may reject certain messages, and will indicate
 - this by filling
in the rtm_errno field. The routing code returns EEXIST if - requested to
duplicate an existing entry, ESRCH if requested to delete a - non-existent
entry, or ENOBUFS if insufficient resources were available - to install a
new route. In the current implementation, all routing pro - cesses run
locally, and the values for rtm_errno are available through - the normal
errno mechanism, even if the routing reply message is lost. - A process may avoid the expense of reading replies to its
 - own messages by
issuing a setsockopt(2) call indicating that the SO_USELOOP - BACK option at
the SOL_SOCKET level is to be turned off. A process may ig - nore all messages from the routing socket by doing a shutdown(2) system
 - call for further input.
 - If a route is in use when it is deleted, the routing entry
 - will be marked
down and removed from the routing table, but the resources - associated
with it will not be reclaimed until all references to it are - released.
User processes can obtain information about the routing en - try to a specific destination by using a RTM_GET message, or by calling
 - sysctl(3).
 - Messages include:
 - #define RTM_ADD         0x1    /* Add Route */
#define RTM_DELETE 0x2 /* Delete Route */
#define RTM_CHANGE 0x3 /* Change Metrics, Flags, or - Gateway */
#define RTM_GET 0x4 /* Report Information */
#define RTM_LOSING 0x5 /* Kernel Suspects Partition - ing */
#define RTM_REDIRECT 0x6 /* Told to use different - route */
#define RTM_MISS 0x7 /* Lookup failed on this ad - dress */
#define RTM_LOCK 0x8 /* fix specified metrics */
#define RTM_RESOLVE 0xb /* request to resolve dst to - LL addr */
#define RTM_NEWADDR 0xc /* address being added to - iface */
#define RTM_DELADDR 0xd /* address being removed from - iface */
#define RTM_IFINFO 0xe /* iface going up/down etc. - */
#define RTM_NEWMADDR 0xf /* mcast group membership be - ing added to if */
#define RTM_DELMADDR 0x10 /* mcast group membership be - ing deleted */
#define RTM_IFANNOUNCE 0x11 /* iface arrival/departure */ - A message header consists of one of the following:
 - struct rt_msghdr {
 - u_short rtm_msglen; /* to skip over non-under
 - stood messages */
u_char rtm_version; /* future binary compatibil - ity */
u_char rtm_type; /* message type */
u_short rtm_index; /* index for associated ifp - */
int rtm_flags; /* flags, incl. kern & mes - sage, e.g. DONE */
int rtm_addrs; /* bitmask identifying sock - addrs in msg */
pid_t rtm_pid; /* identify sender */
int rtm_seq; /* for sender to identify - action */
int rtm_errno; /* why failed */
int rtm_use; /* from rtentry */
u_long rtm_inits; /* which metrics we are ini - tializing */
struct rt_metrics rtm_rmx; /* metrics themselves */ - };
 - struct if_msghdr {
 - u_short ifm_msglen; /* to skip over non-under
 - stood messages */
u_char ifm_version; /* future binary compatibil - ity */
u_char ifm_type; /* message type */
int ifm_addrs; /* like rtm_addrs */
int ifm_flags; /* value of if_flags */
u_short ifm_index; /* index for associated ifp - */
struct if_data ifm_data; /* statistics and other data - about if */
 - };
 - struct ifa_msghdr {
 - u_short ifam_msglen; /* to skip over non-under
 - stood messages */
u_char ifam_version; /* future binary compatibil - ity */
u_char ifam_type; /* message type */
int ifam_addrs; /* like rtm_addrs */
int ifam_flags; /* value of ifa_flags */
u_short ifam_index; /* index for associated ifp - */
int ifam_metric; /* value of ifa_metric */ - };
 - struct ifma_msghdr {
 - u_short ifmam_msglen; /* to skip over non-under
 - stood messages */
u_char ifmam_version; /* future binary compatibil - ity */
u_char ifmam_type; /* message type */
int ifmam_addrs; /* like rtm_addrs */
int ifmam_flags; /* value of ifa_flags */
u_short ifmam_index; /* index for associated ifp - */
 - };
 - struct if_announcemsghdr {
 - u_short ifan_msglen; /* to skip over non-under
 - stood messages */
u_char ifan_version; /* future binary compatibil - ity */
u_char ifan_type; /* message type */
u_short ifan_index; /* index for associated ifp - */
char ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" - */
u_short ifan_what; /* what type of announcement - */
 - };
 - The RTM_IFINFO message uses a if_msghdr header, the
 - RTM_NEWADDR and
RTM_DELADDR messages use a ifa_msghdr header, the RTM_NEW - MADDR and
RTM_DELMADDR messages use a ifma_msghdr header, the - RTM_IFANNOUNCE message uses a if_announcemsghdr header, and all other messages
 - use the
rt_msghdr header. - The ``struct rt_metrics'' and the flag bits are as defined
 - in rtentry(9).
 - Specifiers for metric values in rmx_locks and rtm_inits are:
 - #define RTV_MTU       0x1    /* init or lock _mtu */
#define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */
#define RTV_EXPIRE 0x4 /* init or lock _expire */
#define RTV_RPIPE 0x8 /* init or lock _recvpipe */
#define RTV_SPIPE 0x10 /* init or lock _sendpipe */
#define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */
#define RTV_RTT 0x40 /* init or lock _rtt */
#define RTV_RTTVAR 0x80 /* init or lock _rttvar */ - Specifiers for which addresses are present in the messages
 - are:
 - #define RTA_DST 0x1 /* destination sockaddr present
 - */
#define RTA_GATEWAY 0x2 /* gateway sockaddr present */
#define RTA_NETMASK 0x4 /* netmask sockaddr present */
#define RTA_GENMASK 0x8 /* cloning mask sockaddr pre - sent */
#define RTA_IFP 0x10 /* interface name sockaddr pre - sent */
#define RTA_IFA 0x20 /* interface addr sockaddr pre - sent */
#define RTA_AUTHOR 0x40 /* sockaddr for author of redi - rect */
#define RTA_BRD 0x80 /* for NEWADDR, broadcast or p - p dest addr */
 
SEE ALSO
sysctl(3), route(8), rtentry(9)
- The constants for the rtm_flags field are documented in the
 - manual page
for the route(8) utility. 
HISTORY
- A PF_ROUTE protocol family first appeared in 4.3BSD-Reno.
 - BSD November 4, 2004