* Adds or deletes interface route for p2p ifa. * Returns 0 on success or errno. */
| 1257 | * Returns 0 on success or errno. |
| 1258 | */ |
| 1259 | static int |
| 1260 | in6_handle_dstaddr_rtrequest(int cmd, struct in6_ifaddr *ia) |
| 1261 | { |
| 1262 | struct epoch_tracker et; |
| 1263 | struct ifaddr *ifa = &ia->ia_ifa; |
| 1264 | int error; |
| 1265 | |
| 1266 | /* Prepare gateway */ |
| 1267 | struct sockaddr_dl_short sdl = { |
| 1268 | .sdl_family = AF_LINK, |
| 1269 | .sdl_len = sizeof(struct sockaddr_dl_short), |
| 1270 | .sdl_type = ifa->ifa_ifp->if_type, |
| 1271 | .sdl_index = ifa->ifa_ifp->if_index, |
| 1272 | }; |
| 1273 | |
| 1274 | struct sockaddr_in6 dst = { |
| 1275 | .sin6_family = AF_INET6, |
| 1276 | .sin6_len = sizeof(struct sockaddr_in6), |
| 1277 | .sin6_addr = ia->ia_dstaddr.sin6_addr, |
| 1278 | }; |
| 1279 | |
| 1280 | struct rt_addrinfo info = { |
| 1281 | .rti_ifa = ifa, |
| 1282 | .rti_flags = RTF_PINNED | RTF_HOST, |
| 1283 | .rti_info = { |
| 1284 | [RTAX_DST] = (struct sockaddr *)&dst, |
| 1285 | [RTAX_GATEWAY] = (struct sockaddr *)&sdl, |
| 1286 | }, |
| 1287 | }; |
| 1288 | /* Don't set additional per-gw filters on removal */ |
| 1289 | |
| 1290 | NET_EPOCH_ENTER(et); |
| 1291 | error = rib_handle_ifaddr_info(ifa->ifa_ifp->if_fib, cmd, &info); |
| 1292 | NET_EPOCH_EXIT(et); |
| 1293 | |
| 1294 | return (error); |
| 1295 | } |
| 1296 | |
| 1297 | static bool |
| 1298 | ifa_is_p2p(struct in6_ifaddr *ia) |
no test coverage detected