#define SCTP_GET_ASSOC_STATS   112     /* Read only */
 #define SCTP_PR_SUPPORTED      113
 #define SCTP_DEFAULT_PRINFO    114
+#define SCTP_PR_ASSOC_STATUS   115
 
 /* PR-SCTP policies */
 #define SCTP_PR_SCTP_NONE      0x0000
        __u16 spt_pathpfthld;
 };
 
+/*
+ * Socket Option for Getting the Association/Stream-Specific PR-SCTP Status
+ */
+struct sctp_prstatus {
+       sctp_assoc_t sprstat_assoc_id;
+       __u16 sprstat_sid;
+       __u16 sprstat_policy;
+       __u64 sprstat_abandoned_unsent;
+       __u64 sprstat_abandoned_sent;
+};
+
 struct sctp_default_prinfo {
        sctp_assoc_t pr_assoc_id;
        __u32 pr_value;
 
        return retval;
 }
 
+static int sctp_getsockopt_pr_assocstatus(struct sock *sk, int len,
+                                         char __user *optval,
+                                         int __user *optlen)
+{
+       struct sctp_prstatus params;
+       struct sctp_association *asoc;
+       int policy;
+       int retval = -EINVAL;
+
+       if (len < sizeof(params))
+               goto out;
+
+       len = sizeof(params);
+       if (copy_from_user(¶ms, optval, len)) {
+               retval = -EFAULT;
+               goto out;
+       }
+
+       policy = params.sprstat_policy;
+       if (policy & ~SCTP_PR_SCTP_MASK)
+               goto out;
+
+       asoc = sctp_id2assoc(sk, params.sprstat_assoc_id);
+       if (!asoc)
+               goto out;
+
+       if (policy == SCTP_PR_SCTP_NONE) {
+               params.sprstat_abandoned_unsent = 0;
+               params.sprstat_abandoned_sent = 0;
+               for (policy = 0; policy <= SCTP_PR_INDEX(MAX); policy++) {
+                       params.sprstat_abandoned_unsent +=
+                               asoc->abandoned_unsent[policy];
+                       params.sprstat_abandoned_sent +=
+                               asoc->abandoned_sent[policy];
+               }
+       } else {
+               params.sprstat_abandoned_unsent =
+                       asoc->abandoned_unsent[__SCTP_PR_INDEX(policy)];
+               params.sprstat_abandoned_sent =
+                       asoc->abandoned_sent[__SCTP_PR_INDEX(policy)];
+       }
+
+       if (put_user(len, optlen)) {
+               retval = -EFAULT;
+               goto out;
+       }
+
+       if (copy_to_user(optval, ¶ms, len)) {
+               retval = -EFAULT;
+               goto out;
+       }
+
+       retval = 0;
+
+out:
+       return retval;
+}
+
 static int sctp_getsockopt(struct sock *sk, int level, int optname,
                           char __user *optval, int __user *optlen)
 {
                retval = sctp_getsockopt_default_prinfo(sk, len, optval,
                                                        optlen);
                break;
+       case SCTP_PR_ASSOC_STATUS:
+               retval = sctp_getsockopt_pr_assocstatus(sk, len, optval,
+                                                       optlen);
+               break;
        default:
                retval = -ENOPROTOOPT;
                break;