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
Kirill Smelkov
linux
Commits
f2b48f2e
Commit
f2b48f2e
authored
Feb 11, 2003
by
Sridhar Samudrala
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[SCTP] sctp mib statistics update/display support.
parent
a0065b2f
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
229 additions
and
5 deletions
+229
-5
include/net/sctp/sctp.h
include/net/sctp/sctp.h
+1
-0
net/sctp/Makefile
net/sctp/Makefile
+1
-1
net/sctp/associola.c
net/sctp/associola.c
+2
-0
net/sctp/endpointola.c
net/sctp/endpointola.c
+2
-0
net/sctp/input.c
net/sctp/input.c
+6
-1
net/sctp/ipv6.c
net/sctp/ipv6.c
+2
-0
net/sctp/outqueue.c
net/sctp/outqueue.c
+7
-1
net/sctp/proc.c
net/sctp/proc.c
+128
-0
net/sctp/protocol.c
net/sctp/protocol.c
+17
-2
net/sctp/sm_make_chunk.c
net/sctp/sm_make_chunk.c
+3
-0
net/sctp/sm_statefuns.c
net/sctp/sm_statefuns.c
+58
-0
net/sctp/ulpqueue.c
net/sctp/ulpqueue.c
+2
-0
No files found.
include/net/sctp/sctp.h
View file @
f2b48f2e
...
@@ -214,6 +214,7 @@ DECLARE_SNMP_STAT(struct sctp_mib, sctp_statistics);
...
@@ -214,6 +214,7 @@ DECLARE_SNMP_STAT(struct sctp_mib, sctp_statistics);
#define SCTP_INC_STATS(field) SNMP_INC_STATS(sctp_statistics, field)
#define SCTP_INC_STATS(field) SNMP_INC_STATS(sctp_statistics, field)
#define SCTP_INC_STATS_BH(field) SNMP_INC_STATS_BH(sctp_statistics, field)
#define SCTP_INC_STATS_BH(field) SNMP_INC_STATS_BH(sctp_statistics, field)
#define SCTP_INC_STATS_USER(field) SNMP_INC_STATS_USER(sctp_statistics, field)
#define SCTP_INC_STATS_USER(field) SNMP_INC_STATS_USER(sctp_statistics, field)
#define SCTP_DEC_STATS(field) SNMP_DEC_STATS(sctp_statistics, field)
/* Determine if this is a valid kernel address. */
/* Determine if this is a valid kernel address. */
static
inline
int
sctp_is_valid_kaddr
(
unsigned
long
addr
)
static
inline
int
sctp_is_valid_kaddr
(
unsigned
long
addr
)
...
...
net/sctp/Makefile
View file @
f2b48f2e
...
@@ -10,7 +10,7 @@ sctp-y := sm_statetable.o sm_statefuns.o sm_sideeffect.o \
...
@@ -10,7 +10,7 @@ sctp-y := sm_statetable.o sm_statefuns.o sm_sideeffect.o \
inqueue.o outqueue.o ulpqueue.o command.o
\
inqueue.o outqueue.o ulpqueue.o command.o
\
tsnmap.o bind_addr.o socket.o primitive.o
\
tsnmap.o bind_addr.o socket.o primitive.o
\
output.o input.o hashdriver.o sla1.o
\
output.o input.o hashdriver.o sla1.o
\
debug.o ssnmap.o
debug.o ssnmap.o
proc.o
ifeq
($(CONFIG_SCTP_ADLER32), y)
ifeq
($(CONFIG_SCTP_ADLER32), y)
sctp-y
+=
adler32.o
sctp-y
+=
adler32.o
...
...
net/sctp/associola.c
View file @
f2b48f2e
...
@@ -795,6 +795,8 @@ static void sctp_assoc_bh_rcv(sctp_association_t *asoc)
...
@@ -795,6 +795,8 @@ static void sctp_assoc_bh_rcv(sctp_association_t *asoc)
*/
*/
if
(
sctp_chunk_is_data
(
chunk
))
if
(
sctp_chunk_is_data
(
chunk
))
asoc
->
peer
.
last_data_from
=
chunk
->
transport
;
asoc
->
peer
.
last_data_from
=
chunk
->
transport
;
else
SCTP_INC_STATS
(
SctpInCtrlChunks
);
if
(
chunk
->
transport
)
if
(
chunk
->
transport
)
chunk
->
transport
->
last_time_heard
=
jiffies
;
chunk
->
transport
->
last_time_heard
=
jiffies
;
...
...
net/sctp/endpointola.c
View file @
f2b48f2e
...
@@ -369,6 +369,8 @@ static void sctp_endpoint_bh_rcv(sctp_endpoint_t *ep)
...
@@ -369,6 +369,8 @@ static void sctp_endpoint_bh_rcv(sctp_endpoint_t *ep)
*/
*/
if
(
asoc
&&
sctp_chunk_is_data
(
chunk
))
if
(
asoc
&&
sctp_chunk_is_data
(
chunk
))
asoc
->
peer
.
last_data_from
=
chunk
->
transport
;
asoc
->
peer
.
last_data_from
=
chunk
->
transport
;
else
SCTP_INC_STATS
(
SctpInCtrlChunks
);
if
(
chunk
->
transport
)
if
(
chunk
->
transport
)
chunk
->
transport
->
last_time_heard
=
jiffies
;
chunk
->
transport
->
last_time_heard
=
jiffies
;
...
...
net/sctp/input.c
View file @
f2b48f2e
...
@@ -90,6 +90,7 @@ static inline int sctp_rcv_checksum(struct sk_buff *skb)
...
@@ -90,6 +90,7 @@ static inline int sctp_rcv_checksum(struct sk_buff *skb)
if
(
val
!=
cmp
)
{
if
(
val
!=
cmp
)
{
/* CRC failure, dump it. */
/* CRC failure, dump it. */
SCTP_INC_STATS_BH
(
SctpChecksumErrors
);
return
-
1
;
return
-
1
;
}
}
return
0
;
return
0
;
...
@@ -115,6 +116,8 @@ int sctp_rcv(struct sk_buff *skb)
...
@@ -115,6 +116,8 @@ int sctp_rcv(struct sk_buff *skb)
if
(
skb
->
pkt_type
!=
PACKET_HOST
)
if
(
skb
->
pkt_type
!=
PACKET_HOST
)
goto
discard_it
;
goto
discard_it
;
SCTP_INC_STATS_BH
(
SctpInSCTPPacks
);
sh
=
(
struct
sctphdr
*
)
skb
->
h
.
raw
;
sh
=
(
struct
sctphdr
*
)
skb
->
h
.
raw
;
/* Pull up the IP and SCTP headers. */
/* Pull up the IP and SCTP headers. */
...
@@ -160,8 +163,10 @@ int sctp_rcv(struct sk_buff *skb)
...
@@ -160,8 +163,10 @@ int sctp_rcv(struct sk_buff *skb)
*/
*/
if
(
!
asoc
)
{
if
(
!
asoc
)
{
ep
=
__sctp_rcv_lookup_endpoint
(
&
dest
);
ep
=
__sctp_rcv_lookup_endpoint
(
&
dest
);
if
(
sctp_rcv_ootb
(
skb
))
if
(
sctp_rcv_ootb
(
skb
))
{
SCTP_INC_STATS_BH
(
SctpOutOfBlues
);
goto
discard_release
;
goto
discard_release
;
}
}
}
/* Retrieve the common input handling substructure. */
/* Retrieve the common input handling substructure. */
...
...
net/sctp/ipv6.c
View file @
f2b48f2e
...
@@ -132,6 +132,8 @@ static inline int sctp_v6_xmit(struct sk_buff *skb,
...
@@ -132,6 +132,8 @@ static inline int sctp_v6_xmit(struct sk_buff *skb,
__FUNCTION__
,
skb
,
skb
->
len
,
NIP6
(
fl
.
fl6_src
),
__FUNCTION__
,
skb
,
skb
->
len
,
NIP6
(
fl
.
fl6_src
),
NIP6
(
fl
.
fl6_dst
));
NIP6
(
fl
.
fl6_dst
));
SCTP_INC_STATS
(
SctpOutSCTPPacks
);
return
ip6_xmit
(
sk
,
skb
,
&
fl
,
np
->
opt
);
return
ip6_xmit
(
sk
,
skb
,
&
fl
,
np
->
opt
);
}
}
...
...
net/sctp/outqueue.c
View file @
f2b48f2e
...
@@ -193,11 +193,17 @@ int sctp_outq_tail(struct sctp_outq *q, sctp_chunk_t *chunk)
...
@@ -193,11 +193,17 @@ int sctp_outq_tail(struct sctp_outq *q, sctp_chunk_t *chunk)
:
"Illegal Chunk"
);
:
"Illegal Chunk"
);
skb_queue_tail
(
&
q
->
out
,
(
struct
sk_buff
*
)
chunk
);
skb_queue_tail
(
&
q
->
out
,
(
struct
sk_buff
*
)
chunk
);
if
(
chunk
->
chunk_hdr
->
flags
&
SCTP_DATA_UNORDERED
)
SCTP_INC_STATS
(
SctpOutUnorderChunks
);
else
SCTP_INC_STATS
(
SctpOutOrderChunks
);
q
->
empty
=
0
;
q
->
empty
=
0
;
break
;
break
;
};
};
}
else
}
else
{
skb_queue_tail
(
&
q
->
control
,
(
struct
sk_buff
*
)
chunk
);
skb_queue_tail
(
&
q
->
control
,
(
struct
sk_buff
*
)
chunk
);
SCTP_INC_STATS
(
SctpOutCtrlChunks
);
}
if
(
error
<
0
)
if
(
error
<
0
)
return
error
;
return
error
;
...
...
net/sctp/proc.c
0 → 100644
View file @
f2b48f2e
/* SCTP kernel reference Implementation
* Copyright (c) 2003 International Business Machines, Corp.
*
* This file is part of the SCTP kernel reference Implementation
*
* The SCTP reference implementation is free software;
* you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* The SCTP reference implementation is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied
* ************************
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU CC; see the file COPYING. If not, write to
* the Free Software Foundation, 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Please send any bug reports or fixes you make to the
* email address(es):
* lksctp developers <lksctp-developers@lists.sourceforge.net>
*
* Or submit a bug report through the following website:
* http://www.sf.net/projects/lksctp
*
* Written or modified by:
* Sridhar Samudrala <sri@us.ibm.com>
*
* Any bugs reported given to us we will try to fix... any fixes shared will
* be incorporated into the next SCTP release.
*/
#include <linux/types.h>
#include <linux/seq_file.h>
#include <net/sctp/sctp.h>
static
char
*
sctp_snmp_list
[]
=
{
#define SCTP_SNMP_ENTRY(x) #x
SCTP_SNMP_ENTRY
(
SctpCurrEstab
),
SCTP_SNMP_ENTRY
(
SctpActiveEstabs
),
SCTP_SNMP_ENTRY
(
SctpPassiveEstabs
),
SCTP_SNMP_ENTRY
(
SctpAborteds
),
SCTP_SNMP_ENTRY
(
SctpShutdowns
),
SCTP_SNMP_ENTRY
(
SctpOutOfBlues
),
SCTP_SNMP_ENTRY
(
SctpChecksumErrors
),
SCTP_SNMP_ENTRY
(
SctpOutCtrlChunks
),
SCTP_SNMP_ENTRY
(
SctpOutOrderChunks
),
SCTP_SNMP_ENTRY
(
SctpOutUnorderChunks
),
SCTP_SNMP_ENTRY
(
SctpInCtrlChunks
),
SCTP_SNMP_ENTRY
(
SctpInOrderChunks
),
SCTP_SNMP_ENTRY
(
SctpInUnorderChunks
),
SCTP_SNMP_ENTRY
(
SctpFragUsrMsgs
),
SCTP_SNMP_ENTRY
(
SctpReasmUsrMsgs
),
SCTP_SNMP_ENTRY
(
SctpOutSCTPPacks
),
SCTP_SNMP_ENTRY
(
SctpInSCTPPacks
),
#undef SCTP_SNMP_ENTRY
};
/* Return the current value of a particular entry in the mib by adding its
* per cpu counters.
*/
static
unsigned
long
fold_field
(
void
*
mib
[],
int
nr
)
{
unsigned
long
res
=
0
;
int
i
;
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
if
(
!
cpu_possible
(
i
))
continue
;
res
+=
*
((
unsigned
long
*
)
(((
void
*
)
per_cpu_ptr
(
mib
[
0
],
i
))
+
sizeof
(
unsigned
long
)
*
nr
));
res
+=
*
((
unsigned
long
*
)
(((
void
*
)
per_cpu_ptr
(
mib
[
1
],
i
))
+
sizeof
(
unsigned
long
)
*
nr
));
}
return
res
;
}
/* Display sctp snmp mib statistics(/proc/net/sctp/snmp). */
static
int
sctp_snmp_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
int
i
;
for
(
i
=
0
;
i
<
sizeof
(
sctp_snmp_list
)
/
sizeof
(
char
*
);
i
++
)
seq_printf
(
seq
,
"%-32s
\t
%ld
\n
"
,
sctp_snmp_list
[
i
],
fold_field
((
void
**
)
sctp_statistics
,
i
));
return
0
;
}
/* Initialize the seq file operations for 'snmp' object. */
static
int
sctp_snmp_seq_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
single_open
(
file
,
sctp_snmp_seq_show
,
NULL
);
}
static
struct
file_operations
sctp_snmp_seq_fops
=
{
.
open
=
sctp_snmp_seq_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
single_release
,
};
/* Set up the proc fs entry for 'snmp' object. */
int
__init
sctp_snmp_proc_init
(
void
)
{
struct
proc_dir_entry
*
p
;
p
=
create_proc_entry
(
"snmp"
,
S_IRUGO
,
proc_net_sctp
);
if
(
!
p
)
return
-
ENOMEM
;
p
->
proc_fops
=
&
sctp_snmp_seq_fops
;
return
0
;
}
/* Cleanup the proc fs entry for 'snmp' object. */
void
sctp_snmp_proc_exit
(
void
)
{
remove_proc_entry
(
"snmp"
,
proc_net_sctp
);
}
net/sctp/protocol.c
View file @
f2b48f2e
...
@@ -75,6 +75,9 @@ static struct sctp_af *sctp_af_v6_specific;
...
@@ -75,6 +75,9 @@ static struct sctp_af *sctp_af_v6_specific;
extern
struct
net_proto_family
inet_family_ops
;
extern
struct
net_proto_family
inet_family_ops
;
extern
int
sctp_snmp_proc_init
(
void
);
extern
int
sctp_snmp_proc_exit
(
void
);
/* Return the address of the control sock. */
/* Return the address of the control sock. */
struct
sock
*
sctp_get_ctl_sock
(
void
)
struct
sock
*
sctp_get_ctl_sock
(
void
)
{
{
...
@@ -82,21 +85,32 @@ struct sock *sctp_get_ctl_sock(void)
...
@@ -82,21 +85,32 @@ struct sock *sctp_get_ctl_sock(void)
}
}
/* Set up the proc fs entry for the SCTP protocol. */
/* Set up the proc fs entry for the SCTP protocol. */
__init
void
sctp_proc_init
(
void
)
__init
int
sctp_proc_init
(
void
)
{
{
int
rc
=
0
;
if
(
!
proc_net_sctp
)
{
if
(
!
proc_net_sctp
)
{
struct
proc_dir_entry
*
ent
;
struct
proc_dir_entry
*
ent
;
ent
=
proc_mkdir
(
"net/sctp"
,
0
);
ent
=
proc_mkdir
(
"net/sctp"
,
0
);
if
(
ent
)
{
if
(
ent
)
{
ent
->
owner
=
THIS_MODULE
;
ent
->
owner
=
THIS_MODULE
;
proc_net_sctp
=
ent
;
proc_net_sctp
=
ent
;
}
}
else
rc
=
-
ENOMEM
;
}
}
if
(
sctp_snmp_proc_init
())
rc
=
-
ENOMEM
;
return
rc
;
}
}
/* Clean up the proc fs entry for the SCTP protocol. */
/* Clean up the proc fs entry for the SCTP protocol. */
void
sctp_proc_exit
(
void
)
void
sctp_proc_exit
(
void
)
{
{
sctp_snmp_proc_exit
();
if
(
proc_net_sctp
)
{
if
(
proc_net_sctp
)
{
proc_net_sctp
=
NULL
;
proc_net_sctp
=
NULL
;
remove_proc_entry
(
"net/sctp"
,
0
);
remove_proc_entry
(
"net/sctp"
,
0
);
...
@@ -628,6 +642,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,
...
@@ -628,6 +642,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,
NIPQUAD
(((
struct
rtable
*
)
skb
->
dst
)
->
rt_src
),
NIPQUAD
(((
struct
rtable
*
)
skb
->
dst
)
->
rt_src
),
NIPQUAD
(((
struct
rtable
*
)
skb
->
dst
)
->
rt_dst
));
NIPQUAD
(((
struct
rtable
*
)
skb
->
dst
)
->
rt_dst
));
SCTP_INC_STATS
(
SctpOutSCTPPacks
);
return
ip_queue_xmit
(
skb
,
ipfragok
);
return
ip_queue_xmit
(
skb
,
ipfragok
);
}
}
...
...
net/sctp/sm_make_chunk.c
View file @
f2b48f2e
...
@@ -1180,6 +1180,9 @@ int sctp_datachunks_from_user(sctp_association_t *asoc,
...
@@ -1180,6 +1180,9 @@ int sctp_datachunks_from_user(sctp_association_t *asoc,
over
=
msg_len
%
max
;
over
=
msg_len
%
max
;
offset
=
0
;
offset
=
0
;
if
(
whole
&&
over
)
SCTP_INC_STATS_USER
(
SctpFragUsrMsgs
);
/* Create chunks for all the full sized DATA chunks. */
/* Create chunks for all the full sized DATA chunks. */
for
(
i
=
0
,
len
=
first_len
;
i
<
whole
;
i
++
)
{
for
(
i
=
0
,
len
=
first_len
;
i
<
whole
;
i
++
)
{
frag
=
SCTP_DATA_MIDDLE_FRAG
;
frag
=
SCTP_DATA_MIDDLE_FRAG
;
...
...
net/sctp/sm_statefuns.c
View file @
f2b48f2e
...
@@ -145,6 +145,9 @@ sctp_disposition_t sctp_sf_do_4_C(const sctp_endpoint_t *ep,
...
@@ -145,6 +145,9 @@ sctp_disposition_t sctp_sf_do_4_C(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_INC_STATS
(
SctpShutdowns
);
SCTP_DEC_STATS
(
SctpCurrEstab
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DELETE_TCB
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DELETE_TCB
,
SCTP_NULL
());
...
@@ -223,6 +226,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const sctp_endpoint_t *ep,
...
@@ -223,6 +226,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const sctp_endpoint_t *ep,
if
(
packet
)
{
if
(
packet
)
{
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
SCTP_PACKET
(
packet
));
SCTP_PACKET
(
packet
));
SCTP_INC_STATS
(
SctpOutCtrlChunks
);
return
SCTP_DISPOSITION_CONSUME
;
return
SCTP_DISPOSITION_CONSUME
;
}
else
{
}
else
{
return
SCTP_DISPOSITION_NOMEM
;
return
SCTP_DISPOSITION_NOMEM
;
...
@@ -379,6 +383,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const sctp_endpoint_t *ep,
...
@@ -379,6 +383,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_REPLY
,
SCTP_CHUNK
(
reply
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_REPLY
,
SCTP_CHUNK
(
reply
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_INC_STATS
(
SctpAborteds
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DELETE_TCB
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DELETE_TCB
,
SCTP_NULL
());
return
SCTP_DISPOSITION_DELETE_TCB
;
return
SCTP_DISPOSITION_DELETE_TCB
;
}
}
...
@@ -388,6 +393,9 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const sctp_endpoint_t *ep,
...
@@ -388,6 +393,9 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const sctp_endpoint_t *ep,
if
(
!
sctp_verify_init
(
asoc
,
chunk
->
chunk_hdr
->
type
,
if
(
!
sctp_verify_init
(
asoc
,
chunk
->
chunk_hdr
->
type
,
(
sctp_init_chunk_t
*
)
chunk
->
chunk_hdr
,
chunk
,
(
sctp_init_chunk_t
*
)
chunk
->
chunk_hdr
,
chunk
,
&
err_chunk
))
{
&
err_chunk
))
{
SCTP_INC_STATS
(
SctpAborteds
);
/* This chunk contains fatal error. It is to be discarded.
/* This chunk contains fatal error. It is to be discarded.
* Send an ABORT, with causes if there is any.
* Send an ABORT, with causes if there is any.
*/
*/
...
@@ -403,6 +411,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const sctp_endpoint_t *ep,
...
@@ -403,6 +411,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const sctp_endpoint_t *ep,
if
(
packet
)
{
if
(
packet
)
{
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
SCTP_PACKET
(
packet
));
SCTP_PACKET
(
packet
));
SCTP_INC_STATS
(
SctpOutCtrlChunks
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_STATE
(
SCTP_STATE_CLOSED
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DELETE_TCB
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DELETE_TCB
,
...
@@ -557,6 +566,8 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const sctp_endpoint_t *ep,
...
@@ -557,6 +566,8 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_ASOC
,
SCTP_ASOC
(
new_asoc
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_ASOC
,
SCTP_ASOC
(
new_asoc
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_ESTABLISHED
));
SCTP_STATE
(
SCTP_STATE_ESTABLISHED
));
SCTP_INC_STATS
(
SctpCurrEstab
);
SCTP_INC_STATS
(
SctpPassiveEstabs
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_HB_TIMERS_START
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_HB_TIMERS_START
,
SCTP_NULL
());
if
(
new_asoc
->
autoclose
)
if
(
new_asoc
->
autoclose
)
...
@@ -648,6 +659,8 @@ sctp_disposition_t sctp_sf_do_5_1E_ca(const sctp_endpoint_t *ep,
...
@@ -648,6 +659,8 @@ sctp_disposition_t sctp_sf_do_5_1E_ca(const sctp_endpoint_t *ep,
SCTP_TO
(
SCTP_EVENT_TIMEOUT_T1_COOKIE
));
SCTP_TO
(
SCTP_EVENT_TIMEOUT_T1_COOKIE
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_ESTABLISHED
));
SCTP_STATE
(
SCTP_STATE_ESTABLISHED
));
SCTP_INC_STATS
(
SctpCurrEstab
);
SCTP_INC_STATS
(
SctpActiveEstabs
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_HB_TIMERS_START
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_HB_TIMERS_START
,
SCTP_NULL
());
if
(
asoc
->
autoclose
)
if
(
asoc
->
autoclose
)
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_TIMER_START
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_TIMER_START
,
...
@@ -719,6 +732,8 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const sctp_endpoint_t *ep,
...
@@ -719,6 +732,8 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const sctp_endpoint_t *ep,
if
(
asoc
->
overall_error_count
>=
asoc
->
overall_error_threshold
)
{
if
(
asoc
->
overall_error_count
>=
asoc
->
overall_error_threshold
)
{
/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
SCTP_INC_STATS
(
SctpAborteds
);
SCTP_DEC_STATS
(
SctpCurrEstab
);
return
SCTP_DISPOSITION_DELETE_TCB
;
return
SCTP_DISPOSITION_DELETE_TCB
;
}
}
...
@@ -929,6 +944,8 @@ static int sctp_sf_send_restart_abort(union sctp_addr *ssa,
...
@@ -929,6 +944,8 @@ static int sctp_sf_send_restart_abort(union sctp_addr *ssa,
goto
out
;
goto
out
;
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
SCTP_PACKET
(
pkt
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
SCTP_PACKET
(
pkt
));
SCTP_INC_STATS
(
SctpOutCtrlChunks
);
/* Discard the rest of the inbound packet. */
/* Discard the rest of the inbound packet. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DISCARD_PACKET
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DISCARD_PACKET
,
SCTP_NULL
());
...
@@ -1125,6 +1142,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
...
@@ -1125,6 +1142,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
if
(
packet
)
{
if
(
packet
)
{
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
SCTP_PACKET
(
packet
));
SCTP_PACKET
(
packet
));
SCTP_INC_STATS
(
SctpOutCtrlChunks
);
retval
=
SCTP_DISPOSITION_CONSUME
;
retval
=
SCTP_DISPOSITION_CONSUME
;
}
else
{
}
else
{
retval
=
SCTP_DISPOSITION_NOMEM
;
retval
=
SCTP_DISPOSITION_NOMEM
;
...
@@ -1436,6 +1454,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_b(const sctp_endpoint_t *ep,
...
@@ -1436,6 +1454,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_b(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_UPDATE_ASSOC
,
SCTP_ASOC
(
new_asoc
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_UPDATE_ASSOC
,
SCTP_ASOC
(
new_asoc
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_ESTABLISHED
));
SCTP_STATE
(
SCTP_STATE_ESTABLISHED
));
SCTP_INC_STATS
(
SctpCurrEstab
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_HB_TIMERS_START
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_HB_TIMERS_START
,
SCTP_NULL
());
repl
=
sctp_make_cookie_ack
(
new_asoc
,
chunk
);
repl
=
sctp_make_cookie_ack
(
new_asoc
,
chunk
);
...
@@ -1519,6 +1538,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const sctp_endpoint_t *ep,
...
@@ -1519,6 +1538,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const sctp_endpoint_t *ep,
SCTP_TO
(
SCTP_EVENT_TIMEOUT_T1_COOKIE
));
SCTP_TO
(
SCTP_EVENT_TIMEOUT_T1_COOKIE
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_ESTABLISHED
));
SCTP_STATE
(
SCTP_STATE_ESTABLISHED
));
SCTP_INC_STATS
(
SctpCurrEstab
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_HB_TIMERS_START
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_HB_TIMERS_START
,
SCTP_NULL
());
SCTP_NULL
());
...
@@ -1925,6 +1945,8 @@ sctp_disposition_t sctp_sf_do_9_1_abort(const sctp_endpoint_t *ep,
...
@@ -1925,6 +1945,8 @@ sctp_disposition_t sctp_sf_do_9_1_abort(const sctp_endpoint_t *ep,
/* ASSOC_FAILED will DELETE_TCB. */
/* ASSOC_FAILED will DELETE_TCB. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
SCTP_INC_STATS
(
SctpAborteds
);
SCTP_DEC_STATS
(
SctpCurrEstab
);
/* BUG? This does not look complete... */
/* BUG? This does not look complete... */
return
SCTP_DISPOSITION_ABORT
;
return
SCTP_DISPOSITION_ABORT
;
...
@@ -1948,6 +1970,7 @@ sctp_disposition_t sctp_sf_cookie_wait_abort(const sctp_endpoint_t *ep,
...
@@ -1948,6 +1970,7 @@ sctp_disposition_t sctp_sf_cookie_wait_abort(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_INC_STATS
(
SctpAborteds
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_TIMER_STOP
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_TIMER_STOP
,
SCTP_TO
(
SCTP_EVENT_TIMEOUT_T1_INIT
));
SCTP_TO
(
SCTP_EVENT_TIMEOUT_T1_INIT
));
...
@@ -2332,6 +2355,8 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const sctp_endpoint_t *ep,
...
@@ -2332,6 +2355,8 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const sctp_endpoint_t *ep,
*/
*/
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DISCARD_PACKET
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DISCARD_PACKET
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
SCTP_INC_STATS
(
SctpAborteds
);
SCTP_INC_STATS
(
SctpCurrEstab
);
return
SCTP_DISPOSITION_CONSUME
;
return
SCTP_DISPOSITION_CONSUME
;
}
}
...
@@ -2340,6 +2365,11 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const sctp_endpoint_t *ep,
...
@@ -2340,6 +2365,11 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const sctp_endpoint_t *ep,
/* Record the fact that we have received this TSN. */
/* Record the fact that we have received this TSN. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_REPORT_TSN
,
SCTP_U32
(
tsn
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_REPORT_TSN
,
SCTP_U32
(
tsn
));
if
(
chunk
->
chunk_hdr
->
flags
&
SCTP_DATA_UNORDERED
)
SCTP_INC_STATS
(
SctpInUnorderChunks
);
else
SCTP_INC_STATS
(
SctpInOrderChunks
);
/* RFC 2960 6.5 Stream Identifier and Stream Sequence Number
/* RFC 2960 6.5 Stream Identifier and Stream Sequence Number
*
*
* If an endpoint receive a DATA chunk with an invalid stream
* If an endpoint receive a DATA chunk with an invalid stream
...
@@ -2536,6 +2566,8 @@ sctp_disposition_t sctp_sf_eat_data_fast_4_4(const sctp_endpoint_t *ep,
...
@@ -2536,6 +2566,8 @@ sctp_disposition_t sctp_sf_eat_data_fast_4_4(const sctp_endpoint_t *ep,
*/
*/
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DISCARD_PACKET
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DISCARD_PACKET
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
SCTP_INC_STATS
(
SctpAborteds
);
SCTP_INC_STATS
(
SctpCurrEstab
);
return
SCTP_DISPOSITION_CONSUME
;
return
SCTP_DISPOSITION_CONSUME
;
}
}
...
@@ -2544,6 +2576,11 @@ sctp_disposition_t sctp_sf_eat_data_fast_4_4(const sctp_endpoint_t *ep,
...
@@ -2544,6 +2576,11 @@ sctp_disposition_t sctp_sf_eat_data_fast_4_4(const sctp_endpoint_t *ep,
/* Record the fact that we have received this TSN. */
/* Record the fact that we have received this TSN. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_REPORT_TSN
,
SCTP_U32
(
tsn
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_REPORT_TSN
,
SCTP_U32
(
tsn
));
if
(
chunk
->
chunk_hdr
->
flags
&
SCTP_DATA_UNORDERED
)
SCTP_INC_STATS
(
SctpInUnorderChunks
);
else
SCTP_INC_STATS
(
SctpInOrderChunks
);
/* RFC 2960 6.5 Stream Identifier and Stream Sequence Number
/* RFC 2960 6.5 Stream Identifier and Stream Sequence Number
*
*
* If an endpoint receive a DATA chunk with an invalid stream
* If an endpoint receive a DATA chunk with an invalid stream
...
@@ -2705,6 +2742,8 @@ sctp_disposition_t sctp_sf_tabort_8_4_8(const sctp_endpoint_t *ep,
...
@@ -2705,6 +2742,8 @@ sctp_disposition_t sctp_sf_tabort_8_4_8(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
SCTP_PACKET
(
packet
));
SCTP_PACKET
(
packet
));
SCTP_INC_STATS
(
SctpOutCtrlChunks
);
return
SCTP_DISPOSITION_CONSUME
;
return
SCTP_DISPOSITION_CONSUME
;
}
}
...
@@ -2794,6 +2833,8 @@ sctp_disposition_t sctp_sf_do_9_2_final(const sctp_endpoint_t *ep,
...
@@ -2794,6 +2833,8 @@ sctp_disposition_t sctp_sf_do_9_2_final(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_INC_STATS
(
SctpShutdowns
);
SCTP_DEC_STATS
(
SctpCurrEstab
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_REPLY
,
SCTP_CHUNK
(
reply
));
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_REPLY
,
SCTP_CHUNK
(
reply
));
/* ...and remove all record of the association. */
/* ...and remove all record of the association. */
...
@@ -2834,6 +2875,8 @@ sctp_disposition_t sctp_sf_ootb(const sctp_endpoint_t *ep,
...
@@ -2834,6 +2875,8 @@ sctp_disposition_t sctp_sf_ootb(const sctp_endpoint_t *ep,
__u8
*
ch_end
;
__u8
*
ch_end
;
int
ootb_shut_ack
=
0
;
int
ootb_shut_ack
=
0
;
SCTP_INC_STATS
(
SctpOutOfBlues
);
ch
=
(
sctp_chunkhdr_t
*
)
chunk
->
chunk_hdr
;
ch
=
(
sctp_chunkhdr_t
*
)
chunk
->
chunk_hdr
;
do
{
do
{
ch_end
=
((
__u8
*
)
ch
)
+
WORD_ROUND
(
ntohs
(
ch
->
length
));
ch_end
=
((
__u8
*
)
ch
)
+
WORD_ROUND
(
ntohs
(
ch
->
length
));
...
@@ -2901,6 +2944,8 @@ sctp_disposition_t sctp_sf_shut_8_4_5(const sctp_endpoint_t *ep,
...
@@ -2901,6 +2944,8 @@ sctp_disposition_t sctp_sf_shut_8_4_5(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
SCTP_PACKET
(
packet
));
SCTP_PACKET
(
packet
));
SCTP_INC_STATS
(
SctpOutCtrlChunks
);
return
SCTP_DISPOSITION_CONSUME
;
return
SCTP_DISPOSITION_CONSUME
;
}
}
...
@@ -3472,6 +3517,10 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(const sctp_endpoint_t *ep,
...
@@ -3472,6 +3517,10 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(const sctp_endpoint_t *ep,
/* Delete the established association. */
/* Delete the established association. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
SCTP_INC_STATS
(
SctpAborteds
);
SCTP_DEC_STATS
(
SctpCurrEstab
);
return
retval
;
return
retval
;
}
}
...
@@ -3527,6 +3576,8 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_shutdown(
...
@@ -3527,6 +3576,8 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_shutdown(
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_INC_STATS
(
SctpShutdowns
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DELETE_TCB
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_DELETE_TCB
,
SCTP_NULL
());
return
SCTP_DISPOSITION_DELETE_TCB
;
return
SCTP_DISPOSITION_DELETE_TCB
;
...
@@ -3597,6 +3648,8 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(const sctp_endpoint_t *ep,
...
@@ -3597,6 +3648,8 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(const sctp_endpoint_t *ep,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_NEW_STATE
,
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_STATE
(
SCTP_STATE_CLOSED
));
SCTP_INC_STATS
(
SctpAborteds
);
/* Even if we can't send the ABORT due to low memory delete the
/* Even if we can't send the ABORT due to low memory delete the
* TCB. This is a departure from our typical NOMEM handling.
* TCB. This is a departure from our typical NOMEM handling.
*/
*/
...
@@ -3929,6 +3982,8 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(const sctp_endpoint_t *ep,
...
@@ -3929,6 +3982,8 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(const sctp_endpoint_t *ep,
if
(
asoc
->
overall_error_count
>=
asoc
->
overall_error_threshold
)
{
if
(
asoc
->
overall_error_count
>=
asoc
->
overall_error_threshold
)
{
/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
SCTP_INC_STATS
(
SctpAborteds
);
SCTP_DEC_STATS
(
SctpCurrEstab
);
return
SCTP_DISPOSITION_DELETE_TCB
;
return
SCTP_DISPOSITION_DELETE_TCB
;
}
}
...
@@ -4096,6 +4151,8 @@ sctp_disposition_t sctp_sf_t2_timer_expire(const sctp_endpoint_t *ep,
...
@@ -4096,6 +4151,8 @@ sctp_disposition_t sctp_sf_t2_timer_expire(const sctp_endpoint_t *ep,
if
(
asoc
->
overall_error_count
>=
asoc
->
overall_error_threshold
)
{
if
(
asoc
->
overall_error_count
>=
asoc
->
overall_error_threshold
)
{
/* Note: CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
/* Note: CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_NULL
());
SCTP_INC_STATS
(
SctpAborteds
);
SCTP_DEC_STATS
(
SctpCurrEstab
);
return
SCTP_DISPOSITION_DELETE_TCB
;
return
SCTP_DISPOSITION_DELETE_TCB
;
}
}
...
@@ -4401,6 +4458,7 @@ void sctp_send_stale_cookie_err(const sctp_endpoint_t *ep,
...
@@ -4401,6 +4458,7 @@ void sctp_send_stale_cookie_err(const sctp_endpoint_t *ep,
sctp_packet_append_chunk
(
packet
,
err_chunk
);
sctp_packet_append_chunk
(
packet
,
err_chunk
);
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SEND_PKT
,
SCTP_PACKET
(
packet
));
SCTP_PACKET
(
packet
));
SCTP_INC_STATS
(
SctpOutCtrlChunks
);
}
else
}
else
sctp_free_chunk
(
err_chunk
);
sctp_free_chunk
(
err_chunk
);
}
}
...
...
net/sctp/ulpqueue.c
View file @
f2b48f2e
...
@@ -266,6 +266,8 @@ static inline struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff *
...
@@ -266,6 +266,8 @@ static inline struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff *
event
=
(
sctp_ulpevent_t
*
)
f_frag
->
cb
;
event
=
(
sctp_ulpevent_t
*
)
f_frag
->
cb
;
SCTP_INC_STATS
(
SctpReasmUsrMsgs
);
return
event
;
return
event
;
}
}
...
...
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