char __user *optval,
                                          unsigned int optlen)
 {
+       struct sctp_sock *sp = sctp_sk(sk);
        struct sctp_default_prinfo info;
        struct sctp_association *asoc;
        int retval = -EINVAL;
                info.pr_value = 0;
 
        asoc = sctp_id2assoc(sk, info.pr_assoc_id);
+       if (!asoc && info.pr_assoc_id > SCTP_ALL_ASSOC &&
+           sctp_style(sk, UDP))
+               goto out;
+
+       retval = 0;
+
        if (asoc) {
                SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy);
                asoc->default_timetolive = info.pr_value;
-       } else if (!info.pr_assoc_id) {
-               struct sctp_sock *sp = sctp_sk(sk);
+               goto out;
+       }
 
+       if (info.pr_assoc_id == SCTP_FUTURE_ASSOC ||
+           info.pr_assoc_id == SCTP_ALL_ASSOC) {
                SCTP_PR_SET_POLICY(sp->default_flags, info.pr_policy);
                sp->default_timetolive = info.pr_value;
-       } else {
-               goto out;
        }
 
-       retval = 0;
+       if (info.pr_assoc_id == SCTP_CURRENT_ASSOC ||
+           info.pr_assoc_id == SCTP_ALL_ASSOC) {
+               list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
+                       SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy);
+                       asoc->default_timetolive = info.pr_value;
+               }
+       }
 
 out:
        return retval;
                goto out;
 
        asoc = sctp_id2assoc(sk, info.pr_assoc_id);
+       if (!asoc && info.pr_assoc_id != SCTP_FUTURE_ASSOC &&
+           sctp_style(sk, UDP)) {
+               retval = -EINVAL;
+               goto out;
+       }
+
        if (asoc) {
                info.pr_policy = SCTP_PR_POLICY(asoc->default_flags);
                info.pr_value = asoc->default_timetolive;
-       } else if (!info.pr_assoc_id) {
+       } else {
                struct sctp_sock *sp = sctp_sk(sk);
 
                info.pr_policy = SCTP_PR_POLICY(sp->default_flags);
                info.pr_value = sp->default_timetolive;
-       } else {
-               retval = -EINVAL;
-               goto out;
        }
 
        if (put_user(len, optlen))