rtinfo
rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo)
memset(rtinfo->rti_info, 0, sizeof(rtinfo->rti_info));
if ((rtinfo->rti_addrs & (1 << i)) == 0)
rtinfo->rti_info[i] = sa = (struct sockaddr *)cp;
rt_print(rtinfo, rt);
rn = rnh->rnh_lookup(rtinfo->rti_info[RTAX_DST],
rtinfo->rti_info[RTAX_NETMASK], rnh);
kprintf("rti %p failed error %d\n", rtinfo, error);
kprintf("rti %p succeeded\n", rtinfo);
rt_print(struct rt_addrinfo *rtinfo, struct rtentry *rt)
rtinfo, mycpuid, rt, rt->rt_flags);
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_info[RTAX_DST] = dst;
rtinfo.rti_info[RTAX_GATEWAY] = ifa->ifa_addr;
rtinfo.rti_info[RTAX_NETMASK] = netmask;
rtinfo.rti_flags = flags | ifa->ifa_flags;
rtinfo.rti_ifa = ifa;
error = rtrequest1_global(cmd, &rtinfo, rtinit_rtrequest_callback, ifa,
struct rt_addrinfo *rtinfo, struct rtentry *rt,
struct rt_addrinfo *rtinfo;
rtsearch_global(int req, struct rt_addrinfo *rtinfo,
msg.rtinfo = rtinfo;
struct rt_addrinfo rtinfo;
rtinfo = *rmsg->rtinfo;
if ((rnh = rt_tables[mycpuid][rtinfo.rti_dst->sa_family]) == NULL) {
if (rtinfo.rti_flags & RTF_HOST) {
rtinfo.rti_netmask = NULL;
rtinfo.rti_flags &= ~(RTF_CLONING | RTF_PRCLONING);
rnh->rnh_lookup(rtinfo.rti_dst, rtinfo.rti_netmask, rnh);
((rt->rt_flags ^ rtinfo.rti_flags) & RTF_HOST))
error = rmsg->callback(rmsg->req, &rtinfo, rt, rmsg->arg,
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_info[RTAX_DST] = dst;
rtinfo.rti_info[RTAX_GATEWAY] = gateway;
rtinfo.rti_info[RTAX_NETMASK] = netmask;
rtinfo.rti_flags = flags;
rtinfo.rti_ifa = ifa;
error = rtrequest1(RTM_ADD, &rtinfo, &rt);
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_info[RTAX_DST] = dst;
rtinfo.rti_info[RTAX_GATEWAY] = gateway;
rtinfo.rti_info[RTAX_NETMASK] = netmask;
rtinfo.rti_info[RTAX_AUTHOR] = src;
rt_missmsg(RTM_REDIRECT, &rtinfo, flags, error);
rt_getifa(struct rt_addrinfo *rtinfo)
struct sockaddr *gateway = rtinfo->rti_info[RTAX_GATEWAY];
struct sockaddr *dst = rtinfo->rti_info[RTAX_DST];
struct sockaddr *ifaaddr = rtinfo->rti_info[RTAX_IFA];
int flags = rtinfo->rti_flags;
if (rtinfo->rti_ifp == NULL) {
ifpaddr = rtinfo->rti_info[RTAX_IFP];
rtinfo->rti_ifp = ifa->ifa_ifp;
if (rtinfo->rti_ifa == NULL && ifaaddr != NULL)
rtinfo->rti_ifa = ifa_ifwithaddr(ifaaddr);
if (rtinfo->rti_ifa == NULL) {
if (rtinfo->rti_ifp != NULL) {
rtinfo->rti_ifa = ifaof_ifpforaddr(sa, rtinfo->rti_ifp);
if (rtinfo->rti_ifa == NULL &&
rtinfo->rti_ifa =
ifaof_ifpforaddr(gateway, rtinfo->rti_ifp);
rtinfo->rti_ifa = ifa_ifwithroute(flags, dst, gateway);
rtinfo->rti_ifa = ifa_ifwithroute(flags, sa, sa);
if (rtinfo->rti_ifa == NULL)
if (rtinfo->rti_ifp == NULL)
rtinfo->rti_ifp = rtinfo->rti_ifa->ifa_ifp;
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_info[RTAX_DST] = dst;
rtinfo.rti_info[RTAX_GATEWAY] = gateway;
rtinfo.rti_info[RTAX_NETMASK] = netmask;
rtinfo.rti_flags = flags;
return rtrequest1(req, &rtinfo, ret_nrt);
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_info[RTAX_DST] = dst;
rtinfo.rti_info[RTAX_GATEWAY] = gateway;
rtinfo.rti_info[RTAX_NETMASK] = netmask;
rtinfo.rti_flags = flags;
return rtrequest1_global(req, &rtinfo, NULL, NULL, RTREQ_PRIO_NORM);
struct rt_addrinfo *rtinfo;
rtrequest1_global(int req, struct rt_addrinfo *rtinfo,
msg.rtinfo = rtinfo;
struct rt_addrinfo rtinfo;
rtinfo = *rmsg->rtinfo;
error = rtrequest1(rmsg->req, &rtinfo, &rt);
rmsg->callback(rmsg->req, error, &rtinfo, rt, rmsg->arg);
rtrequest1(int req, struct rt_addrinfo *rtinfo, struct rtentry **ret_nrt)
struct sockaddr *dst = rtinfo->rti_info[RTAX_DST];
rt_addrinfo_print(req, rtinfo);
if (rtinfo->rti_flags & RTF_HOST) {
rtinfo->rti_info[RTAX_NETMASK] = NULL;
rtinfo->rti_flags &= ~(RTF_CLONING | RTF_PRCLONING);
rn = rnh->rnh_deladdr(rtinfo->rti_info[RTAX_DST],
rtinfo->rti_info[RTAX_NETMASK], rnh);
rt_print(rtinfo, rt);
rtinfo->rti_flags =
rtinfo->rti_flags |= RTF_WASCLONED;
rtinfo->rti_info[RTAX_GATEWAY] = rt->rt_gateway;
if ((rtinfo->rti_info[RTAX_NETMASK] = rt->rt_genmask) == NULL)
rtinfo->rti_flags |= RTF_HOST;
rtinfo->rti_info[RTAX_MPLS1] = rt->rt_shim[0];
rtinfo->rti_info[RTAX_MPLS2] = rt->rt_shim[1];
rtinfo->rti_info[RTAX_MPLS3] = rt->rt_shim[2];
KASSERT((!(rtinfo->rti_flags & RTF_GATEWAY) ||
rtinfo->rti_info[RTAX_GATEWAY] != NULL),
if (rtinfo->rti_ifa == NULL &&
(error = rt_getifa(rtinfo)) != 0)
ifa = rtinfo->rti_ifa;
rt->rt_flags = RTF_UP | rtinfo->rti_flags;
error = rt_setgate(rt, dst, rtinfo->rti_info[RTAX_GATEWAY]);
if (rtinfo->rti_info[RTAX_NETMASK] != NULL)
rtinfo->rti_info[RTAX_NETMASK]);
if (rtinfo->rti_info[RTAX_MPLS1] != NULL)
rt_setshims(rt, rtinfo->rti_info);
rn = rnh->rnh_addaddr(ndst, rtinfo->rti_info[RTAX_NETMASK],
rtinfo->rti_info[RTAX_NETMASK],
rt_xaddrs(char *cp, char *cplim, struct rt_addrinfo *rtinfo)
if ((rtinfo->rti_addrs & (1 << i)) == 0)
rtinfo->rti_info[i] = &sa_zero;
rtinfo->rti_info[i] = sa;
rt_msgsize(int type, const struct rt_addrinfo *rtinfo)
if (rtinfo->rti_info[i] != NULL)
len += RT_ROUNDUP(rtinfo->rti_info[i]->sa_len);
rt_msg_buffer(int type, struct rt_addrinfo *rtinfo, void *buf, int msglen)
rtinfo->rti_addrs = 0;
if ((sa = rtinfo->rti_info[i]) == NULL)
if (i == RTAX_NETMASK && rtinfo->rti_dst != NULL)
sa = rt_fix_netmask(&ss, sa, rtinfo->rti_dst);
rtinfo->rti_addrs |= (1 << i);
rt_msg_mbuf(int type, struct rt_addrinfo *rtinfo)
if ((sa = rtinfo->rti_info[i]) == NULL)
if (i == RTAX_NETMASK && rtinfo->rti_dst != NULL)
sa = rt_fix_netmask(&ss, sa, rtinfo->rti_dst);
rtinfo->rti_addrs = 0;
if ((sa = rtinfo->rti_info[i]) == NULL)
if (i == RTAX_NETMASK && rtinfo->rti_dst != NULL)
sa = rt_fix_netmask(&ss, sa, rtinfo->rti_dst);
rtinfo->rti_addrs |= (1 << i);
rt_missmsg(int type, struct rt_addrinfo *rtinfo, int flags, int error)
struct sockaddr *dst = rtinfo->rti_info[RTAX_DST];
m = rt_msg_mbuf(type, rtinfo);
rtm->rtm_addrs = rtinfo->rti_addrs;
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
m = rt_msg_mbuf(RTM_IFINFO, &rtinfo);
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_ifaaddr = ifa->ifa_addr;
rtinfo.rti_ifpaddr =
rtinfo.rti_netmask = ifa->ifa_netmask;
rtinfo.rti_bcastaddr = ifa->ifa_dstaddr;
m = rt_msg_mbuf(cmd, &rtinfo);
ifam->ifam_addrs = rtinfo.rti_addrs;
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_dst = dst = rt_key(rt);
rtinfo.rti_gateway = rt->rt_gateway;
rtinfo.rti_netmask = rt_mask(rt);
rtinfo.rti_ifpaddr =
rtinfo.rti_ifaaddr = rt->rt_ifa->ifa_addr;
m = rt_msg_mbuf(cmd, &rtinfo);
rtm->rtm_addrs = rtinfo.rti_addrs;
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_ifaaddr = ifma->ifma_addr;
rtinfo.rti_ifpaddr =
rtinfo.rti_gateway = ifma->ifma_lladdr;
m = rt_msg_mbuf(cmd, &rtinfo);
ifmam->ifmam_addrs = rtinfo.rti_addrs;
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
static int rt_msgsize(int type, const struct rt_addrinfo *rtinfo);
rtinfo.rti_ifpaddr = ifa->ifa_addr;
msglen = rt_msgsize(RTM_IFINFO, &rtinfo);
rt_msg_buffer(RTM_IFINFO, &rtinfo, w->w_tmem, msglen);
rtinfo.rti_ifpaddr = NULL;
ifm->ifm_addrs = rtinfo.rti_addrs;
rtinfo.rti_ifaaddr = ifa->ifa_addr;
rtinfo.rti_netmask = ifa->ifa_netmask;
rtinfo.rti_bcastaddr = ifa->ifa_dstaddr;
msglen = rt_msgsize(RTM_NEWADDR, &rtinfo);
rt_msg_buffer(RTM_NEWADDR, &rtinfo, w->w_tmem, msglen);
ifam->ifam_addrs = rtinfo.rti_addrs;
rtinfo.rti_netmask = NULL;
rtinfo.rti_ifaaddr = NULL;
rtinfo.rti_bcastaddr = NULL;
struct rt_addrinfo rtinfo;
memset(&rtinfo, 0, sizeof(rtinfo));
rtinfo.rti_info[i] = (struct sockaddr *)&ss;
msglen = rt_msgsize(RTM_GET, &rtinfo);
rttable_entry_rtinfo(struct rt_addrinfo *rtinfo, struct radix_node *rn)
bzero(rtinfo, sizeof(*rtinfo));
rtinfo->rti_dst = rt_key(rt);
rtinfo->rti_gateway = rt->rt_gateway;
rtinfo->rti_netmask = rt_mask(rt);
rtinfo->rti_genmask = rt->rt_genmask;
rtinfo->rti_ifpaddr =
rtinfo->rti_ifaaddr = rt->rt_ifa->ifa_addr;
rtinfo->rti_bcastaddr = rt->rt_ifa->ifa_dstaddr;
struct rt_addrinfo rtinfo;
rttable_entry_rtinfo(&rtinfo, rn);
msglen = rt_msgsize(RTM_GET, &rtinfo);
KASSERT(rtinfo.rti_dst->sa_len <= sizeof(w->w_key0),
("key too long %d", rtinfo.rti_dst->sa_len));
memcpy(&w->w_key0, rtinfo.rti_dst, rtinfo.rti_dst->sa_len);
if (rtinfo.rti_netmask != NULL) {
rtinfo.rti_netmask->sa_len <= sizeof(w->w_mask0),
("mask too long %d", rtinfo.rti_netmask->sa_len));
memcpy(&w->w_mask0, rtinfo.rti_netmask,
rtinfo.rti_netmask->sa_len);
rt_msg_buffer(RTM_GET, &rtinfo, ptr, msglen);
rtm->rtm_addrs = rtinfo.rti_addrs;
struct rt_addrinfo *rtinfo)
rtinfo->rti_dst = rt_key(rt);
rtinfo->rti_gateway = rt->rt_gateway;
rtinfo->rti_netmask = rt_mask(rt); /* might be NULL */
rtinfo->rti_genmask = rt->rt_genmask; /* might be NULL */
rtinfo->rti_ifpaddr =
rtinfo->rti_ifaaddr = rt->rt_ifa->ifa_addr;
rtinfo->rti_bcastaddr = rt->rt_ifa->ifa_dstaddr;
rtinfo->rti_ifpaddr = NULL;
rtinfo->rti_ifaaddr = NULL;
msglen = rt_msgsize(rtm->rtm_type, rtinfo);
rt_msg_buffer(rtm->rtm_type, rtinfo, rtm, msglen);
rtm->rtm_addrs = rtinfo->rti_addrs;
struct rt_addrinfo *rtinfo)
error = _fillrtmsg(&rtm, rt, rtinfo);
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_addrs = rtm->rtm_addrs;
if (rt_xaddrs((char *)(rtm + 1), (char *)rtm + len, &rtinfo) != 0)
rtinfo.rti_flags = rtm->rtm_flags;
if (rtinfo.rti_dst == NULL || rtinfo.rti_dst->sa_family >= AF_MAX ||
(rtinfo.rti_gateway && rtinfo.rti_gateway->sa_family >= AF_MAX))
family = familyof(rtinfo.rti_dst);
if (rtinfo.rti_genmask != NULL) {
error = rtmask_add_global(rtinfo.rti_genmask,
if (rtinfo.rti_gateway == NULL) {
error = rtrequest1_global(RTM_ADD, &rtinfo,
error = rtrequest1_global(RTM_DELETE, &rtinfo,
error = rtsearch_global(RTM_GET, &rtinfo,
error = rtsearch_global(RTM_CHANGE, &rtinfo,
error = rtsearch_global(RTM_LOCK, &rtinfo,
route_output_add_callback(int cmd, int error, struct rt_addrinfo *rtinfo,
if (rtinfo->rti_genmask != NULL) {
rt->rt_genmask = rtmask_purelookup(rtinfo->rti_genmask);
route_output_delete_callback(int cmd, int error, struct rt_addrinfo *rtinfo,
if (fillrtmsg(arg, rt, rtinfo) != 0) {
route_output_get_callback(int cmd, struct rt_addrinfo *rtinfo,
if (((rtinfo->rti_flags ^ rt->rt_flags) & RTF_HOST) == 0)
error = fillrtmsg(arg, rt, rtinfo);
route_output_change_callback(int cmd, struct rt_addrinfo *rtinfo,
if (((rt->rt_flags & RTF_GATEWAY) && rtinfo->rti_gateway != NULL) ||
rtinfo->rti_ifpaddr != NULL ||
(rtinfo->rti_ifaaddr != NULL &&
!sa_equal(rtinfo->rti_ifaaddr, rt->rt_ifa->ifa_addr))) {
error = rt_getifa(rtinfo);
if (rtinfo->rti_gateway != NULL) {
error = rt_setgate(rt, rt_key(rt), rtinfo->rti_gateway);
if ((ifa = rtinfo->rti_ifa) != NULL) {
rt->rt_ifp = rtinfo->rti_ifp;
if (rt->rt_flags != rtinfo->rti_flags) {
rt->rt_flags = (rtinfo->rti_flags & ~PRESERVED_RTF) |
if (rtinfo->rti_genmask != NULL) {
rt->rt_genmask = rtmask_purelookup(rtinfo->rti_genmask);
route_output_lock_callback(int cmd, struct rt_addrinfo *rtinfo,
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_info[RTAX_DST] = rt_key(rt);
rtinfo.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
rtinfo.rti_info[RTAX_NETMASK] = rt_mask(rt);
rtinfo.rti_flags = rt->rt_flags;
rt_missmsg(RTM_LOSING, &rtinfo, rt->rt_flags, 0);
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_info[RTAX_DST] = (struct sockaddr *)&icmpsrc;
rtinfo.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&icmpdst;
rtinfo.rti_info[RTAX_NETMASK] = NULL;
rtinfo.rti_info[RTAX_AUTHOR] = (struct sockaddr *)&icmpgw;
rt_missmsg(RTM_REDIRECT, &rtinfo, ICMP_RTREDIRECT_FLAGS, 0);
struct rt_addrinfo rtinfo;
bzero(&rtinfo, sizeof(struct rt_addrinfo));
rtinfo.rti_info[RTAX_DST] = ifa->ifa_addr;
rtinfo.rti_info[RTAX_GATEWAY] = ifa->ifa_addr;
rtinfo.rti_info[RTAX_NETMASK] = (struct sockaddr *)&all1_sa;
rtinfo.rti_flags = RTF_UP|RTF_HOST|RTF_LLINFO;
error = rtrequest1_global(cmd, &rtinfo, callback, ifa, RTREQ_PRIO_NORM);
in6_ifloop_request_callback(int cmd, int error, struct rt_addrinfo *rtinfo,
in6_newaddrmsg_callback(int cmd, int error, struct rt_addrinfo *rtinfo,
rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo)
memset(rtinfo->rti_info, 0, sizeof(rtinfo->rti_info));
if ((rtinfo->rti_addrs & (1 << i)) == 0)
rtinfo->rti_info[i] = sa = (struct sockaddr *)cp;
struct rtinfo *rti;
rti = (struct rtinfo *)cp.cp_val;
action_show_rtinfo(struct rtinfo *rti)
static int action_show_rtinfo(struct rtinfo *);
struct rtinfo *rti;
struct rtinfo *rti;
struct rtinfo *rti;
struct rtinfo *rti;
TAILQ_ENTRY(rtinfo) rti_next;
TAILQ_HEAD(, rtinfo) rai_route; /* route information option (link head) */
rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo)
memset(rtinfo->rti_info, 0, sizeof(rtinfo->rti_info));
if ((rtinfo->rti_addrs & (1 << i)) == 0)
rtinfo->rti_info[i] = sa = (struct sockaddr *)cp;