]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/sctp/sm_sideeffect.c
m68k: Update defconfigs
[linux-2.6-omap-h63xx.git] / net / sctp / sm_sideeffect.c
index bbdc938da86fa37166866b27cd37fe2aa25efd05..23a9f1a95b7d1f0f6b87c4b495880a954aa5502f 100644 (file)
@@ -1,21 +1,21 @@
-/* SCTP kernel reference Implementation
+/* SCTP kernel implementation
  * (C) Copyright IBM Corp. 2001, 2004
  * Copyright (c) 1999 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
  *
- * This file is part of the SCTP kernel reference Implementation
+ * This file is part of the SCTP kernel implementation
  *
  * These functions work with the state functions in sctp_sm_statefuns.c
  * to implement that state operations.  These functions implement the
  * steps which require modifying existing data structures.
  *
- * The SCTP reference implementation is free software;
+ * This SCTP implementation is free software;
  * you can redistribute it and/or modify it under the terms of
  * the GNU General Public License as published by
  * the Free Software Foundation; either version 2, or (at your option)
  * any later version.
  *
- * The SCTP reference implementation is distributed in the hope that it
+ * This SCTP implementation is distributed in the hope that it
  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
  *                 ************************
  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -243,7 +243,7 @@ void sctp_generate_t3_rtx_event(unsigned long peer)
 
        sctp_bh_lock_sock(asoc->base.sk);
        if (sock_owned_by_user(asoc->base.sk)) {
-               SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __FUNCTION__);
+               SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __func__);
 
                /* Try again later.  */
                if (!mod_timer(&transport->T3_rtx_timer, jiffies + (HZ/20)))
@@ -283,7 +283,7 @@ static void sctp_generate_timeout_event(struct sctp_association *asoc,
        sctp_bh_lock_sock(asoc->base.sk);
        if (sock_owned_by_user(asoc->base.sk)) {
                SCTP_DEBUG_PRINTK("%s:Sock is busy: timer %d\n",
-                                 __FUNCTION__,
+                                 __func__,
                                  timeout_type);
 
                /* Try again later.  */
@@ -361,7 +361,7 @@ void sctp_generate_heartbeat_event(unsigned long data)
 
        sctp_bh_lock_sock(asoc->base.sk);
        if (sock_owned_by_user(asoc->base.sk)) {
-               SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __FUNCTION__);
+               SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __func__);
 
                /* Try again later.  */
                if (!mod_timer(&transport->hb_timer, jiffies + (HZ/20)))
@@ -453,6 +453,7 @@ static void sctp_do_8_2_transport_strike(struct sctp_association *asoc,
         * maximum value discussed in rule C7 above (RTO.max) may be
         * used to provide an upper bound to this doubling operation.
         */
+       transport->last_rto = transport->rto;
        transport->rto = min((transport->rto * 2), transport->asoc->rto_max);
 }
 
@@ -544,14 +545,12 @@ static void sctp_cmd_hb_timers_start(sctp_cmd_seq_t *cmds,
                                     struct sctp_association *asoc)
 {
        struct sctp_transport *t;
-       struct list_head *pos;
 
        /* Start a heartbeat timer for each transport on the association.
         * hold a reference on the transport to make sure none of
         * the needed data structures go away.
         */
-       list_for_each(pos, &asoc->peer.transport_addr_list) {
-               t = list_entry(pos, struct sctp_transport, transports);
+       list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) {
 
                if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t)))
                        sctp_transport_hold(t);
@@ -562,12 +561,11 @@ static void sctp_cmd_hb_timers_stop(sctp_cmd_seq_t *cmds,
                                    struct sctp_association *asoc)
 {
        struct sctp_transport *t;
-       struct list_head *pos;
 
        /* Stop all heartbeat timers. */
 
-       list_for_each(pos, &asoc->peer.transport_addr_list) {
-               t = list_entry(pos, struct sctp_transport, transports);
+       list_for_each_entry(t, &asoc->peer.transport_addr_list,
+                       transports) {
                if (del_timer(&t->hb_timer))
                        sctp_transport_put(t);
        }
@@ -578,10 +576,9 @@ static void sctp_cmd_t3_rtx_timers_stop(sctp_cmd_seq_t *cmds,
                                        struct sctp_association *asoc)
 {
        struct sctp_transport *t;
-       struct list_head *pos;
 
-       list_for_each(pos, &asoc->peer.transport_addr_list) {
-               t = list_entry(pos, struct sctp_transport, transports);
+       list_for_each_entry(t, &asoc->peer.transport_addr_list,
+                       transports) {
                if (timer_pending(&t->T3_rtx_timer) &&
                    del_timer(&t->T3_rtx_timer)) {
                        sctp_transport_put(t);
@@ -592,7 +589,6 @@ static void sctp_cmd_t3_rtx_timers_stop(sctp_cmd_seq_t *cmds,
 
 /* Helper function to update the heartbeat timer. */
 static void sctp_cmd_hb_timer_update(sctp_cmd_seq_t *cmds,
-                                    struct sctp_association *asoc,
                                     struct sctp_transport *t)
 {
        /* Update the heartbeat timer.  */
@@ -1064,7 +1060,6 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
        struct sctp_chunk *new_obj;
        struct sctp_chunk *chunk = NULL;
        struct sctp_packet *packet;
-       struct list_head *pos;
        struct timer_list *timer;
        unsigned long timeout;
        struct sctp_transport *t;
@@ -1267,6 +1262,12 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                        sctp_ootb_pkt_free(packet);
                        break;
 
+               case SCTP_CMD_T1_RETRAN:
+                       /* Mark a transport for retransmission.  */
+                       sctp_retransmit(&asoc->outqueue, cmd->obj.transport,
+                                       SCTP_RTXR_T1_RTX);
+                       break;
+
                case SCTP_CMD_RETRAN:
                        /* Mark a transport for retransmission.  */
                        sctp_retransmit(&asoc->outqueue, cmd->obj.transport,
@@ -1390,10 +1391,10 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                        /* If we've sent any data bundled with
                         * COOKIE-ECHO we need to resend.
                         */
-                       list_for_each(pos, &asoc->peer.transport_addr_list) {
-                               t = list_entry(pos, struct sctp_transport,
-                                              transports);
-                               sctp_retransmit_mark(&asoc->outqueue, t, 0);
+                       list_for_each_entry(t, &asoc->peer.transport_addr_list,
+                                       transports) {
+                               sctp_retransmit_mark(&asoc->outqueue, t,
+                                           SCTP_RTXR_T1_RTX);
                        }
 
                        sctp_add_cmd_sf(commands,
@@ -1449,7 +1450,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
 
                case SCTP_CMD_HB_TIMER_UPDATE:
                        t = cmd->obj.transport;
-                       sctp_cmd_hb_timer_update(commands, asoc, t);
+                       sctp_cmd_hb_timer_update(commands, t);
                        break;
 
                case SCTP_CMD_HB_TIMERS_STOP:
@@ -1528,6 +1529,9 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                        error = sctp_auth_asoc_init_active_key(asoc,
                                                GFP_ATOMIC);
                        break;
+               case SCTP_CMD_UPDATE_INITTAG:
+                       asoc->peer.i.init_tag = cmd->obj.u32;
+                       break;
 
                default:
                        printk(KERN_WARNING "Impossible command: %u, %p\n",