lkml.org 
[lkml]   [2012]   [Aug]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH net-next 5/7] sctp: Push struct net down into all of the state machine functions

    There are a handle of state machine functions primarily those dealing
    with processing INIT packets where there is neither a valid endpoint nor
    a valid assoication from which to derive a struct net. Therefore add
    struct net * to the parameter list of sctp_state_fn_t and update all of
    the state machine functions.

    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    ---
    include/net/sctp/sm.h | 3 +-
    net/sctp/sm_sideeffect.c | 2 +-
    net/sctp/sm_statefuns.c | 619 +++++++++++++++++++++++++---------------------
    3 files changed, 341 insertions(+), 283 deletions(-)

    diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h
    index bcef130..b5887e1 100644
    --- a/include/net/sctp/sm.h
    +++ b/include/net/sctp/sm.h
    @@ -77,7 +77,8 @@ typedef struct {
    int action;
    } sctp_sm_command_t;

    -typedef sctp_disposition_t (sctp_state_fn_t) (const struct sctp_endpoint *,
    +typedef sctp_disposition_t (sctp_state_fn_t) (struct net *,
    + const struct sctp_endpoint *,
    const struct sctp_association *,
    const sctp_subtype_t type,
    void *arg,
    diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
    index 02c4c1c..bcfebb9 100644
    --- a/net/sctp/sm_sideeffect.c
    +++ b/net/sctp/sm_sideeffect.c
    @@ -1123,7 +1123,7 @@ int sctp_do_sm(struct net *net, sctp_event_t event_type, sctp_subtype_t subtype,
    sctp_init_cmd_seq(&commands);

    DEBUG_PRE;
    - status = (*state_fn->fn)(ep, asoc, subtype, event_arg, &commands);
    + status = (*state_fn->fn)(net, ep, asoc, subtype, event_arg, &commands);
    DEBUG_POST;

    error = sctp_side_effects(event_type, subtype, state,
    diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
    index ff2530c..3e5ca61 100644
    --- a/net/sctp/sm_statefuns.c
    +++ b/net/sctp/sm_statefuns.c
    @@ -66,7 +66,8 @@
    #include <net/sctp/sm.h>
    #include <net/sctp/structs.h>

    -static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,
    +static struct sctp_packet *sctp_abort_pkt_new(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    struct sctp_chunk *chunk,
    const void *payload,
    @@ -77,34 +78,40 @@ static int sctp_eat_data(const struct sctp_association *asoc,
    static struct sctp_packet *sctp_ootb_pkt_new(struct net *net,
    const struct sctp_association *asoc,
    const struct sctp_chunk *chunk);
    -static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
    +static void sctp_send_stale_cookie_err(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const struct sctp_chunk *chunk,
    sctp_cmd_seq_t *commands,
    struct sctp_chunk *err_chunk);
    -static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_do_5_2_6_stale(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands);
    -static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_shut_8_4_5(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands);
    -static sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_tabort_8_4_8(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands);
    static struct sctp_sackhdr *sctp_sm_pull_sack(struct sctp_chunk *chunk);

    -static sctp_disposition_t sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands,
    +static sctp_disposition_t sctp_stop_t1_and_abort(struct net *net,
    + sctp_cmd_seq_t *commands,
    __be16 error, int sk_err,
    const struct sctp_association *asoc,
    struct sctp_transport *transport);

    static sctp_disposition_t sctp_sf_abort_violation(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    void *arg,
    @@ -113,6 +120,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
    const size_t paylen);

    static sctp_disposition_t sctp_sf_violation_chunklen(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -120,6 +128,7 @@ static sctp_disposition_t sctp_sf_violation_chunklen(
    sctp_cmd_seq_t *commands);

    static sctp_disposition_t sctp_sf_violation_paramlen(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -127,6 +136,7 @@ static sctp_disposition_t sctp_sf_violation_paramlen(
    sctp_cmd_seq_t *commands);

    static sctp_disposition_t sctp_sf_violation_ctsn(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -134,18 +144,21 @@ static sctp_disposition_t sctp_sf_violation_ctsn(
    sctp_cmd_seq_t *commands);

    static sctp_disposition_t sctp_sf_violation_chunk(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands);

    -static sctp_ierror_t sctp_sf_authenticate(const struct sctp_endpoint *ep,
    +static sctp_ierror_t sctp_sf_authenticate(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    struct sctp_chunk *chunk);

    -static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    +static sctp_disposition_t __sctp_sf_do_9_1_abort(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -205,7 +218,8 @@ sctp_chunk_length_valid(struct sctp_chunk *chunk,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_4_C(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -213,10 +227,9 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
    {
    struct sctp_chunk *chunk = arg;
    struct sctp_ulpevent *ev;
    - struct net *net;

    if (!sctp_vtag_verify_either(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* RFC 2960 6.10 Bundling
    *
    @@ -224,11 +237,11 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
    * SHUTDOWN COMPLETE with any other chunks.
    */
    if (!chunk->singleton)
    - return sctp_sf_violation_chunk(ep, asoc, type, arg, commands);
    + return sctp_sf_violation_chunk(net, ep, asoc, type, arg, commands);

    /* Make sure that the SHUTDOWN_COMPLETE chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* RFC 2960 10.2 SCTP-to-ULP
    @@ -261,7 +274,6 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
    sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
    SCTP_STATE(SCTP_STATE_CLOSED));

    - net = sock_net(asoc->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_SHUTDOWNS);
    SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);

    @@ -292,7 +304,8 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_5_1B_init(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -304,7 +317,6 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
    struct sctp_chunk *err_chunk;
    struct sctp_packet *packet;
    sctp_unrecognized_param_t *unk_param;
    - struct net *net;
    int len;

    /* 6.10 Bundling
    @@ -317,22 +329,21 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
    * with an INIT chunk that is bundled with other chunks.
    */
    if (!chunk->singleton)
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* If the packet is an OOTB packet which is temporarily on the
    * control endpoint, respond with an ABORT.
    */
    - net = sock_net(ep->base.sk);
    if (ep == sctp_sk(net->sctp.ctl_sock)->ep) {
    SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
    - return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
    + return sctp_sf_tabort_8_4_8(net, ep, asoc, type, arg, commands);
    }

    /* 3.1 A packet containing an INIT chunk MUST have a zero Verification
    * Tag.
    */
    if (chunk->sctp_hdr->vtag != 0)
    - return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
    + return sctp_sf_tabort_8_4_8(net, ep, asoc, type, arg, commands);

    /* Make sure that the INIT chunk has a valid length.
    * Normally, this would cause an ABORT with a Protocol Violation
    @@ -340,7 +351,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
    * just discard the packet.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_init_chunk_t)))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* If the INIT is coming toward a closing socket, we'll send back
    * and ABORT. Essentially, this catches the race of INIT being
    @@ -349,7 +360,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
    * can treat this OOTB
    */
    if (sctp_sstate(ep->base.sk, CLOSING))
    - return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
    + return sctp_sf_tabort_8_4_8(net, ep, asoc, type, arg, commands);

    /* Verify the INIT chunk before processing it. */
    err_chunk = NULL;
    @@ -360,7 +371,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
    * Send an ABORT, with causes if there is any.
    */
    if (err_chunk) {
    - packet = sctp_abort_pkt_new(ep, asoc, arg,
    + packet = sctp_abort_pkt_new(net, ep, asoc, arg,
    (__u8 *)(err_chunk->chunk_hdr) +
    sizeof(sctp_chunkhdr_t),
    ntohs(err_chunk->chunk_hdr->length) -
    @@ -377,7 +388,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
    return SCTP_DISPOSITION_NOMEM;
    }
    } else {
    - return sctp_sf_tabort_8_4_8(ep, asoc, type, arg,
    + return sctp_sf_tabort_8_4_8(net, ep, asoc, type, arg,
    commands);
    }
    }
    @@ -489,7 +500,8 @@ nomem:
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_5_1C_ack(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -501,18 +513,18 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
    struct sctp_packet *packet;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* 6.10 Bundling
    * An endpoint MUST NOT bundle INIT, INIT ACK or
    * SHUTDOWN COMPLETE with any other chunks.
    */
    if (!chunk->singleton)
    - return sctp_sf_violation_chunk(ep, asoc, type, arg, commands);
    + return sctp_sf_violation_chunk(net, ep, asoc, type, arg, commands);

    /* Make sure that the INIT-ACK chunk has a valid length */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_initack_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);
    /* Grab the INIT header. */
    chunk->subh.init_hdr = (sctp_inithdr_t *) chunk->skb->data;
    @@ -531,7 +543,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
    * the association.
    */
    if (err_chunk) {
    - packet = sctp_abort_pkt_new(ep, asoc, arg,
    + packet = sctp_abort_pkt_new(net, ep, asoc, arg,
    (__u8 *)(err_chunk->chunk_hdr) +
    sizeof(sctp_chunkhdr_t),
    ntohs(err_chunk->chunk_hdr->length) -
    @@ -542,7 +554,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
    if (packet) {
    sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
    SCTP_PACKET(packet));
    - SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_OUTCTRLCHUNKS);
    + SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
    error = SCTP_ERROR_INV_PARAM;
    }
    }
    @@ -559,10 +571,10 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
    * was malformed.
    */
    if (sctp_auth_recv_cid(SCTP_CID_ABORT, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    - SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_ABORTEDS);
    - return sctp_stop_t1_and_abort(commands, error, ECONNREFUSED,
    + SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
    + return sctp_stop_t1_and_abort(net, commands, error, ECONNREFUSED,
    asoc, chunk->transport);
    }

    @@ -638,7 +650,8 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_5_1D_ce(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type, void *arg,
    sctp_cmd_seq_t *commands)
    @@ -651,15 +664,13 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
    int error = 0;
    struct sctp_chunk *err_chk_p;
    struct sock *sk;
    - struct net *net;

    /* If the packet is an OOTB packet which is temporarily on the
    * control endpoint, respond with an ABORT.
    */
    - net = sock_net(ep->base.sk);
    if (ep == sctp_sk(net->sctp.ctl_sock)->ep) {
    SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
    - return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
    + return sctp_sf_tabort_8_4_8(net, ep, asoc, type, arg, commands);
    }

    /* Make sure that the COOKIE_ECHO chunk has a valid length.
    @@ -668,7 +679,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
    * in sctp_unpack_cookie().
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* If the endpoint is not listening or if the number of associations
    * on the TCP-style socket exceed the max backlog, respond with an
    @@ -677,7 +688,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
    sk = ep->base.sk;
    if (!sctp_sstate(sk, LISTENING) ||
    (sctp_style(sk, TCP) && sk_acceptq_is_full(sk)))
    - return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
    + return sctp_sf_tabort_8_4_8(net, ep, asoc, type, arg, commands);

    /* "Decode" the chunk. We have no optional parameters so we
    * are in good shape.
    @@ -710,13 +721,13 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
    goto nomem;

    case -SCTP_IERROR_STALE_COOKIE:
    - sctp_send_stale_cookie_err(ep, asoc, chunk, commands,
    + sctp_send_stale_cookie_err(net, ep, asoc, chunk, commands,
    err_chk_p);
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    case -SCTP_IERROR_BAD_SIG:
    default:
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }
    }

    @@ -763,14 +774,14 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
    skb_pull(chunk->auth_chunk, sizeof(sctp_chunkhdr_t));
    auth.transport = chunk->transport;

    - ret = sctp_sf_authenticate(ep, new_asoc, type, &auth);
    + ret = sctp_sf_authenticate(net, ep, new_asoc, type, &auth);

    /* We can now safely free the auth_chunk clone */
    kfree_skb(chunk->auth_chunk);

    if (ret != SCTP_IERROR_NO_ERROR) {
    sctp_association_free(new_asoc);
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }
    }

    @@ -863,23 +874,23 @@ nomem:
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_5_1E_ca(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_5_1E_ca(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type, void *arg,
    sctp_cmd_seq_t *commands)
    {
    struct sctp_chunk *chunk = arg;
    struct sctp_ulpevent *ev;
    - struct net *net;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Verify that the chunk length for the COOKIE-ACK is OK.
    * If we don't do this, any bundled chunks may be junked.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* Reset init error count upon receipt of COOKIE-ACK,
    @@ -900,7 +911,6 @@ sctp_disposition_t sctp_sf_do_5_1E_ca(const struct sctp_endpoint *ep,
    SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE));
    sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
    SCTP_STATE(SCTP_STATE_ESTABLISHED));
    - net = sock_net(ep->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
    SCTP_INC_STATS(net, SCTP_MIB_ACTIVEESTABS);
    sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());
    @@ -967,7 +977,8 @@ static sctp_disposition_t sctp_sf_heartbeat(const struct sctp_endpoint *ep,
    }

    /* Generate a HEARTBEAT packet on the given transport. */
    -sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_sendbeat_8_3(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -976,13 +987,11 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep,
    struct sctp_transport *transport = (struct sctp_transport *) arg;

    if (asoc->overall_error_count >= asoc->max_retrans) {
    - struct net *net;
    sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
    SCTP_ERROR(ETIMEDOUT));
    /* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
    sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
    SCTP_PERR(SCTP_ERROR_NO_ERROR));
    - net = sock_net(ep->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
    SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
    return SCTP_DISPOSITION_DELETE_TCB;
    @@ -1039,7 +1048,8 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_beat_8_3(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_beat_8_3(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -1050,11 +1060,11 @@ sctp_disposition_t sctp_sf_beat_8_3(const struct sctp_endpoint *ep,
    size_t paylen = 0;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the HEARTBEAT chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_heartbeat_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* 8.3 The receiver of the HEARTBEAT should immediately
    @@ -1106,7 +1116,8 @@ nomem:
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_backbeat_8_3(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_backbeat_8_3(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -1119,12 +1130,12 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const struct sctp_endpoint *ep,
    unsigned long max_interval;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the HEARTBEAT-ACK chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t) +
    sizeof(sctp_sender_hb_info_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    hbinfo = (sctp_sender_hb_info_t *) chunk->skb->data;
    @@ -1213,7 +1224,7 @@ static int sctp_sf_send_restart_abort(struct net *net, union sctp_addr *ssa,
    /* Association is NULL since this may be a restart attack and we
    * want to send back the attacker's vtag.
    */
    - pkt = sctp_abort_pkt_new(ep, NULL, init, errhdr, len);
    + pkt = sctp_abort_pkt_new(net, ep, NULL, init, errhdr, len);

    if (!pkt)
    goto out;
    @@ -1370,6 +1381,7 @@ static char sctp_tietags_compare(struct sctp_association *new_asoc,
    * chunk handling.
    */
    static sctp_disposition_t sctp_sf_do_unexpected_init(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -1394,20 +1406,20 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
    * with an INIT chunk that is bundled with other chunks.
    */
    if (!chunk->singleton)
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* 3.1 A packet containing an INIT chunk MUST have a zero Verification
    * Tag.
    */
    if (chunk->sctp_hdr->vtag != 0)
    - return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
    + return sctp_sf_tabort_8_4_8(net, ep, asoc, type, arg, commands);

    /* Make sure that the INIT chunk has a valid length.
    * In this case, we generate a protocol violation since we have
    * an association established.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_init_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);
    /* Grab the INIT header. */
    chunk->subh.init_hdr = (sctp_inithdr_t *) chunk->skb->data;
    @@ -1424,7 +1436,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
    * Send an ABORT, with causes if there is any.
    */
    if (err_chunk) {
    - packet = sctp_abort_pkt_new(ep, asoc, arg,
    + packet = sctp_abort_pkt_new(net, ep, asoc, arg,
    (__u8 *)(err_chunk->chunk_hdr) +
    sizeof(sctp_chunkhdr_t),
    ntohs(err_chunk->chunk_hdr->length) -
    @@ -1433,14 +1445,14 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
    if (packet) {
    sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
    SCTP_PACKET(packet));
    - SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_OUTCTRLCHUNKS);
    + SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
    retval = SCTP_DISPOSITION_CONSUME;
    } else {
    retval = SCTP_DISPOSITION_NOMEM;
    }
    goto cleanup;
    } else {
    - return sctp_sf_tabort_8_4_8(ep, asoc, type, arg,
    + return sctp_sf_tabort_8_4_8(net, ep, asoc, type, arg,
    commands);
    }
    }
    @@ -1582,7 +1594,8 @@ cleanup:
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_5_2_1_siminit(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_5_2_1_siminit(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -1591,7 +1604,7 @@ sctp_disposition_t sctp_sf_do_5_2_1_siminit(const struct sctp_endpoint *ep,
    /* Call helper to do the real work for both simulataneous and
    * duplicate INIT chunk handling.
    */
    - return sctp_sf_do_unexpected_init(ep, asoc, type, arg, commands);
    + return sctp_sf_do_unexpected_init(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -1635,7 +1648,8 @@ sctp_disposition_t sctp_sf_do_5_2_1_siminit(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_5_2_2_dupinit(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_5_2_2_dupinit(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -1644,7 +1658,7 @@ sctp_disposition_t sctp_sf_do_5_2_2_dupinit(const struct sctp_endpoint *ep,
    /* Call helper to do the real work for both simulataneous and
    * duplicate INIT chunk handling.
    */
    - return sctp_sf_do_unexpected_init(ep, asoc, type, arg, commands);
    + return sctp_sf_do_unexpected_init(net, ep, asoc, type, arg, commands);
    }


    @@ -1657,19 +1671,19 @@ sctp_disposition_t sctp_sf_do_5_2_2_dupinit(const struct sctp_endpoint *ep,
    * An unexpected INIT ACK usually indicates the processing of an old or
    * duplicated INIT chunk.
    */
    -sctp_disposition_t sctp_sf_do_5_2_3_initack(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_5_2_3_initack(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg, sctp_cmd_seq_t *commands)
    {
    - struct net *net = sock_net(ep->base.sk);
    /* Per the above section, we'll discard the chunk if we have an
    * endpoint. If this is an OOTB INIT-ACK, treat it as such.
    */
    if (ep == sctp_sk(net->sctp.ctl_sock)->ep)
    - return sctp_sf_ootb(ep, asoc, type, arg, commands);
    + return sctp_sf_ootb(net, ep, asoc, type, arg, commands);
    else
    - return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
    + return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands);
    }

    /* Unexpected COOKIE-ECHO handler for peer restart (Table 2, action 'A')
    @@ -1677,7 +1691,8 @@ sctp_disposition_t sctp_sf_do_5_2_3_initack(const struct sctp_endpoint *ep,
    * Section 5.2.4
    * A) In this case, the peer may have restarted.
    */
    -static sctp_disposition_t sctp_sf_do_dupcook_a(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_do_dupcook_a(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    struct sctp_chunk *chunk,
    sctp_cmd_seq_t *commands,
    @@ -1713,7 +1728,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_a(const struct sctp_endpoint *ep,
    * its peer.
    */
    if (sctp_state(asoc, SHUTDOWN_ACK_SENT)) {
    - disposition = sctp_sf_do_9_2_reshutack(ep, asoc,
    + disposition = sctp_sf_do_9_2_reshutack(net, ep, asoc,
    SCTP_ST_CHUNK(chunk->chunk_hdr->type),
    chunk, commands);
    if (SCTP_DISPOSITION_NOMEM == disposition)
    @@ -1776,7 +1791,8 @@ nomem:
    * after responding to the local endpoint's INIT
    */
    /* This case represents an initialization collision. */
    -static sctp_disposition_t sctp_sf_do_dupcook_b(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_do_dupcook_b(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    struct sctp_chunk *chunk,
    sctp_cmd_seq_t *commands,
    @@ -1797,7 +1813,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_b(const struct sctp_endpoint *ep,
    sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
    sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
    SCTP_STATE(SCTP_STATE_ESTABLISHED));
    - SCTP_INC_STATS(sock_net(new_asoc->base.sk), SCTP_MIB_CURRESTAB);
    + SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
    sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());

    repl = sctp_make_cookie_ack(new_asoc, chunk);
    @@ -1846,7 +1862,8 @@ nomem:
    * but a new tag of its own.
    */
    /* This case represents an initialization collision. */
    -static sctp_disposition_t sctp_sf_do_dupcook_c(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_do_dupcook_c(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    struct sctp_chunk *chunk,
    sctp_cmd_seq_t *commands,
    @@ -1867,7 +1884,8 @@ static sctp_disposition_t sctp_sf_do_dupcook_c(const struct sctp_endpoint *ep,
    * enter the ESTABLISHED state, if it has not already done so.
    */
    /* This case represents an initialization collision. */
    -static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_do_dupcook_d(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    struct sctp_chunk *chunk,
    sctp_cmd_seq_t *commands,
    @@ -1889,7 +1907,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep,
    SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE));
    sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
    SCTP_STATE(SCTP_STATE_ESTABLISHED));
    - SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_CURRESTAB);
    + SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
    sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START,
    SCTP_NULL());

    @@ -1961,7 +1979,8 @@ nomem:
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_5_2_4_dupcook(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -1980,7 +1999,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep,
    * done later.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* "Decode" the chunk. We have no optional parameters so we
    @@ -2014,12 +2033,12 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep,
    goto nomem;

    case -SCTP_IERROR_STALE_COOKIE:
    - sctp_send_stale_cookie_err(ep, asoc, chunk, commands,
    + sctp_send_stale_cookie_err(net, ep, asoc, chunk, commands,
    err_chk_p);
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    case -SCTP_IERROR_BAD_SIG:
    default:
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }
    }

    @@ -2030,27 +2049,27 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep,

    switch (action) {
    case 'A': /* Association restart. */
    - retval = sctp_sf_do_dupcook_a(ep, asoc, chunk, commands,
    + retval = sctp_sf_do_dupcook_a(net, ep, asoc, chunk, commands,
    new_asoc);
    break;

    case 'B': /* Collision case B. */
    - retval = sctp_sf_do_dupcook_b(ep, asoc, chunk, commands,
    + retval = sctp_sf_do_dupcook_b(net, ep, asoc, chunk, commands,
    new_asoc);
    break;

    case 'C': /* Collision case C. */
    - retval = sctp_sf_do_dupcook_c(ep, asoc, chunk, commands,
    + retval = sctp_sf_do_dupcook_c(net, ep, asoc, chunk, commands,
    new_asoc);
    break;

    case 'D': /* Collision case D. */
    - retval = sctp_sf_do_dupcook_d(ep, asoc, chunk, commands,
    + retval = sctp_sf_do_dupcook_d(net, ep, asoc, chunk, commands,
    new_asoc);
    break;

    default: /* Discard packet for all others. */
    - retval = sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + retval = sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    break;
    }

    @@ -2076,6 +2095,7 @@ nomem:
    * See sctp_sf_do_9_1_abort().
    */
    sctp_disposition_t sctp_sf_shutdown_pending_abort(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -2085,7 +2105,7 @@ sctp_disposition_t sctp_sf_shutdown_pending_abort(
    struct sctp_chunk *chunk = arg;

    if (!sctp_vtag_verify_either(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the ABORT chunk has a valid length.
    * Since this is an ABORT chunk, we have to discard it
    @@ -2098,7 +2118,7 @@ sctp_disposition_t sctp_sf_shutdown_pending_abort(
    * packet.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_abort_chunk_t)))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* ADD-IP: Special case for ABORT chunks
    * F4) One special consideration is that ABORT Chunks arriving
    @@ -2107,9 +2127,9 @@ sctp_disposition_t sctp_sf_shutdown_pending_abort(
    */
    if (SCTP_ADDR_DEL ==
    sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest))
    - return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
    + return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands);

    - return __sctp_sf_do_9_1_abort(ep, asoc, type, arg, commands);
    + return __sctp_sf_do_9_1_abort(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -2117,7 +2137,8 @@ sctp_disposition_t sctp_sf_shutdown_pending_abort(
    *
    * See sctp_sf_do_9_1_abort().
    */
    -sctp_disposition_t sctp_sf_shutdown_sent_abort(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_shutdown_sent_abort(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2126,7 +2147,7 @@ sctp_disposition_t sctp_sf_shutdown_sent_abort(const struct sctp_endpoint *ep,
    struct sctp_chunk *chunk = arg;

    if (!sctp_vtag_verify_either(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the ABORT chunk has a valid length.
    * Since this is an ABORT chunk, we have to discard it
    @@ -2139,7 +2160,7 @@ sctp_disposition_t sctp_sf_shutdown_sent_abort(const struct sctp_endpoint *ep,
    * packet.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_abort_chunk_t)))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* ADD-IP: Special case for ABORT chunks
    * F4) One special consideration is that ABORT Chunks arriving
    @@ -2148,7 +2169,7 @@ sctp_disposition_t sctp_sf_shutdown_sent_abort(const struct sctp_endpoint *ep,
    */
    if (SCTP_ADDR_DEL ==
    sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest))
    - return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
    + return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands);

    /* Stop the T2-shutdown timer. */
    sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
    @@ -2158,7 +2179,7 @@ sctp_disposition_t sctp_sf_shutdown_sent_abort(const struct sctp_endpoint *ep,
    sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
    SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD));

    - return __sctp_sf_do_9_1_abort(ep, asoc, type, arg, commands);
    + return __sctp_sf_do_9_1_abort(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -2167,6 +2188,7 @@ sctp_disposition_t sctp_sf_shutdown_sent_abort(const struct sctp_endpoint *ep,
    * See sctp_sf_do_9_1_abort().
    */
    sctp_disposition_t sctp_sf_shutdown_ack_sent_abort(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -2176,7 +2198,7 @@ sctp_disposition_t sctp_sf_shutdown_ack_sent_abort(
    /* The same T2 timer, so we should be able to use
    * common function with the SHUTDOWN-SENT state.
    */
    - return sctp_sf_shutdown_sent_abort(ep, asoc, type, arg, commands);
    + return sctp_sf_shutdown_sent_abort(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -2193,7 +2215,8 @@ sctp_disposition_t sctp_sf_shutdown_ack_sent_abort(
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_cookie_echoed_err(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_cookie_echoed_err(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2203,13 +2226,13 @@ sctp_disposition_t sctp_sf_cookie_echoed_err(const struct sctp_endpoint *ep,
    sctp_errhdr_t *err;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the ERROR chunk has a valid length.
    * The parameter walking depends on this as well.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_operr_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* Process the error here */
    @@ -2219,7 +2242,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_err(const struct sctp_endpoint *ep,
    */
    sctp_walk_errors(err, chunk->chunk_hdr) {
    if (SCTP_ERROR_STALE_COOKIE == err->cause)
    - return sctp_sf_do_5_2_6_stale(ep, asoc, type,
    + return sctp_sf_do_5_2_6_stale(net, ep, asoc, type,
    arg, commands);
    }

    @@ -2228,7 +2251,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_err(const struct sctp_endpoint *ep,
    * we are discarding the packet, there should be no adverse
    * affects.
    */
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -2256,7 +2279,8 @@ sctp_disposition_t sctp_sf_cookie_echoed_err(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_do_5_2_6_stale(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2378,7 +2402,8 @@ nomem:
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_9_1_abort(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2387,7 +2412,7 @@ sctp_disposition_t sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    struct sctp_chunk *chunk = arg;

    if (!sctp_vtag_verify_either(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the ABORT chunk has a valid length.
    * Since this is an ABORT chunk, we have to discard it
    @@ -2400,7 +2425,7 @@ sctp_disposition_t sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    * packet.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_abort_chunk_t)))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* ADD-IP: Special case for ABORT chunks
    * F4) One special consideration is that ABORT Chunks arriving
    @@ -2409,12 +2434,13 @@ sctp_disposition_t sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    */
    if (SCTP_ADDR_DEL ==
    sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest))
    - return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
    + return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands);

    - return __sctp_sf_do_9_1_abort(ep, asoc, type, arg, commands);
    + return __sctp_sf_do_9_1_abort(net, ep, asoc, type, arg, commands);
    }

    -static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    +static sctp_disposition_t __sctp_sf_do_9_1_abort(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2423,7 +2449,6 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    struct sctp_chunk *chunk = arg;
    unsigned int len;
    __be16 error = SCTP_ERROR_NO_ERROR;
    - struct net *net;

    /* See if we have an error cause code in the chunk. */
    len = ntohs(chunk->chunk_hdr->length);
    @@ -2432,7 +2457,7 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    sctp_errhdr_t *err;
    sctp_walk_errors(err, chunk->chunk_hdr);
    if ((void *)err != (void *)chunk->chunk_end)
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    error = ((sctp_errhdr_t *)chunk->skb->data)->cause;
    }
    @@ -2440,7 +2465,6 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET));
    /* ASSOC_FAILED will DELETE_TCB. */
    sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, SCTP_PERR(error));
    - net = sock_net(ep->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
    SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);

    @@ -2452,7 +2476,8 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
    *
    * See sctp_sf_do_9_1_abort() above.
    */
    -sctp_disposition_t sctp_sf_cookie_wait_abort(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_cookie_wait_abort(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2463,7 +2488,7 @@ sctp_disposition_t sctp_sf_cookie_wait_abort(const struct sctp_endpoint *ep,
    __be16 error = SCTP_ERROR_NO_ERROR;

    if (!sctp_vtag_verify_either(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the ABORT chunk has a valid length.
    * Since this is an ABORT chunk, we have to discard it
    @@ -2476,27 +2501,28 @@ sctp_disposition_t sctp_sf_cookie_wait_abort(const struct sctp_endpoint *ep,
    * packet.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_abort_chunk_t)))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* See if we have an error cause code in the chunk. */
    len = ntohs(chunk->chunk_hdr->length);
    if (len >= sizeof(struct sctp_chunkhdr) + sizeof(struct sctp_errhdr))
    error = ((sctp_errhdr_t *)chunk->skb->data)->cause;

    - return sctp_stop_t1_and_abort(commands, error, ECONNREFUSED, asoc,
    + return sctp_stop_t1_and_abort(net, commands, error, ECONNREFUSED, asoc,
    chunk->transport);
    }

    /*
    * Process an incoming ICMP as an ABORT. (COOKIE-WAIT state)
    */
    -sctp_disposition_t sctp_sf_cookie_wait_icmp_abort(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_cookie_wait_icmp_abort(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands)
    {
    - return sctp_stop_t1_and_abort(commands, SCTP_ERROR_NO_ERROR,
    + return sctp_stop_t1_and_abort(net, commands, SCTP_ERROR_NO_ERROR,
    ENOPROTOOPT, asoc,
    (struct sctp_transport *)arg);
    }
    @@ -2504,7 +2530,8 @@ sctp_disposition_t sctp_sf_cookie_wait_icmp_abort(const struct sctp_endpoint *ep
    /*
    * Process an ABORT. (COOKIE-ECHOED state)
    */
    -sctp_disposition_t sctp_sf_cookie_echoed_abort(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_cookie_echoed_abort(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2513,7 +2540,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_abort(const struct sctp_endpoint *ep,
    /* There is a single T1 timer, so we should be able to use
    * common function with the COOKIE-WAIT state.
    */
    - return sctp_sf_cookie_wait_abort(ep, asoc, type, arg, commands);
    + return sctp_sf_cookie_wait_abort(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -2521,7 +2548,8 @@ sctp_disposition_t sctp_sf_cookie_echoed_abort(const struct sctp_endpoint *ep,
    *
    * This is common code called by several sctp_sf_*_abort() functions above.
    */
    -static sctp_disposition_t sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands,
    +static sctp_disposition_t sctp_stop_t1_and_abort(struct net *net,
    + sctp_cmd_seq_t *commands,
    __be16 error, int sk_err,
    const struct sctp_association *asoc,
    struct sctp_transport *transport)
    @@ -2529,7 +2557,7 @@ static sctp_disposition_t sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands,
    SCTP_DEBUG_PRINTK("ABORT received (INIT).\n");
    sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
    SCTP_STATE(SCTP_STATE_CLOSED));
    - SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_ABORTEDS);
    + SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
    sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
    SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
    sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(sk_err));
    @@ -2572,7 +2600,8 @@ static sctp_disposition_t sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_9_2_shutdown(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2585,12 +2614,12 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep,
    __u32 ctsn;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the SHUTDOWN chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk,
    sizeof(struct sctp_shutdown_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* Convert the elaborate header. */
    @@ -2610,7 +2639,7 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep,
    * sender with an ABORT.
    */
    if (!TSN_lt(ctsn, asoc->next_tsn))
    - return sctp_sf_violation_ctsn(ep, asoc, type, arg, commands);
    + return sctp_sf_violation_ctsn(net, ep, asoc, type, arg, commands);

    /* API 5.3.1.5 SCTP_SHUTDOWN_EVENT
    * When a peer sends a SHUTDOWN, SCTP delivers this notification to
    @@ -2634,7 +2663,7 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep,
    disposition = SCTP_DISPOSITION_CONSUME;

    if (sctp_outq_is_empty(&asoc->outqueue)) {
    - disposition = sctp_sf_do_9_2_shutdown_ack(ep, asoc, type,
    + disposition = sctp_sf_do_9_2_shutdown_ack(net, ep, asoc, type,
    arg, commands);
    }

    @@ -2660,7 +2689,8 @@ out:
    * The Cumulative TSN Ack of the received SHUTDOWN chunk
    * MUST be processed.
    */
    -sctp_disposition_t sctp_sf_do_9_2_shut_ctsn(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_9_2_shut_ctsn(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2671,12 +2701,12 @@ sctp_disposition_t sctp_sf_do_9_2_shut_ctsn(const struct sctp_endpoint *ep,
    __u32 ctsn;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the SHUTDOWN chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk,
    sizeof(struct sctp_shutdown_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    sdh = (sctp_shutdownhdr_t *)chunk->skb->data;
    @@ -2693,7 +2723,7 @@ sctp_disposition_t sctp_sf_do_9_2_shut_ctsn(const struct sctp_endpoint *ep,
    * sender with an ABORT.
    */
    if (!TSN_lt(ctsn, asoc->next_tsn))
    - return sctp_sf_violation_ctsn(ep, asoc, type, arg, commands);
    + return sctp_sf_violation_ctsn(net, ep, asoc, type, arg, commands);

    /* verify, by checking the Cumulative TSN Ack field of the
    * chunk, that all its outstanding DATA chunks have been
    @@ -2712,7 +2742,8 @@ sctp_disposition_t sctp_sf_do_9_2_shut_ctsn(const struct sctp_endpoint *ep,
    * that belong to this association, it should discard the INIT chunk and
    * retransmit the SHUTDOWN ACK chunk.
    */
    -sctp_disposition_t sctp_sf_do_9_2_reshutack(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_9_2_reshutack(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2723,7 +2754,7 @@ sctp_disposition_t sctp_sf_do_9_2_reshutack(const struct sctp_endpoint *ep,

    /* Make sure that the chunk has a valid length */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* Since we are not going to really process this INIT, there
    @@ -2775,7 +2806,8 @@ nomem:
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_ecn_cwr(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_ecn_cwr(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2786,10 +2818,10 @@ sctp_disposition_t sctp_sf_do_ecn_cwr(const struct sctp_endpoint *ep,
    u32 lowest_tsn;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_ecne_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    cwr = (sctp_cwrhdr_t *) chunk->skb->data;
    @@ -2830,7 +2862,8 @@ sctp_disposition_t sctp_sf_do_ecn_cwr(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_ecne(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_ecne(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2840,10 +2873,10 @@ sctp_disposition_t sctp_sf_do_ecne(const struct sctp_endpoint *ep,
    struct sctp_chunk *chunk = arg;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_ecne_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    ecne = (sctp_ecnehdr_t *) chunk->skb->data;
    @@ -2886,7 +2919,8 @@ sctp_disposition_t sctp_sf_do_ecne(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_eat_data_6_2(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -2899,11 +2933,11 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
    if (!sctp_vtag_verify(chunk, asoc)) {
    sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
    SCTP_NULL());
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }

    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_data_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    error = sctp_eat_data(asoc, chunk, commands );
    @@ -2912,16 +2946,16 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
    break;
    case SCTP_IERROR_HIGH_TSN:
    case SCTP_IERROR_BAD_STREAM:
    - SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
    + SCTP_INC_STATS(net, SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
    goto discard_noforce;
    case SCTP_IERROR_DUP_TSN:
    case SCTP_IERROR_IGNORE_TSN:
    - SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
    + SCTP_INC_STATS(net, SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
    goto discard_force;
    case SCTP_IERROR_NO_DATA:
    goto consume;
    case SCTP_IERROR_PROTO_VIOLATION:
    - return sctp_sf_abort_violation(ep, asoc, chunk, commands,
    + return sctp_sf_abort_violation(net, ep, asoc, chunk, commands,
    (u8 *)chunk->subh.data_hdr, sizeof(sctp_datahdr_t));
    default:
    BUG();
    @@ -3007,7 +3041,8 @@ consume:
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_eat_data_fast_4_4(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_eat_data_fast_4_4(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -3019,11 +3054,11 @@ sctp_disposition_t sctp_sf_eat_data_fast_4_4(const struct sctp_endpoint *ep,
    if (!sctp_vtag_verify(chunk, asoc)) {
    sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
    SCTP_NULL());
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }

    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_data_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    error = sctp_eat_data(asoc, chunk, commands );
    @@ -3037,7 +3072,7 @@ sctp_disposition_t sctp_sf_eat_data_fast_4_4(const struct sctp_endpoint *ep,
    case SCTP_IERROR_NO_DATA:
    goto consume;
    case SCTP_IERROR_PROTO_VIOLATION:
    - return sctp_sf_abort_violation(ep, asoc, chunk, commands,
    + return sctp_sf_abort_violation(net, ep, asoc, chunk, commands,
    (u8 *)chunk->subh.data_hdr, sizeof(sctp_datahdr_t));
    default:
    BUG();
    @@ -3097,7 +3132,8 @@ consume:
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_eat_sack_6_2(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_eat_sack_6_2(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -3108,18 +3144,18 @@ sctp_disposition_t sctp_sf_eat_sack_6_2(const struct sctp_endpoint *ep,
    __u32 ctsn;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the SACK chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_sack_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* Pull the SACK chunk from the data buffer */
    sackh = sctp_sm_pull_sack(chunk);
    /* Was this a bogus SACK? */
    if (!sackh)
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    chunk->subh.sack_hdr = sackh;
    ctsn = ntohl(sackh->cum_tsn_ack);

    @@ -3140,7 +3176,7 @@ sctp_disposition_t sctp_sf_eat_sack_6_2(const struct sctp_endpoint *ep,
    * sender with an ABORT.
    */
    if (!TSN_lt(ctsn, asoc->next_tsn))
    - return sctp_sf_violation_ctsn(ep, asoc, type, arg, commands);
    + return sctp_sf_violation_ctsn(net, ep, asoc, type, arg, commands);

    /* Return this SACK for further processing. */
    sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_SACK, SCTP_SACKH(sackh));
    @@ -3169,7 +3205,8 @@ sctp_disposition_t sctp_sf_eat_sack_6_2(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -static sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_tabort_8_4_8(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -3178,9 +3215,7 @@ static sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
    struct sctp_packet *packet = NULL;
    struct sctp_chunk *chunk = arg;
    struct sctp_chunk *abort;
    - struct net *net;

    - net = sock_net(ep->base.sk);
    packet = sctp_ootb_pkt_new(net, asoc, chunk);

    if (packet) {
    @@ -3207,7 +3242,7 @@ static sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,

    SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);

    - sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    return SCTP_DISPOSITION_CONSUME;
    }

    @@ -3222,7 +3257,8 @@ static sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_operr_notify(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -3232,15 +3268,15 @@ sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep,
    sctp_errhdr_t *err;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the ERROR chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_operr_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);
    sctp_walk_errors(err, chunk->chunk_hdr);
    if ((void *)err != (void *)chunk->chunk_end)
    - return sctp_sf_violation_paramlen(ep, asoc, type, arg,
    + return sctp_sf_violation_paramlen(net, ep, asoc, type, arg,
    (void *)err, commands);

    sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR,
    @@ -3259,7 +3295,8 @@ sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition.
    */
    -sctp_disposition_t sctp_sf_do_9_2_final(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_9_2_final(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -3268,14 +3305,13 @@ sctp_disposition_t sctp_sf_do_9_2_final(const struct sctp_endpoint *ep,
    struct sctp_chunk *chunk = arg;
    struct sctp_chunk *reply;
    struct sctp_ulpevent *ev;
    - struct net *net;

    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the SHUTDOWN_ACK chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);
    /* 10.2 H) SHUTDOWN COMPLETE notification
    *
    @@ -3308,7 +3344,6 @@ sctp_disposition_t sctp_sf_do_9_2_final(const struct sctp_endpoint *ep,

    sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
    SCTP_STATE(SCTP_STATE_CLOSED));
    - net = sock_net(asoc->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_SHUTDOWNS);
    SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
    sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply));
    @@ -3343,7 +3378,8 @@ nomem:
    * receiver of the OOTB packet shall discard the OOTB packet and take
    * no further action.
    */
    -sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_ootb(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -3356,16 +3392,14 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
    __u8 *ch_end;
    int ootb_shut_ack = 0;
    int ootb_cookie_ack = 0;
    - struct net *net;

    - net = sock_net(asoc->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);

    ch = (sctp_chunkhdr_t *) chunk->chunk_hdr;
    do {
    /* Report violation if the chunk is less then minimal */
    if (ntohs(ch->length) < sizeof(sctp_chunkhdr_t))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* Now that we know we at least have a chunk header,
    @@ -3380,7 +3414,7 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
    * sending an ABORT of its own.
    */
    if (SCTP_CID_ABORT == ch->type)
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* RFC 8.4, 7) If the packet contains a "Stale cookie" ERROR
    * or a COOKIE ACK the SCTP Packet should be silently
    @@ -3402,18 +3436,18 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
    /* Report violation if chunk len overflows */
    ch_end = ((__u8 *)ch) + WORD_ROUND(ntohs(ch->length));
    if (ch_end > skb_tail_pointer(skb))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    ch = (sctp_chunkhdr_t *) ch_end;
    } while (ch_end < skb_tail_pointer(skb));

    if (ootb_shut_ack)
    - return sctp_sf_shut_8_4_5(ep, asoc, type, arg, commands);
    + return sctp_sf_shut_8_4_5(net, ep, asoc, type, arg, commands);
    else if (ootb_cookie_ack)
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    else
    - return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
    + return sctp_sf_tabort_8_4_8(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -3437,7 +3471,8 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
    +static sctp_disposition_t sctp_sf_shut_8_4_5(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -3446,9 +3481,7 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
    struct sctp_packet *packet = NULL;
    struct sctp_chunk *chunk = arg;
    struct sctp_chunk *shut;
    - struct net *net;

    - net = sock_net(ep->base.sk);
    packet = sctp_ootb_pkt_new(net, asoc, chunk);

    if (packet) {
    @@ -3479,13 +3512,13 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
    * the reset of the packet.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* We need to discard the rest of the packet to prevent
    * potential bomming attacks from additional bundled chunks.
    * This is documented in SCTP Threats ID.
    */
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }

    return SCTP_DISPOSITION_NOMEM;
    @@ -3502,7 +3535,8 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
    * chunks. --piggy ]
    *
    */
    -sctp_disposition_t sctp_sf_do_8_5_1_E_sa(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_8_5_1_E_sa(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -3512,7 +3546,7 @@ sctp_disposition_t sctp_sf_do_8_5_1_E_sa(const struct sctp_endpoint *ep,

    /* Make sure that the SHUTDOWN_ACK chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    /* Although we do have an association in this case, it corresponds
    @@ -3520,13 +3554,14 @@ sctp_disposition_t sctp_sf_do_8_5_1_E_sa(const struct sctp_endpoint *ep,
    * packet and the state function that handles OOTB SHUTDOWN_ACK is
    * called with a NULL association.
    */
    - SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_OUTOFBLUES);
    + SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);

    - return sctp_sf_shut_8_4_5(ep, NULL, type, arg, commands);
    + return sctp_sf_shut_8_4_5(net, ep, NULL, type, arg, commands);
    }

    /* ADDIP Section 4.2 Upon reception of an ASCONF Chunk. */
    -sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_asconf(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type, void *arg,
    sctp_cmd_seq_t *commands)
    @@ -3542,7 +3577,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
    if (!sctp_vtag_verify(chunk, asoc)) {
    sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
    SCTP_NULL());
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }

    /* ADD-IP: Section 4.1.1
    @@ -3552,11 +3587,11 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
    * described in [I-D.ietf-tsvwg-sctp-auth].
    */
    if (!sctp_addip_noauth && !chunk->auth)
    - return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
    + return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands);

    /* Make sure that the ASCONF ADDIP chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_addip_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    hdr = (sctp_addiphdr_t *)chunk->skb->data;
    @@ -3565,7 +3600,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
    addr_param = (union sctp_addr_param *)hdr->params;
    length = ntohs(addr_param->p.length);
    if (length < sizeof(sctp_paramhdr_t))
    - return sctp_sf_violation_paramlen(ep, asoc, type, arg,
    + return sctp_sf_violation_paramlen(net, ep, asoc, type, arg,
    (void *)addr_param, commands);

    /* Verify the ASCONF chunk before processing it. */
    @@ -3573,7 +3608,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
    (sctp_paramhdr_t *)((void *)addr_param + length),
    (void *)chunk->chunk_end,
    &err_param))
    - return sctp_sf_violation_paramlen(ep, asoc, type, arg,
    + return sctp_sf_violation_paramlen(net, ep, asoc, type, arg,
    (void *)err_param, commands);

    /* ADDIP 5.2 E1) Compare the value of the serial number to the value
    @@ -3653,7 +3688,8 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
    * When building TLV parameters for the ASCONF Chunk that will add or
    * delete IP addresses the D0 to D13 rules should be applied:
    */
    -sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_asconf_ack(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type, void *arg,
    sctp_cmd_seq_t *commands)
    @@ -3668,7 +3704,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
    if (!sctp_vtag_verify(asconf_ack, asoc)) {
    sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
    SCTP_NULL());
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }

    /* ADD-IP, Section 4.1.2:
    @@ -3678,11 +3714,11 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
    * described in [I-D.ietf-tsvwg-sctp-auth].
    */
    if (!sctp_addip_noauth && !asconf_ack->auth)
    - return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
    + return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands);

    /* Make sure that the ADDIP chunk has a valid length. */
    if (!sctp_chunk_length_valid(asconf_ack, sizeof(sctp_addip_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    addip_hdr = (sctp_addiphdr_t *)asconf_ack->skb->data;
    @@ -3693,7 +3729,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
    (sctp_paramhdr_t *)addip_hdr->params,
    (void *)asconf_ack->chunk_end,
    &err_param))
    - return sctp_sf_violation_paramlen(ep, asoc, type, arg,
    + return sctp_sf_violation_paramlen(net, ep, asoc, type, arg,
    (void *)err_param, commands);

    if (last_asconf) {
    @@ -3711,7 +3747,6 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
    */
    if (ADDIP_SERIAL_gte(rcvd_serial, sent_serial + 1) &&
    !(asoc->addip_last_asconf)) {
    - struct net *net;
    abort = sctp_make_abort(asoc, asconf_ack,
    sizeof(sctp_errhdr_t));
    if (abort) {
    @@ -3729,14 +3764,12 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
    SCTP_ERROR(ECONNABORTED));
    sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
    SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
    - net = sock_net(asoc->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
    SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
    return SCTP_DISPOSITION_ABORT;
    }

    if ((rcvd_serial == sent_serial) && asoc->addip_last_asconf) {
    - struct net *net;
    sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
    SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));

    @@ -3765,7 +3798,6 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
    SCTP_ERROR(ECONNABORTED));
    sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
    SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
    - net = sock_net(asoc->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
    SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
    return SCTP_DISPOSITION_ABORT;
    @@ -3788,7 +3820,8 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_eat_fwd_tsn(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -3803,12 +3836,12 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep,
    if (!sctp_vtag_verify(chunk, asoc)) {
    sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
    SCTP_NULL());
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }

    /* Make sure that the FORWARD_TSN chunk has valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_fwdtsn_chunk)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    fwdtsn_hdr = (struct sctp_fwdtsn_hdr *)chunk->skb->data;
    @@ -3855,6 +3888,7 @@ discard_noforce:
    }

    sctp_disposition_t sctp_sf_eat_fwd_tsn_fast(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -3870,12 +3904,12 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn_fast(
    if (!sctp_vtag_verify(chunk, asoc)) {
    sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
    SCTP_NULL());
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }

    /* Make sure that the FORWARD_TSN chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_fwdtsn_chunk)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    fwdtsn_hdr = (struct sctp_fwdtsn_hdr *)chunk->skb->data;
    @@ -3942,7 +3976,8 @@ gen_shutdown:
    *
    * The return value is the disposition of the chunk.
    */
    -static sctp_ierror_t sctp_sf_authenticate(const struct sctp_endpoint *ep,
    +static sctp_ierror_t sctp_sf_authenticate(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    struct sctp_chunk *chunk)
    @@ -4015,7 +4050,8 @@ nomem:
    return SCTP_IERROR_NOMEM;
    }

    -sctp_disposition_t sctp_sf_eat_auth(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_eat_auth(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -4028,21 +4064,21 @@ sctp_disposition_t sctp_sf_eat_auth(const struct sctp_endpoint *ep,

    /* Make sure that the peer has AUTH capable */
    if (!asoc->peer.auth_capable)
    - return sctp_sf_unk_chunk(ep, asoc, type, arg, commands);
    + return sctp_sf_unk_chunk(net, ep, asoc, type, arg, commands);

    if (!sctp_vtag_verify(chunk, asoc)) {
    sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
    SCTP_NULL());
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    }

    /* Make sure that the AUTH chunk has valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_auth_chunk)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    auth_hdr = (struct sctp_authhdr *)chunk->skb->data;
    - error = sctp_sf_authenticate(ep, asoc, type, chunk);
    + error = sctp_sf_authenticate(net, ep, asoc, type, chunk);
    switch (error) {
    case SCTP_IERROR_AUTH_BAD_HMAC:
    /* Generate the ERROR chunk and discard the rest
    @@ -4059,10 +4095,10 @@ sctp_disposition_t sctp_sf_eat_auth(const struct sctp_endpoint *ep,
    /* Fall Through */
    case SCTP_IERROR_AUTH_BAD_KEYID:
    case SCTP_IERROR_BAD_SIG:
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    case SCTP_IERROR_PROTO_VIOLATION:
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    case SCTP_IERROR_NOMEM:
    @@ -4111,7 +4147,8 @@ sctp_disposition_t sctp_sf_eat_auth(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_unk_chunk(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_unk_chunk(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -4124,20 +4161,20 @@ sctp_disposition_t sctp_sf_unk_chunk(const struct sctp_endpoint *ep,
    SCTP_DEBUG_PRINTK("Processing the unknown chunk id %d.\n", type.chunk);

    if (!sctp_vtag_verify(unk_chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the chunk has a valid length.
    * Since we don't know the chunk type, we use a general
    * chunkhdr structure to make a comparison.
    */
    if (!sctp_chunk_length_valid(unk_chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    switch (type.chunk & SCTP_CID_ACTION_MASK) {
    case SCTP_CID_ACTION_DISCARD:
    /* Discard the packet. */
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    break;
    case SCTP_CID_ACTION_DISCARD_ERR:
    /* Generate an ERROR chunk as response. */
    @@ -4152,7 +4189,7 @@ sctp_disposition_t sctp_sf_unk_chunk(const struct sctp_endpoint *ep,
    }

    /* Discard the packet. */
    - sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
    return SCTP_DISPOSITION_CONSUME;
    break;
    case SCTP_CID_ACTION_SKIP:
    @@ -4194,7 +4231,8 @@ sctp_disposition_t sctp_sf_unk_chunk(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_discard_chunk(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_discard_chunk(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -4207,7 +4245,7 @@ sctp_disposition_t sctp_sf_discard_chunk(const struct sctp_endpoint *ep,
    * chunkhdr structure to make a comparison.
    */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    SCTP_DEBUG_PRINTK("Chunk %d is discarded\n", type.chunk);
    @@ -4232,13 +4270,14 @@ sctp_disposition_t sctp_sf_discard_chunk(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_pdiscard(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_pdiscard(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands)
    {
    - SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_IN_PKT_DISCARDS);
    + SCTP_INC_STATS(net, SCTP_MIB_IN_PKT_DISCARDS);
    sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());

    return SCTP_DISPOSITION_CONSUME;
    @@ -4259,7 +4298,8 @@ sctp_disposition_t sctp_sf_pdiscard(const struct sctp_endpoint *ep,
    * We simply tag the chunk as a violation. The state machine will log
    * the violation and continue.
    */
    -sctp_disposition_t sctp_sf_violation(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_violation(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -4269,7 +4309,7 @@ sctp_disposition_t sctp_sf_violation(const struct sctp_endpoint *ep,

    /* Make sure that the chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);

    return SCTP_DISPOSITION_VIOLATION;
    @@ -4279,6 +4319,7 @@ sctp_disposition_t sctp_sf_violation(const struct sctp_endpoint *ep,
    * Common function to handle a protocol violation.
    */
    static sctp_disposition_t sctp_sf_abort_violation(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    void *arg,
    @@ -4289,7 +4330,6 @@ static sctp_disposition_t sctp_sf_abort_violation(
    struct sctp_packet *packet = NULL;
    struct sctp_chunk *chunk = arg;
    struct sctp_chunk *abort = NULL;
    - struct net *net;

    /* SCTP-AUTH, Section 6.3:
    * It should be noted that if the receiver wants to tear
    @@ -4310,7 +4350,6 @@ static sctp_disposition_t sctp_sf_abort_violation(
    if (!abort)
    goto nomem;

    - net = sock_net(ep->base.sk);
    if (asoc) {
    /* Treat INIT-ACK as a special case during COOKIE-WAIT. */
    if (chunk->chunk_hdr->type == SCTP_CID_INIT_ACK &&
    @@ -4369,7 +4408,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
    SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);

    discard:
    - sctp_sf_pdiscard(ep, asoc, SCTP_ST_CHUNK(0), arg, commands);
    + sctp_sf_pdiscard(net, ep, asoc, SCTP_ST_CHUNK(0), arg, commands);
    return SCTP_DISPOSITION_ABORT;

    nomem_pkt:
    @@ -4398,6 +4437,7 @@ nomem:
    * Generate an ABORT chunk and terminate the association.
    */
    static sctp_disposition_t sctp_sf_violation_chunklen(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4406,7 +4446,7 @@ static sctp_disposition_t sctp_sf_violation_chunklen(
    {
    static const char err_str[]="The following chunk had invalid length:";

    - return sctp_sf_abort_violation(ep, asoc, arg, commands, err_str,
    + return sctp_sf_abort_violation(net, ep, asoc, arg, commands, err_str,
    sizeof(err_str));
    }

    @@ -4417,6 +4457,7 @@ static sctp_disposition_t sctp_sf_violation_chunklen(
    * the length is considered as invalid.
    */
    static sctp_disposition_t sctp_sf_violation_paramlen(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4426,7 +4467,6 @@ static sctp_disposition_t sctp_sf_violation_paramlen(
    struct sctp_chunk *chunk = arg;
    struct sctp_paramhdr *param = ext;
    struct sctp_chunk *abort = NULL;
    - struct net *net;

    if (sctp_auth_recv_cid(SCTP_CID_ABORT, asoc))
    goto discard;
    @@ -4436,7 +4476,6 @@ static sctp_disposition_t sctp_sf_violation_paramlen(
    if (!abort)
    goto nomem;

    - net = sock_net(asoc->base.sk);
    sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
    SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);

    @@ -4448,7 +4487,7 @@ static sctp_disposition_t sctp_sf_violation_paramlen(
    SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);

    discard:
    - sctp_sf_pdiscard(ep, asoc, SCTP_ST_CHUNK(0), arg, commands);
    + sctp_sf_pdiscard(net, ep, asoc, SCTP_ST_CHUNK(0), arg, commands);
    return SCTP_DISPOSITION_ABORT;
    nomem:
    return SCTP_DISPOSITION_NOMEM;
    @@ -4461,6 +4500,7 @@ nomem:
    * error code.
    */
    static sctp_disposition_t sctp_sf_violation_ctsn(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4469,7 +4509,7 @@ static sctp_disposition_t sctp_sf_violation_ctsn(
    {
    static const char err_str[]="The cumulative tsn ack beyond the max tsn currently sent:";

    - return sctp_sf_abort_violation(ep, asoc, arg, commands, err_str,
    + return sctp_sf_abort_violation(net, ep, asoc, arg, commands, err_str,
    sizeof(err_str));
    }

    @@ -4480,6 +4520,7 @@ static sctp_disposition_t sctp_sf_violation_ctsn(
    * on the path and we may not want to continue this communication.
    */
    static sctp_disposition_t sctp_sf_violation_chunk(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4489,9 +4530,9 @@ static sctp_disposition_t sctp_sf_violation_chunk(
    static const char err_str[]="The following chunk violates protocol:";

    if (!asoc)
    - return sctp_sf_violation(ep, asoc, type, arg, commands);
    + return sctp_sf_violation(net, ep, asoc, type, arg, commands);

    - return sctp_sf_abort_violation(ep, asoc, arg, commands, err_str,
    + return sctp_sf_abort_violation(net, ep, asoc, arg, commands, err_str,
    sizeof(err_str));
    }
    /***************************************************************************
    @@ -4554,7 +4595,8 @@ static sctp_disposition_t sctp_sf_violation_chunk(
    *
    * The return value is a disposition.
    */
    -sctp_disposition_t sctp_sf_do_prm_asoc(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_prm_asoc(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -4665,7 +4707,8 @@ nomem:
    *
    * The return value is the disposition.
    */
    -sctp_disposition_t sctp_sf_do_prm_send(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_prm_send(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -4704,6 +4747,7 @@ sctp_disposition_t sctp_sf_do_prm_send(const struct sctp_endpoint *ep,
    * The return value is the disposition.
    */
    sctp_disposition_t sctp_sf_do_9_2_prm_shutdown(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4725,7 +4769,7 @@ sctp_disposition_t sctp_sf_do_9_2_prm_shutdown(

    disposition = SCTP_DISPOSITION_CONSUME;
    if (sctp_outq_is_empty(&asoc->outqueue)) {
    - disposition = sctp_sf_do_9_2_start_shutdown(ep, asoc, type,
    + disposition = sctp_sf_do_9_2_start_shutdown(net, ep, asoc, type,
    arg, commands);
    }
    return disposition;
    @@ -4759,6 +4803,7 @@ sctp_disposition_t sctp_sf_do_9_2_prm_shutdown(
    * The return value is the disposition.
    */
    sctp_disposition_t sctp_sf_do_9_1_prm_abort(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4775,7 +4820,6 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(
    */
    struct sctp_chunk *abort = arg;
    sctp_disposition_t retval;
    - struct net *net;

    retval = SCTP_DISPOSITION_CONSUME;

    @@ -4791,7 +4835,6 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(
    sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
    SCTP_PERR(SCTP_ERROR_USER_ABORT));

    - net = sock_net(asoc->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
    SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);

    @@ -4799,7 +4842,8 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(
    }

    /* We tried an illegal operation on an association which is closed. */
    -sctp_disposition_t sctp_sf_error_closed(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_error_closed(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -4812,7 +4856,8 @@ sctp_disposition_t sctp_sf_error_closed(const struct sctp_endpoint *ep,
    /* We tried an illegal operation on an association which is shutting
    * down.
    */
    -sctp_disposition_t sctp_sf_error_shutdown(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_error_shutdown(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -4838,14 +4883,13 @@ sctp_disposition_t sctp_sf_error_shutdown(const struct sctp_endpoint *ep,
    * (timers)
    */
    sctp_disposition_t sctp_sf_cookie_wait_prm_shutdown(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands)
    {
    - struct net *net = sock_net(asoc->base.sk);
    -
    sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
    SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));

    @@ -4874,6 +4918,7 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_shutdown(
    * (timers)
    */
    sctp_disposition_t sctp_sf_cookie_echoed_prm_shutdown(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4882,7 +4927,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_prm_shutdown(
    /* There is a single T1 timer, so we should be able to use
    * common function with the COOKIE-WAIT state.
    */
    - return sctp_sf_cookie_wait_prm_shutdown(ep, asoc, type, arg, commands);
    + return sctp_sf_cookie_wait_prm_shutdown(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -4900,6 +4945,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_prm_shutdown(
    * (timers)
    */
    sctp_disposition_t sctp_sf_cookie_wait_prm_abort(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4908,7 +4954,6 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(
    {
    struct sctp_chunk *abort = arg;
    sctp_disposition_t retval;
    - struct net *net = sock_net(asoc->base.sk);

    /* Stop T1-init timer */
    sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
    @@ -4950,6 +4995,7 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(
    * (timers)
    */
    sctp_disposition_t sctp_sf_cookie_echoed_prm_abort(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4959,7 +5005,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_prm_abort(
    /* There is a single T1 timer, so we should be able to use
    * common function with the COOKIE-WAIT state.
    */
    - return sctp_sf_cookie_wait_prm_abort(ep, asoc, type, arg, commands);
    + return sctp_sf_cookie_wait_prm_abort(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -4975,6 +5021,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_prm_abort(
    * (timers)
    */
    sctp_disposition_t sctp_sf_shutdown_pending_prm_abort(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -4985,7 +5032,7 @@ sctp_disposition_t sctp_sf_shutdown_pending_prm_abort(
    sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
    SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD));

    - return sctp_sf_do_9_1_prm_abort(ep, asoc, type, arg, commands);
    + return sctp_sf_do_9_1_prm_abort(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -5001,6 +5048,7 @@ sctp_disposition_t sctp_sf_shutdown_pending_prm_abort(
    * (timers)
    */
    sctp_disposition_t sctp_sf_shutdown_sent_prm_abort(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -5015,7 +5063,7 @@ sctp_disposition_t sctp_sf_shutdown_sent_prm_abort(
    sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
    SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD));

    - return sctp_sf_do_9_1_prm_abort(ep, asoc, type, arg, commands);
    + return sctp_sf_do_9_1_prm_abort(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -5031,6 +5079,7 @@ sctp_disposition_t sctp_sf_shutdown_sent_prm_abort(
    * (timers)
    */
    sctp_disposition_t sctp_sf_shutdown_ack_sent_prm_abort(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -5040,7 +5089,7 @@ sctp_disposition_t sctp_sf_shutdown_ack_sent_prm_abort(
    /* The same T2 timer, so we should be able to use
    * common function with the SHUTDOWN-SENT state.
    */
    - return sctp_sf_shutdown_sent_prm_abort(ep, asoc, type, arg, commands);
    + return sctp_sf_shutdown_sent_prm_abort(net, ep, asoc, type, arg, commands);
    }

    /*
    @@ -5066,6 +5115,7 @@ sctp_disposition_t sctp_sf_shutdown_ack_sent_prm_abort(
    * association on which a heartbeat should be issued.
    */
    sctp_disposition_t sctp_sf_do_prm_requestheartbeat(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -5097,7 +5147,8 @@ sctp_disposition_t sctp_sf_do_prm_requestheartbeat(
    * When an endpoint has an ASCONF signaled change to be sent to the
    * remote endpoint it should do A1 to A9
    */
    -sctp_disposition_t sctp_sf_do_prm_asconf(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_prm_asconf(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -5118,6 +5169,7 @@ sctp_disposition_t sctp_sf_do_prm_asconf(const struct sctp_endpoint *ep,
    * The return value is the disposition of the primitive.
    */
    sctp_disposition_t sctp_sf_ignore_primitive(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -5139,6 +5191,7 @@ sctp_disposition_t sctp_sf_ignore_primitive(
    * retransmit, the stack will immediately send up this notification.
    */
    sctp_disposition_t sctp_sf_do_no_pending_tsn(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -5170,6 +5223,7 @@ sctp_disposition_t sctp_sf_do_no_pending_tsn(
    * The return value is the disposition.
    */
    sctp_disposition_t sctp_sf_do_9_2_start_shutdown(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -5239,6 +5293,7 @@ nomem:
    * The return value is the disposition.
    */
    sctp_disposition_t sctp_sf_do_9_2_shutdown_ack(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -5257,11 +5312,11 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown_ack(
    */
    if (chunk) {
    if (!sctp_vtag_verify(chunk, asoc))
    - return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
    + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);

    /* Make sure that the SHUTDOWN chunk has a valid length. */
    if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_shutdown_chunk_t)))
    - return sctp_sf_violation_chunklen(ep, asoc, type, arg,
    + return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
    commands);
    }

    @@ -5309,7 +5364,8 @@ nomem:
    *
    * The return value is the disposition of the event.
    */
    -sctp_disposition_t sctp_sf_ignore_other(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_ignore_other(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -5334,14 +5390,14 @@ sctp_disposition_t sctp_sf_ignore_other(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_do_6_3_3_rtx(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_6_3_3_rtx(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands)
    {
    struct sctp_transport *transport = arg;
    - struct net *net = sock_net(asoc->base.sk);

    SCTP_INC_STATS(net, SCTP_MIB_T3_RTX_EXPIREDS);

    @@ -5421,13 +5477,13 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(const struct sctp_endpoint *ep,
    * allow. However, an SCTP transmitter MUST NOT be more aggressive than
    * the following algorithms allow.
    */
    -sctp_disposition_t sctp_sf_do_6_2_sack(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_do_6_2_sack(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands)
    {
    - struct net *net = sock_net(asoc->base.sk);
    SCTP_INC_STATS(net, SCTP_MIB_DELAY_SACK_EXPIREDS);
    sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_FORCE());
    return SCTP_DISPOSITION_CONSUME;
    @@ -5452,7 +5508,8 @@ sctp_disposition_t sctp_sf_do_6_2_sack(const struct sctp_endpoint *ep,
    * (timers, events)
    *
    */
    -sctp_disposition_t sctp_sf_t1_init_timer_expire(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_t1_init_timer_expire(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -5461,7 +5518,6 @@ sctp_disposition_t sctp_sf_t1_init_timer_expire(const struct sctp_endpoint *ep,
    struct sctp_chunk *repl = NULL;
    struct sctp_bind_addr *bp;
    int attempts = asoc->init_err_counter + 1;
    - struct net *net = sock_net(asoc->base.sk);

    SCTP_DEBUG_PRINTK("Timer T1 expired (INIT).\n");
    SCTP_INC_STATS(net, SCTP_MIB_T1_INIT_EXPIREDS);
    @@ -5514,7 +5570,8 @@ sctp_disposition_t sctp_sf_t1_init_timer_expire(const struct sctp_endpoint *ep,
    * (timers, events)
    *
    */
    -sctp_disposition_t sctp_sf_t1_cookie_timer_expire(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_t1_cookie_timer_expire(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -5522,7 +5579,6 @@ sctp_disposition_t sctp_sf_t1_cookie_timer_expire(const struct sctp_endpoint *ep
    {
    struct sctp_chunk *repl = NULL;
    int attempts = asoc->init_err_counter + 1;
    - struct net *net = sock_net(asoc->base.sk);

    SCTP_DEBUG_PRINTK("Timer T1 expired (COOKIE-ECHO).\n");
    SCTP_INC_STATS(net, SCTP_MIB_T1_COOKIE_EXPIREDS);
    @@ -5563,14 +5619,14 @@ sctp_disposition_t sctp_sf_t1_cookie_timer_expire(const struct sctp_endpoint *ep
    * the T2-Shutdown timer, giving its peer ample opportunity to transmit
    * all of its queued DATA chunks that have not yet been sent.
    */
    -sctp_disposition_t sctp_sf_t2_timer_expire(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_t2_timer_expire(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands)
    {
    struct sctp_chunk *reply = NULL;
    - struct net *net = sock_net(asoc->base.sk);

    SCTP_DEBUG_PRINTK("Timer T2 expired.\n");
    SCTP_INC_STATS(net, SCTP_MIB_T2_SHUTDOWN_EXPIREDS);
    @@ -5633,6 +5689,7 @@ nomem:
    * If the T4 RTO timer expires the endpoint should do B1 to B5
    */
    sctp_disposition_t sctp_sf_t4_timer_expire(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    @@ -5641,7 +5698,6 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
    {
    struct sctp_chunk *chunk = asoc->addip_last_asconf;
    struct sctp_transport *transport = chunk->transport;
    - struct net *net = sock_net(asoc->base.sk);

    SCTP_INC_STATS(net, SCTP_MIB_T4_RTO_EXPIREDS);

    @@ -5704,14 +5760,14 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
    * At the expiration of this timer the sender SHOULD abort the association
    * by sending an ABORT chunk.
    */
    -sctp_disposition_t sctp_sf_t5_timer_expire(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_t5_timer_expire(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands)
    {
    struct sctp_chunk *reply = NULL;
    - struct net *net = sock_net(asoc->base.sk);

    SCTP_DEBUG_PRINTK("Timer T5 expired.\n");
    SCTP_INC_STATS(net, SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS);
    @@ -5740,13 +5796,13 @@ nomem:
    * the user. So this routine looks same as sctp_sf_do_9_2_prm_shutdown().
    */
    sctp_disposition_t sctp_sf_autoclose_timer_expire(
    + struct net *net,
    const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    sctp_cmd_seq_t *commands)
    {
    - struct net *net = sock_net(asoc->base.sk);
    int disposition;

    SCTP_INC_STATS(net, SCTP_MIB_AUTOCLOSE_EXPIREDS);
    @@ -5764,7 +5820,7 @@ sctp_disposition_t sctp_sf_autoclose_timer_expire(

    disposition = SCTP_DISPOSITION_CONSUME;
    if (sctp_outq_is_empty(&asoc->outqueue)) {
    - disposition = sctp_sf_do_9_2_start_shutdown(ep, asoc, type,
    + disposition = sctp_sf_do_9_2_start_shutdown(net, ep, asoc, type,
    arg, commands);
    }
    return disposition;
    @@ -5782,7 +5838,8 @@ sctp_disposition_t sctp_sf_autoclose_timer_expire(
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_not_impl(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_not_impl(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -5799,7 +5856,8 @@ sctp_disposition_t sctp_sf_not_impl(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_bug(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_bug(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -5819,7 +5877,8 @@ sctp_disposition_t sctp_sf_bug(const struct sctp_endpoint *ep,
    *
    * The return value is the disposition of the chunk.
    */
    -sctp_disposition_t sctp_sf_timer_ignore(const struct sctp_endpoint *ep,
    +sctp_disposition_t sctp_sf_timer_ignore(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const sctp_subtype_t type,
    void *arg,
    @@ -5861,7 +5920,8 @@ static struct sctp_sackhdr *sctp_sm_pull_sack(struct sctp_chunk *chunk)
    /* Create an ABORT packet to be sent as a response, with the specified
    * error causes.
    */
    -static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,
    +static struct sctp_packet *sctp_abort_pkt_new(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    struct sctp_chunk *chunk,
    const void *payload,
    @@ -5869,9 +5929,7 @@ static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,
    {
    struct sctp_packet *packet;
    struct sctp_chunk *abort;
    - struct net *net;

    - net = sock_net(ep->base.sk);
    packet = sctp_ootb_pkt_new(net, asoc, chunk);

    if (packet) {
    @@ -5984,7 +6042,8 @@ void sctp_ootb_pkt_free(struct sctp_packet *packet)
    }

    /* Send a stale cookie error when a invalid COOKIE ECHO chunk is found */
    -static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
    +static void sctp_send_stale_cookie_err(struct net *net,
    + const struct sctp_endpoint *ep,
    const struct sctp_association *asoc,
    const struct sctp_chunk *chunk,
    sctp_cmd_seq_t *commands,
    @@ -5993,7 +6052,6 @@ static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
    struct sctp_packet *packet;

    if (err_chunk) {
    - struct net *net = sock_net(ep->base.sk);
    packet = sctp_ootb_pkt_new(net, asoc, chunk);
    if (packet) {
    struct sctp_signed_cookie *cookie;
    @@ -6027,7 +6085,7 @@ static int sctp_eat_data(const struct sctp_association *asoc,
    __u32 tsn;
    struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map;
    struct sock *sk = asoc->base.sk;
    - struct net *net;
    + struct net *net = sock_net(sk);
    u16 ssn;
    u16 sid;
    u8 ordered = 0;
    @@ -6144,7 +6202,6 @@ static int sctp_eat_data(const struct sctp_association *asoc,
    * No User Data: This error cause is returned to the originator of a
    * DATA chunk if a received DATA chunk has no user data.
    */
    - net = sock_net(sk);
    if (unlikely(0 == datalen)) {
    err = sctp_make_abort_no_data(asoc, chunk, tsn);
    if (err) {
    --
    1.7.5.4


    \
     
     \ /
      Last update: 2012-08-07 20:02    [W:0.191 / U:91.084 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site