sctp: cleanup, no functional change

MFC after:	3 days
This commit is contained in:
Michael Tuexen 2022-06-08 22:35:14 +02:00
parent 9f009e066f
commit ad6ae52d1c
2 changed files with 89 additions and 87 deletions

View File

@ -3452,7 +3452,7 @@ sctp_source_address_selection(struct sctp_inpcb *inp,
return (answer);
}
static int
static bool
sctp_find_cmsg(int c_type, void *data, struct mbuf *control, size_t cpsize)
{
struct cmsghdr cmh;
@ -3460,13 +3460,13 @@ sctp_find_cmsg(int c_type, void *data, struct mbuf *control, size_t cpsize)
struct sctp_prinfo prinfo;
struct sctp_authinfo authinfo;
int tot_len, rem_len, cmsg_data_len, cmsg_data_off, off;
int found;
bool found;
/*
* Independent of how many mbufs, find the c_type inside the control
* structure and copy out the data.
*/
found = 0;
found = false;
tot_len = SCTP_BUF_LEN(control);
for (off = 0; off < tot_len; off += CMSG_ALIGN(cmh.cmsg_len)) {
rem_len = tot_len - off;
@ -3505,7 +3505,7 @@ sctp_find_cmsg(int c_type, void *data, struct mbuf *control, size_t cpsize)
struct sctp_sndrcvinfo *sndrcvinfo;
sndrcvinfo = (struct sctp_sndrcvinfo *)data;
if (found == 0) {
if (!found) {
if (cpsize < sizeof(struct sctp_sndrcvinfo)) {
return (found);
}
@ -3546,7 +3546,7 @@ sctp_find_cmsg(int c_type, void *data, struct mbuf *control, size_t cpsize)
default:
return (found);
}
found = 1;
found = true;
}
}
}
@ -6136,7 +6136,7 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
static void
sctp_prune_prsctp(struct sctp_tcb *stcb,
struct sctp_association *asoc,
struct sctp_sndrcvinfo *srcv,
struct sctp_nonpad_sndrcvinfo *srcv,
int dataout)
{
int freed_spc = 0;
@ -6317,7 +6317,7 @@ static int
sctp_msg_append(struct sctp_tcb *stcb,
struct sctp_nets *net,
struct mbuf *m,
struct sctp_sndrcvinfo *srcv)
struct sctp_nonpad_sndrcvinfo *srcv)
{
int error = 0;
struct mbuf *at;
@ -6825,7 +6825,7 @@ sctp_copy_out_all(struct uio *uio, ssize_t len)
static int
sctp_sendall(struct sctp_inpcb *inp, struct uio *uio, struct mbuf *m,
struct sctp_sndrcvinfo *srcv)
struct sctp_nonpad_sndrcvinfo *srcv)
{
int ret;
struct sctp_copy_all *ca;
@ -6844,7 +6844,7 @@ sctp_sendall(struct sctp_inpcb *inp, struct uio *uio, struct mbuf *m,
memset(ca, 0, sizeof(struct sctp_copy_all));
ca->inp = inp;
if (srcv) {
if (srcv != NULL) {
memcpy(&ca->sndrcv, srcv, sizeof(struct sctp_nonpad_sndrcvinfo));
}
@ -12278,7 +12278,7 @@ sctp_copy_one(struct sctp_stream_queue_pending *sp,
static struct sctp_stream_queue_pending *
sctp_copy_it_in(struct sctp_tcb *stcb,
struct sctp_association *asoc,
struct sctp_sndrcvinfo *srcv,
struct sctp_nonpad_sndrcvinfo *srcv,
struct uio *uio,
struct sctp_nets *net,
ssize_t max_send_len,
@ -12363,25 +12363,22 @@ sctp_sosend(struct socket *so,
struct mbuf *top,
struct mbuf *control,
int flags,
struct thread *p
)
struct thread *p)
{
int error, use_sndinfo = 0;
struct sctp_sndrcvinfo sndrcvninfo;
struct sockaddr *addr_to_use;
#if defined(INET) && defined(INET6)
struct sockaddr_in sin;
#endif
struct sockaddr *addr_to_use;
int error;
bool use_sndinfo;
if (control) {
if (control != NULL) {
/* process cmsg snd/rcv info (maybe a assoc-id) */
if (sctp_find_cmsg(SCTP_SNDRCV, (void *)&sndrcvninfo, control,
sizeof(sndrcvninfo))) {
/* got one */
use_sndinfo = 1;
}
use_sndinfo = sctp_find_cmsg(SCTP_SNDRCV, (void *)&sndrcvninfo, control, sizeof(sndrcvninfo));
} else {
use_sndinfo = false;
}
addr_to_use = addr;
#if defined(INET) && defined(INET6)
if ((addr != NULL) && (addr->sa_family == AF_INET6)) {
struct sockaddr_in6 *sin6;
@ -12394,15 +12391,17 @@ sctp_sosend(struct socket *so,
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
in6_sin6_2_sin(&sin, sin6);
addr_to_use = (struct sockaddr *)&sin;
} else {
addr_to_use = addr;
}
} else {
addr_to_use = addr;
}
#else
addr_to_use = addr;
#endif
error = sctp_lower_sosend(so, addr_to_use, uio, top,
control,
flags,
use_sndinfo ? &sndrcvninfo : NULL
,p
);
error = sctp_lower_sosend(so, addr_to_use, uio, top, control, flags,
use_sndinfo ? &sndrcvninfo : NULL, p);
return (error);
}
@ -12413,38 +12412,38 @@ sctp_lower_sosend(struct socket *so,
struct mbuf *top,
struct mbuf *control,
int flags,
struct sctp_sndrcvinfo *srcv
,
struct thread *p
)
struct sctp_sndrcvinfo *srcv,
struct thread *p)
{
struct sctp_nonpad_sndrcvinfo sndrcvninfo;
struct sctp_nonpad_sndrcvinfo sndrcvninfo_buf;
struct epoch_tracker et;
ssize_t sndlen = 0, max_len, local_add_more;
int error;
int queue_only = 0, queue_only_for_init = 0;
bool free_cnt_applied = false;
int un_sent;
int now_filled = 0;
unsigned int inqueue_bytes = 0;
struct timeval now;
struct sctp_block_entry be;
struct sctp_inpcb *inp;
struct sctp_tcb *stcb = NULL;
struct timeval now;
struct sctp_nets *net;
struct sctp_association *asoc;
struct sctp_inpcb *t_inp;
struct sctp_nonpad_sndrcvinfo *sndrcvninfo;
ssize_t sndlen = 0, max_len, local_add_more;
ssize_t local_soresv = 0;
sctp_assoc_t sinfo_assoc_id;
int user_marks_eor;
bool create_lock_applied = false;
int nagle_applies = 0;
int error;
int queue_only = 0, queue_only_for_init = 0;
int un_sent;
int now_filled = 0;
unsigned int inqueue_bytes = 0;
uint16_t port;
uint16_t sinfo_flags;
uint16_t sinfo_stream;
bool create_lock_applied = false;
bool free_cnt_applied = false;
bool some_on_control;
bool got_all_of_the_send = false;
bool hold_tcblock = false;
bool non_blocking = false;
ssize_t local_soresv = 0;
uint16_t port;
uint16_t sinfo_flags;
sctp_assoc_t sinfo_assoc_id;
error = 0;
net = NULL;
@ -12518,17 +12517,19 @@ sctp_lower_sosend(struct socket *so,
atomic_add_int(&inp->total_sends, 1);
if (srcv != NULL) {
sinfo_flags = srcv->sinfo_flags;
sinfo_assoc_id = srcv->sinfo_assoc_id;
sndrcvninfo = (struct sctp_nonpad_sndrcvinfo *)srcv;
sinfo_assoc_id = sndrcvninfo->sinfo_assoc_id;
sinfo_flags = sndrcvninfo->sinfo_flags;
if (INVALID_SINFO_FLAG(sinfo_flags) ||
PR_SCTP_INVALID_POLICY(sinfo_flags)) {
error = EINVAL;
goto out_unlocked;
}
if (srcv->sinfo_flags != 0) {
if (sinfo_flags != 0) {
SCTP_STAT_INCR(sctps_sends_with_flags);
}
} else {
sndrcvninfo = NULL;
sinfo_flags = inp->def_send.sinfo_flags;
sinfo_assoc_id = inp->def_send.sinfo_assoc_id;
}
@ -12546,7 +12547,7 @@ sctp_lower_sosend(struct socket *so,
if ((sinfo_flags & SCTP_SENDALL) &&
(inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE)) {
SCTP_INP_RUNLOCK(inp);
error = sctp_sendall(inp, uio, top, srcv);
error = sctp_sendall(inp, uio, top, sndrcvninfo);
top = NULL;
goto out_unlocked;
}
@ -12723,11 +12724,11 @@ sctp_lower_sosend(struct socket *so,
/* Keep the stcb from being freed under our feet. */
atomic_add_int(&asoc->refcnt, 1);
free_cnt_applied = true;
if (srcv == NULL) {
if (sndrcvninfo == NULL) {
/* Use a local copy to have a consistent view. */
sndrcvninfo = asoc->def_send;
srcv = (struct sctp_sndrcvinfo *)&sndrcvninfo;
sinfo_flags = srcv->sinfo_flags;
sndrcvninfo_buf = asoc->def_send;
sndrcvninfo = &sndrcvninfo_buf;
sinfo_flags = sndrcvninfo->sinfo_flags;
if (flags & MSG_EOR) {
sinfo_flags |= SCTP_EOR;
}
@ -12753,18 +12754,19 @@ sctp_lower_sosend(struct socket *so,
net = asoc->primary_destination;
}
}
sinfo_stream = sndrcvninfo->sinfo_stream;
/* Is the stream no. valid? */
if (srcv->sinfo_stream >= asoc->streamoutcnt) {
if (sinfo_stream >= asoc->streamoutcnt) {
/* Invalid stream number */
error = EINVAL;
goto out_unlocked;
}
if ((asoc->strmout[srcv->sinfo_stream].state != SCTP_STREAM_OPEN) &&
(asoc->strmout[srcv->sinfo_stream].state != SCTP_STREAM_OPENING)) {
if ((asoc->strmout[sinfo_stream].state != SCTP_STREAM_OPEN) &&
(asoc->strmout[sinfo_stream].state != SCTP_STREAM_OPENING)) {
/*
* Can't queue any data while stream reset is underway.
*/
if (asoc->strmout[srcv->sinfo_stream].state > SCTP_STREAM_OPEN) {
if (asoc->strmout[sinfo_stream].state > SCTP_STREAM_OPEN) {
error = EAGAIN;
} else {
error = EINVAL;
@ -13046,16 +13048,16 @@ sctp_lower_sosend(struct socket *so,
uint32_t sndout;
if ((asoc->stream_locked) &&
(asoc->stream_locked_on != srcv->sinfo_stream)) {
(asoc->stream_locked_on != sinfo_stream)) {
error = EINVAL;
goto out;
}
strm = &asoc->strmout[srcv->sinfo_stream];
strm = &asoc->strmout[sinfo_stream];
if (strm->last_msg_incomplete == 0) {
do_a_copy_in:
SCTP_TCB_UNLOCK(stcb);
hold_tcblock = false;
sp = sctp_copy_it_in(stcb, asoc, srcv, uio, net, max_len, user_marks_eor, &error);
sp = sctp_copy_it_in(stcb, asoc, sndrcvninfo, uio, net, max_len, user_marks_eor, &error);
SCTP_TCB_LOCK(stcb);
hold_tcblock = true;
if ((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) ||
@ -13097,7 +13099,7 @@ sctp_lower_sosend(struct socket *so,
goto out_unlocked;
}
/* The out streams might be reallocated. */
strm = &asoc->strmout[srcv->sinfo_stream];
strm = &asoc->strmout[sinfo_stream];
if (sp->msg_is_complete) {
strm->last_msg_incomplete = 0;
asoc->stream_locked = 0;
@ -13109,7 +13111,7 @@ sctp_lower_sosend(struct socket *so,
strm->last_msg_incomplete = 1;
if (asoc->idata_supported == 0) {
asoc->stream_locked = 1;
asoc->stream_locked_on = srcv->sinfo_stream;
asoc->stream_locked_on = sinfo_stream;
}
sp->sender_all_done = 0;
}
@ -13241,7 +13243,7 @@ sctp_lower_sosend(struct socket *so,
* This is ugly but we must assure locking
* order
*/
sctp_prune_prsctp(stcb, asoc, srcv, (int)sndlen);
sctp_prune_prsctp(stcb, asoc, sndrcvninfo, (int)sndlen);
inqueue_bytes = asoc->total_output_queue_size - (asoc->chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb));
if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes)
max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes;
@ -13405,13 +13407,13 @@ sctp_lower_sosend(struct socket *so,
("Association was aborted"));
/* The out streams might be reallocated. */
strm = &asoc->strmout[srcv->sinfo_stream];
strm = &asoc->strmout[sinfo_stream];
if (sp != NULL) {
if (sp->msg_is_complete == 0) {
strm->last_msg_incomplete = 1;
if (asoc->idata_supported == 0) {
asoc->stream_locked = 1;
asoc->stream_locked_on = srcv->sinfo_stream;
asoc->stream_locked_on = sinfo_stream;
}
} else {
sp->sender_all_done = 1;
@ -13428,7 +13430,7 @@ sctp_lower_sosend(struct socket *so,
got_all_of_the_send = true;
}
} else {
error = sctp_msg_append(stcb, net, top, srcv);
error = sctp_msg_append(stcb, net, top, sndrcvninfo);
top = NULL;
if ((sinfo_flags & SCTP_EOF) != 0) {
got_all_of_the_send = true;

View File

@ -129,6 +129,26 @@ struct sctp_mcore_ctrl {
};
#endif
/* This struct is here to cut out the compatiabilty
* pad that bulks up both the inp and stcb. The non
* pad portion MUST stay in complete sync with
* sctp_sndrcvinfo... i.e. if sinfo_xxxx is added
* this must be done here too.
*/
struct sctp_nonpad_sndrcvinfo {
uint16_t sinfo_stream;
uint16_t sinfo_ssn;
uint16_t sinfo_flags;
uint32_t sinfo_ppid;
uint32_t sinfo_context;
uint32_t sinfo_timetolive;
uint32_t sinfo_tsn;
uint32_t sinfo_cumtsn;
sctp_assoc_t sinfo_assoc_id;
uint16_t sinfo_keynumber;
uint16_t sinfo_keynumber_valid;
};
struct sctp_iterator {
TAILQ_ENTRY(sctp_iterator) sctp_nxt_itr;
struct vnet *vn;
@ -159,7 +179,7 @@ TAILQ_HEAD(sctpiterators, sctp_iterator);
struct sctp_copy_all {
struct sctp_inpcb *inp; /* ep */
struct mbuf *m;
struct sctp_sndrcvinfo sndrcv;
struct sctp_nonpad_sndrcvinfo sndrcv;
ssize_t sndlen;
int cnt_sent;
int cnt_failed;
@ -675,26 +695,6 @@ struct sctp_fs_spec_log {
uint8_t decr;
};
/* This struct is here to cut out the compatiabilty
* pad that bulks up both the inp and stcb. The non
* pad portion MUST stay in complete sync with
* sctp_sndrcvinfo... i.e. if sinfo_xxxx is added
* this must be done here too.
*/
struct sctp_nonpad_sndrcvinfo {
uint16_t sinfo_stream;
uint16_t sinfo_ssn;
uint16_t sinfo_flags;
uint32_t sinfo_ppid;
uint32_t sinfo_context;
uint32_t sinfo_timetolive;
uint32_t sinfo_tsn;
uint32_t sinfo_cumtsn;
sctp_assoc_t sinfo_assoc_id;
uint16_t sinfo_keynumber;
uint16_t sinfo_keynumber_valid;
};
/*
* JRS - Structure to hold function pointers to the functions responsible
* for congestion control.