Message ID | 20081217214608.GC14518@ghostprotocols.net |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Date: Wed, 17 Dec 2008 19:46:08 -0200 > So, if nobody sees any problem, please apply. > > Build CCID2, because the RFC requires it to be always available, and > CCID3 too as it is the most interesting one for VoIP, etc, together with > the main, layer 3 agnostic, DCCP core code, so that we have a faster > connection path by eliminating the need to always go thru the CCID > registration lock. But keep it there, so that we can experiment with > newer CCIDs without having to rebuild/reboot the whole kernel. > > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Gerrit, are you OK with this? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
| > Build CCID2, because the RFC requires it to be always available, and
| > CCID3 too as it is the most interesting one for VoIP, etc, together with
| > the main, layer 3 agnostic, DCCP core code, so that we have a faster
| > connection path by eliminating the need to always go thru the CCID
| > registration lock. But keep it there, so that we can experiment with
| > newer CCIDs without having to rebuild/reboot the whole kernel.
| >
| > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
| Gerrit, are you OK with this?
|
Acked-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Yes absolutely and thanks a lot to Arnaldo for the quick reply.
I apologize being late in replying, I actually sat down after work
yesterday and formulated a reply which is in agreement with this code.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Gerrit Renker <gerrit@erg.abdn.ac.uk> Date: Thu, 18 Dec 2008 06:33:49 +0100 > | > Build CCID2, because the RFC requires it to be always available, and > | > CCID3 too as it is the most interesting one for VoIP, etc, together with > | > the main, layer 3 agnostic, DCCP core code, so that we have a faster > | > connection path by eliminating the need to always go thru the CCID > | > registration lock. But keep it there, so that we can experiment with > | > newer CCIDs without having to rebuild/reboot the whole kernel. > | > > | > Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> > | > | Gerrit, are you OK with this? > | > Acked-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> Applied, thanks everyone. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
| > | Gerrit, are you OK with this? | > | | > Acked-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> | | Applied, thanks everyone. | I am sorry but I have to revert the Acked-by. As per yesterday's email I was ok with the basic idea, but already said that this did not include testing. Please do not apply this patch yet, it introduces several new problems and needs more work. 1. Module unloading does no longer work - it seems that there is an unmatched module_put somewhere. 2. There is an unresolved cyclic dependency with the dccp_tfrc_lib module: as soon as CCID-3 is enabled, - dccp.ko needs dccp_tfrc_lib.ko to resolve the dependencies of CCID-3 - dccp_tfrc_lib.ko needs dccp.ko since it imports symbols of the main DCCP module. That is this also prohibits module unloading. 3. A third point why module unloading does not work is that there is no ccid_builtins_unregister() function called from dccp_fini() in net/dccp/proto.c. 4. This may be Arnaldo's intention, but I disagree wholly with it: why do we still have the module loading stuff in net/dccp/ccid.c? We currently have no other CCID modules, and this just keeps the flaws of the old interface. When I (have to) fix up CCID-4 to work with the new interface then I will simply add a new entry into the ccid_builtin_ops. Also -- is the r/w lock that was the cause for making this patch really still necessary in ccid.c? 5. (May be the cause for point (4)): we now have 3 arrays in ccid.c where a single one would fully do: struct ccid_operations *ccids[CCID_MAX]; struct ccid_operations *builtin_ccids_ops[] u8 builtin_ccids[] Why do we keep the duplication between 'ccids' and 'builtin_ccids_ops' instead of simply saying struct ccid_operations *ccids[CCID_MAX] = { /* CCID-2 is supported by default */ [DCCPC_CCID2] = &ccid2_ops, #ifdef CONFIG_IP_DCCP_CCID3 [DCCPC_CCID3] = &ccid3_ops, #endif }; In this manner we can do away with all the locking and loading overhead for non-builtin modules that do not even exist. Furthermore, the new routine is_builtin_ccid() is then also redundant. The second array redundancy is between builtin_ccids[] and builtin_ccids_ops[] - one can get the former via builtin_ccids_ops[index]->ccid_id. That is, I am asking to * use 1 array instead of 3 that each do similar things * not make the complicated distinction between builtin and non-builtin (which at the moment is the same as non-existing) * as a result, several routines automatically fall under the table, the code becomes much simpler. 6. Suggestion: use '__init' annotation for ccids_register_builtins()? (Since almost all routines in ccid.c start with ccid_xxx, would it also be more consistent to name the routine 'ccid_register_builtins') 7. When fixing the Kconfig dependency for IP_DCCP_TFRC_LIB we need a bool instead of a tristate, e.g. config IP_DCCP_TFRC_LIB bool def_bool y if (IP_DCCP_CCID3 = y) And then the module_init/exit routines become unnecessary in net/dccp/ccids/lib/tfrc.c. When calling their replacement from ccid_builtins_register()/unregister() in net/dccp/ccid.c, we would need #ifdefs to avoid fusing the code to ccid3.c, e.g. int __init ccid_register_builtins(void) { int i, err; #ifdef CONFIG_IP_DCCP_TFRC_LIB err = tfrc_lib_init(); if (err) return err; #endif for ($i = 0; i < ARRAY_SIZE(builtin_ccids_ops); i++) { // ... } return 0; unwind_registrations: #ifdef CONFIG_IP_DCCP_TFRC_LIB tfrc_lib_exit(); #endif // ... } Linking the tfrc_lib code into ccid3.o seems not to solve the problem since the init()/exit() routines of tfrc_lib are called only once instead of for each new socket, as in ccid3.c. 8. The 'extern struct ccid_operations ccid?_ops;' should be in ccid.h instead of ccid.c (found via sparse). -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Gerrit Renker <gerrit@erg.abdn.ac.uk> Date: Fri, 19 Dec 2008 06:24:46 +0100 > | > | Gerrit, are you OK with this? > | > | > | > Acked-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> > | > | Applied, thanks everyone. > | > I am sorry but I have to revert the Acked-by. As per > yesterday's email I was ok with the basic idea, but > already said that this did not include testing. > > Please do not apply this patch yet, it introduces several > new problems and needs more work. You are so incredibly lucky I didn't push this out to kernel.org yet, it's been sitting in my tree all day long. Don't say ACK unless you mean it. It's reverted but you should do real reviews before you ACK changes in the future. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> You are so incredibly lucky I didn't push this out to kernel.org yet, > it's been sitting in my tree all day long. > > Don't say ACK unless you mean it. > Yes for me that's a lesson learned. I am waiting for Arnaldo's answer before taking any further steps; the changes are a bit bigger than expected so that dividing into a few smaller patches may be useful. Thanks a lot Gerrit -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
This set addresses the issues in making CCIDs an available part of DCCP. I am sending this for discussion, it differs in one point from the previous patch - this set does not keep the module loading and locking code. The rationale for this is that * at the moment there are only 2 fully standardised CCIDs * this situation is not likely to change in the foreseeable future (RFC progress is very slow, the update of RFC 3448 for instance took over 1 year and went through 6 revisions) * so it would only be research prototypes as candidates for the non-builtin case * and for this I think we are better off temporarily modifying the build process * this includes CCID-4, since its Internet draft has expired (http://www.ietf.org/internet-drafts/draft-ietf-dccp-ccid4-03.txt) * (but for heretics, we still have the "UDP-like" no-op module) All patches apply on top of Arnaldo's (your) patch to simplify discussion. Awaiting feedback, please do not apply immediately. Patch #1: Removes CCID module references that were still around. Patch #2: Removes the r/w locks around module loading. Patch #3: Adds a missing ccid_unregister_builtins() function. Patch #4: Integrates the TFRC library (which is a dependency of CCID-3/4) with DCCP, including necessary initialisation. I have performed testing with this set yesterday, it worked very well, including module unloading, use of dccp_probe, different links (WiFi/Ethernet/loopback). The set is also available via the test tree (git/patch/tarball): git://eden-feed.erg.abdn.ac.uk/dccp_exp [subtree `dccp'] http:// (same host) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Em Fri, Dec 19, 2008 at 07:56:25AM -0000, gerrit@erg.abdn.ac.uk escreveu: > > You are so incredibly lucky I didn't push this out to kernel.org yet, > > it's been sitting in my tree all day long. > > > > Don't say ACK unless you mean it. > > > Yes for me that's a lesson learned. > > I am waiting for Arnaldo's answer before taking any further steps; > the changes are a bit bigger than expected so that dividing into a > few smaller patches may be useful. > > Thanks a lot > Gerrit > I was away, travelling, will look at the points you raised tomorrow. - Arnaldo -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/dccp/Kconfig b/net/dccp/Kconfig index 7aa2a7a..ad6dffd 100644 --- a/net/dccp/Kconfig +++ b/net/dccp/Kconfig @@ -1,7 +1,6 @@ menuconfig IP_DCCP tristate "The DCCP Protocol (EXPERIMENTAL)" depends on INET && EXPERIMENTAL - select IP_DCCP_CCID2 ---help--- Datagram Congestion Control Protocol (RFC 4340) @@ -25,9 +24,6 @@ config INET_DCCP_DIAG def_tristate y if (IP_DCCP = y && INET_DIAG = y) def_tristate m -config IP_DCCP_ACKVEC - bool - source "net/dccp/ccids/Kconfig" menu "DCCP Kernel Hacking" diff --git a/net/dccp/Makefile b/net/dccp/Makefile index f4f8793..ac6ede3 100644 --- a/net/dccp/Makefile +++ b/net/dccp/Makefile @@ -1,6 +1,9 @@ obj-$(CONFIG_IP_DCCP) += dccp.o dccp_ipv4.o -dccp-y := ccid.o feat.o input.o minisocks.o options.o output.o proto.o timer.o +dccp-y := ccid.o feat.o input.o minisocks.o options.o output.o proto.o timer.o \ + ackvec.o ccids/ccid2.o + +dccp-$(CONFIG_IP_DCCP_CCID3) += ccids/ccid3.o dccp_ipv4-y := ipv4.o @@ -8,8 +11,6 @@ dccp_ipv4-y := ipv4.o obj-$(subst y,$(CONFIG_IP_DCCP),$(CONFIG_IPV6)) += dccp_ipv6.o dccp_ipv6-y := ipv6.o -dccp-$(CONFIG_IP_DCCP_ACKVEC) += ackvec.o - obj-$(CONFIG_INET_DCCP_DIAG) += dccp_diag.o obj-$(CONFIG_NET_DCCPPROBE) += dccp_probe.o diff --git a/net/dccp/ackvec.h b/net/dccp/ackvec.h index 4ccee03..45f95e5 100644 --- a/net/dccp/ackvec.h +++ b/net/dccp/ackvec.h @@ -84,7 +84,6 @@ struct dccp_ackvec_record { struct sock; struct sk_buff; -#ifdef CONFIG_IP_DCCP_ACKVEC extern int dccp_ackvec_init(void); extern void dccp_ackvec_exit(void); @@ -106,52 +105,4 @@ static inline int dccp_ackvec_pending(const struct dccp_ackvec *av) { return av->av_vec_len; } -#else /* CONFIG_IP_DCCP_ACKVEC */ -static inline int dccp_ackvec_init(void) -{ - return 0; -} - -static inline void dccp_ackvec_exit(void) -{ -} - -static inline struct dccp_ackvec *dccp_ackvec_alloc(const gfp_t priority) -{ - return NULL; -} - -static inline void dccp_ackvec_free(struct dccp_ackvec *av) -{ -} - -static inline int dccp_ackvec_add(struct dccp_ackvec *av, const struct sock *sk, - const u64 ackno, const u8 state) -{ - return -1; -} - -static inline void dccp_ackvec_check_rcv_ackno(struct dccp_ackvec *av, - struct sock *sk, const u64 ackno) -{ -} - -static inline int dccp_ackvec_parse(struct sock *sk, const struct sk_buff *skb, - const u64 *ackno, const u8 opt, - const u8 *value, const u8 len) -{ - return -1; -} - -static inline int dccp_insert_option_ackvec(const struct sock *sk, - const struct sk_buff *skb) -{ - return -1; -} - -static inline int dccp_ackvec_pending(const struct dccp_ackvec *av) -{ - return 0; -} -#endif /* CONFIG_IP_DCCP_ACKVEC */ #endif /* _ACKVEC_H */ diff --git a/net/dccp/ccid.c b/net/dccp/ccid.c index bcc643f..87991ec 100644 --- a/net/dccp/ccid.c +++ b/net/dccp/ccid.c @@ -13,9 +13,21 @@ #include "ccid.h" +extern struct ccid_operations ccid2_ops; +#ifdef CONFIG_IP_DCCP_CCID3 +extern struct ccid_operations ccid3_ops; +#endif + +static struct ccid_operations *builtin_ccids_ops[] = { + &ccid2_ops, /* CCID2 is supported by default */ +#ifdef CONFIG_IP_DCCP_CCID3 + &ccid3_ops, +#endif +}; + static u8 builtin_ccids[] = { DCCPC_CCID2, /* CCID2 is supported by default */ -#if defined(CONFIG_IP_DCCP_CCID3) || defined(CONFIG_IP_DCCP_CCID3_MODULE) +#ifdef CONFIG_IP_DCCP_CCID3 DCCPC_CCID3, #endif }; @@ -196,11 +208,71 @@ int ccid_unregister(struct ccid_operations *ccid_ops) EXPORT_SYMBOL_GPL(ccid_unregister); +int ccids_register_builtins(void) +{ + int i, err; + + for (i = 0; i < ARRAY_SIZE(builtin_ccids_ops); i++) { + err = ccid_register(builtin_ccids_ops[i]); + if (err) + goto unwind_registrations; + } + + return 0; + +unwind_registrations: + while(--i >= 0) + ccid_unregister(builtin_ccids_ops[i]); + return err; +} + +static struct ccid *__ccid_new(struct ccid_operations *ccid_ops, struct sock *sk, + int rx, gfp_t gfp) +{ + struct ccid *ccid = kmem_cache_alloc(rx ? ccid_ops->ccid_hc_rx_slab : + ccid_ops->ccid_hc_tx_slab, gfp); + if (ccid == NULL) + return NULL; + + ccid->ccid_ops = ccid_ops; + if (rx) { + memset(ccid + 1, 0, ccid_ops->ccid_hc_rx_obj_size); + if (ccid->ccid_ops->ccid_hc_rx_init != NULL && + ccid->ccid_ops->ccid_hc_rx_init(ccid, sk) != 0) + goto out_free_ccid; + } else { + memset(ccid + 1, 0, ccid_ops->ccid_hc_tx_obj_size); + if (ccid->ccid_ops->ccid_hc_tx_init != NULL && + ccid->ccid_ops->ccid_hc_tx_init(ccid, sk) != 0) + goto out_free_ccid; + } + return ccid; +out_free_ccid: + kmem_cache_free(rx ? ccid_ops->ccid_hc_rx_slab : + ccid_ops->ccid_hc_tx_slab, ccid); + return NULL; +} + +static bool is_builtin_ccid(unsigned char id) +{ + int i; + for (i = 0; i < ARRAY_SIZE(builtin_ccids); i++) + if (id == builtin_ccids[i]) + return true; + return false; +} + struct ccid *ccid_new(unsigned char id, struct sock *sk, int rx, gfp_t gfp) { struct ccid_operations *ccid_ops; struct ccid *ccid = NULL; + if (is_builtin_ccid(id)) { + ccid_ops = ccids[id]; + BUG_ON(ccid_ops == NULL); + return __ccid_new(ccid_ops, sk, rx, gfp); + } + ccids_read_lock(); #ifdef CONFIG_MODULES if (ccids[id] == NULL) { @@ -221,31 +293,14 @@ struct ccid *ccid_new(unsigned char id, struct sock *sk, int rx, gfp_t gfp) ccids_read_unlock(); - ccid = kmem_cache_alloc(rx ? ccid_ops->ccid_hc_rx_slab : - ccid_ops->ccid_hc_tx_slab, gfp); + ccid = __ccid_new(ccid_ops, sk, rx, gfp); if (ccid == NULL) goto out_module_put; - ccid->ccid_ops = ccid_ops; - if (rx) { - memset(ccid + 1, 0, ccid_ops->ccid_hc_rx_obj_size); - if (ccid->ccid_ops->ccid_hc_rx_init != NULL && - ccid->ccid_ops->ccid_hc_rx_init(ccid, sk) != 0) - goto out_free_ccid; - } else { - memset(ccid + 1, 0, ccid_ops->ccid_hc_tx_obj_size); - if (ccid->ccid_ops->ccid_hc_tx_init != NULL && - ccid->ccid_ops->ccid_hc_tx_init(ccid, sk) != 0) - goto out_free_ccid; - } out: return ccid; out_unlock: ccids_read_unlock(); goto out; -out_free_ccid: - kmem_cache_free(rx ? ccid_ops->ccid_hc_rx_slab : - ccid_ops->ccid_hc_tx_slab, ccid); - ccid = NULL; out_module_put: module_put(ccid_ops->ccid_owner); goto out; diff --git a/net/dccp/ccid.h b/net/dccp/ccid.h index 18f6942..192d25d 100644 --- a/net/dccp/ccid.h +++ b/net/dccp/ccid.h @@ -93,6 +93,8 @@ struct ccid_operations { extern int ccid_register(struct ccid_operations *ccid_ops); extern int ccid_unregister(struct ccid_operations *ccid_ops); +extern int ccids_register_builtins(void); + struct ccid { struct ccid_operations *ccid_ops; char ccid_priv[0]; diff --git a/net/dccp/ccids/Kconfig b/net/dccp/ccids/Kconfig index 1227594..3698965 100644 --- a/net/dccp/ccids/Kconfig +++ b/net/dccp/ccids/Kconfig @@ -1,43 +1,21 @@ menu "DCCP CCIDs Configuration (EXPERIMENTAL)" depends on EXPERIMENTAL -config IP_DCCP_CCID2 - tristate "CCID2 (TCP-Like) (EXPERIMENTAL)" - def_tristate IP_DCCP - select IP_DCCP_ACKVEC - ---help--- - CCID 2, TCP-like Congestion Control, denotes Additive Increase, - Multiplicative Decrease (AIMD) congestion control with behavior - modelled directly on TCP, including congestion window, slow start, - timeouts, and so forth [RFC 2581]. CCID 2 achieves maximum - bandwidth over the long term, consistent with the use of end-to-end - congestion control, but halves its congestion window in response to - each congestion event. This leads to the abrupt rate changes - typical of TCP. Applications should use CCID 2 if they prefer - maximum bandwidth utilization to steadiness of rate. This is often - the case for applications that are not playing their data directly - to the user. For example, a hypothetical application that - transferred files over DCCP, using application-level retransmissions - for lost packets, would prefer CCID 2 to CCID 3. On-line games may - also prefer CCID 2. See RFC 4341 for further details. - - CCID2 is the default CCID used by DCCP. - config IP_DCCP_CCID2_DEBUG bool "CCID2 debugging messages" - depends on IP_DCCP_CCID2 + depends on IP_DCCP ---help--- Enable CCID2-specific debugging messages. - When compiling CCID2 as a module, this debugging output can + When compiling DCCP as a module, this debugging output can additionally be toggled by setting the ccid2_debug module parameter to 0 or 1. If in doubt, say N. config IP_DCCP_CCID3 - tristate "CCID3 (TCP-Friendly) (EXPERIMENTAL)" - def_tristate IP_DCCP + bool "CCID3 (TCP-Friendly) (EXPERIMENTAL)" + def_bool y if (IP_DCCP = y || IP_DCCP = m) select IP_DCCP_TFRC_LIB ---help--- CCID 3 denotes TCP-Friendly Rate Control (TFRC), an equation-based @@ -59,10 +37,7 @@ config IP_DCCP_CCID3 This text was extracted from RFC 4340 (sec. 10.2), http://www.ietf.org/rfc/rfc4340.txt - To compile this CCID as a module, choose M here: the module will be - called dccp_ccid3. - - If in doubt, say M. + If in doubt, say N. config IP_DCCP_CCID3_DEBUG bool "CCID3 debugging messages" diff --git a/net/dccp/ccids/Makefile b/net/dccp/ccids/Makefile index 438f20b..cdaefff 100644 --- a/net/dccp/ccids/Makefile +++ b/net/dccp/ccids/Makefile @@ -1,9 +1 @@ -obj-$(CONFIG_IP_DCCP_CCID3) += dccp_ccid3.o - -dccp_ccid3-y := ccid3.o - -obj-$(CONFIG_IP_DCCP_CCID2) += dccp_ccid2.o - -dccp_ccid2-y := ccid2.o - obj-y += lib/ diff --git a/net/dccp/ccids/ccid2.c b/net/dccp/ccids/ccid2.c index c9ea19a..f4d2108 100644 --- a/net/dccp/ccids/ccid2.c +++ b/net/dccp/ccids/ccid2.c @@ -768,7 +768,7 @@ static void ccid2_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb) } } -static struct ccid_operations ccid2 = { +struct ccid_operations ccid2_ops = { .ccid_id = DCCPC_CCID2, .ccid_name = "TCP-like", .ccid_owner = THIS_MODULE, @@ -784,22 +784,5 @@ static struct ccid_operations ccid2 = { #ifdef CONFIG_IP_DCCP_CCID2_DEBUG module_param(ccid2_debug, bool, 0644); -MODULE_PARM_DESC(ccid2_debug, "Enable debug messages"); +MODULE_PARM_DESC(ccid2_debug, "Enable CCID2 debug messages"); #endif - -static __init int ccid2_module_init(void) -{ - return ccid_register(&ccid2); -} -module_init(ccid2_module_init); - -static __exit void ccid2_module_exit(void) -{ - ccid_unregister(&ccid2); -} -module_exit(ccid2_module_exit); - -MODULE_AUTHOR("Andrea Bittau <a.bittau@cs.ucl.ac.uk>"); -MODULE_DESCRIPTION("DCCP TCP-Like (CCID2) CCID"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("net-dccp-ccid-2"); diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index 3b8bd7c..62de014 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c @@ -940,7 +940,7 @@ static int ccid3_hc_rx_getsockopt(struct sock *sk, const int optname, int len, return 0; } -static struct ccid_operations ccid3 = { +struct ccid_operations ccid3_ops = { .ccid_id = DCCPC_CCID3, .ccid_name = "TCP-Friendly Rate Control", .ccid_owner = THIS_MODULE, @@ -964,23 +964,5 @@ static struct ccid_operations ccid3 = { #ifdef CONFIG_IP_DCCP_CCID3_DEBUG module_param(ccid3_debug, bool, 0644); -MODULE_PARM_DESC(ccid3_debug, "Enable debug messages"); +MODULE_PARM_DESC(ccid3_debug, "Enable CCID3 debug messages"); #endif - -static __init int ccid3_module_init(void) -{ - return ccid_register(&ccid3); -} -module_init(ccid3_module_init); - -static __exit void ccid3_module_exit(void) -{ - ccid_unregister(&ccid3); -} -module_exit(ccid3_module_exit); - -MODULE_AUTHOR("Ian McDonald <ian.mcdonald@jandi.co.nz>, " - "Arnaldo Carvalho de Melo <acme@ghostprotocols.net>"); -MODULE_DESCRIPTION("DCCP TFRC CCID3 CCID"); -MODULE_LICENSE("GPL"); -MODULE_ALIAS("net-dccp-ccid-3"); diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index 0bc4c9a..f2230fc 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h @@ -432,10 +432,8 @@ static inline int dccp_ack_pending(const struct sock *sk) { const struct dccp_sock *dp = dccp_sk(sk); return dp->dccps_timestamp_echo != 0 || -#ifdef CONFIG_IP_DCCP_ACKVEC (dp->dccps_hc_rx_ackvec != NULL && dccp_ackvec_pending(dp->dccps_hc_rx_ackvec)) || -#endif inet_csk_ack_scheduled(sk); } diff --git a/net/dccp/proto.c b/net/dccp/proto.c index d5c2bac..c704b74 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c @@ -1117,9 +1117,15 @@ static int __init dccp_init(void) if (rc) goto out_ackvec_exit; + rc = ccids_register_builtins(); + if (rc) + goto out_sysctl_exit; + dccp_timestamping_init(); out: return rc; +out_sysctl_exit: + dccp_sysctl_exit(); out_ackvec_exit: dccp_ackvec_exit(); out_free_dccp_mib: