Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 668c9beb authored by Xin Long's avatar Xin Long Committed by David S. Miller
Browse files

sctp: implement assign_number for sctp_stream_interleave



assign_number is added as a member of sctp_stream_interleave, used
to assign ssn for data or mid (message id) for idata, called in
sctp_packet_append_data. sctp_chunk_assign_ssn is left as it is,
and sctp_chunk_assign_mid is added for sctp_stream_interleave_1.

This procedure is described in section 2.2.2 of RFC8260.

All sizeof(struct sctp_data_chunk) in tx path is replaced with
sctp_datachk_len, to make it right for idata as well. And also
adjust sctp_chunk_is_data for SCTP_CID_I_DATA.

After this patch, idata can be built and sent in tx path.

Note that if sp strm_interleave is set, it has to wait_connect in
sctp_sendmsg, as asoc intl_enable need to be known after 4 shake-
hands, to decide if it should use data or idata later. data and
idata can't be mixed to send in one asoc.

Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Acked-by: default avatarNeil Horman <nhorman@tuxdriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0c3f6f65
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -145,12 +145,13 @@ SCTP_SUBTYPE_CONSTRUCTOR(OTHER, enum sctp_event_other, other)
SCTP_SUBTYPE_CONSTRUCTOR(PRIMITIVE,	enum sctp_event_primitive, primitive)


#define sctp_chunk_is_data(a) (a->chunk_hdr->type == SCTP_CID_DATA)
#define sctp_chunk_is_data(a) (a->chunk_hdr->type == SCTP_CID_DATA || \
			       a->chunk_hdr->type == SCTP_CID_I_DATA)

/* Calculate the actual data size in a data chunk */
#define SCTP_DATA_SNDSIZE(c) ((int)((unsigned long)(c->chunk_end)\
		       		- (unsigned long)(c->chunk_hdr)\
				- sizeof(struct sctp_data_chunk)))
#define SCTP_DATA_SNDSIZE(c) ((int)((unsigned long)(c->chunk_end) - \
				    (unsigned long)(c->chunk_hdr) - \
				    sctp_datachk_len(&c->asoc->stream)))

/* Internal error codes */
enum sctp_ierror {
+2 −2
Original line number Diff line number Diff line
@@ -444,13 +444,13 @@ static inline int sctp_frag_point(const struct sctp_association *asoc, int pmtu)
	int frag = pmtu;

	frag -= sp->pf->af->net_header_len;
	frag -= sizeof(struct sctphdr) + sizeof(struct sctp_data_chunk);
	frag -= sizeof(struct sctphdr) + sctp_datachk_len(&asoc->stream);

	if (asoc->user_frag)
		frag = min_t(int, frag, asoc->user_frag);

	frag = SCTP_TRUNC4(min_t(int, frag, SCTP_MAX_CHUNK_LEN -
					    sizeof(struct sctp_data_chunk)));
					    sctp_datachk_len(&asoc->stream)));

	return frag;
}
+1 −1
Original line number Diff line number Diff line
@@ -343,7 +343,7 @@ static inline __u16 sctp_data_size(struct sctp_chunk *chunk)
	__u16 size;

	size = ntohs(chunk->chunk_hdr->length);
	size -= sizeof(struct sctp_data_chunk);
	size -= sctp_datahdr_len(&chunk->asoc->stream);

	return size;
}
+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ struct sctp_stream_interleave {
	struct sctp_chunk *(*make_datafrag)(const struct sctp_association *asoc,
					    const struct sctp_sndrcvinfo *sinfo,
					    int len, __u8 flags, gfp_t gfp);
	void	(*assign_number)(struct sctp_chunk *chunk);
};

void sctp_stream_interleave_init(struct sctp_stream *stream);
+17 −1
Original line number Diff line number Diff line
@@ -399,6 +399,18 @@ void sctp_stream_update(struct sctp_stream *stream, struct sctp_stream *new);
#define sctp_ssn_skip(stream, type, sid, ssn) \
	((stream)->type[sid].ssn = ssn + 1)

/* What is the current MID number for this stream? */
#define sctp_mid_peek(stream, type, sid) \
	((stream)->type[sid].mid)

/* Return the next MID number for this stream.  */
#define sctp_mid_next(stream, type, sid) \
	((stream)->type[sid].mid++)

/* Skip over this mid and all below. */
#define sctp_mid_skip(stream, type, sid, mid) \
	((stream)->type[sid].mid = mid + 1)

/*
 * Pointers to address related SCTP functions.
 * (i.e. things that depend on the address family.)
@@ -623,6 +635,7 @@ struct sctp_chunk {
	__u16	rtt_in_progress:1,	/* This chunk used for RTT calc? */
		has_tsn:1,		/* Does this chunk have a TSN yet? */
		has_ssn:1,		/* Does this chunk have a SSN yet? */
#define has_mid has_ssn
		singleton:1,		/* Only chunk in the packet? */
		end_of_packet:1,	/* Last chunk in the packet? */
		ecn_ce_done:1,		/* Have we processed the ECN CE bit? */
@@ -1360,7 +1373,10 @@ struct sctp_stream_out_ext {
};

struct sctp_stream_out {
	union {
		__u32 mid;
		__u16 ssn;
	};
	__u8	state;
	struct sctp_stream_out_ext *ext;
};
Loading