Lines Matching +full:use +full:- +full:rtm
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
7 * Redistribution and use in source and binary forms, with or without
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
126 ( (((struct sockaddr *)(sa))->sa_len == 0) ? \
128 1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(int) - 1) ) )
140 RT_LOG_##_l(_l, "PID %d: " _fmt, curproc ? curproc->p_pid : 0, \
213 struct rt_msghdr *rtm, struct rib_cmd_info *rc);
217 static void send_rtm_reply(struct socket *so, struct rt_msghdr *rtm,
237 if (error || !req->newptr) in sysctl_route_netisr_maxqlen()
283 nh = rc->rc_cmd == RTM_DELETE ? rc->rc_nh_old : rc->rc_nh_new; in report_route_event()
284 rt_routemsg(rc->rc_cmd, rc->rc_rt, nh, fibnum); in report_route_event()
291 if ((rc->rc_nh_new && NH_IS_NHGRP(rc->rc_nh_new)) || in rts_handle_route_event()
292 (rc->rc_nh_old && NH_IS_NHGRP(rc->rc_nh_old))) { in rts_handle_route_event()
308 netlink_callback_p->route_f(fibnum, rc); in rtsock_notify_event()
337 if (sbappendaddr(&so->so_rcv, &route_src, m, NULL) == 0) { in rts_append_data()
353 if (rcb->rcb_family != AF_UNSPEC && in rts_input()
354 rcb->rcb_family != m->m_rtsock_family) in rts_input()
356 if ((m->m_flags & RTS_FILTER_FIB) && in rts_input()
357 M_GETFIB(m) != rcb->rcb_socket->so_fibnum) in rts_input()
366 last = rcb->rcb_socket; in rts_input()
402 rcb->rcb_socket = so; in rts_attach()
403 rcb->rcb_family = proto; in rts_attach()
405 so->so_pcb = rcb; in rts_attach()
406 so->so_fibnum = td->td_proc->p_fibnum; in rts_attach()
407 so->so_options |= SO_USELOOPBACK; in rts_attach()
432 if (sopt->sopt_dir == SOPT_SET) { in rts_ctloutput()
433 switch (sopt->sopt_level) { in rts_ctloutput()
435 switch (sopt->sopt_name) { in rts_ctloutput()
453 struct rcb *rcb = so->so_pcb; in rts_detach()
457 switch(rcb->rcb_family) { in rts_detach()
459 V_route_cb.ip_count--; in rts_detach()
462 V_route_cb.ip6_count--; in rts_detach()
465 V_route_cb.any_count--; in rts_detach()
468 so->so_pcb = NULL; in rts_detach()
519 if (prison_if(cred, nh->nh_ifa->ifa_addr) == 0) { in rtm_get_jailed()
520 info->rti_info[RTAX_IFA] = nh->nh_ifa->ifa_addr; in rtm_get_jailed()
524 switch (info->rti_info[RTAX_DST]->sa_family) { in rtm_get_jailed()
538 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { in rtm_get_jailed()
540 sa = ifa->ifa_addr; in rtm_get_jailed()
541 if (sa->sa_family != AF_INET) in rtm_get_jailed()
543 ia = ((struct sockaddr_in *)sa)->sin_addr; in rtm_get_jailed()
554 ia = ((struct sockaddr_in *)nh->nh_ifa->ifa_addr)-> in rtm_get_jailed()
559 bzero(&saun->sin, sizeof(struct sockaddr_in)); in rtm_get_jailed()
560 saun->sin.sin_len = sizeof(struct sockaddr_in); in rtm_get_jailed()
561 saun->sin.sin_family = AF_INET; in rtm_get_jailed()
562 saun->sin.sin_addr.s_addr = ia.s_addr; in rtm_get_jailed()
563 info->rti_info[RTAX_IFA] = (struct sockaddr *)&saun->sin; in rtm_get_jailed()
580 CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { in rtm_get_jailed()
582 sa = ifa->ifa_addr; in rtm_get_jailed()
583 if (sa->sa_family != AF_INET6) in rtm_get_jailed()
585 bcopy(&((struct sockaddr_in6 *)sa)->sin6_addr, in rtm_get_jailed()
597 ia6 = ((struct sockaddr_in6 *)nh->nh_ifa->ifa_addr)-> in rtm_get_jailed()
602 bzero(&saun->sin6, sizeof(struct sockaddr_in6)); in rtm_get_jailed()
603 saun->sin6.sin6_len = sizeof(struct sockaddr_in6); in rtm_get_jailed()
604 saun->sin6.sin6_family = AF_INET6; in rtm_get_jailed()
605 bcopy(&ia6, &saun->sin6.sin6_addr, sizeof(struct in6_addr)); in rtm_get_jailed()
606 if (sa6_recoverscope(&saun->sin6) != 0) in rtm_get_jailed()
608 info->rti_info[RTAX_IFA] = (struct sockaddr *)&saun->sin6; in rtm_get_jailed()
628 info->rti_ifp = V_loif; in fill_blackholeinfo()
630 saf = info->rti_info[RTAX_DST]->sa_family; in fill_blackholeinfo()
632 CK_STAILQ_FOREACH(ifa, &info->rti_ifp->if_addrhead, ifa_link) { in fill_blackholeinfo()
633 if (ifa->ifa_addr->sa_family == saf) { in fill_blackholeinfo()
634 info->rti_ifa = ifa; in fill_blackholeinfo()
638 if (info->rti_ifa == NULL) { in fill_blackholeinfo()
647 saun->sin.sin_family = AF_INET; in fill_blackholeinfo()
648 saun->sin.sin_len = sizeof(struct sockaddr_in); in fill_blackholeinfo()
649 saun->sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); in fill_blackholeinfo()
654 saun->sin6.sin6_family = AF_INET6; in fill_blackholeinfo()
655 saun->sin6.sin6_len = sizeof(struct sockaddr_in6); in fill_blackholeinfo()
656 saun->sin6.sin6_addr = in6addr_loopback; in fill_blackholeinfo()
663 info->rti_info[RTAX_GATEWAY] = &saun->sa; in fill_blackholeinfo()
664 info->rti_flags |= RTF_GATEWAY; in fill_blackholeinfo()
670 * Fills in @info based on userland-provided @rtm message.
675 fill_addrinfo(struct rt_msghdr *rtm, int len, struct linear_buffer *lb, u_int fibnum, in fill_addrinfo() argument
680 rtm->rtm_pid = curproc->p_pid; in fill_addrinfo()
681 info->rti_addrs = rtm->rtm_addrs; in fill_addrinfo()
683 info->rti_mflags = rtm->rtm_inits; in fill_addrinfo()
684 info->rti_rmx = &rtm->rtm_rmx; in fill_addrinfo()
688 * link-local address because rtrequest requires addresses with in fill_addrinfo()
691 if (rt_xaddrs((caddr_t)(rtm + 1), len + (caddr_t)rtm, info)) in fill_addrinfo()
694 info->rti_flags = rtm->rtm_flags; in fill_addrinfo()
700 * is the only operation the non-superuser is allowed. in fill_addrinfo()
702 if (rtm->rtm_type != RTM_GET) { in fill_addrinfo()
716 if (info->rti_info[RTAX_GATEWAY] != NULL && in fill_addrinfo()
717 info->rti_info[RTAX_GATEWAY]->sa_family != AF_LINK) { in fill_addrinfo()
730 nh = rib_lookup(fibnum, info->rti_info[RTAX_GATEWAY], NHR_NONE, 0); in fill_addrinfo()
731 if (nh != NULL && nh->gw_sa.sa_family == AF_LINK && in fill_addrinfo()
732 nh->nh_ifp->if_flags & IFF_LOOPBACK) { in fill_addrinfo()
733 info->rti_flags &= ~RTF_GATEWAY; in fill_addrinfo()
734 info->rti_flags |= RTF_GWFLAG_COMPAT; in fill_addrinfo()
769 struct rt_msghdr *rtm, struct rib_cmd_info *rc) in handle_rtm_get() argument
776 saf = info->rti_info[RTAX_DST]->sa_family; in handle_rtm_get()
786 * means longest-prefix-match request and the route with netmask in handle_rtm_get()
787 * means exact-match lookup. in handle_rtm_get()
789 * prefixes, use original data to check for the netmask presence. in handle_rtm_get()
791 if ((rtm->rtm_addrs & RTA_NETMASK) == 0) { in handle_rtm_get()
795 * 'route -n get addr' in handle_rtm_get()
797 rc->rc_rt = (struct rtentry *) rnh->rnh_matchaddr( in handle_rtm_get()
798 info->rti_info[RTAX_DST], &rnh->head); in handle_rtm_get()
800 rc->rc_rt = (struct rtentry *) rnh->rnh_lookup( in handle_rtm_get()
801 info->rti_info[RTAX_DST], in handle_rtm_get()
802 info->rti_info[RTAX_NETMASK], &rnh->head); in handle_rtm_get()
804 if (rc->rc_rt == NULL) { in handle_rtm_get()
809 nh = select_nhop(rt_get_raw_nhop(rc->rc_rt), info->rti_info[RTAX_GATEWAY]); in handle_rtm_get()
821 if (rtm->rtm_flags & RTF_ANNOUNCE) { in handle_rtm_get()
824 if (nh->nh_ifp != NULL && in handle_rtm_get()
825 nh->nh_ifp->if_type == IFT_PROPVIRTUAL) { in handle_rtm_get()
828 ifa = ifa_ifwithnet(info->rti_info[RTAX_DST], 1, in handle_rtm_get()
831 rt_maskedcopy(ifa->ifa_addr, in handle_rtm_get()
833 ifa->ifa_netmask); in handle_rtm_get()
835 rt_maskedcopy(nh->nh_ifa->ifa_addr, in handle_rtm_get()
837 nh->nh_ifa->ifa_netmask); in handle_rtm_get()
841 rc->rc_rt = (struct rtentry *)rnh->rnh_matchaddr( in handle_rtm_get()
842 (struct sockaddr *)&laddr, &rnh->head); in handle_rtm_get()
843 if (rc->rc_rt == NULL) { in handle_rtm_get()
847 nh = select_nhop(rt_get_raw_nhop(rc->rc_rt), info->rti_info[RTAX_GATEWAY]); in handle_rtm_get()
853 rc->rc_nh_new = nh; in handle_rtm_get()
854 rc->rc_nh_weight = rc->rc_rt->rt_weight; in handle_rtm_get()
871 dst4->sin_family = AF_INET; in init_sockaddrs_family()
872 dst4->sin_len = sizeof(struct sockaddr_in); in init_sockaddrs_family()
873 mask4->sin_family = AF_INET; in init_sockaddrs_family()
874 mask4->sin_len = sizeof(struct sockaddr_in); in init_sockaddrs_family()
885 dst6->sin6_family = AF_INET6; in init_sockaddrs_family()
886 dst6->sin6_len = sizeof(struct sockaddr_in6); in init_sockaddrs_family()
887 mask6->sin6_family = AF_INET6; in init_sockaddrs_family()
888 mask6->sin6_len = sizeof(struct sockaddr_in6); in init_sockaddrs_family()
898 if (dst->sa_family == AF_INET) { in export_rtaddrs()
902 rt_get_inet_prefix_pmask(rt, &dst4->sin_addr, &mask4->sin_addr, in export_rtaddrs()
908 if (dst->sa_family == AF_INET6) { in export_rtaddrs()
912 rt_get_inet6_prefix_pmask(rt, &dst6->sin6_addr, in export_rtaddrs()
913 &mask6->sin6_addr, &scopeid); in export_rtaddrs()
914 dst6->sin6_scope_id = scopeid; in export_rtaddrs()
924 struct rt_msghdr *rtm, *orig_rtm = NULL; in update_rtm_from_info() local
928 rtm = *prtm; in update_rtm_from_info()
930 rtsock_msg_buffer(rtm->rtm_type, info, NULL, &len); in update_rtm_from_info()
937 bcopy(rtm, tmp_rtm, rtm->rtm_msglen); in update_rtm_from_info()
938 orig_rtm = rtm; in update_rtm_from_info()
939 rtm = tmp_rtm; in update_rtm_from_info()
943 * Delay freeing original rtm as info contains in update_rtm_from_info()
949 .w_tmem = (caddr_t)rtm, in update_rtm_from_info()
952 rtsock_msg_buffer(rtm->rtm_type, info, &w, &len); in update_rtm_from_info()
953 rtm->rtm_addrs = info->rti_addrs; in update_rtm_from_info()
957 *prtm = rtm; in update_rtm_from_info()
964 * rtm can be reallocated.
967 * rtm.
975 struct rt_msghdr *rtm; in update_rtm_from_rc() local
979 rtm = *prtm; in update_rtm_from_rc()
981 int family = info->rti_info[RTAX_DST]->sa_family; in update_rtm_from_rc()
983 export_rtaddrs(rc->rc_rt, &sa_dst.sa, &sa_mask.sa); in update_rtm_from_rc()
985 info->rti_info[RTAX_DST] = &sa_dst.sa; in update_rtm_from_rc()
986 info->rti_info[RTAX_NETMASK] = rt_is_host(rc->rc_rt) ? NULL : &sa_mask.sa; in update_rtm_from_rc()
987 info->rti_info[RTAX_GATEWAY] = &nh->gw_sa; in update_rtm_from_rc()
988 info->rti_info[RTAX_GENMASK] = 0; in update_rtm_from_rc()
989 ifp = nh->nh_ifp; in update_rtm_from_rc()
990 if (rtm->rtm_addrs & (RTA_IFP | RTA_IFA)) { in update_rtm_from_rc()
992 info->rti_info[RTAX_IFP] = in update_rtm_from_rc()
993 ifp->if_addr->ifa_addr; in update_rtm_from_rc()
995 &saun, curthread->td_ucred); in update_rtm_from_rc()
998 if (ifp->if_flags & IFF_POINTOPOINT) in update_rtm_from_rc()
999 info->rti_info[RTAX_BRD] = in update_rtm_from_rc()
1000 nh->nh_ifa->ifa_dstaddr; in update_rtm_from_rc()
1001 rtm->rtm_index = ifp->if_index; in update_rtm_from_rc()
1003 info->rti_info[RTAX_IFP] = NULL; in update_rtm_from_rc()
1004 info->rti_info[RTAX_IFA] = NULL; in update_rtm_from_rc()
1007 rtm->rtm_index = ifp->if_index; in update_rtm_from_rc()
1012 rtm = *prtm; in update_rtm_from_rc()
1013 rtm->rtm_flags = rc->rc_rt->rte_flags | nhop_get_rtflags(nh); in update_rtm_from_rc()
1014 if (rtm->rtm_flags & RTF_GWFLAG_COMPAT) in update_rtm_from_rc()
1015 rtm->rtm_flags = RTF_GATEWAY | in update_rtm_from_rc()
1016 (rtm->rtm_flags & ~RTF_GWFLAG_COMPAT); in update_rtm_from_rc()
1017 rt_getmetrics(rc->rc_rt, nh, &rtm->rtm_rmx); in update_rtm_from_rc()
1018 rtm->rtm_rmx.rmx_weight = rc->rc_nh_weight; in update_rtm_from_rc()
1029 if (rc->rc_cmd == RTM_DELETE) in save_del_notification()
1038 if (rc->rc_cmd == RTM_ADD) in save_add_notification()
1048 if (lb->offset + len > lb->size) in alloc_sockaddr_aligned()
1050 struct sockaddr *sa = (struct sockaddr *)(lb->base + lb->offset); in alloc_sockaddr_aligned()
1051 lb->offset += len; in alloc_sockaddr_aligned()
1060 struct rt_msghdr *rtm = NULL; in rts_send() local
1080 fibnum = so->so_fibnum; in rts_send()
1082 if (m == NULL || ((m->m_len < sizeof(long)) && in rts_send()
1085 if ((m->m_flags & M_PKTHDR) == 0) in rts_send()
1088 len = m->m_pkthdr.len; in rts_send()
1089 if (len < sizeof(*rtm) || in rts_send()
1090 len != mtod(m, struct rt_msghdr *)->rtm_msglen) in rts_send()
1094 * Most of current messages are in range 200-240 bytes, in rts_send()
1095 * minimize possible re-allocation on reply using larger size in rts_send()
1100 if ((rtm = malloc(total_len, M_TEMP, M_NOWAIT)) == NULL) in rts_send()
1103 m_copydata(m, 0, len, (caddr_t)rtm); in rts_send()
1107 .base = (char *)rtm + alloc_len, in rts_send()
1111 if (rtm->rtm_version != RTM_VERSION) { in rts_send()
1113 free(rtm, M_TEMP); in rts_send()
1114 rtm = NULL; in rts_send()
1124 if ((error = fill_addrinfo(rtm, len, &lb, fibnum, &info)) != 0) { in rts_send()
1132 saf = info.rti_info[RTAX_DST]->sa_family; in rts_send()
1135 if (rtm->rtm_flags & RTF_LLDATA) { in rts_send()
1136 error = lla_rt_output(rtm, &info); in rts_send()
1141 int blackhole_flags = rtm->rtm_flags & (RTF_BLACKHOLE|RTF_REJECT); in rts_send()
1153 switch (rtm->rtm_type) { in rts_send()
1156 if (rtm->rtm_type == RTM_ADD) { in rts_send()
1162 error = rib_action(fibnum, rtm->rtm_type, &info, &rc); in rts_send()
1174 /* nh MAY be empty if RTM_CHANGE request is no-op */ in rts_send()
1177 rtm->rtm_index = nh->nh_ifp->if_index; in rts_send()
1178 rtm->rtm_flags = rc.rc_rt->rte_flags | nhop_get_rtflags(nh); in rts_send()
1201 error = handle_rtm_get(&info, fibnum, rtm, &rc); in rts_send()
1206 if (!rt_is_exportable(rc.rc_rt, curthread->td_ucred)) in rts_send()
1215 error = update_rtm_from_rc(&info, &rtm, alloc_len, &rc, nh); in rts_send()
1218 * point to memory outsize @rtm. Some may be pointing in rts_send()
1219 * to the on-stack variables. in rts_send()
1225 * writing updated rtm in rtsock_msg_buffer(). in rts_send()
1237 if (rtm != NULL) { in rts_send()
1239 /* sin6_scope_id is recovered before sending rtm. */ in rts_send()
1244 if (info.rti_info[i]->sa_family != AF_INET6) in rts_send()
1251 if (update_rtm_from_info(&info, &rtm, alloc_len) != 0) { in rts_send()
1258 send_rtm_reply(so, rtm, m, saf, fibnum, error); in rts_send()
1264 * Sends the prepared reply message in @rtm to all rtsock clients.
1265 * Frees @m and @rtm.
1269 send_rtm_reply(struct socket *so, struct rt_msghdr *rtm, struct mbuf *m, in send_rtm_reply() argument
1277 if ((so->so_options & SO_USELOOPBACK) == 0) { in send_rtm_reply()
1279 if (rtm != NULL) in send_rtm_reply()
1280 free(rtm, M_TEMP); in send_rtm_reply()
1285 rcb = so->so_pcb; in send_rtm_reply()
1288 if (rtm != NULL) { in send_rtm_reply()
1290 rtm->rtm_errno = rtm_errno; in send_rtm_reply()
1292 rtm->rtm_flags |= RTF_DONE; in send_rtm_reply()
1294 m_copyback(m, 0, rtm->rtm_msglen, (caddr_t)rtm); in send_rtm_reply()
1295 if (m->m_pkthdr.len < rtm->rtm_msglen) { in send_rtm_reply()
1298 } else if (m->m_pkthdr.len > rtm->rtm_msglen) in send_rtm_reply()
1299 m_adj(m, rtm->rtm_msglen - m->m_pkthdr.len); in send_rtm_reply()
1301 free(rtm, M_TEMP); in send_rtm_reply()
1305 m->m_flags |= RTS_FILTER_FIB; in send_rtm_reply()
1311 sa_family_t family = rcb->rcb_family; in send_rtm_reply()
1312 rcb->rcb_family = AF_UNSPEC; in send_rtm_reply()
1314 rcb->rcb_family = family; in send_rtm_reply()
1326 out->rmx_mtu = nh->nh_mtu; in rt_getmetrics()
1327 out->rmx_weight = rt->rt_weight; in rt_getmetrics()
1328 out->rmx_nhidx = nhop_get_idx(nh); in rt_getmetrics()
1329 /* Kernel -> userland timebase conversion. */ in rt_getmetrics()
1330 out->rmx_expire = nhop_get_expire(nh) ? in rt_getmetrics()
1331 nhop_get_expire(nh) - time_uptime + time_second : 0; in rt_getmetrics()
1346 if ((rtinfo->rti_addrs & (1 << i)) == 0) in rt_xaddrs()
1352 if (cp + sa->sa_len > cplim) { in rt_xaddrs()
1363 if (sa->sa_len == 0) { in rt_xaddrs()
1364 rtinfo->rti_info[i] = &sa_zero; in rt_xaddrs()
1369 if (sa->sa_family == AF_INET6) in rt_xaddrs()
1373 rtinfo->rti_info[i] = sa; in rt_xaddrs()
1419 struct sockaddr_dl *sdl = (struct sockaddr_dl *)info->rti_info[RTAX_GATEWAY]; in cleanup_xaddrs_lladdr()
1421 if (sdl->sdl_family != AF_LINK) in cleanup_xaddrs_lladdr()
1424 if (sdl->sdl_index == 0) { in cleanup_xaddrs_lladdr()
1429 if (offsetof(struct sockaddr_dl, sdl_data) + sdl->sdl_nlen + sdl->sdl_alen > sdl->sdl_len) { in cleanup_xaddrs_lladdr()
1440 struct sockaddr *gw = info->rti_info[RTAX_GATEWAY]; in cleanup_xaddrs_gateway()
1443 if (info->rti_flags & RTF_LLDATA) in cleanup_xaddrs_gateway()
1446 switch (gw->sa_family) { in cleanup_xaddrs_gateway()
1455 gw->sa_len); in cleanup_xaddrs_gateway()
1461 fill_sockaddr_inet((struct sockaddr_in *)sa, gw_sin->sin_addr); in cleanup_xaddrs_gateway()
1462 info->rti_info[RTAX_GATEWAY] = sa; in cleanup_xaddrs_gateway()
1470 if (gw_sin6->sin6_len < sizeof(struct sockaddr_in6)) { in cleanup_xaddrs_gateway()
1472 gw->sa_len); in cleanup_xaddrs_gateway()
1475 fill_sockaddr_inet6(gw_sin6, &gw_sin6->sin6_addr, 0); in cleanup_xaddrs_gateway()
1485 if (gw_sdl->sdl_len < sdl_min_len) { in cleanup_xaddrs_gateway()
1487 gw_sdl->sdl_len); in cleanup_xaddrs_gateway()
1497 .sdl_index = gw_sdl->sdl_index, in cleanup_xaddrs_gateway()
1500 info->rti_info[RTAX_GATEWAY] = sa; in cleanup_xaddrs_gateway()
1512 info->rti_info[RTAX_NETMASK] = NULL; in remove_netmask()
1513 info->rti_flags |= RTF_HOST; in remove_netmask()
1514 info->rti_addrs &= ~RTA_NETMASK; in remove_netmask()
1526 dst_sa = (struct sockaddr_in *)info->rti_info[RTAX_DST]; in cleanup_xaddrs_inet()
1527 mask_sa = (struct sockaddr_in *)info->rti_info[RTAX_NETMASK]; in cleanup_xaddrs_inet()
1532 dst_sa->sin_len); in cleanup_xaddrs_inet()
1536 if ((mask_sa != NULL) && mask_sa->sin_len < sizeof(struct sockaddr_in)) { in cleanup_xaddrs_inet()
1541 int len = mask_sa->sin_len - offsetof(struct sockaddr_in, sin_addr); in cleanup_xaddrs_inet()
1546 memcpy(&mask, &mask_sa->sin_addr, len); in cleanup_xaddrs_inet()
1549 mask_sa->sin_len); in cleanup_xaddrs_inet()
1553 mask.s_addr = mask_sa ? mask_sa->sin_addr.s_addr : INADDR_BROADCAST; in cleanup_xaddrs_inet()
1555 dst.s_addr = htonl(ntohl(dst_sa->sin_addr.s_addr) & ntohl(mask.s_addr)); in cleanup_xaddrs_inet()
1561 info->rti_info[RTAX_DST] = (struct sockaddr *)dst_sa; in cleanup_xaddrs_inet()
1567 info->rti_info[RTAX_NETMASK] = (struct sockaddr *)mask_sa; in cleanup_xaddrs_inet()
1568 info->rti_flags &= ~RTF_HOST; in cleanup_xaddrs_inet()
1573 if (info->rti_info[RTAX_GATEWAY] != NULL) in cleanup_xaddrs_inet()
1590 dst_sa = (struct sockaddr_in6 *)info->rti_info[RTAX_DST]; in cleanup_xaddrs_inet6()
1591 mask_sa = (struct sockaddr_in6 *)info->rti_info[RTAX_NETMASK]; in cleanup_xaddrs_inet6()
1593 if (dst_sa->sin6_len < sizeof(struct sockaddr_in6)) { in cleanup_xaddrs_inet6()
1595 dst_sa->sin6_len); in cleanup_xaddrs_inet6()
1599 if (mask_sa && mask_sa->sin6_len < sizeof(struct sockaddr_in6)) { in cleanup_xaddrs_inet6()
1604 int len = mask_sa->sin6_len - offsetof(struct sockaddr_in6, sin6_addr); in cleanup_xaddrs_inet6()
1609 memcpy(&mask, &mask_sa->sin6_addr, len); in cleanup_xaddrs_inet6()
1612 mask_sa->sin6_len); in cleanup_xaddrs_inet6()
1616 mask = mask_sa ? mask_sa->sin6_addr : in6mask128; in cleanup_xaddrs_inet6()
1618 dst = &dst_sa->sin6_addr; in cleanup_xaddrs_inet6()
1624 info->rti_info[RTAX_DST] = sa; in cleanup_xaddrs_inet6()
1630 info->rti_info[RTAX_NETMASK] = sa; in cleanup_xaddrs_inet6()
1631 info->rti_flags &= ~RTF_HOST; in cleanup_xaddrs_inet6()
1636 if (info->rti_info[RTAX_GATEWAY] != NULL) in cleanup_xaddrs_inet6()
1648 if (info->rti_info[RTAX_DST] == NULL) { in cleanup_xaddrs()
1653 if (info->rti_flags & RTF_LLDATA) { in cleanup_xaddrs()
1662 switch (info->rti_info[RTAX_DST]->sa_family) { in cleanup_xaddrs()
1689 memset(dmask, 0, dst->sa_len); in rtsock_fix_netmask()
1690 memcpy(dmask, smask, smask->sa_len); in rtsock_fix_netmask()
1691 dmask->ss_len = dst->sa_len; in rtsock_fix_netmask()
1692 dmask->ss_family = dst->sa_family; in rtsock_fix_netmask()
1698 * Writes information related to @rtinfo object to newly-allocated mbuf.
1708 struct rt_msghdr *rtm; in rtsock_msg_mbuf() local
1741 /* XXXGL: can we use MJUMPAGESIZE cluster here? */ in rtsock_msg_mbuf()
1750 m->m_pkthdr.len = m->m_len = len; in rtsock_msg_mbuf()
1751 rtm = mtod(m, struct rt_msghdr *); in rtsock_msg_mbuf()
1752 bzero((caddr_t)rtm, len); in rtsock_msg_mbuf()
1754 if ((sa = rtinfo->rti_info[i]) == NULL) in rtsock_msg_mbuf()
1756 rtinfo->rti_addrs |= (1 << i); in rtsock_msg_mbuf()
1762 bcopy(sa, &ss, sa->sa_len); in rtsock_msg_mbuf()
1765 if (sa->sa_family == AF_INET6) { in rtsock_msg_mbuf()
1773 if (m->m_pkthdr.len != len) { in rtsock_msg_mbuf()
1777 rtm->rtm_msglen = len; in rtsock_msg_mbuf()
1778 rtm->rtm_version = RTM_VERSION; in rtsock_msg_mbuf()
1779 rtm->rtm_type = type; in rtsock_msg_mbuf()
1798 struct rt_msghdr *rtm = NULL; in rtsock_msg_buffer() local
1805 compat32 = w != NULL && w->w_req != NULL && in rtsock_msg_buffer()
1806 (w->w_req->flags & SCTL_MASK32); in rtsock_msg_buffer()
1812 if (w != NULL && w->w_op == NET_RT_IFLISTL) { in rtsock_msg_buffer()
1824 if (w != NULL && w->w_op == NET_RT_IFLISTL) { in rtsock_msg_buffer()
1850 rtm = (struct rt_msghdr *)w->w_tmem; in rtsock_msg_buffer()
1851 buflen = w->w_tmemsize - len; in rtsock_msg_buffer()
1852 cp = (caddr_t)w->w_tmem + len; in rtsock_msg_buffer()
1855 rtinfo->rti_addrs = 0; in rtsock_msg_buffer()
1859 if ((sa = rtinfo->rti_info[i]) == NULL) in rtsock_msg_buffer()
1861 rtinfo->rti_addrs |= (1 << i); in rtsock_msg_buffer()
1872 bcopy(sa, &ss, sa->sa_len); in rtsock_msg_buffer()
1875 if (sa->sa_family == AF_INET6) { in rtsock_msg_buffer()
1882 buflen -= dlen; in rtsock_msg_buffer()
1895 dlen = ALIGN(len) - len; in rtsock_msg_buffer()
1901 buflen -= dlen; in rtsock_msg_buffer()
1908 rtm->rtm_version = RTM_VERSION; in rtsock_msg_buffer()
1909 rtm->rtm_type = type; in rtsock_msg_buffer()
1910 rtm->rtm_msglen = len; in rtsock_msg_buffer()
1931 struct rt_msghdr *rtm; in rt_missmsg_fib() local
1933 struct sockaddr *sa = rtinfo->rti_info[RTAX_DST]; in rt_missmsg_fib()
1945 m->m_flags |= RTS_FILTER_FIB; in rt_missmsg_fib()
1948 rtm = mtod(m, struct rt_msghdr *); in rt_missmsg_fib()
1949 rtm->rtm_flags = RTF_DONE | flags; in rt_missmsg_fib()
1950 rtm->rtm_errno = error; in rt_missmsg_fib()
1951 rtm->rtm_addrs = rtinfo->rti_addrs; in rt_missmsg_fib()
1952 rt_dispatch(m, sa ? sa->sa_family : AF_UNSPEC); in rt_missmsg_fib()
1980 ifm->ifm_index = ifp->if_index; in rtsock_ifmsg()
1981 ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; in rtsock_ifmsg()
1982 if_data_copy(ifp, &ifm->ifm_data); in rtsock_ifmsg()
1983 ifm->ifm_addrs = 0; in rtsock_ifmsg()
1989 * Please do not call directly, use rt_addrmsg().
2001 struct ifnet *ifp = ifa->ifa_ifp; in rtsock_addrmsg()
2010 info.rti_info[RTAX_IFA] = sa = ifa->ifa_addr; in rtsock_addrmsg()
2011 info.rti_info[RTAX_IFP] = ifp->if_addr->ifa_addr; in rtsock_addrmsg()
2013 info.rti_info[RTAX_IFA], ifa->ifa_netmask, &ss); in rtsock_addrmsg()
2014 info.rti_info[RTAX_BRD] = ifa->ifa_dstaddr; in rtsock_addrmsg()
2018 ifam->ifam_index = ifp->if_index; in rtsock_addrmsg()
2019 ifam->ifam_metric = ifa->ifa_ifp->if_metric; in rtsock_addrmsg()
2020 ifam->ifam_flags = ifa->ifa_flags; in rtsock_addrmsg()
2021 ifam->ifam_addrs = info.rti_addrs; in rtsock_addrmsg()
2025 m->m_flags |= RTS_FILTER_FIB; in rtsock_addrmsg()
2028 rt_dispatch(m, sa ? sa->sa_family : AF_UNSPEC); in rtsock_addrmsg()
2035 * Callers are advives to use rt_routemsg() instead of using this
2058 info.rti_info[RTAX_GATEWAY] = &nh->gw_sa; in rtsock_routemsg()
2059 info.rti_flags = rt->rte_flags | nhop_get_rtflags(nh); in rtsock_routemsg()
2060 info.rti_ifp = nh->nh_ifp; in rtsock_routemsg()
2068 struct rt_msghdr *rtm; in rtsock_routemsg_info() local
2075 if (info->rti_flags & RTF_HOST) in rtsock_routemsg_info()
2076 info->rti_info[RTAX_NETMASK] = NULL; in rtsock_routemsg_info()
2086 m->m_flags |= RTS_FILTER_FIB; in rtsock_routemsg_info()
2089 rtm = mtod(m, struct rt_msghdr *); in rtsock_routemsg_info()
2090 rtm->rtm_addrs = info->rti_addrs; in rtsock_routemsg_info()
2091 if (info->rti_ifp != NULL) in rtsock_routemsg_info()
2092 rtm->rtm_index = info->rti_ifp->if_index; in rtsock_routemsg_info()
2094 info->rti_flags |= RTF_DONE; in rtsock_routemsg_info()
2097 info->rti_flags |= RTF_UP; in rtsock_routemsg_info()
2098 rtm->rtm_flags = info->rti_flags; in rtsock_routemsg_info()
2100 sa = info->rti_info[RTAX_DST]; in rtsock_routemsg_info()
2101 rt_dispatch(m, sa ? sa->sa_family : AF_UNSPEC); in rtsock_routemsg_info()
2116 struct ifnet *ifp = ifma->ifma_ifp; in rt_newmaddrmsg()
2123 info.rti_info[RTAX_IFA] = ifma->ifma_addr; in rt_newmaddrmsg()
2124 if (ifp && ifp->if_addr) in rt_newmaddrmsg()
2125 info.rti_info[RTAX_IFP] = ifp->if_addr->ifa_addr; in rt_newmaddrmsg()
2129 * If a link-layer address is present, present it as a ``gateway'' in rt_newmaddrmsg()
2132 info.rti_info[RTAX_GATEWAY] = ifma->ifma_lladdr; in rt_newmaddrmsg()
2137 KASSERT(ifp != NULL, ("%s: link-layer multicast address w/o ifp\n", in rt_newmaddrmsg()
2139 ifmam->ifmam_index = ifp->if_index; in rt_newmaddrmsg()
2140 ifmam->ifmam_addrs = info.rti_addrs; in rt_newmaddrmsg()
2141 rt_dispatch(m, ifma->ifma_addr ? ifma->ifma_addr->sa_family : AF_UNSPEC); in rt_newmaddrmsg()
2157 ifan->ifan_index = ifp->if_index; in rt_makeifannouncemsg()
2158 strlcpy(ifan->ifan_name, ifp->if_xname, in rt_makeifannouncemsg()
2159 sizeof(ifan->ifan_name)); in rt_makeifannouncemsg()
2160 ifan->ifan_what = what; in rt_makeifannouncemsg()
2192 n->m_len = data_len; in rt_ieee80211msg()
2193 m->m_next = n; in rt_ieee80211msg()
2195 bcopy(data, mtod(m, u_int8_t *) + m->m_len, data_len); in rt_ieee80211msg()
2196 m->m_len += data_len; in rt_ieee80211msg()
2198 if (m->m_flags & M_PKTHDR) in rt_ieee80211msg()
2199 m->m_pkthdr.len += data_len; in rt_ieee80211msg()
2200 mtod(m, struct if_announcemsghdr *)->ifan_msglen += data_len; in rt_ieee80211msg()
2226 m->m_rtsock_family = saf; in rt_dispatch()
2228 m->m_pkthdr.rcvif = V_loif; in rt_dispatch()
2247 if (!rt_is_exportable(rt, w->w_req->td->td_ucred)) in sysctl_dumpentry()
2250 export_rtaddrs(rt, w->dst, w->mask); in sysctl_dumpentry()
2265 sysctl_dumpnhop(rt, nh, rt->rt_weight, w); in sysctl_dumpentry()
2281 if (w->w_op == NET_RT_FLAGS && !(rtflags & w->w_arg)) in sysctl_dumpnhop()
2285 info.rti_info[RTAX_DST] = w->dst; in sysctl_dumpnhop()
2286 info.rti_info[RTAX_GATEWAY] = &nh->gw_sa; in sysctl_dumpnhop()
2287 info.rti_info[RTAX_NETMASK] = (rtflags & RTF_HOST) ? NULL : w->mask; in sysctl_dumpnhop()
2289 if (nh->nh_ifp && !(nh->nh_ifp->if_flags & IFF_DYING)) { in sysctl_dumpnhop()
2290 info.rti_info[RTAX_IFP] = nh->nh_ifp->if_addr->ifa_addr; in sysctl_dumpnhop()
2291 info.rti_info[RTAX_IFA] = nh->nh_ifa->ifa_addr; in sysctl_dumpnhop()
2292 if (nh->nh_ifp->if_flags & IFF_POINTOPOINT) in sysctl_dumpnhop()
2293 info.rti_info[RTAX_BRD] = nh->nh_ifa->ifa_dstaddr; in sysctl_dumpnhop()
2297 if (w->w_req && w->w_tmem) { in sysctl_dumpnhop()
2298 struct rt_msghdr *rtm = (struct rt_msghdr *)w->w_tmem; in sysctl_dumpnhop() local
2300 bzero(&rtm->rtm_index, in sysctl_dumpnhop()
2301 sizeof(*rtm) - offsetof(struct rt_msghdr, rtm_index)); in sysctl_dumpnhop()
2306 * Given that, use nhop rtflags & add RTF_UP. in sysctl_dumpnhop()
2308 rtm->rtm_flags = rtflags | RTF_UP; in sysctl_dumpnhop()
2309 if (rtm->rtm_flags & RTF_GWFLAG_COMPAT) in sysctl_dumpnhop()
2310 rtm->rtm_flags = RTF_GATEWAY | in sysctl_dumpnhop()
2311 (rtm->rtm_flags & ~RTF_GWFLAG_COMPAT); in sysctl_dumpnhop()
2312 rt_getmetrics(rt, nh, &rtm->rtm_rmx); in sysctl_dumpnhop()
2313 rtm->rtm_rmx.rmx_weight = weight; in sysctl_dumpnhop()
2314 rtm->rtm_index = nh->nh_ifp->if_index; in sysctl_dumpnhop()
2315 rtm->rtm_addrs = info.rti_addrs; in sysctl_dumpnhop()
2316 error = SYSCTL_OUT(w->w_req, (caddr_t)rtm, size); in sysctl_dumpnhop()
2329 ifm = (struct if_msghdrl *)w->w_tmem; in sysctl_iflist_ifml()
2332 if (w->w_req->flags & SCTL_MASK32) { in sysctl_iflist_ifml()
2336 ifm32->ifm_addrs = info->rti_addrs; in sysctl_iflist_ifml()
2337 ifm32->ifm_flags = ifp->if_flags | ifp->if_drv_flags; in sysctl_iflist_ifml()
2338 ifm32->ifm_index = ifp->if_index; in sysctl_iflist_ifml()
2339 ifm32->_ifm_spare1 = 0; in sysctl_iflist_ifml()
2340 ifm32->ifm_len = sizeof(*ifm32); in sysctl_iflist_ifml()
2341 ifm32->ifm_data_off = offsetof(struct if_msghdrl32, ifm_data); in sysctl_iflist_ifml()
2342 ifm32->_ifm_spare2 = 0; in sysctl_iflist_ifml()
2343 ifd = &ifm32->ifm_data; in sysctl_iflist_ifml()
2347 ifm->ifm_addrs = info->rti_addrs; in sysctl_iflist_ifml()
2348 ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; in sysctl_iflist_ifml()
2349 ifm->ifm_index = ifp->if_index; in sysctl_iflist_ifml()
2350 ifm->_ifm_spare1 = 0; in sysctl_iflist_ifml()
2351 ifm->ifm_len = sizeof(*ifm); in sysctl_iflist_ifml()
2352 ifm->ifm_data_off = offsetof(struct if_msghdrl, ifm_data); in sysctl_iflist_ifml()
2353 ifm->_ifm_spare2 = 0; in sysctl_iflist_ifml()
2354 ifd = &ifm->ifm_data; in sysctl_iflist_ifml()
2359 return (SYSCTL_OUT(w->w_req, (caddr_t)ifm, len)); in sysctl_iflist_ifml()
2369 ifm = (struct if_msghdr *)w->w_tmem; in sysctl_iflist_ifm()
2372 if (w->w_req->flags & SCTL_MASK32) { in sysctl_iflist_ifm()
2376 ifm32->ifm_addrs = info->rti_addrs; in sysctl_iflist_ifm()
2377 ifm32->ifm_flags = ifp->if_flags | ifp->if_drv_flags; in sysctl_iflist_ifm()
2378 ifm32->ifm_index = ifp->if_index; in sysctl_iflist_ifm()
2379 ifm32->_ifm_spare1 = 0; in sysctl_iflist_ifm()
2380 ifd = &ifm32->ifm_data; in sysctl_iflist_ifm()
2384 ifm->ifm_addrs = info->rti_addrs; in sysctl_iflist_ifm()
2385 ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; in sysctl_iflist_ifm()
2386 ifm->ifm_index = ifp->if_index; in sysctl_iflist_ifm()
2387 ifm->_ifm_spare1 = 0; in sysctl_iflist_ifm()
2388 ifd = &ifm->ifm_data; in sysctl_iflist_ifm()
2393 return (SYSCTL_OUT(w->w_req, (caddr_t)ifm, len)); in sysctl_iflist_ifm()
2403 ifam = (struct ifa_msghdrl *)w->w_tmem; in sysctl_iflist_ifaml()
2406 if (w->w_req->flags & SCTL_MASK32) { in sysctl_iflist_ifaml()
2410 ifam32->ifam_addrs = info->rti_addrs; in sysctl_iflist_ifaml()
2411 ifam32->ifam_flags = ifa->ifa_flags; in sysctl_iflist_ifaml()
2412 ifam32->ifam_index = ifa->ifa_ifp->if_index; in sysctl_iflist_ifaml()
2413 ifam32->_ifam_spare1 = 0; in sysctl_iflist_ifaml()
2414 ifam32->ifam_len = sizeof(*ifam32); in sysctl_iflist_ifaml()
2415 ifam32->ifam_data_off = in sysctl_iflist_ifaml()
2417 ifam32->ifam_metric = ifa->ifa_ifp->if_metric; in sysctl_iflist_ifaml()
2418 ifd = &ifam32->ifam_data; in sysctl_iflist_ifaml()
2422 ifam->ifam_addrs = info->rti_addrs; in sysctl_iflist_ifaml()
2423 ifam->ifam_flags = ifa->ifa_flags; in sysctl_iflist_ifaml()
2424 ifam->ifam_index = ifa->ifa_ifp->if_index; in sysctl_iflist_ifaml()
2425 ifam->_ifam_spare1 = 0; in sysctl_iflist_ifaml()
2426 ifam->ifam_len = sizeof(*ifam); in sysctl_iflist_ifaml()
2427 ifam->ifam_data_off = offsetof(struct ifa_msghdrl, ifam_data); in sysctl_iflist_ifaml()
2428 ifam->ifam_metric = ifa->ifa_ifp->if_metric; in sysctl_iflist_ifaml()
2429 ifd = &ifam->ifam_data; in sysctl_iflist_ifaml()
2433 ifd->ifi_datalen = sizeof(struct if_data); in sysctl_iflist_ifaml()
2434 ifd->ifi_ipackets = counter_u64_fetch(ifa->ifa_ipackets); in sysctl_iflist_ifaml()
2435 ifd->ifi_opackets = counter_u64_fetch(ifa->ifa_opackets); in sysctl_iflist_ifaml()
2436 ifd->ifi_ibytes = counter_u64_fetch(ifa->ifa_ibytes); in sysctl_iflist_ifaml()
2437 ifd->ifi_obytes = counter_u64_fetch(ifa->ifa_obytes); in sysctl_iflist_ifaml()
2441 ifd->ifi_vhid = (*carp_get_vhid_p)(ifa); in sysctl_iflist_ifaml()
2443 return (SYSCTL_OUT(w->w_req, w->w_tmem, len)); in sysctl_iflist_ifaml()
2452 ifam = (struct ifa_msghdr *)w->w_tmem; in sysctl_iflist_ifam()
2453 ifam->ifam_addrs = info->rti_addrs; in sysctl_iflist_ifam()
2454 ifam->ifam_flags = ifa->ifa_flags; in sysctl_iflist_ifam()
2455 ifam->ifam_index = ifa->ifa_ifp->if_index; in sysctl_iflist_ifam()
2456 ifam->_ifam_spare1 = 0; in sysctl_iflist_ifam()
2457 ifam->ifam_metric = ifa->ifa_ifp->if_metric; in sysctl_iflist_ifam()
2459 return (SYSCTL_OUT(w->w_req, w->w_tmem, len)); in sysctl_iflist_ifam()
2475 if (w->w_arg && w->w_arg != ifp->if_index) in sysctl_iflist()
2478 ifa = ifp->if_addr; in sysctl_iflist()
2479 info.rti_info[RTAX_IFP] = ifa->ifa_addr; in sysctl_iflist()
2484 if (w->w_req && w->w_tmem) { in sysctl_iflist()
2485 if (w->w_op == NET_RT_IFLISTL) in sysctl_iflist()
2495 if (af && af != ifa->ifa_addr->sa_family) in sysctl_iflist()
2497 if (prison_if(w->w_req->td->td_ucred, in sysctl_iflist()
2498 ifa->ifa_addr) != 0) in sysctl_iflist()
2500 info.rti_info[RTAX_IFA] = ifa->ifa_addr; in sysctl_iflist()
2502 ifa->ifa_addr, ifa->ifa_netmask, &ss); in sysctl_iflist()
2503 info.rti_info[RTAX_BRD] = ifa->ifa_dstaddr; in sysctl_iflist()
2507 if (w->w_req && w->w_tmem) { in sysctl_iflist()
2508 if (w->w_op == NET_RT_IFLISTL) in sysctl_iflist()
2541 if (w->w_arg && w->w_arg != ifp->if_index) in sysctl_ifmalist()
2543 ifa = ifp->if_addr; in sysctl_ifmalist()
2544 info.rti_info[RTAX_IFP] = ifa ? ifa->ifa_addr : NULL; in sysctl_ifmalist()
2545 CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { in sysctl_ifmalist()
2546 if (af && af != ifma->ifma_addr->sa_family) in sysctl_ifmalist()
2548 if (prison_if(w->w_req->td->td_ucred, in sysctl_ifmalist()
2549 ifma->ifma_addr) != 0) in sysctl_ifmalist()
2551 info.rti_info[RTAX_IFA] = ifma->ifma_addr; in sysctl_ifmalist()
2553 (ifma->ifma_addr->sa_family != AF_LINK) ? in sysctl_ifmalist()
2554 ifma->ifma_lladdr : NULL; in sysctl_ifmalist()
2558 if (w->w_req && w->w_tmem) { in sysctl_ifmalist()
2561 ifmam = (struct ifma_msghdr *)w->w_tmem; in sysctl_ifmalist()
2562 ifmam->ifmam_index = ifma->ifma_ifp->if_index; in sysctl_ifmalist()
2563 ifmam->ifmam_flags = 0; in sysctl_ifmalist()
2564 ifmam->ifmam_addrs = info.rti_addrs; in sysctl_ifmalist()
2565 ifmam->_ifmam_spare1 = 0; in sysctl_ifmalist()
2566 error = SYSCTL_OUT(w->w_req, w->w_tmem, len); in sysctl_ifmalist()
2582 w->family = family; in rtable_sysctl_dump()
2583 w->dst = (struct sockaddr *)&sa_dst; in rtable_sysctl_dump()
2584 w->mask = (struct sockaddr *)&sa_mask; in rtable_sysctl_dump()
2586 init_sockaddrs_family(family, w->dst, w->mask); in rtable_sysctl_dump()
2607 namelen--; in sysctl_rtsock()
2608 if (req->newptr) in sysctl_rtsock()
2612 fib = req->td->td_proc->p_fibnum; in sysctl_rtsock()
2615 req->td->td_proc->p_fibnum : name[3]; in sysctl_rtsock()