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
982f0efd
Commit
982f0efd
authored
Apr 18, 2004
by
Sridhar Samudrala
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[SCTP] Cleanup sctp_packet and sctp_outq infrastructure.
parent
fe276637
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
74 additions
and
161 deletions
+74
-161
include/net/sctp/constants.h
include/net/sctp/constants.h
+0
-1
include/net/sctp/structs.h
include/net/sctp/structs.h
+9
-47
net/sctp/associola.c
net/sctp/associola.c
+2
-10
net/sctp/output.c
net/sctp/output.c
+30
-35
net/sctp/outqueue.c
net/sctp/outqueue.c
+29
-56
net/sctp/sm_statefuns.c
net/sctp/sm_statefuns.c
+2
-11
net/sctp/transport.c
net/sctp/transport.c
+2
-1
No files found.
include/net/sctp/constants.h
View file @
982f0efd
...
...
@@ -346,7 +346,6 @@ typedef enum {
SCTP_XMIT_OK
,
SCTP_XMIT_PMTU_FULL
,
SCTP_XMIT_RWND_FULL
,
SCTP_XMIT_MUST_FRAG
,
SCTP_XMIT_NAGLE_DELAY
,
}
sctp_xmit_t
;
...
...
include/net/sctp/structs.h
View file @
982f0efd
...
...
@@ -679,16 +679,6 @@ struct sctp_packet {
*/
struct
sctp_transport
*
transport
;
/* Allow a callback for getting a high priority chunk
* bundled early into the packet (This is used for ECNE).
*/
sctp_packet_phandler_t
*
get_prepend_chunk
;
/* This packet should advertise ECN capability to the network
* via the ECT bit.
*/
char
ecn_capable
;
/* This packet contains a COOKIE-ECHO chunk. */
char
has_cookie_echo
;
...
...
@@ -701,27 +691,15 @@ struct sctp_packet {
int
malloced
;
};
typedef
int
(
sctp_outq_thandler_t
)(
struct
sctp_outq
*
,
void
*
);
typedef
int
(
sctp_outq_ehandler_t
)(
struct
sctp_outq
*
);
typedef
struct
sctp_packet
*
(
sctp_outq_ohandler_init_t
)
(
struct
sctp_packet
*
,
struct
sctp_transport
*
,
__u16
sport
,
__u16
dport
);
typedef
struct
sctp_packet
*
(
sctp_outq_ohandler_config_t
)
(
struct
sctp_packet
*
,
__u32
vtag
,
int
ecn_capable
,
sctp_packet_phandler_t
*
get_prepend_chunk
);
typedef
sctp_xmit_t
(
sctp_outq_ohandler_t
)(
struct
sctp_packet
*
,
struct
sctp_chunk
*
);
typedef
int
(
sctp_outq_ohandler_force_t
)(
struct
sctp_packet
*
);
sctp_outq_ohandler_init_t
sctp_packet_init
;
sctp_outq_ohandler_config_t
sctp_packet_config
;
sctp_outq_ohandler_t
sctp_packet_append_chunk
;
sctp_outq_ohandler_t
sctp_packet_transmit_chunk
;
sctp_outq_ohandler_force_t
sctp_packet_transmit
;
struct
sctp_packet
*
sctp_packet_init
(
struct
sctp_packet
*
,
struct
sctp_transport
*
,
__u16
sport
,
__u16
dport
);
struct
sctp_packet
*
sctp_packet_config
(
struct
sctp_packet
*
,
__u32
vtag
,
int
);
sctp_xmit_t
sctp_packet_transmit_chunk
(
struct
sctp_packet
*
,
struct
sctp_chunk
*
);
sctp_xmit_t
sctp_packet_append_chunk
(
struct
sctp_packet
*
,
struct
sctp_chunk
*
);
int
sctp_packet_transmit
(
struct
sctp_packet
*
);
void
sctp_packet_free
(
struct
sctp_packet
*
);
static
inline
int
sctp_packet_empty
(
struct
sctp_packet
*
packet
)
...
...
@@ -1015,16 +993,6 @@ struct sctp_outq {
*/
struct
list_head
retransmit
;
/* Call these functions to send chunks down to the next lower
* layer. This is always sctp_packet, but we separate the two
* structures to make testing simpler.
*/
sctp_outq_ohandler_init_t
*
init_output
;
sctp_outq_ohandler_config_t
*
config_output
;
sctp_outq_ohandler_t
*
append_output
;
sctp_outq_ohandler_t
*
build_output
;
sctp_outq_ohandler_force_t
*
force_output
;
/* How many unackd bytes do we have in-flight? */
__u32
outstanding_bytes
;
...
...
@@ -1046,12 +1014,6 @@ int sctp_outq_tail(struct sctp_outq *, struct sctp_chunk *chunk);
int
sctp_outq_flush
(
struct
sctp_outq
*
,
int
);
int
sctp_outq_sack
(
struct
sctp_outq
*
,
struct
sctp_sackhdr
*
);
int
sctp_outq_is_empty
(
const
struct
sctp_outq
*
);
int
sctp_outq_set_output_handlers
(
struct
sctp_outq
*
,
sctp_outq_ohandler_init_t
init
,
sctp_outq_ohandler_config_t
config
,
sctp_outq_ohandler_t
append
,
sctp_outq_ohandler_t
build
,
sctp_outq_ohandler_force_t
force
);
void
sctp_outq_restart
(
struct
sctp_outq
*
);
void
sctp_retransmit
(
struct
sctp_outq
*
,
struct
sctp_transport
*
,
...
...
net/sctp/associola.c
View file @
982f0efd
...
...
@@ -261,12 +261,6 @@ struct sctp_association *sctp_association_init(struct sctp_association *asoc,
/* Create an output queue. */
sctp_outq_init
(
asoc
,
&
asoc
->
outqueue
);
sctp_outq_set_output_handlers
(
&
asoc
->
outqueue
,
sctp_packet_init
,
sctp_packet_config
,
sctp_packet_append_chunk
,
sctp_packet_transmit_chunk
,
sctp_packet_transmit
);
if
(
!
sctp_ulpq_init
(
&
asoc
->
ulpq
,
asoc
))
goto
fail_init
;
...
...
@@ -482,10 +476,8 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
/* The asoc->peer.port might not be meaningful yet, but
* initialize the packet structure anyway.
*/
(
asoc
->
outqueue
.
init_output
)(
&
peer
->
packet
,
peer
,
asoc
->
base
.
bind_addr
.
port
,
asoc
->
peer
.
port
);
sctp_packet_init
(
&
peer
->
packet
,
peer
,
asoc
->
base
.
bind_addr
.
port
,
asoc
->
peer
.
port
);
/* 7.2.1 Slow-Start
*
...
...
net/sctp/output.c
View file @
982f0efd
...
...
@@ -62,27 +62,35 @@
#include <net/sctp/sm.h>
/* Forward declarations for private helpers. */
static
void
sctp_packet_reset
(
struct
sctp_packet
*
packet
);
static
sctp_xmit_t
sctp_packet_append_data
(
struct
sctp_packet
*
packet
,
struct
sctp_chunk
*
chunk
);
/* Config a packet.
* This appears to be a followup set of initializations.
)
* This appears to be a followup set of initializations.
*/
struct
sctp_packet
*
sctp_packet_config
(
struct
sctp_packet
*
packet
,
__u32
vtag
,
int
ecn_capable
,
sctp_packet_phandler_t
*
prepend_handler
)
__u32
vtag
,
int
ecn_capable
)
{
struct
sctp_chunk
*
chunk
=
NULL
;
SCTP_DEBUG_PRINTK
(
"%s: packet:%p vtag:0x%x
\n
"
,
__FUNCTION__
,
packet
,
vtag
);
packet
->
vtag
=
vtag
;
packet
->
ecn_capable
=
ecn_capable
;
packet
->
get_prepend_chunk
=
prepend_handler
;
packet
->
has_cookie_echo
=
0
;
packet
->
has_sack
=
0
;
packet
->
ipfragok
=
0
;
/* We might need to call the prepend_handler right away. */
if
(
sctp_packet_empty
(
packet
))
sctp_packet_reset
(
packet
);
if
(
ecn_capable
&&
sctp_packet_empty
(
packet
))
{
chunk
=
sctp_get_ecne_prepend
(
packet
->
transport
->
asoc
);
/* If there a is a prepend chunk stick it on the list before
* any other chunks get appended.
*/
if
(
chunk
)
sctp_packet_append_chunk
(
packet
,
chunk
);
}
return
packet
;
}
...
...
@@ -94,6 +102,9 @@ struct sctp_packet *sctp_packet_init(struct sctp_packet *packet,
struct
sctp_association
*
asoc
=
transport
->
asoc
;
size_t
overhead
;
SCTP_DEBUG_PRINTK
(
"%s: packet:%p transport:%p
\n
"
,
__FUNCTION__
,
packet
,
transport
);
packet
->
transport
=
transport
;
packet
->
source_port
=
sport
;
packet
->
destination_port
=
dport
;
...
...
@@ -108,13 +119,10 @@ struct sctp_packet *sctp_packet_init(struct sctp_packet *packet,
packet
->
overhead
=
overhead
;
packet
->
size
=
overhead
;
packet
->
vtag
=
0
;
packet
->
ecn_capable
=
0
;
packet
->
get_prepend_chunk
=
NULL
;
packet
->
has_cookie_echo
=
0
;
packet
->
has_sack
=
0
;
packet
->
ipfragok
=
0
;
packet
->
malloced
=
0
;
sctp_packet_reset
(
packet
);
return
packet
;
}
...
...
@@ -123,6 +131,8 @@ void sctp_packet_free(struct sctp_packet *packet)
{
struct
sctp_chunk
*
chunk
;
SCTP_DEBUG_PRINTK
(
"%s: packet:%p
\n
"
,
__FUNCTION__
,
packet
);
while
((
chunk
=
(
struct
sctp_chunk
*
)
__skb_dequeue
(
&
packet
->
chunks
)))
sctp_chunk_free
(
chunk
);
...
...
@@ -143,6 +153,9 @@ sctp_xmit_t sctp_packet_transmit_chunk(struct sctp_packet *packet,
sctp_xmit_t
retval
;
int
error
=
0
;
SCTP_DEBUG_PRINTK
(
"%s: packet:%p chunk:%p
\n
"
,
__FUNCTION__
,
packet
,
chunk
);
switch
((
retval
=
(
sctp_packet_append_chunk
(
packet
,
chunk
))))
{
case
SCTP_XMIT_PMTU_FULL
:
if
(
!
packet
->
has_cookie_echo
)
{
...
...
@@ -157,7 +170,6 @@ sctp_xmit_t sctp_packet_transmit_chunk(struct sctp_packet *packet,
}
break
;
case
SCTP_XMIT_MUST_FRAG
:
case
SCTP_XMIT_RWND_FULL
:
case
SCTP_XMIT_OK
:
case
SCTP_XMIT_NAGLE_DELAY
:
...
...
@@ -210,6 +222,9 @@ sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *packet,
size_t
pmtu
;
int
too_big
;
SCTP_DEBUG_PRINTK
(
"%s: packet:%p chunk:%p
\n
"
,
__FUNCTION__
,
packet
,
chunk
);
retval
=
sctp_packet_bundle_sack
(
packet
,
chunk
);
psize
=
packet
->
size
;
...
...
@@ -239,9 +254,6 @@ sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *packet,
retval
=
SCTP_XMIT_PMTU_FULL
;
goto
finish
;
}
}
else
{
/* The chunk fits in the packet. */
goto
append
;
}
append:
...
...
@@ -289,6 +301,8 @@ int sctp_packet_transmit(struct sctp_packet *packet)
__u8
has_data
=
0
;
struct
dst_entry
*
dst
;
SCTP_DEBUG_PRINTK
(
"%s: packet:%p
\n
"
,
__FUNCTION__
,
packet
);
/* Do NOT generate a chunkless packet. */
chunk
=
(
struct
sctp_chunk
*
)
skb_peek
(
&
packet
->
chunks
);
if
(
unlikely
(
!
chunk
))
...
...
@@ -510,25 +524,6 @@ int sctp_packet_transmit(struct sctp_packet *packet)
* 2nd Level Abstractions
********************************************************************/
/*
* This private function resets the packet to a fresh state.
*/
static
void
sctp_packet_reset
(
struct
sctp_packet
*
packet
)
{
struct
sctp_chunk
*
chunk
=
NULL
;
packet
->
size
=
packet
->
overhead
;
if
(
packet
->
get_prepend_chunk
)
chunk
=
packet
->
get_prepend_chunk
(
packet
->
transport
->
asoc
);
/* If there a is a prepend chunk stick it on the list before
* any other chunks get appended.
*/
if
(
chunk
)
sctp_packet_append_chunk
(
packet
,
chunk
);
}
/* This private function handles the specifics of appending DATA chunks. */
static
sctp_xmit_t
sctp_packet_append_data
(
struct
sctp_packet
*
packet
,
struct
sctp_chunk
*
chunk
)
...
...
net/sctp/outqueue.c
View file @
982f0efd
...
...
@@ -223,12 +223,6 @@ void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q)
INIT_LIST_HEAD
(
&
q
->
retransmit
);
INIT_LIST_HEAD
(
&
q
->
sacked
);
q
->
init_output
=
NULL
;
q
->
config_output
=
NULL
;
q
->
append_output
=
NULL
;
q
->
build_output
=
NULL
;
q
->
force_output
=
NULL
;
q
->
outstanding_bytes
=
0
;
q
->
empty
=
1
;
q
->
cork
=
0
;
...
...
@@ -552,12 +546,12 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt,
}
/* Attempt to append this chunk to the packet. */
status
=
(
*
q
->
append_output
)
(
pkt
,
chunk
);
status
=
sctp_packet_append_chunk
(
pkt
,
chunk
);
switch
(
status
)
{
case
SCTP_XMIT_PMTU_FULL
:
/* Send this packet. */
if
((
error
=
(
*
q
->
force_output
)
(
pkt
))
==
0
)
if
((
error
=
sctp_packet_transmit
(
pkt
))
==
0
)
*
start_timer
=
1
;
/* If we are retransmitting, we should only
...
...
@@ -573,7 +567,7 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt,
case
SCTP_XMIT_RWND_FULL
:
/* Send this packet. */
if
((
error
=
(
*
q
->
force_output
)
(
pkt
))
==
0
)
if
((
error
=
sctp_packet_transmit
(
pkt
))
==
0
)
*
start_timer
=
1
;
/* Stop sending DATA as there is no more room
...
...
@@ -583,6 +577,16 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt,
lchunk
=
NULL
;
break
;
case
SCTP_XMIT_NAGLE_DELAY
:
/* Send this packet. */
if
((
error
=
sctp_packet_transmit
(
pkt
))
==
0
)
*
start_timer
=
1
;
/* Stop sending DATA because of nagle delay. */
list_add
(
lchunk
,
lqueue
);
lchunk
=
NULL
;
break
;
default:
/* The append was successful, so add this chunk to
* the transmitted list.
...
...
@@ -625,13 +629,9 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
struct
sctp_packet
*
packet
;
struct
sctp_packet
singleton
;
struct
sctp_association
*
asoc
=
q
->
asoc
;
int
ecn_capable
=
asoc
->
peer
.
ecn_capable
;
__u16
sport
=
asoc
->
base
.
bind_addr
.
port
;
__u16
dport
=
asoc
->
peer
.
port
;
__u32
vtag
=
asoc
->
peer
.
i
.
init_tag
;
/* This is the ECNE handler for singleton packets. */
sctp_packet_phandler_t
*
s_ecne_handler
=
NULL
;
sctp_packet_phandler_t
*
ecne_handler
=
NULL
;
struct
sk_buff_head
*
queue
;
struct
sctp_transport
*
transport
=
NULL
;
struct
sctp_transport
*
new_transport
;
...
...
@@ -656,10 +656,6 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
* within a SCTP packet in increasing order of TSN.
* ...
*/
if
(
ecn_capable
)
{
s_ecne_handler
=
&
sctp_get_no_prepend
;
ecne_handler
=
&
sctp_get_ecne_prepend
;
}
queue
=
&
q
->
control
;
while
((
chunk
=
(
struct
sctp_chunk
*
)
skb_dequeue
(
queue
)))
{
...
...
@@ -686,8 +682,8 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
&
transport_list
);
}
packet
=
&
transport
->
packet
;
(
*
q
->
config_output
)
(
packet
,
vtag
,
ecn_capable
,
ecne_handler
);
sctp_packet_config
(
packet
,
vtag
,
asoc
->
peer
.
ecn_capable
);
}
switch
(
chunk
->
chunk_hdr
->
type
)
{
...
...
@@ -700,11 +696,10 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
case
SCTP_CID_INIT
:
case
SCTP_CID_INIT_ACK
:
case
SCTP_CID_SHUTDOWN_COMPLETE
:
(
*
q
->
init_output
)(
&
singleton
,
transport
,
sport
,
dport
);
(
*
q
->
config_output
)(
&
singleton
,
vtag
,
ecn_capable
,
s_ecne_handler
);
(
void
)
(
*
q
->
build_output
)(
&
singleton
,
chunk
);
error
=
(
*
q
->
force_output
)(
&
singleton
);
sctp_packet_init
(
&
singleton
,
transport
,
sport
,
dport
);
sctp_packet_config
(
&
singleton
,
vtag
,
0
);
sctp_packet_append_chunk
(
&
singleton
,
chunk
);
error
=
sctp_packet_transmit
(
&
singleton
);
if
(
error
<
0
)
return
error
;
break
;
...
...
@@ -720,12 +715,9 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
case
SCTP_CID_COOKIE_ACK
:
case
SCTP_CID_ECN_ECNE
:
case
SCTP_CID_ECN_CWR
:
(
void
)
(
*
q
->
build_output
)(
packet
,
chunk
);
break
;
case
SCTP_CID_ASCONF
:
case
SCTP_CID_ASCONF_ACK
:
(
void
)
(
*
q
->
build_output
)
(
packet
,
chunk
);
sctp_packet_transmit_chunk
(
packet
,
chunk
);
break
;
default:
...
...
@@ -770,8 +762,8 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
}
packet
=
&
transport
->
packet
;
(
*
q
->
config_output
)
(
packet
,
vtag
,
ecn_capable
,
ecne_handler
);
sctp_packet_config
(
packet
,
vtag
,
asoc
->
peer
.
ecn_capable
);
retran:
error
=
sctp_outq_flush_rtx
(
q
,
packet
,
rtx_timeout
,
&
start_timer
);
...
...
@@ -836,11 +828,11 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
}
packet
=
&
transport
->
packet
;
(
*
q
->
config_output
)
(
packet
,
vtag
,
ecn_capable
,
ecne_handler
);
sctp_packet_config
(
packet
,
vtag
,
asoc
->
peer
.
ecn_capable
);
}
SCTP_DEBUG_PRINTK
(
"sctp_
transmit_packet
(%p, %p[%s]), "
,
SCTP_DEBUG_PRINTK
(
"sctp_
outq_flush
(%p, %p[%s]), "
,
q
,
chunk
,
chunk
&&
chunk
->
chunk_hdr
?
sctp_cname
(
SCTP_ST_CHUNK
(
...
...
@@ -855,7 +847,7 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
atomic_read
(
&
chunk
->
skb
->
users
)
:
-
1
);
/* Add the chunk to the packet. */
status
=
(
*
q
->
build_output
)
(
packet
,
chunk
);
status
=
sctp_packet_transmit_chunk
(
packet
,
chunk
);
switch
(
status
)
{
case
SCTP_XMIT_PMTU_FULL
:
...
...
@@ -879,7 +871,7 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
BUG
();
}
/* BUG: We assume that the
(*q->force_output())
/* BUG: We assume that the
sctp_packet_transmit()
* call below will succeed all the time and add the
* chunk to the transmitted list and restart the
* timers.
...
...
@@ -922,33 +914,14 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
struct
sctp_transport
*
t
=
list_entry
(
ltransport
,
struct
sctp_transport
,
send_ready
);
if
(
t
!=
transport
)
transport
=
t
;
packet
=
&
transport
->
packet
;
packet
=
&
t
->
packet
;
if
(
!
sctp_packet_empty
(
packet
))
error
=
(
*
q
->
force_output
)
(
packet
);
error
=
sctp_packet_transmit
(
packet
);
}
return
error
;
}
/* Set the various output handling callbacks. */
int
sctp_outq_set_output_handlers
(
struct
sctp_outq
*
q
,
sctp_outq_ohandler_init_t
init
,
sctp_outq_ohandler_config_t
config
,
sctp_outq_ohandler_t
append
,
sctp_outq_ohandler_t
build
,
sctp_outq_ohandler_force_t
force
)
{
q
->
init_output
=
init
;
q
->
config_output
=
config
;
q
->
append_output
=
append
;
q
->
build_output
=
build
;
q
->
force_output
=
force
;
return
0
;
}
/* Update unack_data based on the incoming SACK chunk */
static
void
sctp_sack_update_unack_data
(
struct
sctp_association
*
assoc
,
struct
sctp_sackhdr
*
sack
)
...
...
net/sctp/sm_statefuns.c
View file @
982f0efd
...
...
@@ -4671,28 +4671,20 @@ struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc,
/* Make a transport for the bucket, Eliza... */
transport
=
sctp_transport_new
(
sctp_source
(
chunk
),
GFP_ATOMIC
);
if
(
!
transport
)
goto
nomem
;
/* Allocate a new packet for sending the response. */
packet
=
t_new
(
struct
sctp_packet
,
GFP_ATOMIC
);
if
(
!
packet
)
goto
nomem_packet
;
/* Cache a route for the transport with the chunk's destination as
* the source address.
*/
sctp_transport_route
(
transport
,
(
union
sctp_addr
*
)
&
chunk
->
dest
,
sctp_sk
(
sctp_get_ctl_sock
()));
packet
=
sctp_packet_init
(
packet
,
transport
,
sport
,
dport
);
packet
=
sctp_packet_config
(
packet
,
vtag
,
0
,
NULL
);
packet
=
sctp_packet_init
(
&
transport
->
packet
,
transport
,
sport
,
dport
);
packet
=
sctp_packet_config
(
packet
,
vtag
,
0
);
return
packet
;
nomem_packet:
sctp_transport_free
(
transport
);
nomem:
return
NULL
;
}
...
...
@@ -4701,7 +4693,6 @@ struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc,
void
sctp_ootb_pkt_free
(
struct
sctp_packet
*
packet
)
{
sctp_transport_free
(
packet
->
transport
);
sctp_packet_free
(
packet
);
}
/* Send a stale cookie error when a invalid COOKIE ECHO chunk is found */
...
...
net/sctp/transport.c
View file @
982f0efd
...
...
@@ -118,7 +118,6 @@ struct sctp_transport *sctp_transport_init(struct sctp_transport *peer,
INIT_LIST_HEAD
(
&
peer
->
transmitted
);
INIT_LIST_HEAD
(
&
peer
->
send_ready
);
INIT_LIST_HEAD
(
&
peer
->
transports
);
sctp_packet_init
(
&
peer
->
packet
,
peer
,
0
,
0
);
/* Set up the retransmission timer. */
init_timer
(
&
peer
->
T3_rtx_timer
);
...
...
@@ -169,6 +168,8 @@ void sctp_transport_destroy(struct sctp_transport *transport)
if
(
transport
->
asoc
)
sctp_association_put
(
transport
->
asoc
);
sctp_packet_free
(
&
transport
->
packet
);
dst_release
(
transport
->
dst
);
kfree
(
transport
);
SCTP_DBG_OBJCNT_DEC
(
transport
);
...
...
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