From ac0cd79b53f2c5f10d563efcfab8588287fe36b2 Mon Sep 17 00:00:00 2001 From: Samuel Jero Date: Sun, 24 Jul 2011 21:06:37 -0600 Subject: [PATCH] --- yaml --- r: 265169 b: refs/heads/master c: a6444f4237af6c9981ddd45ab35a5c06d4e5a4d8 h: refs/heads/master i: 265167: 11d44a3dcd6f0b30b253bde6d68684c0c4bc17c7 v: v3 --- [refs] | 2 +- trunk/net/dccp/feat.c | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 0444a829c1dc..382a705bf40f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 44e6fd9e67c1043aaeed381c10b74e73807b7f26 +refs/heads/master: a6444f4237af6c9981ddd45ab35a5c06d4e5a4d8 diff --git a/trunk/net/dccp/feat.c b/trunk/net/dccp/feat.c index ad6f9e2cac1a..23cea0ee3101 100644 --- a/trunk/net/dccp/feat.c +++ b/trunk/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; }