* sctp_bindx(ADD) for one address. * assumes all arguments are valid/checked by caller. */
| 6706 | * assumes all arguments are valid/checked by caller. |
| 6707 | */ |
| 6708 | void |
| 6709 | sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp, |
| 6710 | struct sockaddr *sa, uint32_t vrf_id, int *error, |
| 6711 | void *p) |
| 6712 | { |
| 6713 | #if defined(INET) && defined(INET6) |
| 6714 | struct sockaddr_in sin; |
| 6715 | #endif |
| 6716 | #ifdef INET6 |
| 6717 | struct sockaddr_in6 *sin6; |
| 6718 | #endif |
| 6719 | #ifdef INET |
| 6720 | struct sockaddr_in *sinp; |
| 6721 | #endif |
| 6722 | struct sockaddr *addr_to_use; |
| 6723 | struct sctp_inpcb *lep; |
| 6724 | uint16_t port; |
| 6725 | |
| 6726 | /* see if we're bound all already! */ |
| 6727 | if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { |
| 6728 | SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); |
| 6729 | *error = EINVAL; |
| 6730 | return; |
| 6731 | } |
| 6732 | switch (sa->sa_family) { |
| 6733 | #ifdef INET6 |
| 6734 | case AF_INET6: |
| 6735 | if (sa->sa_len != sizeof(struct sockaddr_in6)) { |
| 6736 | SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); |
| 6737 | *error = EINVAL; |
| 6738 | return; |
| 6739 | } |
| 6740 | if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) { |
| 6741 | /* can only bind v6 on PF_INET6 sockets */ |
| 6742 | SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); |
| 6743 | *error = EINVAL; |
| 6744 | return; |
| 6745 | } |
| 6746 | sin6 = (struct sockaddr_in6 *)sa; |
| 6747 | port = sin6->sin6_port; |
| 6748 | #ifdef INET |
| 6749 | if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { |
| 6750 | if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && |
| 6751 | SCTP_IPV6_V6ONLY(inp)) { |
| 6752 | /* can't bind v4-mapped on PF_INET sockets */ |
| 6753 | SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL); |
| 6754 | *error = EINVAL; |
| 6755 | return; |
| 6756 | } |
| 6757 | in6_sin6_2_sin(&sin, sin6); |
| 6758 | addr_to_use = (struct sockaddr *)&sin; |
| 6759 | } else { |
| 6760 | addr_to_use = sa; |
| 6761 | } |
| 6762 | #else |
| 6763 | addr_to_use = sa; |
| 6764 | #endif |
| 6765 | break; |
no test coverage detected