Lines Matching +full:use +full:- +full:rtm

3 /*-
4 * SPDX-License-Identifier: BSD-3-Clause
10 * Redistribution and use in source and binary forms, with or without
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
61 (((a) & ((size)-1)) ? (1 + ((a) | ((size)-1))) : (a))
65 ((ap)->sa_len ? ROUNDUP((ap)->sa_len, sizeof(u_long)) : \
86 struct sockinfo sock = { .si_fd = -1, .si_name = NULL };
87 struct sockinfo rtsock = { .si_fd = -1, .si_name = NULL };
88 struct sockinfo ctrlsock = { .si_fd = -1, .si_name = _PATH_CTRL_SOCK };
112 #define ROUNDUP8(a) (1 + (((a) - 1) | 7))
116 switch (sdl->sdl_type) {
131 ndopt->nd_opt_type = ND_OPT_SOURCE_LINKADDR; /* fixed */
133 switch (sdl->sdl_type) {
137 ndopt->nd_opt_len = (ROUNDUP8(ETHER_ADDR_LEN + 2)) >> 3;
143 __func__, sdl->sdl_type);
155 return (-1);
166 struct rt_msghdr *rtm;
171 for (rtm = (struct rt_msghdr *)buf;
172 rtm < (struct rt_msghdr *)lim;
173 rtm = (struct rt_msghdr *)(((char *)rtm) + rtm->rtm_msglen)) {
175 if (!rtm->rtm_msglen) {
177 "(buf=%p lim=%p rtm=%p)", __func__,
178 buf, lim, rtm);
181 if (((struct rt_msghdr *)buf)->rtm_version != RTM_VERSION) {
184 "(buf=%p lim=%p rtm=%p)", __func__,
185 buf, lim, rtm);
189 if (FILTER_MATCH(rtm->rtm_type, filter) == 0)
192 switch (rtm->rtm_type) {
197 sa = (struct sockaddr *)(rtm + 1);
198 get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
200 dst->sa_family != AF_INET6)
203 if (IN6_IS_ADDR_LINKLOCAL(&SIN6(dst)->sin6_addr) ||
204 IN6_IS_ADDR_MULTICAST(&SIN6(dst)->sin6_addr))
208 gw->sa_family != AF_LINK)
210 if (ifindex && SDL(gw)->sdl_index != ifindex)
217 *lenp = rtm->rtm_msglen;
218 return (char *)rtm;
222 ifam = (struct ifa_msghdr *)rtm;
226 get_rtaddrs(ifam->ifam_addrs, sa, rti_info);
228 (ifa->sa_family != AF_INET &&
229 ifa->sa_family != AF_INET6))
232 if (ifa->sa_family == AF_INET6 &&
233 (IN6_IS_ADDR_LINKLOCAL(&SIN6(ifa)->sin6_addr) ||
234 IN6_IS_ADDR_MULTICAST(&SIN6(ifa)->sin6_addr)))
237 if (ifindex && ifam->ifam_index != ifindex)
241 *lenp = ifam->ifam_msglen;
242 return (char *)rtm;
247 *lenp = rtm->rtm_msglen;
248 return (char *)rtm;
253 return ((char *)rtm);
260 struct rt_msghdr *rtm = (struct rt_msghdr *)buf;
263 sa = (struct sockaddr *)(rtm + 1);
264 get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
266 return (&SIN6(rti_info[RTAX_DST])->sin6_addr);
272 struct rt_msghdr *rtm = (struct rt_msghdr *)buf;
275 sa = (struct sockaddr *)(rtm + 1);
276 get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
278 return (((struct sockaddr_dl *)rti_info[RTAX_GATEWAY])->sdl_index);
284 struct rt_msghdr *rtm = (struct rt_msghdr *)buf;
288 sa = (struct sockaddr *)(rtm + 1);
289 get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
292 p = (char *)(&SIN6(sa)->sin6_addr);
293 lim = (char *)sa + sa->sa_len;
331 return (-1);
348 if (ifindex == ifi->ifi_ifindex)
351 if (strncmp(ifname, ifi->ifi_ifname,
352 sizeof(ifi->ifi_ifname)) == 0)
363 ifi->ifi_ifindex = 0;
364 strlcpy(ifi->ifi_ifname, ifname, sizeof(ifi->ifi_ifname));
365 ifi->ifi_rainfo = NULL;
366 ifi->ifi_state = IFI_STATE_UNCONFIGURED;
370 ifi->ifi_persist = 1;
373 ifi->ifi_ifname);
375 ifi->ifi_ifname, ifi->ifi_state);
393 strlcpy(nd.ifname, ifi->ifi_ifname,
402 ifi->ifi_nd_flags = nd.ndi.flags;
466 __func__, ifm, lim, (char *)lim - (char *)ifm);
468 if (ifm->ifm_version != RTM_VERSION) {
473 if (ifm->ifm_msglen == 0) {
481 if (ifm->ifm_type == RTM_IFINFO) {
488 __func__, ifm->ifm_index, ifindex);
492 ifindex != ifm->ifm_index)
496 if (if_indextoname(ifm->ifm_index, ifname) == NULL) {
499 __func__, ifm->ifm_index);
505 if (ifm->ifm_index == ifi->ifi_ifindex)
507 if (strncmp(ifname, ifi->ifi_ifname,
514 __func__, ifm->ifm_index);
516 ifi->ifi_rainfo = NULL;
517 ifi->ifi_state = IFI_STATE_UNCONFIGURED;
518 ifi->ifi_persist = 0;
522 ifi->ifi_ifindex = ifm->ifm_index;
525 strlcpy(ifi->ifi_ifname, ifname, IFNAMSIZ);
536 ifi->ifi_phymtu = ifm->ifm_data.ifi_mtu;
537 if (ifi->ifi_phymtu == 0) {
540 strlcpy(ifr.ifr_name, ifi->ifi_ifname,
552 ifi->ifi_phymtu = ifr.ifr_mtu;
553 if (ifi->ifi_phymtu == 0) {
557 __func__, ifi->ifi_ifname,
559 ifi->ifi_phymtu = IPV6_MMTU;
574 get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
576 if (sa->sa_family == AF_LINK) {
577 memcpy(&ifi->ifi_sdl,
579 sizeof(ifi->ifi_sdl));
582 memset(&ifi->ifi_sdl, 0,
583 sizeof(ifi->ifi_sdl));
586 ifi->ifi_flags = ifm->ifm_flags;
589 ifi->ifi_type = ifm->ifm_type;
594 RTM_IFINFO, ifm->ifm_type, ifm->ifm_msglen);
601 __func__, ifi->ifi_ifname, ifi->ifi_ifindex);
621 for (ifam = (struct ifa_msghdr *)((char *)ifm + ifm->ifm_msglen);
623 ifam = (struct ifa_msghdr *)((char *)ifam + ifam->ifam_msglen)) {
624 if (!ifam->ifam_msglen) {
629 if (ifam->ifam_type != RTM_NEWADDR)
650 return (-1);
679 if (setsockopt(s->si_fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq,
688 "<%s> %s: join link-local all-routers MC group",
717 if (setsockopt(s->si_fd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &mreq,
726 "<%s> %s: leave link-local all-routers MC group",
742 * When attending router renumbering, join all-routers site-local
756 if (setsockopt(s->si_fd, IPPROTO_IPV6, IPV6_JOIN_GROUP,
765 "<%s> %s: join site-local all-routers MC group",