sctp: add SCTP_ADDR_ADDED event
[linux-2.6-block.git] / net / sctp / associola.c
index d2ffc9a0ba3a608637472a3492043ce088acabe0..55aad70bb2d36bcea22be4f48d3a8bca0a6d0f84 100644 (file)
@@ -707,6 +707,8 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
        list_add_tail_rcu(&peer->transports, &asoc->peer.transport_addr_list);
        asoc->peer.transport_count++;
 
+       sctp_ulpevent_nofity_peer_addr_change(peer, SCTP_ADDR_ADDED, 0);
+
        /* If we do not yet have a primary path, set one.  */
        if (!asoc->peer.primary_path) {
                sctp_assoc_set_primary(asoc, peer);
@@ -781,10 +783,8 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
                                  enum sctp_transport_cmd command,
                                  sctp_sn_error_t error)
 {
-       struct sctp_ulpevent *event;
-       struct sockaddr_storage addr;
-       int spc_state = 0;
        bool ulp_notify = true;
+       int spc_state = 0;
 
        /* Record the transition on the transport.  */
        switch (command) {
@@ -836,16 +836,9 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
        /* Generate and send a SCTP_PEER_ADDR_CHANGE notification
         * to the user.
         */
-       if (ulp_notify) {
-               memset(&addr, 0, sizeof(struct sockaddr_storage));
-               memcpy(&addr, &transport->ipaddr,
-                      transport->af_specific->sockaddr_len);
-
-               event = sctp_ulpevent_make_peer_addr_change(asoc, &addr,
-                                       0, spc_state, error, GFP_ATOMIC);
-               if (event)
-                       asoc->stream.si->enqueue_event(&asoc->ulpq, event);
-       }
+       if (ulp_notify)
+               sctp_ulpevent_nofity_peer_addr_change(transport,
+                                                     spc_state, error);
 
        /* Select new active and retran paths. */
        sctp_select_active_and_retran_path(asoc);