sctp: ASCONF-ACK with Unresolvable Address should be sent
authorlucien <lucien.xin@gmail.com>
Fri, 28 Aug 2015 09:45:58 +0000 (17:45 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 29 Aug 2015 05:25:42 +0000 (22:25 -0700)
RFC 5061:
    This is an opaque integer assigned by the sender to identify each
    request parameter.  The receiver of the ASCONF Chunk will copy this
    32-bit value into the ASCONF Response Correlation ID field of the
    ASCONF-ACK response parameter.  The sender of the ASCONF can use this
    same value in the ASCONF-ACK to find which request the response is
    for.  Note that the receiver MUST NOT change this 32-bit value.

    Address Parameter: TLV

    This field contains an IPv4 or IPv6 address parameter, as described
    in Section 3.3.2.1 of [RFC4960].

ASCONF chunk with Error Cause Indication Parameter (Unresolvable Address)
should be sent if the Delete IP Address is not part of the association.

  Endpoint A                           Endpoint B
  (ESTABLISHED)                        (ESTABLISHED)

  ASCONF        ----------------->
  (Delete IP Address)
                <-----------------      ASCONF-ACK
                                        (Unresolvable Address)

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Acked-by: Vlad Yasevich <vyasevich@gmail.com>
Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sctp/sm_make_chunk.c

index a655ddc3f3530727f5225ee40f006964b8cb7a50..7954c52e179442ab89151971787432af75d84383 100644 (file)
@@ -3090,8 +3090,19 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
                        sctp_assoc_set_primary(asoc, asconf->transport);
                        sctp_assoc_del_nonprimary_peers(asoc,
                                                        asconf->transport);
-               } else
-                       sctp_assoc_del_peer(asoc, &addr);
+                       return SCTP_ERROR_NO_ERROR;
+               }
+
+               /* If the address is not part of the association, the
+                * ASCONF-ACK with Error Cause Indication Parameter
+                * which including cause of Unresolvable Address should
+                * be sent.
+                */
+               peer = sctp_assoc_lookup_paddr(asoc, &addr);
+               if (!peer)
+                       return SCTP_ERROR_DNS_FAILED;
+
+               sctp_assoc_rm_peer(asoc, peer);
                break;
        case SCTP_PARAM_SET_PRIMARY:
                /* ADDIP Section 4.2.4