[kernel] r7788 - in dists/trunk/linux-2.6/debian: .
patches/features/all patches/series
Dann Frazier
dannf at alioth.debian.org
Mon Nov 13 07:42:28 UTC 2006
Author: dannf
Date: Mon Nov 13 08:42:27 2006
New Revision: 7788
Added:
dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-1.patch
dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-2.patch
dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-3.patch
dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-4.patch
dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-5.patch
dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-6.patch
dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-7.patch
Modified:
dists/trunk/linux-2.6/debian/changelog
dists/trunk/linux-2.6/debian/patches/series/6
Log:
* Backport various SCTP changesets from 2.6.19, recommended by Vlad Yasevich
(closes: #397946)
Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog (original)
+++ dists/trunk/linux-2.6/debian/changelog Mon Nov 13 08:42:27 2006
@@ -22,7 +22,11 @@
[ Martin Michlmayr ]
- arm: Set CONFIG_BINFMT_MISC=m
- -- maximilian attems <maks at sternwelten.at> Fri, 10 Nov 2006 08:57:45 +0100
+ [ dann frazier ]
+ * Backport various SCTP changesets from 2.6.19, recommended by Vlad Yasevich
+ (closes: #397946)
+
+ -- dann frazier <dannf at debian.org> Mon, 13 Nov 2006 00:39:30 -0700
linux-2.6 (2.6.18-5) unstable; urgency=low
Added: dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-1.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-1.patch Mon Nov 13 08:42:27 2006
@@ -0,0 +1,331 @@
+From: Sridhar Samudrala <sri at us.ibm.com>
+Date: Tue, 22 Aug 2006 07:15:33 +0000 (-0700)
+Subject: [SCTP]: Extend /proc/net/sctp/snmp to provide more statistics.
+X-Git-Tag: v2.6.19-rc1
+X-Git-Url: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=ac0b04627269ff16c3c7ab854a65fe6780c6e3e5
+
+[SCTP]: Extend /proc/net/sctp/snmp to provide more statistics.
+
+This patch adds more statistics info under /proc/net/sctp/snmp
+that should be useful for debugging. The additional events that
+are counted now include timer expirations, retransmits, packet
+and data chunk discards.
+
+The Data chunk discards include all the cases where a data chunk
+is discarded including high tsn, bad stream, dup tsn and the most
+useful one(out of receive buffer/rwnd).
+
+Also moved the SCTP MIB data structures from the generic include
+directories to include/sctp/sctp.h.
+
+Signed-off-by: Sridhar Samudrala <sri at us.ibm.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+
+--- a/include/linux/snmp.h
++++ b/include/linux/snmp.h
+@@ -160,39 +160,6 @@ enum
+ __UDP_MIB_MAX
+ };
+
+-/* sctp mib definitions */
+-/*
+- * draft-ietf-sigtran-sctp-mib-07.txt
+- */
+-enum
+-{
+- SCTP_MIB_NUM = 0,
+- SCTP_MIB_CURRESTAB, /* CurrEstab */
+- SCTP_MIB_ACTIVEESTABS, /* ActiveEstabs */
+- SCTP_MIB_PASSIVEESTABS, /* PassiveEstabs */
+- SCTP_MIB_ABORTEDS, /* Aborteds */
+- SCTP_MIB_SHUTDOWNS, /* Shutdowns */
+- SCTP_MIB_OUTOFBLUES, /* OutOfBlues */
+- SCTP_MIB_CHECKSUMERRORS, /* ChecksumErrors */
+- SCTP_MIB_OUTCTRLCHUNKS, /* OutCtrlChunks */
+- SCTP_MIB_OUTORDERCHUNKS, /* OutOrderChunks */
+- SCTP_MIB_OUTUNORDERCHUNKS, /* OutUnorderChunks */
+- SCTP_MIB_INCTRLCHUNKS, /* InCtrlChunks */
+- SCTP_MIB_INORDERCHUNKS, /* InOrderChunks */
+- SCTP_MIB_INUNORDERCHUNKS, /* InUnorderChunks */
+- SCTP_MIB_FRAGUSRMSGS, /* FragUsrMsgs */
+- SCTP_MIB_REASMUSRMSGS, /* ReasmUsrMsgs */
+- SCTP_MIB_OUTSCTPPACKS, /* OutSCTPPacks */
+- SCTP_MIB_INSCTPPACKS, /* InSCTPPacks */
+- SCTP_MIB_RTOALGORITHM, /* RtoAlgorithm */
+- SCTP_MIB_RTOMIN, /* RtoMin */
+- SCTP_MIB_RTOMAX, /* RtoMax */
+- SCTP_MIB_RTOINITIAL, /* RtoInitial */
+- SCTP_MIB_VALCOOKIELIFE, /* ValCookieLife */
+- SCTP_MIB_MAXINITRETR, /* MaxInitRetr */
+- __SCTP_MIB_MAX
+-};
+-
+ /* linux mib definitions */
+ enum
+ {
+--- a/include/net/sctp/sctp.h
++++ b/include/net/sctp/sctp.h
+@@ -216,6 +216,50 @@ DECLARE_SNMP_STAT(struct sctp_mib, sctp_
+
+ #endif /* !TEST_FRAME */
+
++/* sctp mib definitions */
++enum
++{
++ SCTP_MIB_NUM = 0,
++ SCTP_MIB_CURRESTAB, /* CurrEstab */
++ SCTP_MIB_ACTIVEESTABS, /* ActiveEstabs */
++ SCTP_MIB_PASSIVEESTABS, /* PassiveEstabs */
++ SCTP_MIB_ABORTEDS, /* Aborteds */
++ SCTP_MIB_SHUTDOWNS, /* Shutdowns */
++ SCTP_MIB_OUTOFBLUES, /* OutOfBlues */
++ SCTP_MIB_CHECKSUMERRORS, /* ChecksumErrors */
++ SCTP_MIB_OUTCTRLCHUNKS, /* OutCtrlChunks */
++ SCTP_MIB_OUTORDERCHUNKS, /* OutOrderChunks */
++ SCTP_MIB_OUTUNORDERCHUNKS, /* OutUnorderChunks */
++ SCTP_MIB_INCTRLCHUNKS, /* InCtrlChunks */
++ SCTP_MIB_INORDERCHUNKS, /* InOrderChunks */
++ SCTP_MIB_INUNORDERCHUNKS, /* InUnorderChunks */
++ SCTP_MIB_FRAGUSRMSGS, /* FragUsrMsgs */
++ SCTP_MIB_REASMUSRMSGS, /* ReasmUsrMsgs */
++ SCTP_MIB_OUTSCTPPACKS, /* OutSCTPPacks */
++ SCTP_MIB_INSCTPPACKS, /* InSCTPPacks */
++ SCTP_MIB_T1_INIT_EXPIREDS,
++ SCTP_MIB_T1_COOKIE_EXPIREDS,
++ SCTP_MIB_T2_SHUTDOWN_EXPIREDS,
++ SCTP_MIB_T3_RTX_EXPIREDS,
++ SCTP_MIB_T4_RTO_EXPIREDS,
++ SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS,
++ SCTP_MIB_DELAY_SACK_EXPIREDS,
++ SCTP_MIB_AUTOCLOSE_EXPIREDS,
++ SCTP_MIB_T3_RETRANSMITS,
++ SCTP_MIB_PMTUD_RETRANSMITS,
++ SCTP_MIB_FAST_RETRANSMITS,
++ SCTP_MIB_IN_PKT_SOFTIRQ,
++ SCTP_MIB_IN_PKT_BACKLOG,
++ SCTP_MIB_IN_PKT_DISCARDS,
++ SCTP_MIB_IN_DATA_CHUNK_DISCARDS,
++ __SCTP_MIB_MAX
++};
++
++#define SCTP_MIB_MAX __SCTP_MIB_MAX
++struct sctp_mib {
++ unsigned long mibs[SCTP_MIB_MAX];
++} __SNMP_MIB_ALIGN__;
++
+
+ /* Print debugging messages. */
+ #if SCTP_DEBUG
+--- a/include/net/snmp.h
++++ b/include/net/snmp.h
+@@ -100,12 +100,6 @@ struct udp_mib {
+ unsigned long mibs[UDP_MIB_MAX];
+ } __SNMP_MIB_ALIGN__;
+
+-/* SCTP */
+-#define SCTP_MIB_MAX __SCTP_MIB_MAX
+-struct sctp_mib {
+- unsigned long mibs[SCTP_MIB_MAX];
+-} __SNMP_MIB_ALIGN__;
+-
+ /* Linux */
+ #define LINUX_MIB_MAX __LINUX_MIB_MAX
+ struct linux_mib {
+--- a/net/sctp/input.c
++++ b/net/sctp/input.c
+@@ -255,10 +255,13 @@ int sctp_rcv(struct sk_buff *skb)
+ */
+ sctp_bh_lock_sock(sk);
+
+- if (sock_owned_by_user(sk))
++ if (sock_owned_by_user(sk)) {
++ SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG);
+ sctp_add_backlog(sk, skb);
+- else
++ } else {
++ SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_SOFTIRQ);
+ sctp_inq_push(&chunk->rcvr->inqueue, chunk);
++ }
+
+ sctp_bh_unlock_sock(sk);
+
+@@ -271,6 +274,7 @@ int sctp_rcv(struct sk_buff *skb)
+ return 0;
+
+ discard_it:
++ SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_DISCARDS);
+ kfree_skb(skb);
+ return 0;
+
+--- a/net/sctp/inqueue.c
++++ b/net/sctp/inqueue.c
+@@ -87,7 +87,7 @@ void sctp_inq_free(struct sctp_inq *queu
+ /* Put a new packet in an SCTP inqueue.
+ * We assume that packet->sctp_hdr is set and in host byte order.
+ */
+-void sctp_inq_push(struct sctp_inq *q, struct sctp_chunk *packet)
++void sctp_inq_push(struct sctp_inq *q, struct sctp_chunk *chunk)
+ {
+ /* Directly call the packet handling routine. */
+
+@@ -96,7 +96,7 @@ void sctp_inq_push(struct sctp_inq *q, s
+ * Eventually, we should clean up inqueue to not rely
+ * on the BH related data structures.
+ */
+- list_add_tail(&packet->list, &q->in_chunk_list);
++ list_add_tail(&chunk->list, &q->in_chunk_list);
+ q->immediate.func(q->immediate.data);
+ }
+
+--- a/net/sctp/outqueue.c
++++ b/net/sctp/outqueue.c
+@@ -467,6 +467,7 @@ void sctp_retransmit(struct sctp_outq *q
+
+ switch(reason) {
+ case SCTP_RTXR_T3_RTX:
++ SCTP_INC_STATS(SCTP_MIB_T3_RETRANSMITS);
+ sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_T3_RTX);
+ /* Update the retran path if the T3-rtx timer has expired for
+ * the current retran path.
+@@ -475,12 +476,15 @@ void sctp_retransmit(struct sctp_outq *q
+ sctp_assoc_update_retran_path(transport->asoc);
+ break;
+ case SCTP_RTXR_FAST_RTX:
++ SCTP_INC_STATS(SCTP_MIB_FAST_RETRANSMITS);
+ sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_FAST_RTX);
+ fast_retransmit = 1;
+ break;
+ case SCTP_RTXR_PMTUD:
+- default:
++ SCTP_INC_STATS(SCTP_MIB_PMTUD_RETRANSMITS);
+ break;
++ default:
++ BUG();
+ }
+
+ sctp_retransmit_mark(q, transport, fast_retransmit);
+--- a/net/sctp/proc.c
++++ b/net/sctp/proc.c
+@@ -57,6 +57,21 @@ static struct snmp_mib sctp_snmp_list[]
+ SNMP_MIB_ITEM("SctpReasmUsrMsgs", SCTP_MIB_REASMUSRMSGS),
+ SNMP_MIB_ITEM("SctpOutSCTPPacks", SCTP_MIB_OUTSCTPPACKS),
+ SNMP_MIB_ITEM("SctpInSCTPPacks", SCTP_MIB_INSCTPPACKS),
++ SNMP_MIB_ITEM("SctpT1InitExpireds", SCTP_MIB_T1_INIT_EXPIREDS),
++ SNMP_MIB_ITEM("SctpT1CookieExpireds", SCTP_MIB_T1_COOKIE_EXPIREDS),
++ SNMP_MIB_ITEM("SctpT2ShutdownExpireds", SCTP_MIB_T2_SHUTDOWN_EXPIREDS),
++ SNMP_MIB_ITEM("SctpT3RtxExpireds", SCTP_MIB_T3_RTX_EXPIREDS),
++ SNMP_MIB_ITEM("SctpT4RtoExpireds", SCTP_MIB_T4_RTO_EXPIREDS),
++ SNMP_MIB_ITEM("SctpT5ShutdownGuardExpireds", SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS),
++ SNMP_MIB_ITEM("SctpDelaySackExpireds", SCTP_MIB_DELAY_SACK_EXPIREDS),
++ SNMP_MIB_ITEM("SctpAutocloseExpireds", SCTP_MIB_AUTOCLOSE_EXPIREDS),
++ SNMP_MIB_ITEM("SctpT3Retransmits", SCTP_MIB_T3_RETRANSMITS),
++ SNMP_MIB_ITEM("SctpPmtudRetransmits", SCTP_MIB_PMTUD_RETRANSMITS),
++ SNMP_MIB_ITEM("SctpFastRetransmits", SCTP_MIB_FAST_RETRANSMITS),
++ SNMP_MIB_ITEM("SctpInPktSoftirq", SCTP_MIB_IN_PKT_SOFTIRQ),
++ SNMP_MIB_ITEM("SctpInPktBacklog", SCTP_MIB_IN_PKT_BACKLOG),
++ SNMP_MIB_ITEM("SctpInPktDiscards", SCTP_MIB_IN_PKT_DISCARDS),
++ SNMP_MIB_ITEM("SctpInDataChunkDiscards", SCTP_MIB_IN_DATA_CHUNK_DISCARDS),
+ SNMP_MIB_SENTINEL
+ };
+
+@@ -328,8 +343,8 @@ static int sctp_assocs_seq_show(struct s
+ "%8p %8p %-3d %-3d %-2d %-4d %4d %8d %8d %7d %5lu %-5d %5d ",
+ assoc, sk, sctp_sk(sk)->type, sk->sk_state,
+ assoc->state, hash, assoc->assoc_id,
+- (sk->sk_rcvbuf - assoc->rwnd),
+ assoc->sndbuf_used,
++ (sk->sk_rcvbuf - assoc->rwnd),
+ sock_i_uid(sk), sock_i_ino(sk),
+ epb->bind_addr.port,
+ assoc->peer.port);
+--- a/net/sctp/sm_statefuns.c
++++ b/net/sctp/sm_statefuns.c
+@@ -2663,9 +2663,11 @@ sctp_disposition_t sctp_sf_eat_data_6_2(
+ break;
+ case SCTP_IERROR_HIGH_TSN:
+ case SCTP_IERROR_BAD_STREAM:
++ SCTP_INC_STATS(SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
+ goto discard_noforce;
+ case SCTP_IERROR_DUP_TSN:
+ case SCTP_IERROR_IGNORE_TSN:
++ SCTP_INC_STATS(SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
+ goto discard_force;
+ case SCTP_IERROR_NO_DATA:
+ goto consume;
+@@ -3652,6 +3654,7 @@ sctp_disposition_t sctp_sf_pdiscard(cons
+ void *arg,
+ sctp_cmd_seq_t *commands)
+ {
++ SCTP_INC_STATS(SCTP_MIB_IN_PKT_DISCARDS);
+ sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
+
+ return SCTP_DISPOSITION_CONSUME;
+@@ -4548,6 +4551,8 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(
+ {
+ struct sctp_transport *transport = arg;
+
++ SCTP_INC_STATS(SCTP_MIB_T3_RTX_EXPIREDS);
++
+ if (asoc->overall_error_count >= asoc->max_retrans) {
+ sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
+ SCTP_ERROR(ETIMEDOUT));
+@@ -4616,6 +4621,7 @@ sctp_disposition_t sctp_sf_do_6_2_sack(c
+ void *arg,
+ sctp_cmd_seq_t *commands)
+ {
++ SCTP_INC_STATS(SCTP_MIB_DELAY_SACK_EXPIREDS);
+ sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_FORCE());
+ return SCTP_DISPOSITION_CONSUME;
+ }
+@@ -4650,6 +4656,7 @@ sctp_disposition_t sctp_sf_t1_init_timer
+ int attempts = asoc->init_err_counter + 1;
+
+ SCTP_DEBUG_PRINTK("Timer T1 expired (INIT).\n");
++ SCTP_INC_STATS(SCTP_MIB_T1_INIT_EXPIREDS);
+
+ if (attempts <= asoc->max_init_attempts) {
+ bp = (struct sctp_bind_addr *) &asoc->base.bind_addr;
+@@ -4709,6 +4716,7 @@ sctp_disposition_t sctp_sf_t1_cookie_tim
+ int attempts = asoc->init_err_counter + 1;
+
+ SCTP_DEBUG_PRINTK("Timer T1 expired (COOKIE-ECHO).\n");
++ SCTP_INC_STATS(SCTP_MIB_T1_COOKIE_EXPIREDS);
+
+ if (attempts <= asoc->max_init_attempts) {
+ repl = sctp_make_cookie_echo(asoc, NULL);
+@@ -4753,6 +4761,8 @@ sctp_disposition_t sctp_sf_t2_timer_expi
+ struct sctp_chunk *reply = NULL;
+
+ SCTP_DEBUG_PRINTK("Timer T2 expired.\n");
++ SCTP_INC_STATS(SCTP_MIB_T2_SHUTDOWN_EXPIREDS);
++
+ if (asoc->overall_error_count >= asoc->max_retrans) {
+ sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
+ SCTP_ERROR(ETIMEDOUT));
+@@ -4814,6 +4824,8 @@ sctp_disposition_t sctp_sf_t4_timer_expi
+ struct sctp_chunk *chunk = asoc->addip_last_asconf;
+ struct sctp_transport *transport = chunk->transport;
+
++ SCTP_INC_STATS(SCTP_MIB_T4_RTO_EXPIREDS);
++
+ /* ADDIP 4.1 B1) Increment the error counters and perform path failure
+ * detection on the appropriate destination address as defined in
+ * RFC2960 [5] section 8.1 and 8.2.
+@@ -4880,6 +4892,7 @@ sctp_disposition_t sctp_sf_t5_timer_expi
+ struct sctp_chunk *reply = NULL;
+
+ SCTP_DEBUG_PRINTK("Timer T5 expired.\n");
++ SCTP_INC_STATS(SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS);
+
+ reply = sctp_make_abort(asoc, NULL, 0);
+ if (!reply)
+@@ -4910,6 +4923,8 @@ sctp_disposition_t sctp_sf_autoclose_tim
+ {
+ int disposition;
+
++ SCTP_INC_STATS(SCTP_MIB_AUTOCLOSE_EXPIREDS);
++
+ /* From 9.2 Shutdown of an Association
+ * Upon receipt of the SHUTDOWN primitive from its upper
+ * layer, the endpoint enters SHUTDOWN-PENDING state and
Added: dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-2.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-2.patch Mon Nov 13 08:42:27 2006
@@ -0,0 +1,28 @@
+From: Vladislav Yasevich <vladislav.yasevich at hp.com>
+Date: Tue, 22 Aug 2006 07:23:13 +0000 (-0700)
+Subject: [SCTP]: Fix IPv6 address flag setting when doing peel-off/accept.
+X-Git-Tag: v2.6.19-rc1
+X-Git-Url: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=eb5fa39f5ef490c72901b547ac5e7211efd47d56
+
+[SCTP]: Fix IPv6 address flag setting when doing peel-off/accept.
+
+During accept/peeloff we try to copy the list of bound addresses from
+the original endpoint to the new one. However, we forgot to set the flag
+to say that IPv6 is allowed on the new endpoint.
+
+Signed-off-by: Vladislav Yasevich <vladislav.yasevich at hp.com>
+Signed-off-by: Sridhar Samudrala <sri at us.ibm.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+
+--- a/net/sctp/socket.c
++++ b/net/sctp/socket.c
+@@ -5619,6 +5619,8 @@ static void sctp_sock_migrate(struct soc
+ /* Copy the bind_addr list from the original endpoint to the new
+ * endpoint so that we can handle restarts properly
+ */
++ if (PF_INET6 == assoc->base.sk->sk_family)
++ flags = SCTP_ADDR6_ALLOWED;
+ if (assoc->peer.ipv4_address)
+ flags |= SCTP_ADDR4_PEERSUPP;
+ if (assoc->peer.ipv6_address)
Added: dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-3.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-3.patch Mon Nov 13 08:42:27 2006
@@ -0,0 +1,424 @@
+From: Vladislav Yasevich <vladislav.yasevich at hp.com>
+Date: Tue, 22 Aug 2006 20:29:17 +0000 (-0700)
+Subject: [SCTP]: Remove multiple levels of msecs to jiffies conversions.
+X-Git-Tag: v2.6.19-rc1
+X-Git-Url: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=3fd091e73b81f131e1567c4d4a1ec042940bf2f7
+
+[SCTP]: Remove multiple levels of msecs to jiffies conversions.
+
+The SCTP sysctl entries are displayed in milliseconds, but stored
+internally in jiffies. This results in multiple levels of msecs to
+jiffies conversion and as a result produces a truncation error. This
+patch makes things consistent in that we store and display defaults
+in milliseconds and only convert once for use by association.
+This patch also adds some sane min/max values so that we don't go off
+the deep end.
+
+Signed-off-by: Vladislav Yasevich <vladislav.yasevich at hp.com>
+Signed-off-by: Sridhar Samudrala <sri at us.ibm.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+
+--- a/include/net/sctp/constants.h
++++ b/include/net/sctp/constants.h
+@@ -264,10 +264,10 @@ enum { SCTP_MAX_DUP_TSNS = 16 };
+ enum { SCTP_MAX_GABS = 16 };
+
+ /* Heartbeat interval - 30 secs */
+-#define SCTP_DEFAULT_TIMEOUT_HEARTBEAT (30 * HZ)
++#define SCTP_DEFAULT_TIMEOUT_HEARTBEAT (30*1000)
+
+ /* Delayed sack timer - 200ms */
+-#define SCTP_DEFAULT_TIMEOUT_SACK ((200 * HZ) / 1000)
++#define SCTP_DEFAULT_TIMEOUT_SACK (200)
+
+ /* RTO.Initial - 3 seconds
+ * RTO.Min - 1 second
+@@ -275,9 +275,9 @@ enum { SCTP_MAX_GABS = 16 };
+ * RTO.Alpha - 1/8
+ * RTO.Beta - 1/4
+ */
+-#define SCTP_RTO_INITIAL (3 * HZ)
+-#define SCTP_RTO_MIN (1 * HZ)
+-#define SCTP_RTO_MAX (60 * HZ)
++#define SCTP_RTO_INITIAL (3 * 1000)
++#define SCTP_RTO_MIN (1 * 1000)
++#define SCTP_RTO_MAX (60 * 1000)
+
+ #define SCTP_RTO_ALPHA 3 /* 1/8 when converted to right shifts. */
+ #define SCTP_RTO_BETA 2 /* 1/4 when converted to right shifts. */
+@@ -290,8 +290,7 @@ enum { SCTP_MAX_GABS = 16 };
+ #define SCTP_DEF_MAX_INIT 6
+ #define SCTP_DEF_MAX_SEND 10
+
+-#define SCTP_DEFAULT_COOKIE_LIFE_SEC 60 /* seconds */
+-#define SCTP_DEFAULT_COOKIE_LIFE_USEC 0 /* microseconds */
++#define SCTP_DEFAULT_COOKIE_LIFE (60 * 1000) /* 60 seconds */
+
+ #define SCTP_DEFAULT_MINWINDOW 1500 /* default minimum rwnd size */
+ #define SCTP_DEFAULT_MAXWINDOW 65535 /* default rwnd size */
+--- a/include/net/sctp/structs.h
++++ b/include/net/sctp/structs.h
+@@ -128,9 +128,9 @@ extern struct sctp_globals {
+ * RTO.Alpha - 1/8 (3 when converted to right shifts.)
+ * RTO.Beta - 1/4 (2 when converted to right shifts.)
+ */
+- unsigned long rto_initial;
+- unsigned long rto_min;
+- unsigned long rto_max;
++ unsigned int rto_initial;
++ unsigned int rto_min;
++ unsigned int rto_max;
+
+ /* Note: rto_alpha and rto_beta are really defined as inverse
+ * powers of two to facilitate integer operations.
+@@ -145,13 +145,13 @@ extern struct sctp_globals {
+ int cookie_preserve_enable;
+
+ /* Valid.Cookie.Life - 60 seconds */
+- unsigned long valid_cookie_life;
++ unsigned int valid_cookie_life;
+
+ /* Delayed SACK timeout 200ms default*/
+- unsigned long sack_timeout;
++ unsigned int sack_timeout;
+
+ /* HB.interval - 30 seconds */
+- unsigned long hb_interval;
++ unsigned int hb_interval;
+
+ /* Association.Max.Retrans - 10 attempts
+ * Path.Max.Retrans - 5 attempts (per destination address)
+--- a/net/sctp/protocol.c
++++ b/net/sctp/protocol.c
+@@ -1049,7 +1049,7 @@ SCTP_STATIC __init int sctp_init(void)
+ sctp_rto_beta = SCTP_RTO_BETA;
+
+ /* Valid.Cookie.Life - 60 seconds */
+- sctp_valid_cookie_life = 60 * HZ;
++ sctp_valid_cookie_life = SCTP_DEFAULT_COOKIE_LIFE;
+
+ /* Whether Cookie Preservative is enabled(1) or not(0) */
+ sctp_cookie_preserve_enable = 1;
+--- a/net/sctp/socket.c
++++ b/net/sctp/socket.c
+@@ -3045,14 +3045,14 @@ SCTP_STATIC int sctp_init_sock(struct so
+ sp->initmsg.sinit_num_ostreams = sctp_max_outstreams;
+ sp->initmsg.sinit_max_instreams = sctp_max_instreams;
+ sp->initmsg.sinit_max_attempts = sctp_max_retrans_init;
+- sp->initmsg.sinit_max_init_timeo = jiffies_to_msecs(sctp_rto_max);
++ sp->initmsg.sinit_max_init_timeo = sctp_rto_max;
+
+ /* Initialize default RTO related parameters. These parameters can
+ * be modified for with the SCTP_RTOINFO socket option.
+ */
+- sp->rtoinfo.srto_initial = jiffies_to_msecs(sctp_rto_initial);
+- sp->rtoinfo.srto_max = jiffies_to_msecs(sctp_rto_max);
+- sp->rtoinfo.srto_min = jiffies_to_msecs(sctp_rto_min);
++ sp->rtoinfo.srto_initial = sctp_rto_initial;
++ sp->rtoinfo.srto_max = sctp_rto_max;
++ sp->rtoinfo.srto_min = sctp_rto_min;
+
+ /* Initialize default association related parameters. These parameters
+ * can be modified with the SCTP_ASSOCINFO socket option.
+@@ -3061,8 +3061,7 @@ SCTP_STATIC int sctp_init_sock(struct so
+ sp->assocparams.sasoc_number_peer_destinations = 0;
+ sp->assocparams.sasoc_peer_rwnd = 0;
+ sp->assocparams.sasoc_local_rwnd = 0;
+- sp->assocparams.sasoc_cookie_life =
+- jiffies_to_msecs(sctp_valid_cookie_life);
++ sp->assocparams.sasoc_cookie_life = sctp_valid_cookie_life;
+
+ /* Initialize default event subscriptions. By default, all the
+ * options are off.
+@@ -3072,10 +3071,10 @@ SCTP_STATIC int sctp_init_sock(struct so
+ /* Default Peer Address Parameters. These defaults can
+ * be modified via SCTP_PEER_ADDR_PARAMS
+ */
+- sp->hbinterval = jiffies_to_msecs(sctp_hb_interval);
++ sp->hbinterval = sctp_hb_interval;
+ sp->pathmaxrxt = sctp_max_retrans_path;
+ sp->pathmtu = 0; // allow default discovery
+- sp->sackdelay = jiffies_to_msecs(sctp_sack_timeout);
++ sp->sackdelay = sctp_sack_timeout;
+ sp->param_flags = SPP_HB_ENABLE |
+ SPP_PMTUD_ENABLE |
+ SPP_SACKDELAY_ENABLE;
+--- a/net/sctp/sysctl.c
++++ b/net/sctp/sysctl.c
+@@ -45,9 +45,10 @@
+ #include <net/sctp/sctp.h>
+ #include <linux/sysctl.h>
+
+-static ctl_handler sctp_sysctl_jiffies_ms;
+-static long rto_timer_min = 1;
+-static long rto_timer_max = 86400000; /* One day */
++static int zero = 0;
++static int one = 1;
++static int timer_max = 86400000; /* ms in one day */
++static int int_max = INT_MAX;
+ static long sack_timer_min = 1;
+ static long sack_timer_max = 500;
+
+@@ -56,45 +57,45 @@ static ctl_table sctp_table[] = {
+ .ctl_name = NET_SCTP_RTO_INITIAL,
+ .procname = "rto_initial",
+ .data = &sctp_rto_initial,
+- .maxlen = sizeof(long),
++ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
+- .strategy = &sctp_sysctl_jiffies_ms,
+- .extra1 = &rto_timer_min,
+- .extra2 = &rto_timer_max
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
++ .extra1 = &one,
++ .extra2 = &timer_max
+ },
+ {
+ .ctl_name = NET_SCTP_RTO_MIN,
+ .procname = "rto_min",
+ .data = &sctp_rto_min,
+- .maxlen = sizeof(long),
++ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
+- .strategy = &sctp_sysctl_jiffies_ms,
+- .extra1 = &rto_timer_min,
+- .extra2 = &rto_timer_max
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
++ .extra1 = &one,
++ .extra2 = &timer_max
+ },
+ {
+ .ctl_name = NET_SCTP_RTO_MAX,
+ .procname = "rto_max",
+ .data = &sctp_rto_max,
+- .maxlen = sizeof(long),
++ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
+- .strategy = &sctp_sysctl_jiffies_ms,
+- .extra1 = &rto_timer_min,
+- .extra2 = &rto_timer_max
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
++ .extra1 = &one,
++ .extra2 = &timer_max
+ },
+ {
+ .ctl_name = NET_SCTP_VALID_COOKIE_LIFE,
+ .procname = "valid_cookie_life",
+ .data = &sctp_valid_cookie_life,
+- .maxlen = sizeof(long),
++ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
+- .strategy = &sctp_sysctl_jiffies_ms,
+- .extra1 = &rto_timer_min,
+- .extra2 = &rto_timer_max
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
++ .extra1 = &one,
++ .extra2 = &timer_max
+ },
+ {
+ .ctl_name = NET_SCTP_MAX_BURST,
+@@ -102,7 +103,10 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_max_burst,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
++ .extra1 = &zero,
++ .extra2 = &int_max
+ },
+ {
+ .ctl_name = NET_SCTP_ASSOCIATION_MAX_RETRANS,
+@@ -110,7 +114,10 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_max_retrans_association,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
++ .extra1 = &one,
++ .extra2 = &int_max
+ },
+ {
+ .ctl_name = NET_SCTP_SNDBUF_POLICY,
+@@ -118,7 +125,8 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_sndbuf_policy,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .proc_handler = &proc_dointvec,
++ .strategy = &sysctl_intvec
+ },
+ {
+ .ctl_name = NET_SCTP_RCVBUF_POLICY,
+@@ -126,7 +134,8 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_rcvbuf_policy,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .proc_handler = &proc_dointvec,
++ .strategy = &sysctl_intvec
+ },
+ {
+ .ctl_name = NET_SCTP_PATH_MAX_RETRANS,
+@@ -134,7 +143,10 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_max_retrans_path,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
++ .extra1 = &one,
++ .extra2 = &int_max
+ },
+ {
+ .ctl_name = NET_SCTP_MAX_INIT_RETRANSMITS,
+@@ -142,18 +154,21 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_max_retrans_init,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
++ .extra1 = &one,
++ .extra2 = &int_max
+ },
+ {
+ .ctl_name = NET_SCTP_HB_INTERVAL,
+ .procname = "hb_interval",
+ .data = &sctp_hb_interval,
+- .maxlen = sizeof(long),
++ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
+- .strategy = &sctp_sysctl_jiffies_ms,
+- .extra1 = &rto_timer_min,
+- .extra2 = &rto_timer_max
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
++ .extra1 = &one,
++ .extra2 = &timer_max
+ },
+ {
+ .ctl_name = NET_SCTP_PRESERVE_ENABLE,
+@@ -161,23 +176,26 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_cookie_preserve_enable,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .proc_handler = &proc_dointvec,
++ .strategy = &sysctl_intvec
+ },
+ {
+ .ctl_name = NET_SCTP_RTO_ALPHA,
+ .procname = "rto_alpha_exp_divisor",
+ .data = &sctp_rto_alpha,
+ .maxlen = sizeof(int),
+- .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .mode = 0444,
++ .proc_handler = &proc_dointvec,
++ .strategy = &sysctl_intvec
+ },
+ {
+ .ctl_name = NET_SCTP_RTO_BETA,
+ .procname = "rto_beta_exp_divisor",
+ .data = &sctp_rto_beta,
+ .maxlen = sizeof(int),
+- .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .mode = 0444,
++ .proc_handler = &proc_dointvec,
++ .strategy = &sysctl_intvec
+ },
+ {
+ .ctl_name = NET_SCTP_ADDIP_ENABLE,
+@@ -185,7 +203,8 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_addip_enable,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .proc_handler = &proc_dointvec,
++ .strategy = &sysctl_intvec
+ },
+ {
+ .ctl_name = NET_SCTP_PRSCTP_ENABLE,
+@@ -193,7 +212,8 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_prsctp_enable,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = &proc_dointvec
++ .proc_handler = &proc_dointvec,
++ .strategy = &sysctl_intvec
+ },
+ {
+ .ctl_name = NET_SCTP_SACK_TIMEOUT,
+@@ -201,8 +221,8 @@ static ctl_table sctp_table[] = {
+ .data = &sctp_sack_timeout,
+ .maxlen = sizeof(long),
+ .mode = 0644,
+- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
+- .strategy = &sctp_sysctl_jiffies_ms,
++ .proc_handler = &proc_dointvec_minmax,
++ .strategy = &sysctl_intvec,
+ .extra1 = &sack_timer_min,
+ .extra2 = &sack_timer_max,
+ },
+@@ -242,37 +262,3 @@ void sctp_sysctl_unregister(void)
+ {
+ unregister_sysctl_table(sctp_sysctl_header);
+ }
+-
+-/* Strategy function to convert jiffies to milliseconds. */
+-static int sctp_sysctl_jiffies_ms(ctl_table *table, int __user *name, int nlen,
+- void __user *oldval, size_t __user *oldlenp,
+- void __user *newval, size_t newlen, void **context) {
+-
+- if (oldval) {
+- size_t olen;
+-
+- if (oldlenp) {
+- if (get_user(olen, oldlenp))
+- return -EFAULT;
+-
+- if (olen != sizeof (int))
+- return -EINVAL;
+- }
+- if (put_user((*(int *)(table->data) * 1000) / HZ,
+- (int __user *)oldval) ||
+- (oldlenp && put_user(sizeof (int), oldlenp)))
+- return -EFAULT;
+- }
+- if (newval && newlen) {
+- int new;
+-
+- if (newlen != sizeof (int))
+- return -EINVAL;
+-
+- if (get_user(new, (int __user *)newval))
+- return -EFAULT;
+-
+- *(int *)(table->data) = (new * HZ) / 1000;
+- }
+- return 1;
+-}
+--- a/net/sctp/transport.c
++++ b/net/sctp/transport.c
+@@ -75,7 +75,7 @@ static struct sctp_transport *sctp_trans
+ * parameter 'RTO.Initial'.
+ */
+ peer->rtt = 0;
+- peer->rto = sctp_rto_initial;
++ peer->rto = msecs_to_jiffies(sctp_rto_initial);
+ peer->rttvar = 0;
+ peer->srtt = 0;
+ peer->rto_pending = 0;
Added: dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-4.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-4.patch Mon Nov 13 08:42:27 2006
@@ -0,0 +1,56 @@
+From: Sridhar Samudrala <sri at us.ibm.com>
+Date: Sat, 30 Sep 2006 00:09:05 +0000 (-0700)
+Subject: [SCTP]: Include sk_buff overhead while updating the peer's receive window.
+X-Git-Tag: v2.6.19-rc1
+X-Git-Url: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=cd49788563d3b9e2ec0b316fa57aef1c0cb3bd4b
+
+[SCTP]: Include sk_buff overhead while updating the peer's receive window.
+
+Currently if the sender is sending small messages, it can cause a receiver
+to run out of receive buffer space even when the advertised receive window
+is still open and results in packet drops and retransmissions. Including
+a overhead while updating the sender's view of peer receive window will
+reduce the chances of receive buffer space overshooting the receive window.
+
+Signed-off-by: Sridhar Samudrala <sri at us.ibm.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+
+--- a/net/sctp/output.c
++++ b/net/sctp/output.c
+@@ -633,7 +633,7 @@ static sctp_xmit_t sctp_packet_append_da
+ * data will fit or delay in hopes of bundling a full
+ * sized packet.
+ */
+- if (len < asoc->pathmtu - packet->overhead) {
++ if (len < asoc->frag_point) {
+ retval = SCTP_XMIT_NAGLE_DELAY;
+ goto finish;
+ }
+@@ -645,7 +645,13 @@ static sctp_xmit_t sctp_packet_append_da
+ /* Keep track of how many bytes are in flight to the receiver. */
+ asoc->outqueue.outstanding_bytes += datasize;
+
+- /* Update our view of the receiver's rwnd. */
++ /* Update our view of the receiver's rwnd. Include sk_buff overhead
++ * while updating peer.rwnd so that it reduces the chances of a
++ * receiver running out of receive buffer space even when receive
++ * window is still open. This can happen when a sender is sending
++ * sending small messages.
++ */
++ datasize += sizeof(struct sk_buff);
+ if (datasize < rwnd)
+ rwnd -= datasize;
+ else
+--- a/net/sctp/outqueue.c
++++ b/net/sctp/outqueue.c
+@@ -416,7 +416,8 @@ void sctp_retransmit_mark(struct sctp_ou
+ * (Section 7.2.4)), add the data size of those
+ * chunks to the rwnd.
+ */
+- q->asoc->peer.rwnd += sctp_data_size(chunk);
++ q->asoc->peer.rwnd += (sctp_data_size(chunk) +
++ sizeof(struct sk_buff));
+ q->outstanding_bytes -= sctp_data_size(chunk);
+ transport->flight_size -= sctp_data_size(chunk);
+
Added: dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-5.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-5.patch Mon Nov 13 08:42:27 2006
@@ -0,0 +1,24 @@
+From: Vlad Yasevich <vladislav.yasevich at hp.com>
+Date: Sat, 30 Sep 2006 00:09:34 +0000 (-0700)
+Subject: [SCTP]: Use correct mask when disabling PMTUD.
+X-Git-Tag: v2.6.19-rc1
+X-Git-Url: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=b56bab46f3220eb6b1f71c000faa44c6b13fb148
+
+[SCTP]: Use correct mask when disabling PMTUD.
+
+Signed-off-by: Vlad Yasevich <vladislav.yasevich at hp.com>
+Signed-off-by: Sridhar Samudrala <sri at us.ibm.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+
+--- a/net/sctp/input.c
++++ b/net/sctp/input.c
+@@ -388,7 +388,7 @@ void sctp_icmp_frag_needed(struct sock *
+ * pmtu discovery on this transport.
+ */
+ t->pathmtu = SCTP_DEFAULT_MINSEGMENT;
+- t->param_flags = (t->param_flags & ~SPP_HB) |
++ t->param_flags = (t->param_flags & ~SPP_PMTUD) |
+ SPP_PMTUD_DISABLE;
+ } else {
+ t->pathmtu = pmtu;
Added: dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-6.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-6.patch Mon Nov 13 08:42:27 2006
@@ -0,0 +1,54 @@
+From: Vlad Yasevich <vladislav.yasevich at hp.com>
+Date: Sat, 30 Sep 2006 00:10:03 +0000 (-0700)
+Subject: [SCTP]: Do not timestamp every SCTP packet.
+X-Git-Tag: v2.6.19-rc1
+X-Git-Url: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=f236218b7292bccb0f8754a0feb5d9e9a06fe5a2
+
+[SCTP]: Do not timestamp every SCTP packet.
+
+We only need the timestamp on COOKIE-ECHO chunks, so instead of always
+timestamping every SCTP packet, let common code timestamp if the socket
+option is set. For COOKIE-ECHO, simply get the time of day if we don't
+have a timestamp. This introduces a small possibility that the cookie
+may be considered expired, but it will be renegotiated.
+
+Signed-off-by: Vlad Yasevich <vladislav.yasevich at hp.com>
+Signed-off-by: Sridhar Samudrala <sri at us.ibm.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+
+--- a/net/sctp/input.c
++++ b/net/sctp/input.c
+@@ -218,12 +218,6 @@ int sctp_rcv(struct sk_buff *skb)
+ }
+ }
+
+- /* SCTP seems to always need a timestamp right now (FIXME) */
+- if (skb->tstamp.off_sec == 0) {
+- __net_timestamp(skb);
+- sock_enable_timestamp(sk);
+- }
+-
+ if (!xfrm_policy_check(sk, XFRM_POLICY_IN, skb, family))
+ goto discard_release;
+ nf_reset(skb);
+--- a/net/sctp/sm_make_chunk.c
++++ b/net/sctp/sm_make_chunk.c
+@@ -1447,8 +1447,16 @@ no_hmac:
+ /* Check to see if the cookie is stale. If there is already
+ * an association, there is no need to check cookie's expiration
+ * for init collision case of lost COOKIE ACK.
++ * If skb has been timestamped, then use the stamp, otherwise
++ * use current time. This introduces a small possibility that
++ * that a cookie may be considered expired, but his would only slow
++ * down the new association establishment instead of every packet.
+ */
+- skb_get_timestamp(skb, &tv);
++ if (sock_flag(ep->base.sk, SOCK_TIMESTAMP))
++ skb_get_timestamp(skb, &tv);
++ else
++ do_gettimeofday(&tv);
++
+ if (!asoc && tv_lt(bear_cookie->expiration, tv)) {
+ __u16 len;
+ /*
Added: dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-7.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/sctp-backports-7.patch Mon Nov 13 08:42:27 2006
@@ -0,0 +1,199 @@
+From: Vlad Yasevich <vladislav.yasevich at hp.com>
+Date: Tue, 10 Oct 2006 04:34:04 +0000 (-0700)
+Subject: [SCTP]: Fix receive buffer accounting.
+X-Git-Tag: v2.6.19-rc2
+X-Git-Url: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=331c4ee7faa4ee1e1404c872a139784753100498
+
+[SCTP]: Fix receive buffer accounting.
+
+When doing receiver buffer accounting, we always used skb->truesize.
+This is problematic when processing bundled DATA chunks because for
+every DATA chunk that could be small part of one large skb, we would
+charge the size of the entire skb. The new approach is to store the
+size of the DATA chunk we are accounting for in the sctp_ulpevent
+structure and use that stored value for accounting.
+
+Signed-off-by: Vlad Yasevich <vladislav.yasevich at hp.com>
+Signed-off-by: Sridhar Samudrala <sri at us.ibm.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+
+--- a/include/net/sctp/sctp.h
++++ b/include/net/sctp/sctp.h
+@@ -139,6 +139,7 @@ int sctp_inet_listen(struct socket *sock
+ void sctp_write_space(struct sock *sk);
+ unsigned int sctp_poll(struct file *file, struct socket *sock,
+ poll_table *wait);
++void sctp_sock_rfree(struct sk_buff *skb);
+
+ /*
+ * sctp/primitive.c
+@@ -444,6 +445,19 @@ static inline struct list_head *sctp_lis
+ return result;
+ }
+
++/* SCTP version of skb_set_owner_r. We need this one because
++ * of the way we have to do receive buffer accounting on bundled
++ * chunks.
++ */
++static inline void sctp_skb_set_owner_r(struct sk_buff *skb, struct sock *sk)
++{
++ struct sctp_ulpevent *event = sctp_skb2event(skb);
++
++ skb->sk = sk;
++ skb->destructor = sctp_sock_rfree;
++ atomic_add(event->rmem_len, &sk->sk_rmem_alloc);
++}
++
+ /* Tests if the list has one and only one entry. */
+ static inline int sctp_list_single_entry(struct list_head *head)
+ {
+--- a/include/net/sctp/ulpevent.h
++++ b/include/net/sctp/ulpevent.h
+@@ -63,6 +63,7 @@ struct sctp_ulpevent {
+ __u32 cumtsn;
+ int msg_flags;
+ int iif;
++ unsigned int rmem_len;
+ };
+
+ /* Retrieve the skb this event sits inside of. */
+--- a/net/sctp/socket.c
++++ b/net/sctp/socket.c
+@@ -5362,6 +5362,20 @@ static void sctp_wfree(struct sk_buff *s
+ sctp_association_put(asoc);
+ }
+
++/* Do accounting for the receive space on the socket.
++ * Accounting for the association is done in ulpevent.c
++ * We set this as a destructor for the cloned data skbs so that
++ * accounting is done at the correct time.
++ */
++void sctp_sock_rfree(struct sk_buff *skb)
++{
++ struct sock *sk = skb->sk;
++ struct sctp_ulpevent *event = sctp_skb2event(skb);
++
++ atomic_sub(event->rmem_len, &sk->sk_rmem_alloc);
++}
++
++
+ /* Helper function to wait for space in the sndbuf. */
+ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
+ size_t msg_len)
+@@ -5634,10 +5648,10 @@ static void sctp_sock_migrate(struct soc
+ sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) {
+ event = sctp_skb2event(skb);
+ if (event->asoc == assoc) {
+- sock_rfree(skb);
++ sctp_sock_rfree(skb);
+ __skb_unlink(skb, &oldsk->sk_receive_queue);
+ __skb_queue_tail(&newsk->sk_receive_queue, skb);
+- skb_set_owner_r(skb, newsk);
++ sctp_skb_set_owner_r(skb, newsk);
+ }
+ }
+
+@@ -5665,10 +5679,10 @@ static void sctp_sock_migrate(struct soc
+ sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) {
+ event = sctp_skb2event(skb);
+ if (event->asoc == assoc) {
+- sock_rfree(skb);
++ sctp_sock_rfree(skb);
+ __skb_unlink(skb, &oldsp->pd_lobby);
+ __skb_queue_tail(queue, skb);
+- skb_set_owner_r(skb, newsk);
++ sctp_skb_set_owner_r(skb, newsk);
+ }
+ }
+
+--- a/net/sctp/ulpevent.c
++++ b/net/sctp/ulpevent.c
+@@ -55,10 +55,13 @@ static void sctp_ulpevent_release_frag_d
+
+
+ /* Initialize an ULP event from an given skb. */
+-SCTP_STATIC void sctp_ulpevent_init(struct sctp_ulpevent *event, int msg_flags)
++SCTP_STATIC void sctp_ulpevent_init(struct sctp_ulpevent *event,
++ int msg_flags,
++ unsigned int len)
+ {
+ memset(event, 0, sizeof(struct sctp_ulpevent));
+ event->msg_flags = msg_flags;
++ event->rmem_len = len;
+ }
+
+ /* Create a new sctp_ulpevent. */
+@@ -73,7 +76,7 @@ SCTP_STATIC struct sctp_ulpevent *sctp_u
+ goto fail;
+
+ event = sctp_skb2event(skb);
+- sctp_ulpevent_init(event, msg_flags);
++ sctp_ulpevent_init(event, msg_flags, skb->truesize);
+
+ return event;
+
+@@ -101,17 +104,16 @@ static inline void sctp_ulpevent_set_own
+ sctp_association_hold((struct sctp_association *)asoc);
+ skb = sctp_event2skb(event);
+ event->asoc = (struct sctp_association *)asoc;
+- atomic_add(skb->truesize, &event->asoc->rmem_alloc);
+- skb_set_owner_r(skb, asoc->base.sk);
++ atomic_add(event->rmem_len, &event->asoc->rmem_alloc);
++ sctp_skb_set_owner_r(skb, asoc->base.sk);
+ }
+
+ /* A simple destructor to give up the reference to the association. */
+ static inline void sctp_ulpevent_release_owner(struct sctp_ulpevent *event)
+ {
+ struct sctp_association *asoc = event->asoc;
+- struct sk_buff *skb = sctp_event2skb(event);
+
+- atomic_sub(skb->truesize, &asoc->rmem_alloc);
++ atomic_sub(event->rmem_len, &asoc->rmem_alloc);
+ sctp_association_put(asoc);
+ }
+
+@@ -372,7 +374,7 @@ struct sctp_ulpevent *sctp_ulpevent_make
+
+ /* Embed the event fields inside the cloned skb. */
+ event = sctp_skb2event(skb);
+- sctp_ulpevent_init(event, MSG_NOTIFICATION);
++ sctp_ulpevent_init(event, MSG_NOTIFICATION, skb->truesize);
+
+ sre = (struct sctp_remote_error *)
+ skb_push(skb, sizeof(struct sctp_remote_error));
+@@ -464,7 +466,7 @@ struct sctp_ulpevent *sctp_ulpevent_make
+
+ /* Embed the event fields inside the cloned skb. */
+ event = sctp_skb2event(skb);
+- sctp_ulpevent_init(event, MSG_NOTIFICATION);
++ sctp_ulpevent_init(event, MSG_NOTIFICATION, skb->truesize);
+
+ ssf = (struct sctp_send_failed *)
+ skb_push(skb, sizeof(struct sctp_send_failed));
+@@ -682,8 +684,11 @@ struct sctp_ulpevent *sctp_ulpevent_make
+ /* Embed the event fields inside the cloned skb. */
+ event = sctp_skb2event(skb);
+
+- /* Initialize event with flags 0. */
+- sctp_ulpevent_init(event, 0);
++ /* Initialize event with flags 0 and correct length
++ * Since this is a clone of the original skb, only account for
++ * the data of this chunk as other chunks will be accounted separately.
++ */
++ sctp_ulpevent_init(event, 0, skb->len + sizeof(struct sk_buff));
+
+ sctp_ulpevent_receive_data(event, asoc);
+
+--- a/net/sctp/ulpqueue.c
++++ b/net/sctp/ulpqueue.c
+@@ -309,7 +309,7 @@ static struct sctp_ulpevent *sctp_make_r
+ if (!new)
+ return NULL; /* try again later */
+
+- new->sk = f_frag->sk;
++ sctp_skb_set_owner_r(new, f_frag->sk);
+
+ skb_shinfo(new)->frag_list = pos;
+ } else
Modified: dists/trunk/linux-2.6/debian/patches/series/6
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/6 (original)
+++ dists/trunk/linux-2.6/debian/patches/series/6 Mon Nov 13 08:42:27 2006
@@ -6,3 +6,10 @@
+ features/mm-install_page-cleanup.patch
+ features/mm-do_wp_page-fixup.patch
+ features/mm-msync-cleanup.patch
++ features/all/sctp-backports-1.patch
++ features/all/sctp-backports-2.patch
++ features/all/sctp-backports-3.patch
++ features/all/sctp-backports-4.patch
++ features/all/sctp-backports-5.patch
++ features/all/sctp-backports-6.patch
++ features/all/sctp-backports-7.patch
More information about the Kernel-svn-changes
mailing list