Module Name: src
Committed By: rjs
Date: Sun Dec 10 11:52:14 UTC 2017
Modified Files:
src/sys/netinet: sctp_indata.c sctp_output.c sctp_uio.h sctp_usrreq.c
Log Message:
Improve compliance to RFC 6458.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/netinet/sctp_indata.c
cvs rdiff -u -r1.11 -r1.12 src/sys/netinet/sctp_output.c
cvs rdiff -u -r1.2 -r1.3 src/sys/netinet/sctp_uio.h
cvs rdiff -u -r1.8 -r1.9 src/sys/netinet/sctp_usrreq.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netinet/sctp_indata.c
diff -u src/sys/netinet/sctp_indata.c:1.4 src/sys/netinet/sctp_indata.c:1.5
--- src/sys/netinet/sctp_indata.c:1.4 Mon Apr 25 21:21:02 2016
+++ src/sys/netinet/sctp_indata.c Sun Dec 10 11:52:14 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: sctp_indata.c,v 1.4 2016/04/25 21:21:02 rjs Exp $ */
+/* $NetBSD: sctp_indata.c,v 1.5 2017/12/10 11:52:14 rjs Exp $ */
/* $KAME: sctp_indata.c,v 1.36 2005/03/06 16:04:17 itojun Exp $ */
/*
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sctp_indata.c,v 1.4 2016/04/25 21:21:02 rjs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sctp_indata.c,v 1.5 2017/12/10 11:52:14 rjs Exp $");
#ifdef _KERNEL_OPT
#include "opt_ipsec.h"
@@ -205,7 +205,7 @@ sctp_build_ctl_nchunk(struct sctp_tcb *s
outinfo->sinfo_stream = stream_no;
outinfo->sinfo_ssn = stream_seq;
if (flags & SCTP_DATA_UNORDERED) {
- outinfo->sinfo_flags = MSG_UNORDERED;
+ outinfo->sinfo_flags = SCTP_UNORDERED;
} else {
outinfo->sinfo_flags = 0;
}
@@ -256,7 +256,7 @@ sctp_build_ctl(struct sctp_tcb *stcb, st
outinfo->sinfo_stream = chk->rec.data.stream_number;
outinfo->sinfo_ssn = chk->rec.data.stream_seq;
if (chk->rec.data.rcv_flags & SCTP_DATA_UNORDERED) {
- outinfo->sinfo_flags = MSG_UNORDERED;
+ outinfo->sinfo_flags = SCTP_UNORDERED;
} else {
outinfo->sinfo_flags = 0;
}
Index: src/sys/netinet/sctp_output.c
diff -u src/sys/netinet/sctp_output.c:1.11 src/sys/netinet/sctp_output.c:1.12
--- src/sys/netinet/sctp_output.c:1.11 Tue Jun 27 13:54:56 2017
+++ src/sys/netinet/sctp_output.c Sun Dec 10 11:52:14 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: sctp_output.c,v 1.11 2017/06/27 13:54:56 rjs Exp $ */
+/* $NetBSD: sctp_output.c,v 1.12 2017/12/10 11:52:14 rjs Exp $ */
/* $KAME: sctp_output.c,v 1.48 2005/06/16 18:29:24 jinmei Exp $ */
/*
@@ -30,7 +30,7 @@
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sctp_output.c,v 1.11 2017/06/27 13:54:56 rjs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sctp_output.c,v 1.12 2017/12/10 11:52:14 rjs Exp $");
#ifdef _KERNEL_OPT
#include "opt_ipsec.h"
@@ -4006,7 +4006,7 @@ sctp_prepare_chunk(struct sctp_tmit_chun
memset(template, 0, sizeof(struct sctp_tmit_chunk));
template->sent = SCTP_DATAGRAM_UNSENT;
if ((stcb->asoc.peer_supports_prsctp) &&
- (srcv->sinfo_flags & (MSG_PR_SCTP_TTL|MSG_PR_SCTP_BUF)) &&
+ (srcv->sinfo_flags & (SCTP_PR_SCTP_TTL|SCTP_PR_SCTP_BUF)) &&
(srcv->sinfo_timetolive > 0)
) {
/* If:
@@ -4016,7 +4016,7 @@ sctp_prepare_chunk(struct sctp_tmit_chun
* to mean a reliable send for both buffer/time
* related one.
*/
- if (srcv->sinfo_flags & MSG_PR_SCTP_BUF) {
+ if (srcv->sinfo_flags & SCTP_PR_SCTP_BUF) {
/*
* Time to live is a priority stored in tv_sec
* when doing the buffer drop thing.
@@ -4036,7 +4036,7 @@ sctp_prepare_chunk(struct sctp_tmit_chun
#endif
}
}
- if ((srcv->sinfo_flags & MSG_UNORDERED) == 0) {
+ if ((srcv->sinfo_flags & SCTP_UNORDERED) == 0) {
template->rec.data.stream_seq = strq->next_sequence_sent;
} else {
template->rec.data.stream_seq = 0;
@@ -4049,7 +4049,7 @@ sctp_prepare_chunk(struct sctp_tmit_chun
template->rec.data.doing_fast_retransmit = 0;
template->rec.data.ect_nonce = 0; /* ECN Nonce */
- if (srcv->sinfo_flags & MSG_ADDR_OVER) {
+ if (srcv->sinfo_flags & SCTP_ADDR_OVER) {
template->whoTo = net;
} else {
if (stcb->asoc.primary_destination)
@@ -4060,7 +4060,7 @@ sctp_prepare_chunk(struct sctp_tmit_chun
}
}
/* the actual chunk flags */
- if (srcv->sinfo_flags & MSG_UNORDERED) {
+ if (srcv->sinfo_flags & SCTP_UNORDERED) {
template->rec.data.rcv_flags = SCTP_DATA_UNORDERED;
} else {
template->rec.data.rcv_flags = 0;
@@ -4076,10 +4076,10 @@ sctp_prepare_chunk(struct sctp_tmit_chun
* Zero is reserved specifically to be
* EXCLUDED and sent reliable.
*/
- if (srcv->sinfo_flags & MSG_PR_SCTP_TTL) {
+ if (srcv->sinfo_flags & SCTP_PR_SCTP_TTL) {
template->flags |= SCTP_PR_SCTP_ENABLED;
}
- if (srcv->sinfo_flags & MSG_PR_SCTP_BUF) {
+ if (srcv->sinfo_flags & SCTP_PR_SCTP_BUF) {
template->flags |= SCTP_PR_SCTP_BUFFER;
}
}
@@ -4160,7 +4160,7 @@ sctp_msg_append(struct sctp_tcb *stcb,
}
so = stcb->sctp_socket;
asoc = &stcb->asoc;
- if (srcv->sinfo_flags & MSG_ABORT) {
+ if (srcv->sinfo_flags & SCTP_ABORT) {
if ((SCTP_GET_STATE(asoc) != SCTP_STATE_COOKIE_WAIT) &&
(SCTP_GET_STATE(asoc) != SCTP_STATE_COOKIE_ECHOED)) {
/* It has to be up before we abort */
@@ -4242,7 +4242,7 @@ sctp_msg_append(struct sctp_tcb *stcb,
error = EMSGSIZE;
goto release;
}
- if ((srcv->sinfo_flags & MSG_EOF) &&
+ if ((srcv->sinfo_flags & SCTP_EOF) &&
(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
(dataout == 0)
) {
@@ -4365,7 +4365,7 @@ sctp_msg_append(struct sctp_tcb *stcb,
chk->book_size = chk->send_size;
chk->mbcnt = mbcnt;
/* ok, we are commited */
- if ((srcv->sinfo_flags & MSG_UNORDERED) == 0) {
+ if ((srcv->sinfo_flags & SCTP_UNORDERED) == 0) {
/* bump the ssn if we are unordered. */
strq->next_sequence_sent++;
}
@@ -4480,7 +4480,7 @@ sctp_msg_append(struct sctp_tcb *stcb,
* and breaking the pointers.
*/
/* ok, we are commited */
- if ((srcv->sinfo_flags & MSG_UNORDERED) == 0) {
+ if ((srcv->sinfo_flags & SCTP_UNORDERED) == 0) {
/* bump the ssn if we are unordered. */
strq->next_sequence_sent++;
}
@@ -4514,7 +4514,7 @@ sctp_msg_append(struct sctp_tcb *stcb,
/* has a SHUTDOWN been (also) requested by the user on this asoc? */
zap_by_it_all:
- if ((srcv->sinfo_flags & MSG_EOF) &&
+ if ((srcv->sinfo_flags & SCTP_EOF) &&
(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE)) {
int some_on_streamwheel = 0;
@@ -4557,11 +4557,6 @@ zap_by_it_all:
* we still got (or just got) data to send, so set
* SHUTDOWN_PENDING
*/
- /*
- * XXX sockets draft says that MSG_EOF should be sent
- * with no data. currently, we will allow user data
- * to be sent first and move to SHUTDOWN-PENDING
- */
asoc->state |= SCTP_STATE_SHUTDOWN_PENDING;
}
}
@@ -4800,7 +4795,7 @@ sctp_sendall (struct sctp_inpcb *inp, st
/* take off the sendall flag, it would
* be bad if we failed to do this :-0
*/
- ca->sndrcv.sinfo_flags &= ~MSG_SENDALL;
+ ca->sndrcv.sinfo_flags &= ~SCTP_SENDALL;
/* get length and mbuf chain */
if (uio) {
@@ -7171,7 +7166,7 @@ sctp_output(struct sctp_inpcb *inp, stru
sctppcbinfo.mbuf_track++;
if (sctp_find_cmsg(SCTP_SNDRCV, (void *)&srcv, control,
sizeof(srcv))) {
- if (srcv.sinfo_flags & MSG_SENDALL) {
+ if (srcv.sinfo_flags & SCTP_SENDALL) {
/* its a sendall */
sctppcbinfo.mbuf_track--;
sctp_m_freem(control);
@@ -7293,7 +7288,7 @@ sctp_output(struct sctp_inpcb *inp, stru
return (ENOENT);
} else if (stcb == NULL) {
/* UDP mode, we must go ahead and start the INIT process */
- if ((use_rcvinfo) && (srcv.sinfo_flags & MSG_ABORT)) {
+ if ((use_rcvinfo) && (srcv.sinfo_flags & SCTP_ABORT)) {
/* Strange user to do this */
if (control) {
sctppcbinfo.mbuf_track--;
@@ -7409,7 +7404,7 @@ sctp_output(struct sctp_inpcb *inp, stru
control = NULL;
}
if ((use_rcvinfo) &&
- (srcv.sinfo_flags & MSG_ABORT)) {
+ (srcv.sinfo_flags & SCTP_ABORT)) {
sctp_msg_append(stcb, net, m, &srcv, flags);
error = 0;
} else {
@@ -7448,7 +7443,7 @@ sctp_output(struct sctp_inpcb *inp, stru
sctp_m_freem(control);
control = NULL;
}
- if (net && ((srcv.sinfo_flags & MSG_ADDR_OVER))) {
+ if (net && ((srcv.sinfo_flags & SCTP_ADDR_OVER))) {
/* we take the override or the unconfirmed */
;
} else {
@@ -9455,7 +9450,7 @@ sctp_copy_it_in(struct sctp_inpcb *inp,
}
/* Are we aborting? */
- if (srcv->sinfo_flags & MSG_ABORT) {
+ if (srcv->sinfo_flags & SCTP_ABORT) {
if ((SCTP_GET_STATE(asoc) != SCTP_STATE_COOKIE_WAIT) &&
(SCTP_GET_STATE(asoc) != SCTP_STATE_COOKIE_ECHOED)) {
/* It has to be up before we abort */
@@ -9536,7 +9531,7 @@ sctp_copy_it_in(struct sctp_inpcb *inp,
error = EFAULT;
goto release;
}
- if ((srcv->sinfo_flags & MSG_EOF) &&
+ if ((srcv->sinfo_flags & SCTP_EOF) &&
(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) &&
(tot_out == 0)) {
sounlock(so);
@@ -9591,7 +9586,7 @@ sctp_copy_it_in(struct sctp_inpcb *inp,
chk->send_size = tot_out;
chk->book_size = chk->send_size;
/* ok, we are commited */
- if ((srcv->sinfo_flags & MSG_UNORDERED) == 0) {
+ if ((srcv->sinfo_flags & SCTP_UNORDERED) == 0) {
/* bump the ssn if we are unordered. */
strq->next_sequence_sent++;
}
@@ -9680,7 +9675,7 @@ clean_up:
tot_out -= tot_demand;
}
/* Now the tmp list holds all chunks and data */
- if ((srcv->sinfo_flags & MSG_UNORDERED) == 0) {
+ if ((srcv->sinfo_flags & SCTP_UNORDERED) == 0) {
/* bump the ssn if we are unordered. */
strq->next_sequence_sent++;
}
@@ -9759,7 +9754,7 @@ zap_by_it_now:
so->so_snd.sb_cc += dataout;
so->so_snd.sb_mbcnt += mbcnt;
}
- if ((srcv->sinfo_flags & MSG_EOF) &&
+ if ((srcv->sinfo_flags & SCTP_EOF) &&
(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE)
) {
int some_on_streamwheel = 0;
@@ -9802,7 +9797,7 @@ zap_by_it_now:
* SHUTDOWN_PENDING
*/
/*
- * XXX sockets draft says that MSG_EOF should be sent
+ * XXX sockets draft says that SCTP_EOF should be sent
* with no data. currently, we will allow user data
* to be sent first and move to SHUTDOWN-PENDING
*/
@@ -9900,7 +9895,7 @@ sctp_sosend(struct socket *so, struct so
if (sctp_find_cmsg(SCTP_SNDRCV, (void *)&srcv, control,
sizeof(srcv))) {
/* got one */
- if (srcv.sinfo_flags & MSG_SENDALL) {
+ if (srcv.sinfo_flags & SCTP_SENDALL) {
/* its a sendall */
sctppcbinfo.mbuf_track--;
sctp_m_freem(control);
@@ -9961,7 +9956,7 @@ sctp_sosend(struct socket *so, struct so
} else if (stcb == NULL) {
/* UDP style, we must go ahead and start the INIT process */
if ((use_rcvinfo) &&
- (srcv.sinfo_flags & MSG_ABORT)) {
+ (srcv.sinfo_flags & SCTP_ABORT)) {
/* User asks to abort a non-existant asoc */
error = ENOENT;
sounlock(so);
@@ -10075,7 +10070,7 @@ sctp_sosend(struct socket *so, struct so
(SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_ACK_SENT) ||
(asoc->state & SCTP_STATE_SHUTDOWN_PENDING)) {
if ((use_rcvinfo) &&
- (srcv.sinfo_flags & MSG_ABORT)) {
+ (srcv.sinfo_flags & SCTP_ABORT)) {
;
} else {
error = ECONNRESET;
@@ -10090,7 +10085,7 @@ sctp_sosend(struct socket *so, struct so
#endif
if (stcb) {
- if (net && ((srcv.sinfo_flags & MSG_ADDR_OVER))) {
+ if (net && ((srcv.sinfo_flags & SCTP_ADDR_OVER))) {
/* we take the override or the unconfirmed */
;
} else {
Index: src/sys/netinet/sctp_uio.h
diff -u src/sys/netinet/sctp_uio.h:1.2 src/sys/netinet/sctp_uio.h:1.3
--- src/sys/netinet/sctp_uio.h:1.2 Wed Jun 28 14:39:33 2017
+++ src/sys/netinet/sctp_uio.h Sun Dec 10 11:52:14 2017
@@ -1,5 +1,5 @@
/* $KAME: sctp_uio.h,v 1.11 2005/03/06 16:04:18 itojun Exp $ */
-/* $NetBSD: sctp_uio.h,v 1.2 2017/06/28 14:39:33 rjs Exp $ */
+/* $NetBSD: sctp_uio.h,v 1.3 2017/12/10 11:52:14 rjs Exp $ */
#ifndef __SCTP_UIO_H__
#define __SCTP_UIO_H__
@@ -41,6 +41,10 @@
typedef u_int32_t sctp_assoc_t;
+#define SCTP_FUTURE_ASSOC 0
+#define SCTP_CURRENT_ASSOC 1
+#define SCTP_ALL_ASSOC 2
+
/* On/Off setup for subscription to events */
struct sctp_event_subscribe {
u_int8_t sctp_data_io_event;
@@ -57,6 +61,20 @@ struct sctp_event_subscribe {
/* ancillary data types */
#define SCTP_INIT 0x0001
#define SCTP_SNDRCV 0x0002
+#define SCTP_EXTRCV 0x0003
+#define SCTP_SNDINFO 0x0004
+#define SCTP_RCVINFO 0x0005
+#define SCTP_NXTINFO 0x0006
+#define SCTP_PRINFO 0x0007
+#define SCTP_AUTHINFO 0x0008
+#define SCTP_DSTADDRV4 0x0009
+#define SCTP_DSTADDRV6 0x000a
+
+struct sctp_event {
+ sctp_assoc_t se_assoc_id;
+ u_int16_t se_type;
+ u_int8_t se_on;
+} __packed;
/*
* ancillary data structures
@@ -80,6 +98,42 @@ struct sctp_sndrcvinfo {
sctp_assoc_t sinfo_assoc_id;
} __packed;
+struct sctp_sndinfo {
+ u_int16_t snd_sid;
+ u_int16_t snd_flags;
+ u_int32_t snd_ppid;
+ u_int32_t snd_context;
+ sctp_assoc_t snd_assoc_id;
+} __packed;
+
+struct sctp_rcvinfo {
+ u_int16_t rcv_sid;
+ u_int16_t rcv_ssn;
+ u_int16_t rcv_flags;
+ u_int32_t rcv_ppid;
+ u_int32_t rcv_tsn;
+ u_int32_t rcv_cumtsn;
+ u_int32_t rcv_context;
+ sctp_assoc_t rcv_assoc_id;
+};
+
+struct sctp_nxtinfo {
+ u_int16_t nxt_sid;
+ u_int16_t nxt_flags;
+ u_int32_t nxt_ppid;
+ u_int32_t nxt_length;
+ sctp_assoc_t nxt_assoc_id;
+} __packed;
+
+struct sctp_prinfo {
+ u_int16_t pr_policy;
+ u_int32_t pr_value;
+};
+
+struct sctp_authinfo {
+ u_int16_t auth_keynumber;
+} __packed;
+
struct sctp_snd_all_completes {
u_int16_t sall_stream;
u_int16_t sall_flags;
@@ -90,16 +144,13 @@ struct sctp_snd_all_completes {
} __packed;
/* send/recv flags */
-/* MSG_EOF (0x0100) is reused from sys/socket.h */
-#define MSG_SENDALL 0x0200
-#define MSG_PR_SCTP_TTL 0x0400 /* Partial Reliable on this msg */
-#define MSG_PR_SCTP_BUF 0x0800 /* Buffer based PR-SCTP */
-#ifndef MSG_EOF
-#define MSG_EOF 0x1000 /* Start shutdown procedures */
-#endif
-#define MSG_UNORDERED 0x2000 /* Message is un-ordered */
-#define MSG_ADDR_OVER 0x4000 /* Override the primary-address */
-#define MSG_ABORT 0x8000 /* Send an ABORT to peer */
+#define SCTP_SENDALL 0x0200
+#define SCTP_PR_SCTP_TTL 0x0400 /* Partial Reliable on this msg */
+#define SCTP_PR_SCTP_BUF 0x0800 /* Buffer based PR-SCTP */
+#define SCTP_EOF 0x1000 /* Start shutdown procedures */
+#define SCTP_UNORDERED 0x2000 /* Message is un-ordered */
+#define SCTP_ADDR_OVER 0x4000 /* Override the primary-address */
+#define SCTP_ABORT 0x8000 /* Send an ABORT to peer */
/* Stat's */
struct sctp_pcbinfo {
@@ -135,6 +186,7 @@ struct sctp_assoc_change {
u_int16_t sac_outbound_streams;
u_int16_t sac_inbound_streams;
sctp_assoc_t sac_assoc_id;
+ u_int8_t sac_info[0];
} __packed;
/* sac_state values */
@@ -144,6 +196,11 @@ struct sctp_assoc_change {
#define SCTP_SHUTDOWN_COMP 0x0004
#define SCTP_CANT_STR_ASSOC 0x0005
+/* sac_info values */
+#define SCTP_ASSOC_SUPPORTS_PR 0x0001
+#define SCTP_ASSOC_SUPPORTS_AUTH 0x0002
+#define SCTP_ASSOC_SUPPORTS_ASCONF 0x0003
+#define SCTP_ASSOC_SUPPORTS_MULTIBUF 0x0004
/* Address events */
struct sctp_paddr_change {
@@ -161,7 +218,7 @@ struct sctp_paddr_change {
#define SCTP_ADDR_REMOVED 0x0003
#define SCTP_ADDR_ADDED 0x0004
#define SCTP_ADDR_MADE_PRIM 0x0005
-#define SCTP_ADDR_CONFIRMED 0x0006
+#define SCTP_ADDR_CONFIRMED 0x0006 /* XXX */
/*
* CAUTION: these are user exposed SCTP addr reachability states
@@ -189,8 +246,6 @@ struct sctp_paddr_change {
#define SCTP_NOHEARTBEAT 0x0040 /* SCTP_ADDR_NOHB */
-
-
/* remote error events */
struct sctp_remote_error {
u_int16_t sre_type;
@@ -243,12 +298,22 @@ struct sctp_pdapi_event {
u_int16_t pdapi_flags;
u_int32_t pdapi_length;
u_int32_t pdapi_indication;
+ u_int32_t pdapi_stream;
+ u_int32_t pdapi_seq;
sctp_assoc_t pdapi_assoc_id;
} __packed;
#define SCTP_PARTIAL_DELIVERY_ABORTED 0x0001
+/* sender dry indications */
+struct sctp_sender_dry_event {
+ u_int16_t sender_dry_type;
+ u_int16_t sender_dry_flags;
+ u_int32_t sender_dry_length;
+ sctp_assoc_t sender_dry_assoc_id;
+} __packed;
+
/* stream reset stuff */
struct sctp_stream_reset_event {
@@ -282,9 +347,9 @@ struct sctp_assoc_ids {
#define SCTP_SHUTDOWN_EVENT 0x0005
#define SCTP_ADAPTION_INDICATION 0x0006
#define SCTP_PARTIAL_DELIVERY_EVENT 0x0007
-#define SCTP_STREAM_RESET_EVENT 0x0008
-
-
+#define SCTP_STREAM_RESET_EVENT 0x0008 /* XXX */
+#define SCTP_AUTHENTICATION_EVENT 0x0009
+#define SCT_SENDER_DRY_EVENT 0x000a
struct sctp_tlv {
u_int16_t sn_type;
@@ -317,8 +382,21 @@ struct sctp_paddrparams {
struct sockaddr_storage spp_address;
u_int32_t spp_hbinterval;
u_int16_t spp_pathmaxrxt;
+ u_int32_t spp_pathmtu;
+ u_int32_t spp_flags;
+ u_int32_t spp_ipv6_flowlabel;
+ u_int8_t spp_dscp;
} __packed;
+#define SPP_HB_ENABLE 0x0001
+#define SPP_HB_DISABLE 0x0002
+#define SPP_HB_DEMAND 0x0004
+#define SPP_HB_TIME_IS_ZERO 0x0008
+#define SPP_PMTUD_ENABLE 0x0010
+#define SPP_PMTUD_DISABLE 0x0020
+#define SPP_IPV6_FLOWLABEL 0x0040
+#define SPP_DSCP 0x0080
+
struct sctp_paddrinfo {
sctp_assoc_t spinfo_assoc_id;
struct sockaddr_storage spinfo_address;
@@ -456,7 +534,7 @@ struct sctp_mbcnt_log {
u_int32_t mbcnt_change;
} __packed;
-struct sctp_cwnd_log{
+struct sctp_cwnd_log {
union {
struct sctp_blk_args blk;
struct sctp_cwnd_args cwnd;
@@ -471,7 +549,7 @@ struct sctp_cwnd_log{
} __packed;
-struct sctp_cwnd_log_req{
+struct sctp_cwnd_log_req {
int num_in_log; /* Number in log */
int num_ret; /* Number returned */
int start_at; /* start at this one */
@@ -479,6 +557,32 @@ struct sctp_cwnd_log_req{
struct sctp_cwnd_log log[0];
} __packed;
+struct sctp_sendv_spa {
+ u_int32_t sendv_flags;
+ struct sctp_sndinfo sendv_sndinfo;
+ struct sctp_prinfo sendv_prinfo;
+ struct sctp_authinfo sendv_authinfo;
+} __packed;
+
+#define SCTP_SEND_SNDINFO_VALID 0x00000001
+#define SCTP_SEND_PRINFO_VALID 0x00000002
+#define SCTP_SEND_AUTHINFO_VALID 0x00000004
+
+#define SCTP_SENDV_NOINFO 0x0000
+#define SCTP_SENDV_SNDINFO 0x0001
+#define SCTP_SENDV_PRINFO 0x0002
+#define SCTP_SENDV_AUTHINFO 0x0003
+#define SCTP_SENDV_SPA 0x0004
+
+struct sctp_recvv_rn {
+ struct sctp_rcvinfo recvv_rcvinfo;
+ struct sctp_nxtinfo recvv_nxtinfo;
+} __packed;
+
+#define SCTP_RECVV_NOINFO 0x0000
+#define SCTP_RECVV_RCVINFO 0x0001
+#define SCTP_RECVV_NXTINFO 0x0002
+#define SCTP_RECVV_RN 0x0003
/*
@@ -489,7 +593,7 @@ struct sctp_cwnd_log_req{
__BEGIN_DECLS
int sctp_peeloff(int, sctp_assoc_t);
int sctp_bindx(int, struct sockaddr *, int, int);
-int sctp_connectx(int, struct sockaddr *, int);
+int sctp_connectx(int, struct sockaddr *, int, sctp_assoc_t *);
int sctp_getpaddrs(int, sctp_assoc_t, struct sockaddr **);
void sctp_freepaddrs(struct sockaddr *);
int sctp_getladdrs(int, sctp_assoc_t, struct sockaddr **);
@@ -500,23 +604,27 @@ ssize_t sctp_sendmsg(int, const void *,
const struct sockaddr *,
socklen_t, u_int32_t, u_int32_t, u_int16_t, u_int32_t, u_int32_t);
-ssize_t sctp_send(int sd, const void *msg, size_t len,
- const struct sctp_sndrcvinfo *sinfo,int flags);
+ssize_t sctp_send(int, const void *, size_t,
+ const struct sctp_sndrcvinfo *, int);
ssize_t
-sctp_sendx(int sd, const void *msg, size_t len,
- struct sockaddr *addrs, int addrcnt,
- struct sctp_sndrcvinfo *sinfo, int flags);
+sctp_sendx(int, const void *, size_t, struct sockaddr *, int,
+ struct sctp_sndrcvinfo *, int);
ssize_t
sctp_sendmsgx(int sd, const void *, size_t,
- struct sockaddr *, int,
- u_int32_t, u_int32_t, u_int16_t, u_int32_t, u_int32_t);
+ struct sockaddr *, int,
+ u_int32_t, u_int32_t, u_int16_t, u_int32_t, u_int32_t);
+ssize_t sctp_sendv(int, const struct iovec *, int, struct sockaddr *, int,
+ void *, socklen_t, unsigned int, int);
sctp_assoc_t
sctp_getassocid(int sd, struct sockaddr *sa);
ssize_t sctp_recvmsg(int, void *, size_t, struct sockaddr *,
socklen_t *, struct sctp_sndrcvinfo *, int *);
+ssize_t sctp_recvv(int, const struct iovec *, int, struct sockaddr *,
+ socklen_t *, void *, socklen_t *, unsigned int *,
+ int *);
__END_DECLS
Index: src/sys/netinet/sctp_usrreq.c
diff -u src/sys/netinet/sctp_usrreq.c:1.8 src/sys/netinet/sctp_usrreq.c:1.9
--- src/sys/netinet/sctp_usrreq.c:1.8 Tue Oct 17 19:23:42 2017
+++ src/sys/netinet/sctp_usrreq.c Sun Dec 10 11:52:14 2017
@@ -1,5 +1,5 @@
/* $KAME: sctp_usrreq.c,v 1.50 2005/06/16 20:45:29 jinmei Exp $ */
-/* $NetBSD: sctp_usrreq.c,v 1.8 2017/10/17 19:23:42 rjs Exp $ */
+/* $NetBSD: sctp_usrreq.c,v 1.9 2017/12/10 11:52:14 rjs Exp $ */
/*
* Copyright (c) 2001, 2002, 2003, 2004 Cisco Systems, Inc.
@@ -33,7 +33,7 @@
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sctp_usrreq.c,v 1.8 2017/10/17 19:23:42 rjs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sctp_usrreq.c,v 1.9 2017/12/10 11:52:14 rjs Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -784,12 +784,6 @@ sctp_disconnect(struct socket *so)
* we still got (or just got) data to send,
* so set SHUTDOWN_PENDING
*/
- /*
- * XXX sockets draft says that MSG_EOF should
- * be sent with no data.
- * currently, we will allow user data to be
- * sent first and move to SHUTDOWN-PENDING
- */
asoc->state |= SCTP_STATE_SHUTDOWN_PENDING;
}
SCTP_TCB_UNLOCK(stcb);
@@ -2785,8 +2779,8 @@ sctp_optsset(struct socket *so, struct s
}
/* Mask off the flags that are allowed */
s_info->sinfo_flags = (s_info->sinfo_flags &
- (MSG_UNORDERED | MSG_ADDR_OVER |
- MSG_PR_SCTP_TTL | MSG_PR_SCTP_BUF));
+ (SCTP_UNORDERED | SCTP_ADDR_OVER |
+ SCTP_PR_SCTP_TTL | SCTP_PR_SCTP_BUF));
/* Copy it in */
stcb->asoc.def_send = *s_info;
SCTP_TCB_UNLOCK(stcb);