On 9/30/07, Gerrit Renker <[EMAIL PROTECTED]> wrote:
> [DCCP]: Convert Reset code into socket error number
>
> This adds support for converting the 11 currently defined Reset codes into 
> system
> error numbers, which are stored in sk_err for further interpretation.
>
> This makes the externally visible API behaviour similar to TCP, since a client
> connecting to a non-existing port will experience ECONNREFUSED.
>
>  * Code 0, Unspecified, is interpreted as non-error (0);
>  * Code 1, Closed (normal termination), also maps into 0;
>  * Code 2, Aborted, maps into "Connection reset by peer" (ECONNRESET);
>  * Code 3, No Connection and
>    Code 7, Connection Refused, map into "Connection refused" (ECONNREFUSED);
>  * Code 4, Packet Error, maps into "No message of desired type" (ENOMSG);
>  * Code 5, Option Error, maps into "Illegal byte sequence" (EILSEQ);
>  * Code 6, Mandatory Error, maps into "Operation not supported on transport 
> endpoint" (EOPNOTSUPP);
>  * Code 8, Bad Service Code, maps into "Invalid request code" (EBADRQC);
>  * Code 9, Too Busy, maps into "Too many users" (EUSERS);
>  * Code 10, Bad Init Cookie, maps into "Invalid request descriptor" (EBADR);
>  * Code 11, Aggression Penalty, maps into "Quota exceeded" (EDQUOT)
>    which makes sense in terms of using more than the `fair share' of 
> bandwidth.
>
> The patch was found to solve the problem reported by Rémi Denis-Courmont - 
> many thanks.
>
> Signed-off-by: Gerrit Renker <[EMAIL PROTECTED]>
> ---
>  net/dccp/input.c |   48 +++++++++++++++++++++++++++++++++++++++---------
>  1 file changed, 39 insertions(+), 9 deletions(-)
>
> --- a/net/dccp/input.c
> +++ b/net/dccp/input.c
> @@ -55,6 +55,42 @@ static void dccp_rcv_closereq(struct soc
>         dccp_send_close(sk, 0);
>  }
>
> +static u8 dccp_reset_code_convert(const u8 code)
> +{
> +       const u8 error_code[] = {
> +       [DCCP_RESET_CODE_CLOSED]             = 0,       /* normal termination 
> */
> +       [DCCP_RESET_CODE_UNSPECIFIED]        = 0,       /* nothing known */
> +       [DCCP_RESET_CODE_ABORTED]            = ECONNRESET,
> +
> +       [DCCP_RESET_CODE_NO_CONNECTION]      = ECONNREFUSED,
> +       [DCCP_RESET_CODE_CONNECTION_REFUSED] = ECONNREFUSED,
> +       [DCCP_RESET_CODE_TOO_BUSY]           = EUSERS,
> +       [DCCP_RESET_CODE_AGGRESSION_PENALTY] = EDQUOT,
> +
> +       [DCCP_RESET_CODE_PACKET_ERROR]       = ENOMSG,
> +       [DCCP_RESET_CODE_BAD_INIT_COOKIE]    = EBADR,
> +       [DCCP_RESET_CODE_BAD_SERVICE_CODE]   = EBADRQC,
> +       [DCCP_RESET_CODE_OPTION_ERROR]       = EILSEQ,
> +       [DCCP_RESET_CODE_MANDATORY_ERROR]    = EOPNOTSUPP,
> +       };
> +

This array is inside the function so is local.

> +       return code <= DCCP_RESET_CODE_AGGRESSION_PENALTY? error_code[code] : 
> 0;

and then you basically don't use half of it.
> +}

So I presume the reason for doing this is that half the codes don't
apply to reset.

However this looks ugly as you're only using half the array. I suspect
that you want this for other purposes too (it would make sense too).
As such then the array should be shifted out of the local function
into the main part of the file.

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

Reply via email to