SCTP_CMD_SET_SK_ERR,     /* Set sk_err */
        SCTP_CMD_ASSOC_CHANGE,   /* generate and send assoc_change event */
        SCTP_CMD_ADAPTATION_IND, /* generate and send adaptation event */
+       SCTP_CMD_PEER_NO_AUTH,   /* generate and send authentication event */
        SCTP_CMD_ASSOC_SHKEY,    /* generate the association shared keys */
        SCTP_CMD_T1_RETRAN,      /* Mark for retransmission after T1 timeout  */
        SCTP_CMD_UPDATE_INITTAG, /* Update peer inittag */
 
                asoc->stream.si->enqueue_event(&asoc->ulpq, ev);
 }
 
+static void sctp_cmd_peer_no_auth(struct sctp_cmd_seq *commands,
+                                 struct sctp_association *asoc)
+{
+       struct sctp_ulpevent *ev;
+
+       ev = sctp_ulpevent_make_authkey(asoc, 0, SCTP_AUTH_NO_AUTH, GFP_ATOMIC);
+       if (ev)
+               asoc->stream.si->enqueue_event(&asoc->ulpq, ev);
+}
+
 /* Helper function to generate an adaptation indication event */
 static void sctp_cmd_adaptation_ind(struct sctp_cmd_seq *commands,
                                    struct sctp_association *asoc)
                case SCTP_CMD_ADAPTATION_IND:
                        sctp_cmd_adaptation_ind(commands, asoc);
                        break;
+               case SCTP_CMD_PEER_NO_AUTH:
+                       sctp_cmd_peer_no_auth(commands, asoc);
+                       break;
 
                case SCTP_CMD_ASSOC_SHKEY:
                        error = sctp_auth_asoc_init_active_key(asoc,
 
                                         void *arg,
                                         struct sctp_cmd_seq *commands)
 {
-       struct sctp_ulpevent *ev, *ai_ev = NULL;
+       struct sctp_ulpevent *ev, *ai_ev = NULL, *auth_ev = NULL;
        struct sctp_association *new_asoc;
        struct sctp_init_chunk *peer_init;
        struct sctp_chunk *chunk = arg;
                        goto nomem_aiev;
        }
 
+       if (!new_asoc->peer.auth_capable) {
+               auth_ev = sctp_ulpevent_make_authkey(new_asoc, 0,
+                                                    SCTP_AUTH_NO_AUTH,
+                                                    GFP_ATOMIC);
+               if (!auth_ev)
+                       goto nomem_authev;
+       }
+
        /* Add all the state machine commands now since we've created
         * everything.  This way we don't introduce memory corruptions
         * during side-effect processing and correclty count established
                sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
                                SCTP_ULPEVENT(ai_ev));
 
+       if (auth_ev)
+               sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
+                               SCTP_ULPEVENT(auth_ev));
+
        return SCTP_DISPOSITION_CONSUME;
 
+nomem_authev:
+       sctp_ulpevent_free(ai_ev);
 nomem_aiev:
        sctp_ulpevent_free(ev);
 nomem_ev:
                                SCTP_ULPEVENT(ev));
        }
 
+       if (!asoc->peer.auth_capable) {
+               ev = sctp_ulpevent_make_authkey(asoc, 0, SCTP_AUTH_NO_AUTH,
+                                               GFP_ATOMIC);
+               if (!ev)
+                       goto nomem;
+               sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
+                               SCTP_ULPEVENT(ev));
+       }
+
        return SCTP_DISPOSITION_CONSUME;
 nomem:
        return SCTP_DISPOSITION_NOMEM;
        if (asoc->peer.adaptation_ind)
                sctp_add_cmd_sf(commands, SCTP_CMD_ADAPTATION_IND, SCTP_NULL());
 
+       if (!asoc->peer.auth_capable)
+               sctp_add_cmd_sf(commands, SCTP_CMD_PEER_NO_AUTH, SCTP_NULL());
+
        return SCTP_DISPOSITION_CONSUME;
 
 nomem:
                                        struct sctp_cmd_seq *commands,
                                        struct sctp_association *new_asoc)
 {
-       struct sctp_ulpevent *ev = NULL, *ai_ev = NULL;
+       struct sctp_ulpevent *ev = NULL, *ai_ev = NULL, *auth_ev = NULL;
        struct sctp_chunk *repl;
 
        /* Clarification from Implementor's Guide:
                                goto nomem;
 
                }
+
+               if (!asoc->peer.auth_capable) {
+                       auth_ev = sctp_ulpevent_make_authkey(asoc, 0,
+                                                            SCTP_AUTH_NO_AUTH,
+                                                            GFP_ATOMIC);
+                       if (!auth_ev)
+                               goto nomem;
+               }
        }
 
        repl = sctp_make_cookie_ack(new_asoc, chunk);
        if (ai_ev)
                sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
                                        SCTP_ULPEVENT(ai_ev));
+       if (auth_ev)
+               sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
+                               SCTP_ULPEVENT(auth_ev));
 
        return SCTP_DISPOSITION_CONSUME;
 
 nomem:
+       if (auth_ev)
+               sctp_ulpevent_free(auth_ev);
        if (ai_ev)
                sctp_ulpevent_free(ai_ev);
        if (ev)