| 452 | } |
| 453 | |
| 454 | static int |
| 455 | fill_blackholeinfo(struct rt_addrinfo *info, union sockaddr_union *saun) |
| 456 | { |
| 457 | struct ifaddr *ifa; |
| 458 | sa_family_t saf; |
| 459 | |
| 460 | if (V_loif == NULL) { |
| 461 | printf("Unable to add blackhole/reject nhop without loopback"); |
| 462 | return (ENOTSUP); |
| 463 | } |
| 464 | info->rti_ifp = V_loif; |
| 465 | |
| 466 | saf = info->rti_info[RTAX_DST]->sa_family; |
| 467 | |
| 468 | CK_STAILQ_FOREACH(ifa, &info->rti_ifp->if_addrhead, ifa_link) { |
| 469 | if (ifa->ifa_addr->sa_family == saf) { |
| 470 | info->rti_ifa = ifa; |
| 471 | break; |
| 472 | } |
| 473 | } |
| 474 | if (info->rti_ifa == NULL) |
| 475 | return (ENOTSUP); |
| 476 | |
| 477 | bzero(saun, sizeof(union sockaddr_union)); |
| 478 | switch (saf) { |
| 479 | case AF_INET: |
| 480 | saun->sin.sin_family = AF_INET; |
| 481 | saun->sin.sin_len = sizeof(struct sockaddr_in); |
| 482 | saun->sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
| 483 | break; |
| 484 | #ifdef INET6 |
| 485 | case AF_INET6: |
| 486 | saun->sin6.sin6_family = AF_INET6; |
| 487 | saun->sin6.sin6_len = sizeof(struct sockaddr_in6); |
| 488 | saun->sin6.sin6_addr = in6addr_loopback; |
| 489 | break; |
| 490 | #endif |
| 491 | default: |
| 492 | return (ENOTSUP); |
| 493 | } |
| 494 | info->rti_info[RTAX_GATEWAY] = &saun->sa; |
| 495 | info->rti_flags |= RTF_GATEWAY; |
| 496 | |
| 497 | return (0); |
| 498 | } |
| 499 | |
| 500 | /* |
| 501 | * Fills in @info based on userland-provided @rtm message. |
no test coverage detected