From: Samuel Jero <sj323707@xxxxxxxx> If a connection is in the OPEN state, then remove Feature Negotiation Confirm Options from the list of options to send after they are sent once. Confirm options are NOT supposed to be retransmitted and are ONLY supposed to be sent in response to a Change Option (RFC 4340 6.2). When combined with feature negotiation code that would reset the connection on an feature negotiation value that didn't match the most recently sent value, this issue will cause a connection reset on the second feature negotiation for any given NN feature. Signed-off-by: Samuel Jero <sj323707@xxxxxxxx> Acked-by: Gerrit Renker <gerrit@xxxxxxxxxxxxxx> --- net/dccp/feat.c | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) --- 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; } -- To unsubscribe from this list: send the line "unsubscribe dccp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html