diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index 0e0f9d2..de17e69 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -224,6 +224,7 @@ struct sctp_sock {
 	__u8 frag_interleave;
 	__u32 adaptation_ind;
 	__u32 pd_point;
+	__u8 noshut_onclose;     /* Disable SHUTDOWN or ABORT on close */
 
 	atomic_t pd_mode;
 	/* Receive to here while partial delivery is in effect. */
diff --git a/include/net/sctp/user.h b/include/net/sctp/user.h
index 9a0ae09..1f4dd41 100644
--- a/include/net/sctp/user.h
+++ b/include/net/sctp/user.h
@@ -108,6 +108,7 @@ typedef __s32 sctp_assoc_t;
 #define SCTP_SOCKOPT_CONNECTX	110		/* CONNECTX requests. */
 #define SCTP_SOCKOPT_CONNECTX3	111	/* CONNECTX requests (updated) */
 #define SCTP_GET_ASSOC_STATS	112	/* Read only */
+#define SCTP_SOCKOPT_NOSHUT_ONCLOSE	113	/* No SHUT/ABORT on close() */
 
 /*
  * 5.2.1 SCTP Initiation Structure (SCTP_INIT)
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index c99458d..7e8db4b 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -1500,9 +1500,12 @@ SCTP_STATIC void sctp_close(struct sock *sk, long timeout)
 			}
 		}
 
-		if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) ||
-		    !skb_queue_empty(&asoc->ulpq.reasm) ||
-		    (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) {
+		if (sctp_sk(sk)->noshut_onclose) {
+			sctp_unhash_established(asoc);
+			sctp_association_free(asoc);
+		} else if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) ||
+			   !skb_queue_empty(&asoc->ulpq.reasm) ||
+			   (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) {
 			struct sctp_chunk *chunk;
 
 			chunk = sctp_make_abort_user(asoc, NULL, 0);
@@ -1513,7 +1516,7 @@ SCTP_STATIC void sctp_close(struct sock *sk, long timeout)
 	}
 
 	/* On a TCP-style socket, block for at most linger_time if set. */
-	if (sctp_style(sk, TCP) && timeout)
+	if (sctp_style(sk, TCP) && timeout) 
 		sctp_wait_for_close(sk, timeout);
 
 	/* This will run the backlog queue.  */
@@ -3545,6 +3548,27 @@ static int sctp_setsockopt_paddr_thresholds(struct sock *sk,
 	return 0;
 }
 
+/*
+ * SCTP_NOSHUT_ONCLOSE
+ *
+ * Disable sending SHUTDOWN/ABORT chunks when sctp_close()
+ * gets called.
+ */
+static int sctp_setsockopt_noshutdown_onclose(struct sock *sk,
+					      char __user *optval,
+					      unsigned int optlen)
+{
+	int val;
+
+	if (optlen < sizeof(int))
+		return -EINVAL;
+	if (get_user(val, (int __user *)optval))
+		return -EFAULT;
+
+	sctp_sk(sk)->noshut_onclose = (val == 0) ? 0 : 1;
+	return 0;
+}
+
 /* API 6.2 setsockopt(), getsockopt()
  *
  * Applications use setsockopt() and getsockopt() to set or retrieve
@@ -3697,6 +3721,9 @@ SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname,
 	case SCTP_PEER_ADDR_THLDS:
 		retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen);
 		break;
+	case SCTP_SOCKOPT_NOSHUT_ONCLOSE:
+		retval = sctp_setsockopt_noshutdown_onclose(sk, optval, optlen);
+		break;
 	default:
 		retval = -ENOPROTOOPT;
 		break;
@@ -3944,6 +3971,9 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk)
 	/* Enable Nagle algorithm by default.  */
 	sp->nodelay           = 0;
 
+	/* Enable sending SHUTDOWN on close() by default */
+	sp->noshut_onclose   = 0;
+
 	/* Enable by default. */
 	sp->v4mapped          = 1;
 
@@ -5701,6 +5731,31 @@ static int sctp_getsockopt_assoc_stats(struct sock *sk, int len,
 	return 0;
 }
 
+/*
+ * SCTP_NOSHUT_ONCLOSE
+ *
+ * Disable sending SHUTDOWN/ABORT chunks when sctp_close()
+ * gets called.
+ */
+static int sctp_getsockopt_noshutdown_onclose(struct sock *sk, int len,
+					      char __user *optval,
+					      int __user *optlen)
+{
+	int val;
+
+	if (len < sizeof(int))
+		return -EINVAL;
+
+	len = sizeof(int);
+	val = (sctp_sk(sk)->noshut_onclose == 1);
+	if (put_user(len, optlen))
+		return -EFAULT;
+	if (copy_to_user(optval, &val, len))
+		return -EFAULT;
+	return 0;
+}
+
+
 SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname,
 				char __user *optval, int __user *optlen)
 {
@@ -5845,6 +5900,10 @@ SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname,
 	case SCTP_GET_ASSOC_STATS:
 		retval = sctp_getsockopt_assoc_stats(sk, len, optval, optlen);
 		break;
+	case SCTP_SOCKOPT_NOSHUT_ONCLOSE:
+		retval = sctp_getsockopt_noshutdown_onclose(sk, len, optval,
+							    optlen);
+		break;
 	default:
 		retval = -ENOPROTOOPT;
 		break;
