mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
net/sctp: Make wrappers for accessing in/out streams
This patch introduces wrappers for accessing in/out streams indirectly. This will enable to replace physically contiguous memory arrays of streams with flexible arrays (or maybe any other appropriate mechanism) which do memory allocation on a per-page basis. Signed-off-by: Oleg Babin <obabin@virtuozzo.com> Signed-off-by: Konstantin Khorenko <khorenko@virtuozzo.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b70f1f3af4
commit
05364ca03c
9 changed files with 103 additions and 81 deletions
|
@ -162,7 +162,7 @@ int sctp_stream_init(struct sctp_stream *stream, __u16 outcnt, __u16 incnt,
|
|||
|
||||
stream->outcnt = outcnt;
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
stream->out[i].state = SCTP_STREAM_OPEN;
|
||||
SCTP_SO(stream, i)->state = SCTP_STREAM_OPEN;
|
||||
|
||||
sched->init(stream);
|
||||
|
||||
|
@ -193,7 +193,7 @@ int sctp_stream_init_ext(struct sctp_stream *stream, __u16 sid)
|
|||
soute = kzalloc(sizeof(*soute), GFP_KERNEL);
|
||||
if (!soute)
|
||||
return -ENOMEM;
|
||||
stream->out[sid].ext = soute;
|
||||
SCTP_SO(stream, sid)->ext = soute;
|
||||
|
||||
return sctp_sched_init_sid(stream, sid, GFP_KERNEL);
|
||||
}
|
||||
|
@ -205,7 +205,7 @@ void sctp_stream_free(struct sctp_stream *stream)
|
|||
|
||||
sched->free(stream);
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
kfree(stream->out[i].ext);
|
||||
kfree(SCTP_SO(stream, i)->ext);
|
||||
kfree(stream->out);
|
||||
kfree(stream->in);
|
||||
}
|
||||
|
@ -215,12 +215,12 @@ void sctp_stream_clear(struct sctp_stream *stream)
|
|||
int i;
|
||||
|
||||
for (i = 0; i < stream->outcnt; i++) {
|
||||
stream->out[i].mid = 0;
|
||||
stream->out[i].mid_uo = 0;
|
||||
SCTP_SO(stream, i)->mid = 0;
|
||||
SCTP_SO(stream, i)->mid_uo = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < stream->incnt; i++)
|
||||
stream->in[i].mid = 0;
|
||||
SCTP_SI(stream, i)->mid = 0;
|
||||
}
|
||||
|
||||
void sctp_stream_update(struct sctp_stream *stream, struct sctp_stream *new)
|
||||
|
@ -273,8 +273,8 @@ static bool sctp_stream_outq_is_empty(struct sctp_stream *stream,
|
|||
for (i = 0; i < str_nums; i++) {
|
||||
__u16 sid = ntohs(str_list[i]);
|
||||
|
||||
if (stream->out[sid].ext &&
|
||||
!list_empty(&stream->out[sid].ext->outq))
|
||||
if (SCTP_SO(stream, sid)->ext &&
|
||||
!list_empty(&SCTP_SO(stream, sid)->ext->outq))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -361,11 +361,11 @@ int sctp_send_reset_streams(struct sctp_association *asoc,
|
|||
if (out) {
|
||||
if (str_nums)
|
||||
for (i = 0; i < str_nums; i++)
|
||||
stream->out[str_list[i]].state =
|
||||
SCTP_SO(stream, str_list[i])->state =
|
||||
SCTP_STREAM_CLOSED;
|
||||
else
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
stream->out[i].state = SCTP_STREAM_CLOSED;
|
||||
SCTP_SO(stream, i)->state = SCTP_STREAM_CLOSED;
|
||||
}
|
||||
|
||||
asoc->strreset_chunk = chunk;
|
||||
|
@ -380,11 +380,11 @@ int sctp_send_reset_streams(struct sctp_association *asoc,
|
|||
|
||||
if (str_nums)
|
||||
for (i = 0; i < str_nums; i++)
|
||||
stream->out[str_list[i]].state =
|
||||
SCTP_SO(stream, str_list[i])->state =
|
||||
SCTP_STREAM_OPEN;
|
||||
else
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
stream->out[i].state = SCTP_STREAM_OPEN;
|
||||
SCTP_SO(stream, i)->state = SCTP_STREAM_OPEN;
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
@ -418,7 +418,7 @@ int sctp_send_reset_assoc(struct sctp_association *asoc)
|
|||
|
||||
/* Block further xmit of data until this request is completed */
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
stream->out[i].state = SCTP_STREAM_CLOSED;
|
||||
SCTP_SO(stream, i)->state = SCTP_STREAM_CLOSED;
|
||||
|
||||
asoc->strreset_chunk = chunk;
|
||||
sctp_chunk_hold(asoc->strreset_chunk);
|
||||
|
@ -429,7 +429,7 @@ int sctp_send_reset_assoc(struct sctp_association *asoc)
|
|||
asoc->strreset_chunk = NULL;
|
||||
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
stream->out[i].state = SCTP_STREAM_OPEN;
|
||||
SCTP_SO(stream, i)->state = SCTP_STREAM_OPEN;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -609,10 +609,10 @@ struct sctp_chunk *sctp_process_strreset_outreq(
|
|||
}
|
||||
|
||||
for (i = 0; i < nums; i++)
|
||||
stream->in[ntohs(str_p[i])].mid = 0;
|
||||
SCTP_SI(stream, ntohs(str_p[i]))->mid = 0;
|
||||
} else {
|
||||
for (i = 0; i < stream->incnt; i++)
|
||||
stream->in[i].mid = 0;
|
||||
SCTP_SI(stream, i)->mid = 0;
|
||||
}
|
||||
|
||||
result = SCTP_STRRESET_PERFORMED;
|
||||
|
@ -683,11 +683,11 @@ struct sctp_chunk *sctp_process_strreset_inreq(
|
|||
|
||||
if (nums)
|
||||
for (i = 0; i < nums; i++)
|
||||
stream->out[ntohs(str_p[i])].state =
|
||||
SCTP_SO(stream, ntohs(str_p[i]))->state =
|
||||
SCTP_STREAM_CLOSED;
|
||||
else
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
stream->out[i].state = SCTP_STREAM_CLOSED;
|
||||
SCTP_SO(stream, i)->state = SCTP_STREAM_CLOSED;
|
||||
|
||||
asoc->strreset_chunk = chunk;
|
||||
asoc->strreset_outstanding = 1;
|
||||
|
@ -786,11 +786,11 @@ struct sctp_chunk *sctp_process_strreset_tsnreq(
|
|||
* incoming and outgoing streams.
|
||||
*/
|
||||
for (i = 0; i < stream->outcnt; i++) {
|
||||
stream->out[i].mid = 0;
|
||||
stream->out[i].mid_uo = 0;
|
||||
SCTP_SO(stream, i)->mid = 0;
|
||||
SCTP_SO(stream, i)->mid_uo = 0;
|
||||
}
|
||||
for (i = 0; i < stream->incnt; i++)
|
||||
stream->in[i].mid = 0;
|
||||
SCTP_SI(stream, i)->mid = 0;
|
||||
|
||||
result = SCTP_STRRESET_PERFORMED;
|
||||
|
||||
|
@ -979,15 +979,18 @@ struct sctp_chunk *sctp_process_strreset_resp(
|
|||
sizeof(__u16);
|
||||
|
||||
if (result == SCTP_STRRESET_PERFORMED) {
|
||||
struct sctp_stream_out *sout;
|
||||
if (nums) {
|
||||
for (i = 0; i < nums; i++) {
|
||||
stream->out[ntohs(str_p[i])].mid = 0;
|
||||
stream->out[ntohs(str_p[i])].mid_uo = 0;
|
||||
sout = SCTP_SO(stream, ntohs(str_p[i]));
|
||||
sout->mid = 0;
|
||||
sout->mid_uo = 0;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < stream->outcnt; i++) {
|
||||
stream->out[i].mid = 0;
|
||||
stream->out[i].mid_uo = 0;
|
||||
sout = SCTP_SO(stream, i);
|
||||
sout->mid = 0;
|
||||
sout->mid_uo = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -995,7 +998,7 @@ struct sctp_chunk *sctp_process_strreset_resp(
|
|||
}
|
||||
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
stream->out[i].state = SCTP_STREAM_OPEN;
|
||||
SCTP_SO(stream, i)->state = SCTP_STREAM_OPEN;
|
||||
|
||||
*evp = sctp_ulpevent_make_stream_reset_event(asoc, flags,
|
||||
nums, str_p, GFP_ATOMIC);
|
||||
|
@ -1050,15 +1053,15 @@ struct sctp_chunk *sctp_process_strreset_resp(
|
|||
asoc->adv_peer_ack_point = asoc->ctsn_ack_point;
|
||||
|
||||
for (i = 0; i < stream->outcnt; i++) {
|
||||
stream->out[i].mid = 0;
|
||||
stream->out[i].mid_uo = 0;
|
||||
SCTP_SO(stream, i)->mid = 0;
|
||||
SCTP_SO(stream, i)->mid_uo = 0;
|
||||
}
|
||||
for (i = 0; i < stream->incnt; i++)
|
||||
stream->in[i].mid = 0;
|
||||
SCTP_SI(stream, i)->mid = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < stream->outcnt; i++)
|
||||
stream->out[i].state = SCTP_STREAM_OPEN;
|
||||
SCTP_SO(stream, i)->state = SCTP_STREAM_OPEN;
|
||||
|
||||
*evp = sctp_ulpevent_make_assoc_reset_event(asoc, flags,
|
||||
stsn, rtsn, GFP_ATOMIC);
|
||||
|
@ -1072,7 +1075,7 @@ struct sctp_chunk *sctp_process_strreset_resp(
|
|||
|
||||
if (result == SCTP_STRRESET_PERFORMED)
|
||||
for (i = number; i < stream->outcnt; i++)
|
||||
stream->out[i].state = SCTP_STREAM_OPEN;
|
||||
SCTP_SO(stream, i)->state = SCTP_STREAM_OPEN;
|
||||
else
|
||||
stream->outcnt = number;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue