| 13757 | |
| 13758 | #ifdef INET6 |
| 13759 | int |
| 13760 | sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t *ro) |
| 13761 | { |
| 13762 | struct nd_prefix *pfx = NULL; |
| 13763 | struct nd_pfxrouter *pfxrtr = NULL; |
| 13764 | struct sockaddr_in6 gw6; |
| 13765 | |
| 13766 | if (ro == NULL || ro->ro_nh == NULL || src6->sin6_family != AF_INET6) |
| 13767 | return (0); |
| 13768 | |
| 13769 | /* get prefix entry of address */ |
| 13770 | ND6_RLOCK(); |
| 13771 | LIST_FOREACH(pfx, &MODULE_GLOBAL(nd_prefix), ndpr_entry) { |
| 13772 | if (pfx->ndpr_stateflags & NDPRF_DETACHED) |
| 13773 | continue; |
| 13774 | if (IN6_ARE_MASKED_ADDR_EQUAL(&pfx->ndpr_prefix.sin6_addr, |
| 13775 | &src6->sin6_addr, &pfx->ndpr_mask)) |
| 13776 | break; |
| 13777 | } |
| 13778 | /* no prefix entry in the prefix list */ |
| 13779 | if (pfx == NULL) { |
| 13780 | ND6_RUNLOCK(); |
| 13781 | SCTPDBG(SCTP_DEBUG_OUTPUT2, "No prefix entry for "); |
| 13782 | SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)src6); |
| 13783 | return (0); |
| 13784 | } |
| 13785 | |
| 13786 | SCTPDBG(SCTP_DEBUG_OUTPUT2, "v6src_match_nexthop(), Prefix entry is "); |
| 13787 | SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)src6); |
| 13788 | |
| 13789 | /* search installed gateway from prefix entry */ |
| 13790 | LIST_FOREACH(pfxrtr, &pfx->ndpr_advrtrs, pfr_entry) { |
| 13791 | memset(&gw6, 0, sizeof(struct sockaddr_in6)); |
| 13792 | gw6.sin6_family = AF_INET6; |
| 13793 | gw6.sin6_len = sizeof(struct sockaddr_in6); |
| 13794 | memcpy(&gw6.sin6_addr, &pfxrtr->router->rtaddr, |
| 13795 | sizeof(struct in6_addr)); |
| 13796 | SCTPDBG(SCTP_DEBUG_OUTPUT2, "prefix router is "); |
| 13797 | SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, (struct sockaddr *)&gw6); |
| 13798 | SCTPDBG(SCTP_DEBUG_OUTPUT2, "installed router is "); |
| 13799 | SCTPDBG_ADDR(SCTP_DEBUG_OUTPUT2, &ro->ro_nh->gw_sa); |
| 13800 | if (sctp_cmpaddr((struct sockaddr *)&gw6, &ro->ro_nh->gw_sa)) { |
| 13801 | ND6_RUNLOCK(); |
| 13802 | SCTPDBG(SCTP_DEBUG_OUTPUT2, "pfxrouter is installed\n"); |
| 13803 | return (1); |
| 13804 | } |
| 13805 | } |
| 13806 | ND6_RUNLOCK(); |
| 13807 | SCTPDBG(SCTP_DEBUG_OUTPUT2, "pfxrouter is not installed\n"); |
| 13808 | return (0); |
| 13809 | } |
| 13810 | #endif |
| 13811 | |
| 13812 | int |
no test coverage detected