Re: [PATCH 2/4] dccp: Send Confirm Options Only Once

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Kernel]     [IETF DCCP]     [Linux Networking]     [Git]     [Security]     [Linux Assembly]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux