]> git.hungrycats.org Git - linux/commitdiff
sctp: not send SCTP_PEER_ADDR_CHANGE notifications with failed probe
authorZhu Yanjun <zyjzyj2000@gmail.com>
Thu, 20 Nov 2014 06:04:40 +0000 (14:04 +0800)
committerWilly Tarreau <w@1wt.eu>
Sun, 23 Nov 2014 09:55:54 +0000 (10:55 +0100)
2.6.x kernels require a similar logic change as commit 2c0d6ac894a
[sctp: not send SCTP_PEER_ADDR_CHANGE notifications with failed probe]
introduces for newer kernels.

Since the transport has always been in state SCTP_UNCONFIRMED, it
therefore wasn't active before and hasn't been used before, and it
always has been, so it is unnecessary to bug the user with a
notification.

Reported-by: Deepak Khandelwal <khandelwal.deepak.1987@gmail.com>
Suggested-by: Vlad Yasevich <vyasevich@gmail.com>
Suggested-by: Michael Tuexen <tuexen@fh-muenster.de>
Suggested-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: Zhu Yanjun <Yanjun.Zhu@windriver.com>
Acked-by: Vlad Yasevich <vyasevich@gmail.com>
Acked-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Willy Tarreau <w@1wt.eu>
net/sctp/associola.c

index 506236df746b8550d4fd0bc2d2711806eb157377..12137d3818154c109a2e39f64e4f61c6deb9b300 100644 (file)
@@ -824,6 +824,7 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
        struct sctp_ulpevent *event;
        struct sockaddr_storage addr;
        int spc_state = 0;
+       bool ulp_notify = true;
 
        /* Record the transition on the transport.  */
        switch (command) {
@@ -850,6 +851,7 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
                else {
                        dst_release(transport->dst);
                        transport->dst = NULL;
+                       ulp_notify = false;
                }
 
                spc_state = SCTP_ADDR_UNREACHABLE;
@@ -862,12 +864,14 @@ void sctp_assoc_control_transport(struct sctp_association *asoc,
        /* Generate and send a SCTP_PEER_ADDR_CHANGE notification to the
         * user.
         */
-       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,
+       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)
-               sctp_ulpq_tail_event(&asoc->ulpq, event);
+               if (event)
+                       sctp_ulpq_tail_event(&asoc->ulpq, event);
+       }
 
        /* Select new active and retran paths. */