|
@@ -251,6 +251,7 @@ void sctp_generate_t3_rtx_event(unsigned long peer)
|
|
int error;
|
|
int error;
|
|
struct sctp_transport *transport = (struct sctp_transport *) peer;
|
|
struct sctp_transport *transport = (struct sctp_transport *) peer;
|
|
struct sctp_association *asoc = transport->asoc;
|
|
struct sctp_association *asoc = transport->asoc;
|
|
|
|
+ struct net *net = sock_net(asoc->base.sk);
|
|
|
|
|
|
/* Check whether a task is in the sock. */
|
|
/* Check whether a task is in the sock. */
|
|
|
|
|
|
@@ -271,7 +272,7 @@ void sctp_generate_t3_rtx_event(unsigned long peer)
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
|
|
|
|
/* Run through the state machine. */
|
|
/* Run through the state machine. */
|
|
- error = sctp_do_sm(SCTP_EVENT_T_TIMEOUT,
|
|
|
|
|
|
+ error = sctp_do_sm(net, SCTP_EVENT_T_TIMEOUT,
|
|
SCTP_ST_TIMEOUT(SCTP_EVENT_TIMEOUT_T3_RTX),
|
|
SCTP_ST_TIMEOUT(SCTP_EVENT_TIMEOUT_T3_RTX),
|
|
asoc->state,
|
|
asoc->state,
|
|
asoc->ep, asoc,
|
|
asoc->ep, asoc,
|
|
@@ -291,6 +292,7 @@ out_unlock:
|
|
static void sctp_generate_timeout_event(struct sctp_association *asoc,
|
|
static void sctp_generate_timeout_event(struct sctp_association *asoc,
|
|
sctp_event_timeout_t timeout_type)
|
|
sctp_event_timeout_t timeout_type)
|
|
{
|
|
{
|
|
|
|
+ struct net *net = sock_net(asoc->base.sk);
|
|
int error = 0;
|
|
int error = 0;
|
|
|
|
|
|
sctp_bh_lock_sock(asoc->base.sk);
|
|
sctp_bh_lock_sock(asoc->base.sk);
|
|
@@ -312,7 +314,7 @@ static void sctp_generate_timeout_event(struct sctp_association *asoc,
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
|
|
|
|
/* Run through the state machine. */
|
|
/* Run through the state machine. */
|
|
- error = sctp_do_sm(SCTP_EVENT_T_TIMEOUT,
|
|
|
|
|
|
+ error = sctp_do_sm(net, SCTP_EVENT_T_TIMEOUT,
|
|
SCTP_ST_TIMEOUT(timeout_type),
|
|
SCTP_ST_TIMEOUT(timeout_type),
|
|
asoc->state, asoc->ep, asoc,
|
|
asoc->state, asoc->ep, asoc,
|
|
(void *)timeout_type, GFP_ATOMIC);
|
|
(void *)timeout_type, GFP_ATOMIC);
|
|
@@ -371,6 +373,7 @@ void sctp_generate_heartbeat_event(unsigned long data)
|
|
int error = 0;
|
|
int error = 0;
|
|
struct sctp_transport *transport = (struct sctp_transport *) data;
|
|
struct sctp_transport *transport = (struct sctp_transport *) data;
|
|
struct sctp_association *asoc = transport->asoc;
|
|
struct sctp_association *asoc = transport->asoc;
|
|
|
|
+ struct net *net = sock_net(asoc->base.sk);
|
|
|
|
|
|
sctp_bh_lock_sock(asoc->base.sk);
|
|
sctp_bh_lock_sock(asoc->base.sk);
|
|
if (sock_owned_by_user(asoc->base.sk)) {
|
|
if (sock_owned_by_user(asoc->base.sk)) {
|
|
@@ -388,7 +391,7 @@ void sctp_generate_heartbeat_event(unsigned long data)
|
|
if (transport->dead)
|
|
if (transport->dead)
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
|
|
|
|
- error = sctp_do_sm(SCTP_EVENT_T_TIMEOUT,
|
|
|
|
|
|
+ error = sctp_do_sm(net, SCTP_EVENT_T_TIMEOUT,
|
|
SCTP_ST_TIMEOUT(SCTP_EVENT_TIMEOUT_HEARTBEAT),
|
|
SCTP_ST_TIMEOUT(SCTP_EVENT_TIMEOUT_HEARTBEAT),
|
|
asoc->state, asoc->ep, asoc,
|
|
asoc->state, asoc->ep, asoc,
|
|
transport, GFP_ATOMIC);
|
|
transport, GFP_ATOMIC);
|
|
@@ -408,6 +411,7 @@ void sctp_generate_proto_unreach_event(unsigned long data)
|
|
{
|
|
{
|
|
struct sctp_transport *transport = (struct sctp_transport *) data;
|
|
struct sctp_transport *transport = (struct sctp_transport *) data;
|
|
struct sctp_association *asoc = transport->asoc;
|
|
struct sctp_association *asoc = transport->asoc;
|
|
|
|
+ struct net *net = sock_net(asoc->base.sk);
|
|
|
|
|
|
sctp_bh_lock_sock(asoc->base.sk);
|
|
sctp_bh_lock_sock(asoc->base.sk);
|
|
if (sock_owned_by_user(asoc->base.sk)) {
|
|
if (sock_owned_by_user(asoc->base.sk)) {
|
|
@@ -426,7 +430,7 @@ void sctp_generate_proto_unreach_event(unsigned long data)
|
|
if (asoc->base.dead)
|
|
if (asoc->base.dead)
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
|
|
|
|
- sctp_do_sm(SCTP_EVENT_T_OTHER,
|
|
|
|
|
|
+ sctp_do_sm(net, SCTP_EVENT_T_OTHER,
|
|
SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH),
|
|
SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH),
|
|
asoc->state, asoc->ep, asoc, transport, GFP_ATOMIC);
|
|
asoc->state, asoc->ep, asoc, transport, GFP_ATOMIC);
|
|
|
|
|
|
@@ -753,8 +757,10 @@ static int sctp_cmd_process_sack(sctp_cmd_seq_t *cmds,
|
|
int err = 0;
|
|
int err = 0;
|
|
|
|
|
|
if (sctp_outq_sack(&asoc->outqueue, sackh)) {
|
|
if (sctp_outq_sack(&asoc->outqueue, sackh)) {
|
|
|
|
+ struct net *net = sock_net(asoc->base.sk);
|
|
|
|
+
|
|
/* There are no more TSNs awaiting SACK. */
|
|
/* There are no more TSNs awaiting SACK. */
|
|
- err = sctp_do_sm(SCTP_EVENT_T_OTHER,
|
|
|
|
|
|
+ err = sctp_do_sm(net, SCTP_EVENT_T_OTHER,
|
|
SCTP_ST_OTHER(SCTP_EVENT_NO_PENDING_TSN),
|
|
SCTP_ST_OTHER(SCTP_EVENT_NO_PENDING_TSN),
|
|
asoc->state, asoc->ep, asoc, NULL,
|
|
asoc->state, asoc->ep, asoc, NULL,
|
|
GFP_ATOMIC);
|
|
GFP_ATOMIC);
|
|
@@ -1042,6 +1048,8 @@ static int sctp_cmd_send_msg(struct sctp_association *asoc,
|
|
*/
|
|
*/
|
|
static void sctp_cmd_send_asconf(struct sctp_association *asoc)
|
|
static void sctp_cmd_send_asconf(struct sctp_association *asoc)
|
|
{
|
|
{
|
|
|
|
+ struct net *net = sock_net(asoc->base.sk);
|
|
|
|
+
|
|
/* Send the next asconf chunk from the addip chunk
|
|
/* Send the next asconf chunk from the addip chunk
|
|
* queue.
|
|
* queue.
|
|
*/
|
|
*/
|
|
@@ -1053,7 +1061,7 @@ static void sctp_cmd_send_asconf(struct sctp_association *asoc)
|
|
|
|
|
|
/* Hold the chunk until an ASCONF_ACK is received. */
|
|
/* Hold the chunk until an ASCONF_ACK is received. */
|
|
sctp_chunk_hold(asconf);
|
|
sctp_chunk_hold(asconf);
|
|
- if (sctp_primitive_ASCONF(asoc, asconf))
|
|
|
|
|
|
+ if (sctp_primitive_ASCONF(net, asoc, asconf))
|
|
sctp_chunk_free(asconf);
|
|
sctp_chunk_free(asconf);
|
|
else
|
|
else
|
|
asoc->addip_last_asconf = asconf;
|
|
asoc->addip_last_asconf = asconf;
|
|
@@ -1089,7 +1097,7 @@ static void sctp_cmd_send_asconf(struct sctp_association *asoc)
|
|
* If you want to understand all of lksctp, this is a
|
|
* If you want to understand all of lksctp, this is a
|
|
* good place to start.
|
|
* good place to start.
|
|
*/
|
|
*/
|
|
-int sctp_do_sm(sctp_event_t event_type, sctp_subtype_t subtype,
|
|
|
|
|
|
+int sctp_do_sm(struct net *net, sctp_event_t event_type, sctp_subtype_t subtype,
|
|
sctp_state_t state,
|
|
sctp_state_t state,
|
|
struct sctp_endpoint *ep,
|
|
struct sctp_endpoint *ep,
|
|
struct sctp_association *asoc,
|
|
struct sctp_association *asoc,
|
|
@@ -1110,7 +1118,7 @@ int sctp_do_sm(sctp_event_t event_type, sctp_subtype_t subtype,
|
|
/* Look up the state function, run it, and then process the
|
|
/* Look up the state function, run it, and then process the
|
|
* side effects. These three steps are the heart of lksctp.
|
|
* side effects. These three steps are the heart of lksctp.
|
|
*/
|
|
*/
|
|
- state_fn = sctp_sm_lookup_event(event_type, state, subtype);
|
|
|
|
|
|
+ state_fn = sctp_sm_lookup_event(net, event_type, state, subtype);
|
|
|
|
|
|
sctp_init_cmd_seq(&commands);
|
|
sctp_init_cmd_seq(&commands);
|
|
|
|
|