diff options
Diffstat (limited to 'sys/netinet/sctputil.c')
-rw-r--r-- | sys/netinet/sctputil.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index 42903b1..0b33c49 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$"); #include <netinet/sctp_var.h> #include <netinet/sctp_sysctl.h> #ifdef INET6 -#include <netinet6/sctp6_var.h> #endif #include <netinet/sctp_header.h> #include <netinet/sctp_output.h> @@ -3098,7 +3097,7 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint32_t error, #endif ) { - struct mbuf *m_notify; + struct mbuf *m_notify, *tt; struct sctp_send_failed *ssf; struct sctp_queued_to_read *control; int length; @@ -3107,11 +3106,12 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint32_t error, /* event not enabled */ return; - length = sizeof(struct sctp_send_failed) + chk->send_size; m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_send_failed), 0, M_DONTWAIT, 1, MT_DATA); if (m_notify == NULL) /* no space left */ return; + length = sizeof(struct sctp_send_failed) + chk->send_size; + length -= sizeof(struct sctp_data_chunk); SCTP_BUF_LEN(m_notify) = 0; ssf = mtod(m_notify, struct sctp_send_failed *); ssf->ssf_type = SCTP_SEND_FAILED; @@ -3130,6 +3130,18 @@ sctp_notify_send_failed(struct sctp_tcb *stcb, uint32_t error, ssf->ssf_info.sinfo_context = chk->rec.data.context; ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); ssf->ssf_assoc_id = sctp_get_associd(stcb); + + /* Take off the chunk header */ + m_adj(chk->data, sizeof(struct sctp_data_chunk)); + + /* trim out any 0 len mbufs */ + while (SCTP_BUF_LEN(chk->data) == 0) { + tt = chk->data; + chk->data = SCTP_BUF_NEXT(tt); + SCTP_BUF_NEXT(tt) = NULL; + sctp_m_freem(tt); + } + SCTP_BUF_NEXT(m_notify) = chk->data; SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed); @@ -3195,7 +3207,11 @@ sctp_notify_send_failed2(struct sctp_tcb *stcb, uint32_t error, bzero(&ssf->ssf_info, sizeof(ssf->ssf_info)); ssf->ssf_info.sinfo_stream = sp->stream; ssf->ssf_info.sinfo_ssn = sp->strseq; - ssf->ssf_info.sinfo_flags = sp->sinfo_flags; + if (sp->some_taken) { + ssf->ssf_info.sinfo_flags = SCTP_DATA_LAST_FRAG; + } else { + ssf->ssf_info.sinfo_flags = SCTP_DATA_NOT_FRAG; + } ssf->ssf_info.sinfo_ppid = sp->ppid; ssf->ssf_info.sinfo_context = sp->context; ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb); @@ -5467,10 +5483,10 @@ found_one: bzero(&sin6, sizeof(sin6)); sin6.sin6_family = AF_INET6; sin6.sin6_len = sizeof(struct sockaddr_in6); - sin6.sin6_addr.s6_addr32[2] = ntohl(0x0000ffff); + sin6.sin6_addr.s6_addr16[2] = 0xffff; bcopy(&sin->sin_addr, - &sin6.sin6_addr.s6_addr32[3], - sizeof(sin6.sin6_addr.s6_addr32[3])); + &sin6.sin6_addr.s6_addr16[3], + sizeof(sin6.sin6_addr.s6_addr16[3])); sin6.sin6_port = sin->sin_port; memcpy(from, (caddr_t)&sin6, sizeof(sin6)); } @@ -6000,8 +6016,6 @@ sctp_dynamic_set_primary(struct sockaddr *sa, uint32_t vrf_id) } - - int sctp_soreceive(struct socket *so, struct sockaddr **psa, @@ -6256,7 +6270,7 @@ sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp, return; } addr_touse = sa; -#if defined(INET6) +#if defined(INET6) && !defined(__Userspace__) /* TODO port in6_sin6_2_sin */ if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *sin6; @@ -6382,7 +6396,7 @@ sctp_bindx_delete_address(struct socket *so, struct sctp_inpcb *inp, return; } addr_touse = sa; -#if defined(INET6) +#if defined(INET6) && !defined(__Userspace__) /* TODO port in6_sin6_2_sin */ if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *sin6; |