From: Samuel Jero Date: Mon, 25 Jul 2011 03:06:37 +0000 (-0600) Subject: dccp: send Confirm options only once X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=a6444f4237af6c9981ddd45ab35a5c06d4e5a4d8;p=mv-sheeva.git dccp: send Confirm options only once If a connection is in the OPEN state, remove feature negotiation Confirm options from the list of options after sending them once; as such options are NOT supposed to be retransmitted and are ONLY supposed to be sent in response to a Change option (RFC 4340 6.2). Signed-off-by: Samuel Jero Acked-by: Gerrit Renker --- diff --git a/net/dccp/feat.c b/net/dccp/feat.c index ad6f9e2cac1..23cea0ee310 100644 --- a/net/dccp/feat.c +++ b/net/dccp/feat.c @@ -665,11 +665,22 @@ int dccp_feat_insert_opts(struct dccp_sock *dp, struct dccp_request_sock *dreq, return -1; if (pos->needs_mandatory && dccp_insert_option_mandatory(skb)) return -1; - /* - * Enter CHANGING after transmitting the Change option (6.6.2). - */ - if (pos->state == FEAT_INITIALISING) - pos->state = FEAT_CHANGING; + + if (skb->sk->sk_state == DCCP_OPEN && + (opt == DCCPO_CONFIRM_R || opt == DCCPO_CONFIRM_L)) { + /* + * Confirms don't get retransmitted (6.6.3) once the + * connection is in state OPEN + */ + dccp_feat_list_pop(pos); + } else { + /* + * Enter CHANGING after transmitting the Change + * option (6.6.2). + */ + if (pos->state == FEAT_INITIALISING) + pos->state = FEAT_CHANGING; + } } return 0; }