Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
8843177d
Commit
8843177d
authored
Apr 05, 2004
by
Sridhar Samudrala
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[SCTP] Update sctp_ulpevent structure to include assoc pointer and
only the receive specific fields of sctp_sndrcvinfo.
parent
de831dd1
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
120 additions
and
131 deletions
+120
-131
include/net/sctp/ulpevent.h
include/net/sctp/ulpevent.h
+8
-2
net/sctp/ipv6.c
net/sctp/ipv6.c
+2
-2
net/sctp/protocol.c
net/sctp/protocol.c
+1
-1
net/sctp/socket.c
net/sctp/socket.c
+3
-4
net/sctp/ulpevent.c
net/sctp/ulpevent.c
+84
-100
net/sctp/ulpqueue.c
net/sctp/ulpqueue.c
+22
-22
No files found.
include/net/sctp/ulpevent.h
View file @
8843177d
/* SCTP kernel reference Implementation
* (C) Copyright IBM Corp. 2001, 2004
* Copyright (c) 1999-2000 Cisco, Inc.
* Copyright (c) 1999-2001 Motorola, Inc.
* Copyright (c) 2001 International Business Machines, Corp.
* Copyright (c) 2001 Intel Corp.
* Copyright (c) 2001 Nokia, Inc.
* Copyright (c) 2001 La Monte H.P. Yarroll
...
...
@@ -54,7 +54,13 @@
* growing this structure as it is at the maximum limit now.
*/
struct
sctp_ulpevent
{
struct
sctp_sndrcvinfo
sndrcvinfo
;
struct
sctp_association
*
asoc
;
__u16
stream
;
__u16
ssn
;
__u16
flags
;
__u32
ppid
;
__u32
tsn
;
__u32
cumtsn
;
int
msg_flags
;
int
iif
;
};
...
...
net/sctp/ipv6.c
View file @
8843177d
/* SCTP kernel reference Implementation
* (C) Copyright IBM Corp. 2002, 2004
* Copyright (c) 2001 Nokia, Inc.
* Copyright (c) 2001 La Monte H.P. Yarroll
* Copyright (c) 2002-2003 International Business Machines, Corp.
* Copyright (c) 2002-2003 Intel Corp.
*
* This file is part of the SCTP kernel reference Implementation
...
...
@@ -698,7 +698,7 @@ static void sctp_inet6_event_msgname(struct sctp_ulpevent *event,
union
sctp_addr
*
addr
;
struct
sctp_association
*
asoc
;
asoc
=
event
->
sndrcvinfo
.
sinfo_assoc_id
;
asoc
=
event
->
asoc
;
sctp_inet6_msgname
(
msgname
,
addrlen
);
sin6
=
(
struct
sockaddr_in6
*
)
msgname
;
sin6
->
sin6_port
=
htons
(
asoc
->
peer
.
port
);
...
...
net/sctp/protocol.c
View file @
8843177d
...
...
@@ -721,7 +721,7 @@ static void sctp_inet_event_msgname(struct sctp_ulpevent *event, char *msgname,
if
(
msgname
)
{
struct
sctp_association
*
asoc
;
asoc
=
event
->
sndrcvinfo
.
sinfo_assoc_id
;
asoc
=
event
->
asoc
;
sctp_inet_msgname
(
msgname
,
addr_len
);
sin
=
(
struct
sockaddr_in
*
)
msgname
;
sinfrom
=
&
asoc
->
peer
.
primary_addr
.
v4
;
...
...
net/sctp/socket.c
View file @
8843177d
...
...
@@ -1498,8 +1498,7 @@ SCTP_STATIC int sctp_recvmsg(struct kiocb *iocb, struct sock *sk,
* rwnd by that amount. If all the data in the skb is read,
* rwnd is updated when the event is freed.
*/
sctp_assoc_rwnd_increase
(
event
->
sndrcvinfo
.
sinfo_assoc_id
,
copied
);
sctp_assoc_rwnd_increase
(
event
->
asoc
,
copied
);
goto
out
;
}
else
if
((
event
->
msg_flags
&
MSG_NOTIFICATION
)
||
(
event
->
msg_flags
&
MSG_EOR
))
...
...
@@ -4477,7 +4476,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
*/
sctp_skb_for_each
(
skb
,
&
oldsk
->
sk_receive_queue
,
tmp
)
{
event
=
sctp_skb2event
(
skb
);
if
(
event
->
sndrcvinfo
.
sinfo_assoc_id
==
assoc
)
{
if
(
event
->
asoc
==
assoc
)
{
__skb_unlink
(
skb
,
skb
->
list
);
__skb_queue_tail
(
&
newsk
->
sk_receive_queue
,
skb
);
}
...
...
@@ -4506,7 +4505,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
*/
sctp_skb_for_each
(
skb
,
&
oldsp
->
pd_lobby
,
tmp
)
{
event
=
sctp_skb2event
(
skb
);
if
(
event
->
sndrcvinfo
.
sinfo_assoc_id
==
assoc
)
{
if
(
event
->
asoc
==
assoc
)
{
__skb_unlink
(
skb
,
skb
->
list
);
__skb_queue_tail
(
queue
,
skb
);
}
...
...
net/sctp/ulpevent.c
View file @
8843177d
/* SCTP kernel reference Implementation
* (C) Copyright IBM Corp. 2001, 2004
* Copyright (c) 1999-2000 Cisco, Inc.
* Copyright (c) 1999-2001 Motorola, Inc.
* Copyright (c) 2001 International Business Machines, Corp.
* Copyright (c) 2001 Intel Corp.
* Copyright (c) 2001 Nokia, Inc.
* Copyright (c) 2001 La Monte H.P. Yarroll
...
...
@@ -590,8 +590,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc,
struct
sctp_chunk
*
chunk
,
int
gfp
)
{
struct
sctp_ulpevent
*
event
;
struct
sctp_sndrcvinfo
*
info
;
struct
sctp_ulpevent
*
event
=
NULL
;
struct
sk_buff
*
skb
;
size_t
padding
,
len
;
...
...
@@ -624,101 +623,21 @@ struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc,
/* Initialize event with flags 0. */
sctp_ulpevent_init
(
event
,
0
);
event
->
iif
=
sctp_chunk_iif
(
chunk
);
sctp_ulpevent_receive_data
(
event
,
asoc
);
info
=
(
struct
sctp_sndrcvinfo
*
)
&
event
->
sndrcvinfo
;
/* Sockets API Extensions for SCTP
* Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
*
* sinfo_stream: 16 bits (unsigned integer)
*
* For recvmsg() the SCTP stack places the message's stream number in
* this value.
*/
info
->
sinfo_stream
=
ntohs
(
chunk
->
subh
.
data_hdr
->
stream
);
/* Sockets API Extensions for SCTP
* Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
*
* sinfo_ssn: 16 bits (unsigned integer)
*
* For recvmsg() this value contains the stream sequence number that
* the remote endpoint placed in the DATA chunk. For fragmented
* messages this is the same number for all deliveries of the message
* (if more than one recvmsg() is needed to read the message).
*/
info
->
sinfo_ssn
=
ntohs
(
chunk
->
subh
.
data_hdr
->
ssn
);
/* Sockets API Extensions for SCTP
* Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
*
* sinfo_ppid: 32 bits (unsigned integer)
*
* In recvmsg() this value is
* the same information that was passed by the upper layer in the peer
* application. Please note that byte order issues are NOT accounted
* for and this information is passed opaquely by the SCTP stack from
* one end to the other.
*/
info
->
sinfo_ppid
=
chunk
->
subh
.
data_hdr
->
ppid
;
/* Sockets API Extensions for SCTP
* Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
*
* sinfo_flags: 16 bits (unsigned integer)
*
* This field may contain any of the following flags and is composed of
* a bitwise OR of these values.
*
* recvmsg() flags:
*
* MSG_UNORDERED - This flag is present when the message was sent
* non-ordered.
*/
event
->
stream
=
ntohs
(
chunk
->
subh
.
data_hdr
->
stream
);
event
->
ssn
=
ntohs
(
chunk
->
subh
.
data_hdr
->
ssn
);
event
->
ppid
=
chunk
->
subh
.
data_hdr
->
ppid
;
if
(
chunk
->
chunk_hdr
->
flags
&
SCTP_DATA_UNORDERED
)
{
info
->
sinfo_flags
|=
MSG_UNORDERED
;
/* sinfo_cumtsn: 32 bit (unsigned integer)
*
* This field will hold the current cumulative TSN as
* known by the underlying SCTP layer. Note this field is
* ignored when sending and only valid for a receive
* operation when sinfo_flags are set to MSG_UNORDERED.
*/
info
->
sinfo_cumtsn
=
sctp_tsnmap_get_ctsn
(
&
asoc
->
peer
.
tsn_map
);
event
->
flags
|=
MSG_UNORDERED
;
event
->
cumtsn
=
sctp_tsnmap_get_ctsn
(
&
asoc
->
peer
.
tsn_map
);
}
/* Note: For reassembly, we need to have the fragmentation bits.
* For now, merge these into the msg_flags, since those bit
* possitions are not used.
*/
event
->
tsn
=
ntohl
(
chunk
->
subh
.
data_hdr
->
tsn
);
event
->
msg_flags
|=
chunk
->
chunk_hdr
->
flags
;
/* With 04 draft, tsn moves into sndrcvinfo. */
info
->
sinfo_tsn
=
ntohl
(
chunk
->
subh
.
data_hdr
->
tsn
);
/* Context is not used on receive. */
info
->
sinfo_context
=
0
;
/* Sockets API Extensions for SCTP
* Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
*
* sinfo_assoc_id: sizeof (sctp_assoc_t)
*
* The association handle field, sinfo_assoc_id, holds the identifier
* for the association announced in the COMMUNICATION_UP notification.
* All notifications for a given association have the same identifier.
* Ignored for TCP-style sockets.
*/
info
->
sinfo_assoc_id
=
sctp_assoc2id
(
asoc
);
return
event
;
event
->
iif
=
sctp_chunk_iif
(
chunk
);
fail:
return
NULL
;
return
event
;
}
/* Create a partial delivery related event.
...
...
@@ -797,11 +716,77 @@ __u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event)
void
sctp_ulpevent_read_sndrcvinfo
(
const
struct
sctp_ulpevent
*
event
,
struct
msghdr
*
msghdr
)
{
if
(
!
sctp_ulpevent_is_notification
(
event
))
{
put_cmsg
(
msghdr
,
IPPROTO_SCTP
,
SCTP_SNDRCV
,
sizeof
(
struct
sctp_sndrcvinfo
),
(
void
*
)
&
event
->
sndrcvinfo
);
}
struct
sctp_sndrcvinfo
sinfo
;
if
(
sctp_ulpevent_is_notification
(
event
))
return
;
/* Sockets API Extensions for SCTP
* Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
*
* sinfo_stream: 16 bits (unsigned integer)
*
* For recvmsg() the SCTP stack places the message's stream number in
* this value.
*/
sinfo
.
sinfo_stream
=
event
->
stream
;
/* sinfo_ssn: 16 bits (unsigned integer)
*
* For recvmsg() this value contains the stream sequence number that
* the remote endpoint placed in the DATA chunk. For fragmented
* messages this is the same number for all deliveries of the message
* (if more than one recvmsg() is needed to read the message).
*/
sinfo
.
sinfo_ssn
=
event
->
ssn
;
/* sinfo_ppid: 32 bits (unsigned integer)
*
* In recvmsg() this value is
* the same information that was passed by the upper layer in the peer
* application. Please note that byte order issues are NOT accounted
* for and this information is passed opaquely by the SCTP stack from
* one end to the other.
*/
sinfo
.
sinfo_ppid
=
event
->
ppid
;
/* sinfo_flags: 16 bits (unsigned integer)
*
* This field may contain any of the following flags and is composed of
* a bitwise OR of these values.
*
* recvmsg() flags:
*
* MSG_UNORDERED - This flag is present when the message was sent
* non-ordered.
*/
sinfo
.
sinfo_flags
=
event
->
flags
;
/* sinfo_tsn: 32 bit (unsigned integer)
*
* For the receiving side, this field holds a TSN that was
* assigned to one of the SCTP Data Chunks.
*/
sinfo
.
sinfo_tsn
=
event
->
tsn
;
/* sinfo_cumtsn: 32 bit (unsigned integer)
*
* This field will hold the current cumulative TSN as
* known by the underlying SCTP layer. Note this field is
* ignored when sending and only valid for a receive
* operation when sinfo_flags are set to MSG_UNORDERED.
*/
sinfo
.
sinfo_cumtsn
=
event
->
cumtsn
;
/* sinfo_assoc_id: sizeof (sctp_assoc_t)
*
* The association handle field, sinfo_assoc_id, holds the identifier
* for the association announced in the COMMUNICATION_UP notification.
* All notifications for a given association have the same identifier.
* Ignored for one-to-one style sockets.
*/
sinfo
.
sinfo_assoc_id
=
sctp_assoc2id
(
event
->
asoc
);
/* These fields are not used while receiving. */
sinfo
.
sinfo_context
=
0
;
sinfo
.
sinfo_timetolive
=
0
;
put_cmsg
(
msghdr
,
IPPROTO_SCTP
,
SCTP_SNDRCV
,
sizeof
(
struct
sctp_sndrcvinfo
),
(
void
*
)
&
sinfo
);
}
/* Stub skb destructor. */
...
...
@@ -831,14 +816,14 @@ static inline void sctp_ulpevent_set_owner(struct sctp_ulpevent *event,
sctp_association_hold
((
struct
sctp_association
*
)
asoc
);
skb
=
sctp_event2skb
(
event
);
skb
->
sk
=
asoc
->
base
.
sk
;
event
->
sndrcvinfo
.
sinfo_assoc_id
=
sctp_assoc2id
(
asoc
)
;
event
->
asoc
=
(
struct
sctp_association
*
)
asoc
;
skb
->
destructor
=
sctp_stub_rfree
;
}
/* A simple destructor to give up the reference to the association. */
static
inline
void
sctp_ulpevent_release_owner
(
struct
sctp_ulpevent
*
event
)
{
sctp_association_put
(
event
->
sndrcvinfo
.
sinfo_assoc_id
);
sctp_association_put
(
event
->
asoc
);
}
/* Do accounting for bytes received and hold a reference to the association
...
...
@@ -880,8 +865,7 @@ static void sctp_ulpevent_release_data(struct sctp_ulpevent *event)
*/
skb
=
sctp_event2skb
(
event
);
sctp_assoc_rwnd_increase
(
event
->
sndrcvinfo
.
sinfo_assoc_id
,
skb_headlen
(
skb
));
sctp_assoc_rwnd_increase
(
event
->
asoc
,
skb_headlen
(
skb
));
/* Don't forget the fragments. */
for
(
frag
=
skb_shinfo
(
skb
)
->
frag_list
;
frag
;
frag
=
frag
->
next
)
{
...
...
net/sctp/ulpqueue.c
View file @
8843177d
/* SCTP kernel reference Implementation
* (C) Copyright IBM Corp. 2001, 2004
* Copyright (c) 1999-2000 Cisco, Inc.
* Copyright (c) 1999-2001 Motorola, Inc.
* Copyright (c) 2001-2003 International Business Machines, Corp.
* Copyright (c) 2001 Intel Corp.
* Copyright (c) 2001 Nokia, Inc.
* Copyright (c) 2001 La Monte H.P. Yarroll
...
...
@@ -251,7 +251,7 @@ static inline void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq,
struct
sctp_ulpevent
*
cevent
;
__u32
tsn
,
ctsn
;
tsn
=
event
->
sndrcvinfo
.
sinfo_
tsn
;
tsn
=
event
->
tsn
;
/* See if it belongs at the end. */
pos
=
skb_peek_tail
(
&
ulpq
->
reasm
);
...
...
@@ -262,7 +262,7 @@ static inline void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq,
/* Short circuit just dropping it at the end. */
cevent
=
sctp_skb2event
(
pos
);
ctsn
=
cevent
->
sndrcvinfo
.
sinfo_
tsn
;
ctsn
=
cevent
->
tsn
;
if
(
TSN_lt
(
ctsn
,
tsn
))
{
__skb_queue_tail
(
&
ulpq
->
reasm
,
sctp_event2skb
(
event
));
return
;
...
...
@@ -271,7 +271,7 @@ static inline void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq,
/* Find the right place in this list. We store them by TSN. */
skb_queue_walk
(
&
ulpq
->
reasm
,
pos
)
{
cevent
=
sctp_skb2event
(
pos
);
ctsn
=
cevent
->
sndrcvinfo
.
sinfo_
tsn
;
ctsn
=
cevent
->
tsn
;
if
(
TSN_lt
(
tsn
,
ctsn
))
break
;
...
...
@@ -368,7 +368,7 @@ static inline struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_u
*/
skb_queue_walk
(
&
ulpq
->
reasm
,
pos
)
{
cevent
=
sctp_skb2event
(
pos
);
ctsn
=
cevent
->
sndrcvinfo
.
sinfo_
tsn
;
ctsn
=
cevent
->
tsn
;
switch
(
cevent
->
msg_flags
&
SCTP_DATA_FRAG_MASK
)
{
case
SCTP_DATA_FIRST_FRAG
:
...
...
@@ -425,7 +425,7 @@ static inline struct sctp_ulpevent *sctp_ulpq_retrieve_partial(struct sctp_ulpq
skb_queue_walk
(
&
ulpq
->
reasm
,
pos
)
{
cevent
=
sctp_skb2event
(
pos
);
ctsn
=
cevent
->
sndrcvinfo
.
sinfo_
tsn
;
ctsn
=
cevent
->
tsn
;
switch
(
cevent
->
msg_flags
&
SCTP_DATA_FRAG_MASK
)
{
case
SCTP_DATA_MIDDLE_FRAG
:
...
...
@@ -486,7 +486,7 @@ static inline struct sctp_ulpevent *sctp_ulpq_reasm(struct sctp_ulpq *ulpq,
/* Do not even bother unless this is the next tsn to
* be delivered.
*/
ctsn
=
event
->
sndrcvinfo
.
sinfo_
tsn
;
ctsn
=
event
->
tsn
;
ctsnap
=
sctp_tsnmap_get_ctsn
(
&
ulpq
->
asoc
->
peer
.
tsn_map
);
if
(
TSN_lte
(
ctsn
,
ctsnap
))
retval
=
sctp_ulpq_retrieve_partial
(
ulpq
);
...
...
@@ -517,7 +517,7 @@ static inline struct sctp_ulpevent *sctp_ulpq_retrieve_first(struct sctp_ulpq *u
skb_queue_walk
(
&
ulpq
->
reasm
,
pos
)
{
cevent
=
sctp_skb2event
(
pos
);
ctsn
=
cevent
->
sndrcvinfo
.
sinfo_
tsn
;
ctsn
=
cevent
->
tsn
;
switch
(
cevent
->
msg_flags
&
SCTP_DATA_FRAG_MASK
)
{
case
SCTP_DATA_FIRST_FRAG
:
...
...
@@ -563,15 +563,15 @@ static inline void sctp_ulpq_retrieve_ordered(struct sctp_ulpq *ulpq,
__u16
sid
,
csid
;
__u16
ssn
,
cssn
;
sid
=
event
->
s
ndrcvinfo
.
sinfo_s
tream
;
ssn
=
event
->
s
ndrcvinfo
.
sinfo_s
sn
;
sid
=
event
->
stream
;
ssn
=
event
->
ssn
;
in
=
&
ulpq
->
asoc
->
ssnmap
->
in
;
/* We are holding the chunks by stream, by SSN. */
sctp_skb_for_each
(
pos
,
&
ulpq
->
lobby
,
tmp
)
{
cevent
=
(
struct
sctp_ulpevent
*
)
pos
->
cb
;
csid
=
cevent
->
s
ndrcvinfo
.
sinfo_s
tream
;
cssn
=
cevent
->
s
ndrcvinfo
.
sinfo_s
sn
;
csid
=
cevent
->
stream
;
cssn
=
cevent
->
ssn
;
/* Have we gone too far? */
if
(
csid
>
sid
)
...
...
@@ -609,12 +609,12 @@ static inline void sctp_ulpq_store_ordered(struct sctp_ulpq *ulpq,
return
;
}
sid
=
event
->
s
ndrcvinfo
.
sinfo_s
tream
;
ssn
=
event
->
s
ndrcvinfo
.
sinfo_s
sn
;
sid
=
event
->
stream
;
ssn
=
event
->
ssn
;
cevent
=
(
struct
sctp_ulpevent
*
)
pos
->
cb
;
csid
=
cevent
->
s
ndrcvinfo
.
sinfo_s
tream
;
cssn
=
cevent
->
s
ndrcvinfo
.
sinfo_s
sn
;
csid
=
cevent
->
stream
;
cssn
=
cevent
->
ssn
;
if
(
sid
>
csid
)
{
__skb_queue_tail
(
&
ulpq
->
lobby
,
sctp_event2skb
(
event
));
return
;
...
...
@@ -630,8 +630,8 @@ static inline void sctp_ulpq_store_ordered(struct sctp_ulpq *ulpq,
*/
skb_queue_walk
(
&
ulpq
->
lobby
,
pos
)
{
cevent
=
(
struct
sctp_ulpevent
*
)
pos
->
cb
;
csid
=
cevent
->
s
ndrcvinfo
.
sinfo_s
tream
;
cssn
=
cevent
->
s
ndrcvinfo
.
sinfo_s
sn
;
csid
=
cevent
->
stream
;
cssn
=
cevent
->
ssn
;
if
(
csid
>
sid
)
break
;
...
...
@@ -656,8 +656,8 @@ static inline struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq,
return
event
;
/* Note: The stream ID must be verified before this routine. */
sid
=
event
->
s
ndrcvinfo
.
sinfo_s
tream
;
ssn
=
event
->
s
ndrcvinfo
.
sinfo_s
sn
;
sid
=
event
->
stream
;
ssn
=
event
->
ssn
;
in
=
&
ulpq
->
asoc
->
ssnmap
->
in
;
/* Is this the expected SSN for this stream ID? */
...
...
@@ -694,7 +694,7 @@ static __u16 sctp_ulpq_renege_order(struct sctp_ulpq *ulpq, __u16 needed)
while
((
skb
=
__skb_dequeue_tail
(
&
ulpq
->
lobby
)))
{
freed
+=
skb_headlen
(
skb
);
event
=
sctp_skb2event
(
skb
);
tsn
=
event
->
sndrcvinfo
.
sinfo_
tsn
;
tsn
=
event
->
tsn
;
sctp_ulpevent_free
(
event
);
sctp_tsnmap_renege
(
tsnmap
,
tsn
);
...
...
@@ -720,7 +720,7 @@ static __u16 sctp_ulpq_renege_frags(struct sctp_ulpq *ulpq, __u16 needed)
while
((
skb
=
__skb_dequeue_tail
(
&
ulpq
->
reasm
)))
{
freed
+=
skb_headlen
(
skb
);
event
=
sctp_skb2event
(
skb
);
tsn
=
event
->
sndrcvinfo
.
sinfo_
tsn
;
tsn
=
event
->
tsn
;
sctp_ulpevent_free
(
event
);
sctp_tsnmap_renege
(
tsnmap
,
tsn
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment