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. Note: Patch #3 (Don't Reset on Confirm for Old NN Feature Values), fixed the other side of this issue by ignoring values that don't match the most recent. --- I have modified this patch to only remove confirm options when the connection is in the OPEN state. This will allow confirm options to be retransmitted during PARTOPEN to provide durability at that point. Samuel Jero --- Signed-off-by: Samuel Jero diff --git a/net/dccp/feat.c b/net/dccp/feat.c --- a/net/dccp/feat.c +++ b/net/dccp/feat.c @@ -690,11 +678,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; }
Attachment:
signature.asc
Description: This is a digitally signed message part