MCPcopy Create free account
hub / github.com/F-Stack/f-stack / sctp_bindx_add_address

Function sctp_bindx_add_address

freebsd/netinet/sctputil.c:6708–6818  ·  view source on GitHub ↗

* sctp_bindx(ADD) for one address. * assumes all arguments are valid/checked by caller. */

Source from the content-addressed store, hash-verified

6706 * assumes all arguments are valid/checked by caller.
6707 */
6708void
6709sctp_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;

Callers 1

sctp_setoptFunction · 0.85

Calls 4

in6_sin6_2_sinFunction · 0.85
sctp_inpcb_bindFunction · 0.85
sctp_pcb_findepFunction · 0.85
sctp_addr_mgmt_ep_saFunction · 0.85

Tested by

no test coverage detected