Re: [PATCH] sctp: send SHUTDOWN-ACK chunk back to where the SHUTDOWN came from

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I was just doing review of the patches again and testing them out.

I think the following is a more elegant solution.

diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
index 4e4ca65..bbd238d 100644
--- a/net/sctp/sm_sideeffect.c
+++ b/net/sctp/sm_sideeffect.c
@@ -696,11 +696,15 @@ static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds,
 {
        struct sctp_transport *t;

-       t = sctp_assoc_choose_alter_transport(asoc,
+       if (chunk->transport)
+               t = chunk->transport;
+       else {
+               t = sctp_assoc_choose_alter_transport(asoc,
                                              asoc->shutdown_last_sent_to);
+               chunk->transport = t;
+       }
        asoc->shutdown_last_sent_to = t;
        asoc->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = t->rto;
-       chunk->transport = t;
 }

 /* Helper function to change the state of an association. */


-vlad

Wei Yongjun wrote:
> SHUTDOWN-ACK is alaways sent to the primary path at the first time,
> but should better transmit SHUTDOWN-ACK chunk to the same destination
> transport address from which it received the SHUTDOWN chunk.
> 
> Signed-off-by: Wei Yongjun <yjwei@xxxxxxxxxxxxxx>
> ---
>  include/net/sctp/structs.h |    3 ++-
>  net/sctp/associola.c       |   12 ++++++++----
>  net/sctp/sm_sideeffect.c   |    7 ++++---
>  3 files changed, 14 insertions(+), 8 deletions(-)
> 
> diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
> index ff30177..565a291 100644
> --- a/include/net/sctp/structs.h
> +++ b/include/net/sctp/structs.h
> @@ -1948,7 +1948,8 @@ void sctp_association_put(struct sctp_association *);
>  void sctp_association_hold(struct sctp_association *);
>  
>  struct sctp_transport *sctp_assoc_choose_alter_transport(
> -	struct sctp_association *, struct sctp_transport *);
> +	struct sctp_association *, struct sctp_transport *,
> +	struct sctp_chunk *);
>  void sctp_assoc_update_retran_path(struct sctp_association *);
>  struct sctp_transport *sctp_assoc_lookup_paddr(const struct sctp_association *,
>  					  const union sctp_addr *);
> diff --git a/net/sctp/associola.c b/net/sctp/associola.c
> index df5abbf..45bb311 100644
> --- a/net/sctp/associola.c
> +++ b/net/sctp/associola.c
> @@ -1335,15 +1335,19 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
>  
>  /* Choose the transport for sending retransmit packet.  */
>  struct sctp_transport *sctp_assoc_choose_alter_transport(
> -	struct sctp_association *asoc, struct sctp_transport *last_sent_to)
> +	struct sctp_association *asoc, struct sctp_transport *last_sent_to,
> +	struct sctp_chunk *chunk)
>  {
>  	/* If this is the first time packet is sent, use the active path,
>  	 * else use the retran path. If the last packet was sent over the
>  	 * retran path, update the retran path and use it.
>  	 */
> -	if (!last_sent_to)
> -		return asoc->peer.active_path;
> -	else {
> +	if (!last_sent_to) {
> +		if (chunk && chunk->transport)
> +			return chunk->transport;
> +		else
> +			return asoc->peer.active_path;
> +	} else {
>  		if (last_sent_to == asoc->peer.retran_path)
>  			sctp_assoc_update_retran_path(asoc);
>  		return asoc->peer.retran_path;
> diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
> index 4e4ca65..e61d5bf 100644
> --- a/net/sctp/sm_sideeffect.c
> +++ b/net/sctp/sm_sideeffect.c
> @@ -697,7 +697,8 @@ static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds,
>  	struct sctp_transport *t;
>  
>  	t = sctp_assoc_choose_alter_transport(asoc,
> -					      asoc->shutdown_last_sent_to);
> +					      asoc->shutdown_last_sent_to,
> +					      chunk);
>  	asoc->shutdown_last_sent_to = t;
>  	asoc->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = t->rto;
>  	chunk->transport = t;
> @@ -788,7 +789,7 @@ static void sctp_cmd_setup_t4(sctp_cmd_seq_t *cmds,
>  {
>  	struct sctp_transport *t;
>  
> -	t = sctp_assoc_choose_alter_transport(asoc, chunk->transport);
> +	t = sctp_assoc_choose_alter_transport(asoc, chunk->transport, NULL);
>  	asoc->timeouts[SCTP_EVENT_TIMEOUT_T4_RTO] = t->rto;
>  	chunk->transport = t;
>  }
> @@ -1412,7 +1413,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
>  		case SCTP_CMD_INIT_CHOOSE_TRANSPORT:
>  			chunk = cmd->obj.ptr;
>  			t = sctp_assoc_choose_alter_transport(asoc,
> -						asoc->init_last_sent_to);
> +						asoc->init_last_sent_to, NULL);
>  			asoc->init_last_sent_to = t;
>  			chunk->transport = t;
>  			t->init_sent_count++;
--
To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Networking Development]     [Linux OMAP]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux