* Add or remove interface route specified by @dst, @netmask and @ifp. * ifa can be NULL. * Returns 0 on success */
| 2025 | * Returns 0 on success |
| 2026 | */ |
| 2027 | static int |
| 2028 | nd6_prefix_rtrequest(uint32_t fibnum, int cmd, struct sockaddr_in6 *dst, |
| 2029 | struct sockaddr_in6 *netmask, struct ifnet *ifp, struct ifaddr *ifa) |
| 2030 | { |
| 2031 | struct epoch_tracker et; |
| 2032 | int error; |
| 2033 | |
| 2034 | /* Prepare gateway */ |
| 2035 | struct sockaddr_dl_short sdl = { |
| 2036 | .sdl_family = AF_LINK, |
| 2037 | .sdl_len = sizeof(struct sockaddr_dl_short), |
| 2038 | .sdl_type = ifp->if_type, |
| 2039 | .sdl_index = ifp->if_index, |
| 2040 | }; |
| 2041 | |
| 2042 | struct rt_addrinfo info = { |
| 2043 | .rti_ifa = ifa, |
| 2044 | .rti_flags = RTF_PINNED | ((netmask != NULL) ? 0 : RTF_HOST), |
| 2045 | .rti_info = { |
| 2046 | [RTAX_DST] = (struct sockaddr *)dst, |
| 2047 | [RTAX_NETMASK] = (struct sockaddr *)netmask, |
| 2048 | [RTAX_GATEWAY] = (struct sockaddr *)&sdl, |
| 2049 | }, |
| 2050 | }; |
| 2051 | /* Don't set additional per-gw filters on removal */ |
| 2052 | |
| 2053 | NET_EPOCH_ENTER(et); |
| 2054 | error = rib_handle_ifaddr_info(fibnum, cmd, &info); |
| 2055 | NET_EPOCH_EXIT(et); |
| 2056 | return (error); |
| 2057 | } |
| 2058 | |
| 2059 | static int |
| 2060 | nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa) |
no test coverage detected