Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
a8c617ea
Commit
a8c617ea
authored
Jun 03, 2009
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'net-next' of
git://git.kernel.org/pub/scm/linux/kernel/git/vxy/lksctp-dev
parents
2307f866
c6ba68a2
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
110 additions
and
70 deletions
+110
-70
include/linux/sctp.h
include/linux/sctp.h
+10
-10
include/net/sctp/structs.h
include/net/sctp/structs.h
+2
-4
include/net/sctp/user.h
include/net/sctp/user.h
+2
-0
net/sctp/associola.c
net/sctp/associola.c
+28
-36
net/sctp/sm_make_chunk.c
net/sctp/sm_make_chunk.c
+8
-8
net/sctp/sm_sideeffect.c
net/sctp/sm_sideeffect.c
+5
-3
net/sctp/sm_statefuns.c
net/sctp/sm_statefuns.c
+10
-4
net/sctp/sm_statetable.c
net/sctp/sm_statetable.c
+1
-1
net/sctp/socket.c
net/sctp/socket.c
+41
-1
net/sctp/sysctl.c
net/sctp/sysctl.c
+3
-3
No files found.
include/linux/sctp.h
View file @
a8c617ea
...
...
@@ -487,17 +487,17 @@ typedef enum {
*
* Value Cause Code
* --------- ----------------
* 0x0
10
0 Request to Delete Last Remaining IP Address.
* 0x0
10
1 Operation Refused Due to Resource Shortage.
* 0x0
10
2 Request to Delete Source IP Address.
* 0x0
10
3 Association Aborted due to illegal ASCONF-ACK
* 0x0
10
4 Request refused - no authorization.
* 0x0
0A
0 Request to Delete Last Remaining IP Address.
* 0x0
0A
1 Operation Refused Due to Resource Shortage.
* 0x0
0A
2 Request to Delete Source IP Address.
* 0x0
0A
3 Association Aborted due to illegal ASCONF-ACK
* 0x0
0A
4 Request refused - no authorization.
*/
SCTP_ERROR_DEL_LAST_IP
=
cpu_to_be16
(
0x0
10
0
),
SCTP_ERROR_RSRC_LOW
=
cpu_to_be16
(
0x0
10
1
),
SCTP_ERROR_DEL_SRC_IP
=
cpu_to_be16
(
0x0
10
2
),
SCTP_ERROR_ASCONF_ACK
=
cpu_to_be16
(
0x0
10
3
),
SCTP_ERROR_REQ_REFUSED
=
cpu_to_be16
(
0x0
10
4
),
SCTP_ERROR_DEL_LAST_IP
=
cpu_to_be16
(
0x0
0A
0
),
SCTP_ERROR_RSRC_LOW
=
cpu_to_be16
(
0x0
0A
1
),
SCTP_ERROR_DEL_SRC_IP
=
cpu_to_be16
(
0x0
0A
2
),
SCTP_ERROR_ASCONF_ACK
=
cpu_to_be16
(
0x0
0A
3
),
SCTP_ERROR_REQ_REFUSED
=
cpu_to_be16
(
0x0
0A
4
),
/* AUTH Section 4. New Error Cause
*
...
...
include/net/sctp/structs.h
View file @
a8c617ea
...
...
@@ -1939,10 +1939,8 @@ void sctp_association_free(struct sctp_association *);
void
sctp_association_put
(
struct
sctp_association
*
);
void
sctp_association_hold
(
struct
sctp_association
*
);
struct
sctp_transport
*
sctp_assoc_choose_init_transport
(
struct
sctp_association
*
);
struct
sctp_transport
*
sctp_assoc_choose_shutdown_transport
(
struct
sctp_association
*
);
struct
sctp_transport
*
sctp_assoc_choose_alter_transport
(
struct
sctp_association
*
,
struct
sctp_transport
*
);
void
sctp_assoc_update_retran_path
(
struct
sctp_association
*
);
struct
sctp_transport
*
sctp_assoc_lookup_paddr
(
const
struct
sctp_association
*
,
const
union
sctp_addr
*
);
...
...
include/net/sctp/user.h
View file @
a8c617ea
...
...
@@ -147,6 +147,8 @@ enum sctp_optname {
#define SCTP_GET_LOCAL_ADDRS SCTP_GET_LOCAL_ADDRS
SCTP_SOCKOPT_CONNECTX
,
/* CONNECTX requests. */
#define SCTP_SOCKOPT_CONNECTX SCTP_SOCKOPT_CONNECTX
SCTP_SOCKOPT_CONNECTX3
,
/* CONNECTX requests. (new implementation) */
#define SCTP_SOCKOPT_CONNECTX3 SCTP_SOCKOPT_CONNECTX3
};
/*
...
...
net/sctp/associola.c
View file @
a8c617ea
...
...
@@ -293,7 +293,8 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
* told otherwise.
*/
asoc
->
peer
.
ipv4_address
=
1
;
asoc
->
peer
.
ipv6_address
=
1
;
if
(
asoc
->
base
.
sk
->
sk_family
==
PF_INET6
)
asoc
->
peer
.
ipv6_address
=
1
;
INIT_LIST_HEAD
(
&
asoc
->
asocs
);
asoc
->
autoclose
=
sp
->
autoclose
;
...
...
@@ -566,6 +567,21 @@ void sctp_assoc_rm_peer(struct sctp_association *asoc,
if
(
asoc
->
init_last_sent_to
==
peer
)
asoc
->
init_last_sent_to
=
NULL
;
/* If we remove the transport an SHUTDOWN was last sent to, set it
* to NULL. Combined with the update of the retran path above, this
* will cause the next SHUTDOWN to be sent to the next available
* transport, maintaining the cycle.
*/
if
(
asoc
->
shutdown_last_sent_to
==
peer
)
asoc
->
shutdown_last_sent_to
=
NULL
;
/* If we remove the transport an ASCONF was last sent to, set it to
* NULL.
*/
if
(
asoc
->
addip_last_asconf
&&
asoc
->
addip_last_asconf
->
transport
==
peer
)
asoc
->
addip_last_asconf
->
transport
=
NULL
;
asoc
->
peer
.
transport_count
--
;
sctp_transport_free
(
peer
);
...
...
@@ -1268,49 +1284,21 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
ntohs
(
t
->
ipaddr
.
v4
.
sin_port
));
}
/* Choose the transport for sending a INIT packet. */
struct
sctp_transport
*
sctp_assoc_choose_init_transport
(
struct
sctp_association
*
asoc
)
{
struct
sctp_transport
*
t
;
/* Use the retran path. If the last INIT was sent over the
* retran path, update the retran path and use it.
*/
if
(
!
asoc
->
init_last_sent_to
)
{
t
=
asoc
->
peer
.
active_path
;
}
else
{
if
(
asoc
->
init_last_sent_to
==
asoc
->
peer
.
retran_path
)
sctp_assoc_update_retran_path
(
asoc
);
t
=
asoc
->
peer
.
retran_path
;
}
SCTP_DEBUG_PRINTK_IPADDR
(
"sctp_assoc_update_retran_path:association"
" %p addr: "
,
" port: %d
\n
"
,
asoc
,
(
&
t
->
ipaddr
),
ntohs
(
t
->
ipaddr
.
v4
.
sin_port
));
return
t
;
}
/* Choose the transport for sending a SHUTDOWN packet. */
struct
sctp_transport
*
sctp_assoc_choose_shutdown_transport
(
struct
sctp_association
*
asoc
)
/* Choose the transport for sending retransmit packet. */
struct
sctp_transport
*
sctp_assoc_choose_alter_transport
(
struct
sctp_association
*
asoc
,
struct
sctp_transport
*
last_sent_to
)
{
/* If this is the first time
SHUTDOWN
is sent, use the active path,
* else use the retran path. If the last
SHUTDOWN
was sent over the
/* If this is the first time
packet
is sent, use the active path,
* else use the retran path. If the last
packet
was sent over the
* retran path, update the retran path and use it.
*/
if
(
!
asoc
->
shutdown_
last_sent_to
)
if
(
!
last_sent_to
)
return
asoc
->
peer
.
active_path
;
else
{
if
(
asoc
->
shutdown_
last_sent_to
==
asoc
->
peer
.
retran_path
)
if
(
last_sent_to
==
asoc
->
peer
.
retran_path
)
sctp_assoc_update_retran_path
(
asoc
);
return
asoc
->
peer
.
retran_path
;
}
}
/* Update the association's pmtu and frag_point by going through all the
...
...
@@ -1482,6 +1470,10 @@ int sctp_assoc_set_id(struct sctp_association *asoc, gfp_t gfp)
{
int
assoc_id
;
int
error
=
0
;
/* If the id is already assigned, keep it. */
if
(
asoc
->
assoc_id
)
return
error
;
retry:
if
(
unlikely
(
!
idr_pre_get
(
&
sctp_assocs_id
,
gfp
)))
return
-
ENOMEM
;
...
...
net/sctp/sm_make_chunk.c
View file @
a8c617ea
...
...
@@ -2864,19 +2864,19 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
switch
(
addr_param
->
v4
.
param_hdr
.
type
)
{
case
SCTP_PARAM_IPV6_ADDRESS
:
if
(
!
asoc
->
peer
.
ipv6_address
)
return
SCTP_ERROR_
INV_PARAM
;
return
SCTP_ERROR_
DNS_FAILED
;
break
;
case
SCTP_PARAM_IPV4_ADDRESS
:
if
(
!
asoc
->
peer
.
ipv4_address
)
return
SCTP_ERROR_
INV_PARAM
;
return
SCTP_ERROR_
DNS_FAILED
;
break
;
default:
return
SCTP_ERROR_
INV_PARAM
;
return
SCTP_ERROR_
DNS_FAILED
;
}
af
=
sctp_get_af_specific
(
param_type2af
(
addr_param
->
v4
.
param_hdr
.
type
));
if
(
unlikely
(
!
af
))
return
SCTP_ERROR_
INV_PARAM
;
return
SCTP_ERROR_
DNS_FAILED
;
af
->
from_addr_param
(
&
addr
,
addr_param
,
htons
(
asoc
->
peer
.
port
),
0
);
...
...
@@ -2886,7 +2886,7 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
* make sure we check for that)
*/
if
(
!
af
->
is_any
(
&
addr
)
&&
!
af
->
addr_valid
(
&
addr
,
NULL
,
asconf
->
skb
))
return
SCTP_ERROR_
INV_PARAM
;
return
SCTP_ERROR_
DNS_FAILED
;
switch
(
asconf_param
->
param_hdr
.
type
)
{
case
SCTP_PARAM_ADD_IP
:
...
...
@@ -2954,12 +2954,12 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
peer
=
sctp_assoc_lookup_paddr
(
asoc
,
&
addr
);
if
(
!
peer
)
return
SCTP_ERROR_
INV_PARAM
;
return
SCTP_ERROR_
DNS_FAILED
;
sctp_assoc_set_primary
(
asoc
,
peer
);
break
;
default:
return
SCTP_ERROR_
INV
_PARAM
;
return
SCTP_ERROR_
UNKNOWN
_PARAM
;
break
;
}
...
...
@@ -3273,7 +3273,7 @@ int sctp_process_asconf_ack(struct sctp_association *asoc,
retval
=
1
;
break
;
case
SCTP_ERROR_
INV
_PARAM
:
case
SCTP_ERROR_
UNKNOWN
_PARAM
:
/* Disable sending this type of asconf parameter in
* future.
*/
...
...
net/sctp/sm_sideeffect.c
View file @
a8c617ea
...
...
@@ -686,7 +686,8 @@ static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds,
{
struct
sctp_transport
*
t
;
t
=
sctp_assoc_choose_shutdown_transport
(
asoc
);
t
=
sctp_assoc_choose_alter_transport
(
asoc
,
asoc
->
shutdown_last_sent_to
);
asoc
->
shutdown_last_sent_to
=
t
;
asoc
->
timeouts
[
SCTP_EVENT_TIMEOUT_T2_SHUTDOWN
]
=
t
->
rto
;
chunk
->
transport
=
t
;
...
...
@@ -777,7 +778,7 @@ static void sctp_cmd_setup_t4(sctp_cmd_seq_t *cmds,
{
struct
sctp_transport
*
t
;
t
=
asoc
->
peer
.
active_path
;
t
=
sctp_assoc_choose_alter_transport
(
asoc
,
chunk
->
transport
)
;
asoc
->
timeouts
[
SCTP_EVENT_TIMEOUT_T4_RTO
]
=
t
->
rto
;
chunk
->
transport
=
t
;
}
...
...
@@ -1379,7 +1380,8 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
case
SCTP_CMD_INIT_CHOOSE_TRANSPORT
:
chunk
=
cmd
->
obj
.
ptr
;
t
=
sctp_assoc_choose_init_transport
(
asoc
);
t
=
sctp_assoc_choose_alter_transport
(
asoc
,
asoc
->
init_last_sent_to
);
asoc
->
init_last_sent_to
=
t
;
chunk
->
transport
=
t
;
t
->
init_sent_count
++
;
...
...
net/sctp/sm_statefuns.c
View file @
a8c617ea
...
...
@@ -5432,9 +5432,13 @@ sctp_disposition_t sctp_sf_t2_timer_expire(const struct sctp_endpoint *ep,
if
(
!
reply
)
goto
nomem
;
/* Do some failure management (Section 8.2). */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_STRIKE
,
SCTP_TRANSPORT
(
asoc
->
shutdown_last_sent_to
));
/* Do some failure management (Section 8.2).
* If we remove the transport an SHUTDOWN was last sent to, don't
* do failure management.
*/
if
(
asoc
->
shutdown_last_sent_to
)
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_STRIKE
,
SCTP_TRANSPORT
(
asoc
->
shutdown_last_sent_to
));
/* Set the transport for the SHUTDOWN/ACK chunk and the timeout for
* the T2-shutdown timer.
...
...
@@ -5471,7 +5475,9 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
* detection on the appropriate destination address as defined in
* RFC2960 [5] section 8.1 and 8.2.
*/
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_STRIKE
,
SCTP_TRANSPORT
(
transport
));
if
(
transport
)
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_STRIKE
,
SCTP_TRANSPORT
(
transport
));
/* Reconfig T4 timer and transport. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SETUP_T4
,
SCTP_CHUNK
(
chunk
));
...
...
net/sctp/sm_statetable.c
View file @
a8c617ea
...
...
@@ -698,7 +698,7 @@ chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = {
TYPE_SCTP_FUNC(sctp_sf_do_prm_asconf), \
/* SCTP_STATE_SHUTDOWN_ACK_SENT */
\
TYPE_SCTP_FUNC(sctp_sf_error_shutdown), \
}
/* TYPE_SCTP_PRIMITIVE_
REQUESTHEARTBEAT
*/
}
/* TYPE_SCTP_PRIMITIVE_
ASCONF
*/
/* The primary index for this table is the primitive type.
* The secondary index for this table is the state.
...
...
net/sctp/socket.c
View file @
a8c617ea
...
...
@@ -1100,6 +1100,15 @@ static int __sctp_connect(struct sock* sk,
goto
out_free
;
}
/* In case the user of sctp_connectx() wants an association
* id back, assign one now.
*/
if
(
assoc_id
)
{
err
=
sctp_assoc_set_id
(
asoc
,
GFP_KERNEL
);
if
(
err
<
0
)
goto
out_free
;
}
err
=
sctp_primitive_ASSOCIATE
(
asoc
,
NULL
);
if
(
err
<
0
)
{
goto
out_free
;
...
...
@@ -1120,7 +1129,7 @@ static int __sctp_connect(struct sock* sk,
timeo
=
sock_sndtimeo
(
sk
,
f_flags
&
O_NONBLOCK
);
err
=
sctp_wait_for_connect
(
asoc
,
&
timeo
);
if
(
!
err
&&
assoc_id
)
if
(
(
err
==
0
||
err
==
-
EINPROGRESS
)
&&
assoc_id
)
*
assoc_id
=
asoc
->
assoc_id
;
/* Don't free association on exit. */
...
...
@@ -1264,6 +1273,34 @@ SCTP_STATIC int sctp_setsockopt_connectx(struct sock* sk,
return
assoc_id
;
}
/*
* New (hopefully final) interface for the API. The option buffer is used
* both for the returned association id and the addresses.
*/
SCTP_STATIC
int
sctp_getsockopt_connectx3
(
struct
sock
*
sk
,
int
len
,
char
__user
*
optval
,
int
__user
*
optlen
)
{
sctp_assoc_t
assoc_id
=
0
;
int
err
=
0
;
if
(
len
<
sizeof
(
assoc_id
))
return
-
EINVAL
;
err
=
__sctp_setsockopt_connectx
(
sk
,
(
struct
sockaddr
__user
*
)(
optval
+
sizeof
(
assoc_id
)),
len
-
sizeof
(
assoc_id
),
&
assoc_id
);
if
(
err
==
0
||
err
==
-
EINPROGRESS
)
{
if
(
copy_to_user
(
optval
,
&
assoc_id
,
sizeof
(
assoc_id
)))
return
-
EFAULT
;
if
(
put_user
(
sizeof
(
assoc_id
),
optlen
))
return
-
EFAULT
;
}
return
err
;
}
/* API 3.1.4 close() - UDP Style Syntax
* Applications use close() to perform graceful shutdown (as described in
* Section 10.1 of [SCTP]) on ALL the associations currently represented
...
...
@@ -5578,6 +5615,9 @@ SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname,
retval
=
sctp_getsockopt_local_addrs
(
sk
,
len
,
optval
,
optlen
);
break
;
case
SCTP_SOCKOPT_CONNECTX3
:
retval
=
sctp_getsockopt_connectx3
(
sk
,
len
,
optval
,
optlen
);
break
;
case
SCTP_DEFAULT_SEND_PARAM
:
retval
=
sctp_getsockopt_default_send_param
(
sk
,
len
,
optval
,
optlen
);
...
...
net/sctp/sysctl.c
View file @
a8c617ea
...
...
@@ -49,8 +49,8 @@ static int zero = 0;
static
int
one
=
1
;
static
int
timer_max
=
86400000
;
/* ms in one day */
static
int
int_max
=
INT_MAX
;
static
long
sack_timer_min
=
1
;
static
long
sack_timer_max
=
500
;
static
int
sack_timer_min
=
1
;
static
int
sack_timer_max
=
500
;
extern
int
sysctl_sctp_mem
[
3
];
extern
int
sysctl_sctp_rmem
[
3
];
...
...
@@ -223,7 +223,7 @@ static ctl_table sctp_table[] = {
.
ctl_name
=
NET_SCTP_SACK_TIMEOUT
,
.
procname
=
"sack_timeout"
,
.
data
=
&
sctp_sack_timeout
,
.
maxlen
=
sizeof
(
long
),
.
maxlen
=
sizeof
(
int
),
.
mode
=
0644
,
.
proc_handler
=
proc_dointvec_minmax
,
.
strategy
=
sysctl_intvec
,
...
...
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