| 565 | } |
| 566 | |
| 567 | static int |
| 568 | fill_blackholeinfo(struct rt_addrinfo *info, union sockaddr_union *saun) |
| 569 | { |
| 570 | struct ifaddr *ifa; |
| 571 | sa_family_t saf; |
| 572 | |
| 573 | if (V_loif == NULL) { |
| 574 | printf("Unable to add blackhole/reject nhop without loopback"); |
| 575 | return (ENOTSUP); |
| 576 | } |
| 577 | info->rti_ifp = V_loif; |
| 578 | |
| 579 | saf = info->rti_info[RTAX_DST]->sa_family; |
| 580 | |
| 581 | CK_STAILQ_FOREACH(ifa, &info->rti_ifp->if_addrhead, ifa_link) { |
| 582 | if (ifa->ifa_addr->sa_family == saf) { |
| 583 | info->rti_ifa = ifa; |
| 584 | break; |
| 585 | } |
| 586 | } |
| 587 | if (info->rti_ifa == NULL) |
| 588 | return (ENOTSUP); |
| 589 | |
| 590 | bzero(saun, sizeof(union sockaddr_union)); |
| 591 | switch (saf) { |
| 592 | #ifdef INET |
| 593 | case AF_INET: |
| 594 | saun->sin.sin_family = AF_INET; |
| 595 | saun->sin.sin_len = sizeof(struct sockaddr_in); |
| 596 | saun->sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
| 597 | break; |
| 598 | #endif |
| 599 | #ifdef INET6 |
| 600 | case AF_INET6: |
| 601 | saun->sin6.sin6_family = AF_INET6; |
| 602 | saun->sin6.sin6_len = sizeof(struct sockaddr_in6); |
| 603 | saun->sin6.sin6_addr = in6addr_loopback; |
| 604 | break; |
| 605 | #endif |
| 606 | default: |
| 607 | return (ENOTSUP); |
| 608 | } |
| 609 | info->rti_info[RTAX_GATEWAY] = &saun->sa; |
| 610 | info->rti_flags |= RTF_GATEWAY; |
| 611 | |
| 612 | return (0); |
| 613 | } |
| 614 | |
| 615 | /* |
| 616 | * Fills in @info based on userland-provided @rtm message. |
no test coverage detected