sctp: add support for the process of unordered idata
Unordered idata process is more complicated than unordered data: - It has to add mid into sctp_stream_out to save the next mid value, which is separated from ordered idata's. - To support pd for unordered idata, another mid and pd_mode need to be added to save the message id and pd state in sctp_stream_in. - To make unordered idata reasm easier, it adds a new event queue to save frags for idata. The patch mostly adds the samilar reasm functions for unordered idata as ordered idata's, and also adjusts some other codes on assign_mid, abort_pd and ulpevent_data for idata. Signed-off-by: Xin Long <lucien.xin@gmail.com> Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
65f5e35783
commit
132282386f
@@ -201,6 +201,22 @@ static void sctp_for_each_tx_datachunk(struct sctp_association *asoc,
|
||||
cb(chunk);
|
||||
}
|
||||
|
||||
static void sctp_for_each_rx_skb(struct sctp_association *asoc, struct sock *sk,
|
||||
void (*cb)(struct sk_buff *, struct sock *))
|
||||
|
||||
{
|
||||
struct sk_buff *skb, *tmp;
|
||||
|
||||
sctp_skb_for_each(skb, &asoc->ulpq.lobby, tmp)
|
||||
cb(skb, sk);
|
||||
|
||||
sctp_skb_for_each(skb, &asoc->ulpq.reasm, tmp)
|
||||
cb(skb, sk);
|
||||
|
||||
sctp_skb_for_each(skb, &asoc->ulpq.reasm_uo, tmp)
|
||||
cb(skb, sk);
|
||||
}
|
||||
|
||||
/* Verify that this is a valid address. */
|
||||
static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr,
|
||||
int len)
|
||||
@@ -1554,6 +1570,7 @@ static void sctp_close(struct sock *sk, long timeout)
|
||||
|
||||
if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) ||
|
||||
!skb_queue_empty(&asoc->ulpq.reasm) ||
|
||||
!skb_queue_empty(&asoc->ulpq.reasm_uo) ||
|
||||
(sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) {
|
||||
struct sctp_chunk *chunk;
|
||||
|
||||
@@ -8495,11 +8512,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
|
||||
|
||||
}
|
||||
|
||||
sctp_skb_for_each(skb, &assoc->ulpq.reasm, tmp)
|
||||
sctp_skb_set_owner_r_frag(skb, newsk);
|
||||
|
||||
sctp_skb_for_each(skb, &assoc->ulpq.lobby, tmp)
|
||||
sctp_skb_set_owner_r_frag(skb, newsk);
|
||||
sctp_for_each_rx_skb(assoc, newsk, sctp_skb_set_owner_r_frag);
|
||||
|
||||
/* Set the type of socket to indicate that it is peeled off from the
|
||||
* original UDP-style socket or created with the accept() call on a
|
||||
|
||||
Reference in New Issue
Block a user