Merge branch 'pandora-27-omap1' into rev2
[pandora-kernel.git] / net / sctp / chunk.c
index 77fb7b0..1748ef9 100644 (file)
@@ -1,17 +1,17 @@
-/* SCTP kernel reference Implementation
+/* SCTP kernel implementation
  * (C) Copyright IBM Corp. 2003, 2004
  *
- * This file is part of the SCTP kernel reference Implementation
+ * This file is part of the SCTP kernel implementation
  *
  * This file contains the code relating the chunk abstraction.
  *
- * 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.
@@ -66,9 +66,10 @@ SCTP_STATIC struct sctp_datamsg *sctp_datamsg_new(gfp_t gfp)
 {
        struct sctp_datamsg *msg;
        msg = kmalloc(sizeof(struct sctp_datamsg), gfp);
-       if (msg)
+       if (msg) {
                sctp_datamsg_init(msg);
-       SCTP_DBG_OBJCNT_INC(datamsg);
+               SCTP_DBG_OBJCNT_INC(datamsg);
+       }
        return msg;
 }
 
@@ -136,20 +137,6 @@ void sctp_datamsg_put(struct sctp_datamsg *msg)
                sctp_datamsg_destroy(msg);
 }
 
-/* Free a message.  Really just give up a reference, the
- * really free happens in sctp_datamsg_destroy().
- */
-void sctp_datamsg_free(struct sctp_datamsg *msg)
-{
-       sctp_datamsg_put(msg);
-}
-
-/* Hold on to all the fragments until all chunks have been sent. */
-void sctp_datamsg_track(struct sctp_chunk *chunk)
-{
-       sctp_chunk_hold(chunk);
-}
-
 /* Assign a chunk to this datamsg. */
 static void sctp_datamsg_assign(struct sctp_datamsg *msg, struct sctp_chunk *chunk)
 {
@@ -189,11 +176,23 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
                                    msecs_to_jiffies(sinfo->sinfo_timetolive);
                msg->can_abandon = 1;
                SCTP_DEBUG_PRINTK("%s: msg:%p expires_at: %ld jiffies:%ld\n",
-                                 __FUNCTION__, msg, msg->expires_at, jiffies);
+                                 __func__, msg, msg->expires_at, jiffies);
        }
 
        max = asoc->frag_point;
 
+       /* If the the peer requested that we authenticate DATA chunks
+        * we need to accound for bundling of the AUTH chunks along with
+        * DATA.
+        */
+       if (sctp_auth_send_cid(SCTP_CID_DATA, asoc)) {
+               struct sctp_hmac *hmac_desc = sctp_auth_asoc_get_hmac(asoc);
+
+               if (hmac_desc)
+                       max -= WORD_ROUND(sizeof(sctp_auth_chunk_t) +
+                                           hmac_desc->hmac_len);
+       }
+
        whole = 0;
        first_len = max;
 
@@ -283,7 +282,7 @@ errout:
                chunk = list_entry(pos, struct sctp_chunk, frag_list);
                sctp_chunk_free(chunk);
        }
-       sctp_datamsg_free(msg);
+       sctp_datamsg_put(msg);
        return NULL;
 }