This  serves to illustrate how to hook up a new CCID with the new 
feature-negotiation interface, so that the new CCID 

 * is detected for advertising during feature-negotiation,
 * can be queried via getsockopt,
 * can be set via setsockopt,
 * can be negotiated just as any other CCID.

It is done using an existing example, a fully working CCID module, 
CCID Null ("UDP-like", thanks to Arnaldo for the cool name), 
which can be downloaded from

     http://www.erg.abdn.ac.uk/users/gerrit/dccp/testing_dccp/Null-CCID.diff


Here are the steps.
 

1) Add an entry in the CCID enum in include/linux/dccp.h
--------------------------------------------------------

@@ -173,6 +173,7 @@ enum {
 enum {
        DCCPC_CCID2 = 2,
        DCCPC_CCID3 = 3,
+       DCCPC_CCID_NULL = 248,  /* example, for testing */
 };
 

2) Add a Kconfig option (not shown) and add a corresponding line to 
net/dccp/ccids.c:
-------------------------------------------------------------------------------------
This makes the new CCID `visible' to the sockopt and feature-negotiation 
infrastructure.

@@ -18,6 +18,9 @@ static u8 builtin_ccids[] = {
 #if defined(CONFIG_IP_DCCP_CCID3) || defined(CONFIG_IP_DCCP_CCID3_MODULE)
        DCCPC_CCID3,
 #endif
+#if defined(CONFIG_IP_DCCP_CCID0) || defined(CONFIG_IP_DCCP_CCID0_MODULE)
+       DCCPC_CCID_NULL,
+#endif
 };
 

3) Add the CCID symbolic name to the validity test in net/dccp/feat.c:
----------------------------------------------------------------------
This test avoids that alien CCIDs are negotiated, so to make a CCID like
CCID_NULL non-alien, it needs to be added in dccp_feat_is_valid_sp_val().

@@ -476,7 +476,8 @@ static u8 dccp_feat_is_valid_sp_val(u8 f
 {
        switch (feat_num) {
        case DCCPF_CCID:
-               return (val == DCCPC_CCID2 || val == DCCPC_CCID3);
+               return (val == DCCPC_CCID2 || val == DCCPC_CCID3 ||
+                       val == DCCPC_CCID_NULL);
        /* Type-check Boolean feature values: */
        case DCCPF_SHORT_SEQNOS:
        case DCCPF_ECN_INCAPABLE:


4) Add a feature-dependency list to dccp_feat_ccid_deps() in net/dccp/feat.c
----------------------------------------------------------------------------
Many CCIDs have dependencies (CCID2 for instance needs Ack Vectors, the present
Linux implementation of CCID3 relies on NDP count for better accuracy, etc.).

A dependency table ends in both rows with a column that has only zeroes. Since
CCID_NULL is not really a CCID, it has no dependencies, hence the columns in the
table below are empty.

In a real CCID, there would be things like Ack Vector feature etc (check feat.c 
for examples). A dependency table needs to be added in any case. 


@@ -780,9 +781,18 @@ static const struct ccid_dependency *dcc
+       static const struct ccid_dependency ccid0_dependencies[2][1] = {
+               {       /* Receiver-side dependencies: none */
+                       { 0, 0, 0, 0 },
+               },
+               {       /* Sender-side dependencies: none */
+                       { 0, 0, 0, 0 }
+               }
+       };
        switch (ccid) {
        case DCCPC_CCID2: return ccid2_dependencies[is_local];
        case DCCPC_CCID3: return ccid3_dependencies[is_local];
+       case DCCPC_CCID_NULL: return ccid0_dependencies[is_local];
        default:          return NULL;  /* other CCIDs: no specifics yet */
        }
 }


That's all - the new CCID is now ready for use!
-
To unsubscribe from this list: send the line "unsubscribe dccp" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to