Ack Vectors, feature negotiation and preview of new patches

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

 



Ian -

|  > I have just checked and found out that the negotiation of the "Send ack vector feature" is not yet 
|  > implemented. It is not something which can be done with a hack, since the CCIDs can also be negotiated, 
|  > so that enabling Ack Vectors depends on the end result of negotiating the CCID.
|  > I think at the moment we should add this as a ToDo. If I get some time I'll try to implement the
|  > above, but it is more work than anticipated and so depends on available time.
|  >
|  
|  Well I think the discussion is useful as a future reference. There's
|  no hurry on any of this really.

I am happy to announce that feature negotiation now works, which resolves the above problem. Below is
a log dump which shows the successful negotiation of CCID and dependent features during the handshake.
Exchanging NN features during an established connection is also possible (as used e.g. by Ack Ratio for
CCID2). I'll be sending the patches next week after some more testing.

In a nutshell, it works like this:
 * client makes its reservations on the initial Request,
 * server aligns its reservations with the received client reservations, confirms or rejects the NN features
   and has the last word on server-priority (sic!) features,
 * after negotiating the CCID, the server resolves the CCID dependencies:
	- for CCID3 enable Send Loss Event rate, disable Ack Vectors, set Ack Ratio = 0
	- for CCID2 enable mandatory Send Ack Vector, set Ack Ratio = 2 or from sysctl
 * server adds Confirms and local Change options onto Response
 * client performs local checks, adds its Confirms onto the Ack, and enters PARTOPEN; before it does this,
   it enables all successfully negotiated features (or aborts on disagreement)    
 * server receives Ack and enters OPEN; before it does this, it activates all features as the client does

It is now possible to
 * influence negotiation of Sequence Window via feature negotiation
 * negotiate a common minimum Checksum coverage
 * set CCIDs on a per-connection basis via sockopts
 * the above works in general - almost all features use sysctls as default and can be overridden via
   sockopts

I will be sending the patches next week, in small batches, after testing. It is quite a lot since it involved
a few nasty problems which are now resolved. There is some (too much) documentation on 
http://www.erg.abdn.ac.uk/users/gerrit/dccp/notes/feature_negotiation/implementation_notes.html

The other news is a patch for wireshark to 
 * decode all feature-negotiation options
 * decode CCID3's X_recv and Loss Event Rate
This is on http://www.erg.abdn.ac.uk/users/gerrit/dccp/apps/wireshark-options-decoding.diff

Here is the log with comments:

# 1. initial startup phase: sequence window needs to be enabled early since needed for AWL/SWL
   -> activating RX Sequence Window, default val=100
   -> activating TX Sequence Window, default val=100
dccp_feat_finalise_settings: List Dump:
   * local CCID = 2, 3, state=INITIALISING
   * remote CCID = 2, 3, state=INITIALISING
   * local ECN Incapable = 1, state=INITIALISING
   * remote Min. Csum Coverage = 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, state=INITIALISING

# 2. client inserts its options (chose CCID2, note that the server elects to use CCID3 instead)
dccp_feat_insert_opts: Change_R(Min. Csum Coverage, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
dccp_feat_insert_opts: Change_L(ECN Incapable, 1)
dccp_feat_insert_opts: Change_R(CCID, 2, 3)
dccp_feat_insert_opts: Change_L(CCID, 2, 3)
dccp_feat_confirm_recv: Confirm_L(CCID, 3, 3, 2)
dccp_feat_confirm_recv: Confirm_R(CCID, 3, 3, 2)

# 3. client receives Change/Confirms on the server Response
dccp_feat_change_recv: Change_L(ECN Incapable, 1) !
dccp_feat_confirm_recv: Confirm_R(ECN Incapable, 1, 1)
dccp_feat_change_recv: Change_L(Ack Ratio, 0)
dccp_feat_change_recv: Change_R(Send NDP Count, 1) !
dccp_feat_change_recv: Change_L(Send NDP Count, 1)
dccp_feat_confirm_recv: Confirm_L(Min. Csum Coverage, 6, 6, 4, 5, 3, 7, 8, 9, 10, 11, 12, 13, 14, 15)
dccp_feat_change_recv: Change_L(Send Loss Event Rate, 1) !
dccp_feat_change_recv: Change_R(Send Loss Event Rate, 1) !

# 4. client is done (but has not sent the Ack with the Confirms yet)
dccp_feat_activate_values: List Dump:
   * local CCID = 3, 3, state=STABLE
   * remote CCID = 3, 3, state=STABLE
   * local ECN Incapable = 1, state=STABLE
   * remote ECN Incapable = 1, state=STABLE (Confirm pending)
   * remote Ack Ratio = 0, state=STABLE (Confirm pending)
   * local Send NDP Count = 1, state=STABLE (Confirm pending)
   * remote Send NDP Count = 1, state=STABLE (Confirm pending)
   * remote Min. Csum Coverage = 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, state=STABLE
   * remote Send Loss Event Rate = 1, state=STABLE (Confirm pending)
   * local Send Loss Event Rate = 1, state=STABLE (Confirm pending)
   -> activating TX Min. Csum Coverage, val=6
   -> activating RX Min. Csum Coverage, default val=0
   -> activating RX Send NDP Count, val=1
   -> activating TX Send NDP Count, val=1
   -> activating TX Send ACK Vector, default val=0
   -> activating RX Send ACK Vector, default val=0
   -> activating RX Ack Ratio, val=0
   -> activating TX Ack Ratio, default val=2
   -> activating RX Sequence Window, default val=100
   -> activating TX Sequence Window, default val=100
   -> activating RX CCID, val=3
   -> activating TX CCID, val=3
dccp_feat_activate_values: Activation OK

# 5. this is the Ack sent to the server
dccp_feat_insert_opts: Confirm_L(Send Loss Event Rate, 1)
dccp_feat_insert_opts: Confirm_R(Send Loss Event Rate, 1)
dccp_feat_insert_opts: Confirm_R(Send NDP Count, 1)
dccp_feat_insert_opts: Confirm_L(Send NDP Count, 1)
dccp_feat_insert_opts: Confirm_R(Ack Ratio, 0)
dccp_feat_insert_opts: Confirm_R(ECN Incapable, 1)

# 6. This required the recent patch :)
SYN RTT = 170us
-
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

[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