This is a little better.

One suggestion.  The new function you create is almost exactly like
sctp_sf_violation_chunklen() with the exception of the error string.
Can you extract the common parts into a single function so that
we don't have duplication of code.

Thanks
-vlad

Wei Yongjun wrote:
>>   
>> This is an interesting case, but I am not sure that simply discarding
>> the SACK is the right thing.
>>
>> The peer in this case is violating the protocol whereby he is trying to
>> advance the cumulative tsn ack to a point beyond the max tsn currently
>> sent. I would vote for terminating the association in this case since
>> either the peer is a mis-behaved implementation, or the association is
>> under attack.
> I have modify the patch to abort the association with protocol violation 
> error cause, and new patch is come on. May be this patch is correct.^_^
> 
> Signed-off-by: Wei Yongjun <[EMAIL PROTECTED]>
> 
> --- net/sctp/sm_statefuns.c.orig      2007-07-29 18:11:01.000000000 -0400
> +++ net/sctp/sm_statefuns.c   2007-07-31 00:29:16.000000000 -0400
> @@ -104,6 +104,13 @@ static sctp_disposition_t sctp_sf_violat
>                                    void *arg,
>                                    sctp_cmd_seq_t *commands);
>  
> +static sctp_disposition_t sctp_sf_violation_ctsn(
> +                                  const struct sctp_endpoint *ep,
> +                                  const struct sctp_association *asoc,
> +                                  const sctp_subtype_t type,
> +                                  void *arg,
> +                                  sctp_cmd_seq_t *commands);
> +
>  /* Small helper function that checks if the chunk length
>   * is of the appropriate length.  The 'required_length' argument
>   * is set to be the size of a specific chunk we are testing.
> @@ -2880,6 +2887,13 @@ sctp_disposition_t sctp_sf_eat_sack_6_2(
>               return SCTP_DISPOSITION_DISCARD;
>       }
>  
> +     /* If Cumulative TSN Ack beyond the max tsn currently
> +      * send, terminating the association and respond to the 
> +      * sender with an ABORT.
> +      */
> +     if (!TSN_lt(ctsn, asoc->next_tsn))
> +             return sctp_sf_violation_ctsn(ep, asoc, type, arg, commands);
> +
>       /* Return this SACK for further processing.  */
>       sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_SACK, SCTP_SACKH(sackh));
>  
> @@ -3756,6 +3770,68 @@ nomem:
>       return SCTP_DISPOSITION_NOMEM;
>  }
>  
> +/*
> + * Handle a protocol violation when the peer trying to advance the 
> + * cumulative tsn ack to a point beyond the max tsn currently sent.
> + *
> + * We inform the other end by sending an ABORT with a Protocol Violation
> + * error code.
> + *
> + * Section: Not specified
> + * Verification Tag:  Nothing to do
> + * Inputs
> + * (endpoint, asoc, chunk)
> + *
> + * Outputs
> + * (reply_msg, msg_up, counters)
> + *
> + * Generate an  ABORT chunk and terminate the association.
> + */
> +static sctp_disposition_t sctp_sf_violation_ctsn(
> +                                  const struct sctp_endpoint *ep,
> +                                  const struct sctp_association *asoc,
> +                                  const sctp_subtype_t type,
> +                                  void *arg,
> +                                  sctp_cmd_seq_t *commands)
> +{
> +     struct sctp_chunk *chunk =  arg;
> +     struct sctp_chunk *abort = NULL;
> +     char err_str[] = "The cumulative tsn ack beyond the max tsn currently 
> sent:";
> +
> +     /* Make the abort chunk. */
> +     abort = sctp_make_abort_violation(asoc, chunk, err_str,
> +                                       sizeof(err_str));
> +     if (!abort)
> +             goto nomem;
> +
> +     sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
> +     SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +
> +     if (asoc->state <= SCTP_STATE_COOKIE_ECHOED) {
> +             sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
> +                             SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
> +             sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
> +                             SCTP_ERROR(ECONNREFUSED));
> +             sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED,
> +                             SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
> +     } else {
> +             sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
> +                             SCTP_ERROR(ECONNABORTED));
> +             sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
> +                             SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
> +             SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +     }
> +
> +     sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
> +
> +     SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +
> +     return SCTP_DISPOSITION_ABORT;
> +
> +nomem:
> +     return SCTP_DISPOSITION_NOMEM;
> +}
> +
>  /***************************************************************************
>   * These are the state functions for handling primitive (Section 10) events.
>   ***************************************************************************/
> 
> 
> 

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to