aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@mandriva.com>2006-03-21 00:25:11 -0500
committerDavid S. Miller <davem@davemloft.net>2006-03-21 00:25:11 -0500
commitb61fafc4ef3faf54236d57e3b230ca19167663bf (patch)
treed928d79a28556ee06fda685458d3f398b6e57d40 /net
parent46f09ffa7db595f49fb42338e013417756816d37 (diff)
[DCCP]: Move the IPv4 specific bits from proto.c to ipv4.c
With this patch in place we can break down the complexity by better compartmentalizing the code that is common to ipv6 and ipv4. Now we have these modules: Module Size Used by dccp_diag 1344 0 inet_diag 9448 1 dccp_diag dccp_ccid3 15856 0 dccp_tfrc_lib 12320 1 dccp_ccid3 dccp_ccid2 5764 0 dccp_ipv4 16996 2 dccp 48208 4 dccp_diag,dccp_ccid3,dccp_ccid2,dccp_ipv4 dccp_ipv6 still requires dccp_ipv4 due to dccp_ipv6_mapped, that is the next target to work on the "hey, ipv4 is legacy, I only want ipv6 dude!" direction. Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/dccp/Makefile7
-rw-r--r--net/dccp/dccp.h6
-rw-r--r--net/dccp/ipv4.c140
-rw-r--r--net/dccp/options.c2
-rw-r--r--net/dccp/output.c2
-rw-r--r--net/dccp/proto.c132
6 files changed, 148 insertions, 141 deletions
diff --git a/net/dccp/Makefile b/net/dccp/Makefile
index 7af0569fe4cb..7696e219b05d 100644
--- a/net/dccp/Makefile
+++ b/net/dccp/Makefile
@@ -2,10 +2,11 @@ obj-$(CONFIG_IPV6) += dccp_ipv6.o
2 2
3dccp_ipv6-y := ipv6.o 3dccp_ipv6-y := ipv6.o
4 4
5obj-$(CONFIG_IP_DCCP) += dccp.o 5obj-$(CONFIG_IP_DCCP) += dccp.o dccp_ipv4.o
6 6
7dccp-y := ccid.o feat.o input.o ipv4.o minisocks.o options.o output.o proto.o \ 7dccp-y := ccid.o feat.o input.o minisocks.o options.o output.o proto.o timer.o
8 timer.o 8
9dccp_ipv4-y := ipv4.o
9 10
10dccp-$(CONFIG_IP_DCCP_ACKVEC) += ackvec.o 11dccp-$(CONFIG_IP_DCCP_ACKVEC) += ackvec.o
11 12
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
index b6ea4cc12608..46aa4814d65f 100644
--- a/net/dccp/dccp.h
+++ b/net/dccp/dccp.h
@@ -59,8 +59,6 @@ extern void dccp_time_wait(struct sock *sk, int state, int timeo);
59 59
60#define DCCP_RTO_MAX ((unsigned)(120 * HZ)) /* FIXME: using TCP value */ 60#define DCCP_RTO_MAX ((unsigned)(120 * HZ)) /* FIXME: using TCP value */
61 61
62extern struct proto dccp_prot;
63
64/* is seq1 < seq2 ? */ 62/* is seq1 < seq2 ? */
65static inline int before48(const u64 seq1, const u64 seq2) 63static inline int before48(const u64 seq1, const u64 seq2)
66{ 64{
@@ -209,10 +207,6 @@ extern struct sock *dccp_create_openreq_child(struct sock *sk,
209 207
210extern int dccp_v4_do_rcv(struct sock *sk, struct sk_buff *skb); 208extern int dccp_v4_do_rcv(struct sock *sk, struct sk_buff *skb);
211 209
212extern void dccp_v4_err(struct sk_buff *skb, u32);
213
214extern int dccp_v4_rcv(struct sk_buff *skb);
215
216extern struct sock *dccp_v4_request_recv_sock(struct sock *sk, 210extern struct sock *dccp_v4_request_recv_sock(struct sock *sk,
217 struct sk_buff *skb, 211 struct sk_buff *skb,
218 struct request_sock *req, 212 struct request_sock *req,
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
index a7332f0f85c4..033c3ab8fe33 100644
--- a/net/dccp/ipv4.c
+++ b/net/dccp/ipv4.c
@@ -18,8 +18,10 @@
18#include <linux/random.h> 18#include <linux/random.h>
19 19
20#include <net/icmp.h> 20#include <net/icmp.h>
21#include <net/inet_common.h>
21#include <net/inet_hashtables.h> 22#include <net/inet_hashtables.h>
22#include <net/inet_sock.h> 23#include <net/inet_sock.h>
24#include <net/protocol.h>
23#include <net/sock.h> 25#include <net/sock.h>
24#include <net/timewait_sock.h> 26#include <net/timewait_sock.h>
25#include <net/tcp_states.h> 27#include <net/tcp_states.h>
@@ -285,7 +287,7 @@ out:
285 * check at all. A more general error queue to queue errors for later handling 287 * check at all. A more general error queue to queue errors for later handling
286 * is probably better. 288 * is probably better.
287 */ 289 */
288void dccp_v4_err(struct sk_buff *skb, u32 info) 290static void dccp_v4_err(struct sk_buff *skb, u32 info)
289{ 291{
290 const struct iphdr *iph = (struct iphdr *)skb->data; 292 const struct iphdr *iph = (struct iphdr *)skb->data;
291 const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + 293 const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data +
@@ -639,6 +641,8 @@ int dccp_v4_checksum(const struct sk_buff *skb, const __be32 saddr,
639 IPPROTO_DCCP, tmp); 641 IPPROTO_DCCP, tmp);
640} 642}
641 643
644EXPORT_SYMBOL_GPL(dccp_v4_checksum);
645
642static int dccp_v4_verify_checksum(struct sk_buff *skb, 646static int dccp_v4_verify_checksum(struct sk_buff *skb,
643 const __be32 saddr, const __be32 daddr) 647 const __be32 saddr, const __be32 daddr)
644{ 648{
@@ -871,7 +875,7 @@ int dccp_invalid_packet(struct sk_buff *skb)
871EXPORT_SYMBOL_GPL(dccp_invalid_packet); 875EXPORT_SYMBOL_GPL(dccp_invalid_packet);
872 876
873/* this is called when real data arrives */ 877/* this is called when real data arrives */
874int dccp_v4_rcv(struct sk_buff *skb) 878static int dccp_v4_rcv(struct sk_buff *skb)
875{ 879{
876 const struct dccp_hdr *dh; 880 const struct dccp_hdr *dh;
877 struct sock *sk; 881 struct sock *sk;
@@ -978,7 +982,7 @@ do_time_wait:
978 goto no_dccp_socket; 982 goto no_dccp_socket;
979} 983}
980 984
981struct inet_connection_sock_af_ops dccp_ipv4_af_ops = { 985static struct inet_connection_sock_af_ops dccp_ipv4_af_ops = {
982 .queue_xmit = ip_queue_xmit, 986 .queue_xmit = ip_queue_xmit,
983 .send_check = dccp_v4_send_check, 987 .send_check = dccp_v4_send_check,
984 .rebuild_header = inet_sk_rebuild_header, 988 .rebuild_header = inet_sk_rebuild_header,
@@ -1018,7 +1022,7 @@ static struct timewait_sock_ops dccp_timewait_sock_ops = {
1018 .twsk_obj_size = sizeof(struct inet_timewait_sock), 1022 .twsk_obj_size = sizeof(struct inet_timewait_sock),
1019}; 1023};
1020 1024
1021struct proto dccp_prot = { 1025struct proto dccp_v4_prot = {
1022 .name = "DCCP", 1026 .name = "DCCP",
1023 .owner = THIS_MODULE, 1027 .owner = THIS_MODULE,
1024 .close = dccp_close, 1028 .close = dccp_close,
@@ -1044,4 +1048,130 @@ struct proto dccp_prot = {
1044 .twsk_prot = &dccp_timewait_sock_ops, 1048 .twsk_prot = &dccp_timewait_sock_ops,
1045}; 1049};
1046 1050
1047EXPORT_SYMBOL_GPL(dccp_prot); 1051static struct net_protocol dccp_v4_protocol = {
1052 .handler = dccp_v4_rcv,
1053 .err_handler = dccp_v4_err,
1054 .no_policy = 1,
1055};
1056
1057static const struct proto_ops inet_dccp_ops = {
1058 .family = PF_INET,
1059 .owner = THIS_MODULE,
1060 .release = inet_release,
1061 .bind = inet_bind,
1062 .connect = inet_stream_connect,
1063 .socketpair = sock_no_socketpair,
1064 .accept = inet_accept,
1065 .getname = inet_getname,
1066 /* FIXME: work on tcp_poll to rename it to inet_csk_poll */
1067 .poll = dccp_poll,
1068 .ioctl = inet_ioctl,
1069 /* FIXME: work on inet_listen to rename it to sock_common_listen */
1070 .listen = inet_dccp_listen,
1071 .shutdown = inet_shutdown,
1072 .setsockopt = sock_common_setsockopt,
1073 .getsockopt = sock_common_getsockopt,
1074 .sendmsg = inet_sendmsg,
1075 .recvmsg = sock_common_recvmsg,
1076 .mmap = sock_no_mmap,
1077 .sendpage = sock_no_sendpage,
1078};
1079
1080static struct inet_protosw dccp_v4_protosw = {
1081 .type = SOCK_DCCP,
1082 .protocol = IPPROTO_DCCP,
1083 .prot = &dccp_v4_prot,
1084 .ops = &inet_dccp_ops,
1085 .capability = -1,
1086 .no_check = 0,
1087 .flags = INET_PROTOSW_ICSK,
1088};
1089
1090/*
1091 * This is the global socket data structure used for responding to
1092 * the Out-of-the-blue (OOTB) packets. A control sock will be created
1093 * for this socket at the initialization time.
1094 */
1095struct socket *dccp_ctl_socket;
1096
1097static char dccp_ctl_socket_err_msg[] __initdata =
1098 KERN_ERR "DCCP: Failed to create the control socket.\n";
1099
1100static int __init dccp_ctl_sock_init(void)
1101{
1102 int rc = sock_create_kern(PF_INET, SOCK_DCCP, IPPROTO_DCCP,
1103 &dccp_ctl_socket);
1104 if (rc < 0)
1105 printk(dccp_ctl_socket_err_msg);
1106 else {
1107 dccp_ctl_socket->sk->sk_allocation = GFP_ATOMIC;
1108 inet_sk(dccp_ctl_socket->sk)->uc_ttl = -1;
1109
1110 /* Unhash it so that IP input processing does not even
1111 * see it, we do not wish this socket to see incoming
1112 * packets.
1113 */
1114 dccp_ctl_socket->sk->sk_prot->unhash(dccp_ctl_socket->sk);
1115 }
1116
1117 return rc;
1118}
1119
1120#ifdef CONFIG_IP_DCCP_UNLOAD_HACK
1121void dccp_ctl_sock_exit(void)
1122{
1123 if (dccp_ctl_socket != NULL) {
1124 sock_release(dccp_ctl_socket);
1125 dccp_ctl_socket = NULL;
1126 }
1127}
1128
1129EXPORT_SYMBOL_GPL(dccp_ctl_sock_exit);
1130#endif
1131
1132static int __init dccp_v4_init(void)
1133{
1134 int err = proto_register(&dccp_v4_prot, 1);
1135
1136 if (err != 0)
1137 goto out;
1138
1139 err = inet_add_protocol(&dccp_v4_protocol, IPPROTO_DCCP);
1140 if (err != 0)
1141 goto out_proto_unregister;
1142
1143 inet_register_protosw(&dccp_v4_protosw);
1144
1145 err = dccp_ctl_sock_init();
1146 if (err)
1147 goto out_unregister_protosw;
1148out:
1149 return err;
1150out_unregister_protosw:
1151 inet_unregister_protosw(&dccp_v4_protosw);
1152 inet_del_protocol(&dccp_v4_protocol, IPPROTO_DCCP);
1153out_proto_unregister:
1154 proto_unregister(&dccp_v4_prot);
1155 goto out;
1156}
1157
1158static void __exit dccp_v4_exit(void)
1159{
1160 inet_unregister_protosw(&dccp_v4_protosw);
1161 inet_del_protocol(&dccp_v4_protocol, IPPROTO_DCCP);
1162 proto_unregister(&dccp_v4_prot);
1163}
1164
1165module_init(dccp_v4_init);
1166module_exit(dccp_v4_exit);
1167
1168/*
1169 * __stringify doesn't likes enums, so use SOCK_DCCP (6) and IPPROTO_DCCP (33)
1170 * values directly, Also cover the case where the protocol is not specified,
1171 * i.e. net-pf-PF_INET-proto-0-type-SOCK_DCCP
1172 */
1173MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-33-type-6");
1174MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-0-type-6");
1175MODULE_LICENSE("GPL");
1176MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>");
1177MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol");
diff --git a/net/dccp/options.c b/net/dccp/options.c
index 3ecd319c0f59..79d228e4d6b2 100644
--- a/net/dccp/options.c
+++ b/net/dccp/options.c
@@ -258,6 +258,8 @@ out_invalid_option:
258 return -1; 258 return -1;
259} 259}
260 260
261EXPORT_SYMBOL_GPL(dccp_parse_options);
262
261static void dccp_encode_value_var(const u32 value, unsigned char *to, 263static void dccp_encode_value_var(const u32 value, unsigned char *to,
262 const unsigned int len) 264 const unsigned int len)
263{ 265{
diff --git a/net/dccp/output.c b/net/dccp/output.c
index 6bd21e37686e..8c83aa51572e 100644
--- a/net/dccp/output.c
+++ b/net/dccp/output.c
@@ -526,6 +526,8 @@ void dccp_send_sync(struct sock *sk, const u64 seq,
526 dccp_transmit_skb(sk, skb); 526 dccp_transmit_skb(sk, skb);
527} 527}
528 528
529EXPORT_SYMBOL_GPL(dccp_send_sync);
530
529/* 531/*
530 * Send a DCCP_PKT_CLOSE/CLOSEREQ. The caller locks the socket for us. This 532 * Send a DCCP_PKT_CLOSE/CLOSEREQ. The caller locks the socket for us. This
531 * cannot be allowed to fail queueing a DCCP_PKT_CLOSE/CLOSEREQ frame under 533 * cannot be allowed to fail queueing a DCCP_PKT_CLOSE/CLOSEREQ frame under
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index abab6c10af96..ef94b0c8a0c0 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -23,9 +23,7 @@
23#include <linux/random.h> 23#include <linux/random.h>
24#include <net/checksum.h> 24#include <net/checksum.h>
25 25
26#include <net/inet_common.h>
27#include <net/inet_sock.h> 26#include <net/inet_sock.h>
28#include <net/protocol.h>
29#include <net/sock.h> 27#include <net/sock.h>
30#include <net/xfrm.h> 28#include <net/xfrm.h>
31 29
@@ -55,12 +53,6 @@ struct inet_hashinfo __cacheline_aligned dccp_hashinfo = {
55 53
56EXPORT_SYMBOL_GPL(dccp_hashinfo); 54EXPORT_SYMBOL_GPL(dccp_hashinfo);
57 55
58static struct net_protocol dccp_protocol = {
59 .handler = dccp_v4_rcv,
60 .err_handler = dccp_v4_err,
61 .no_policy = 1,
62};
63
64const char *dccp_packet_name(const int type) 56const char *dccp_packet_name(const int type)
65{ 57{
66 static const char *dccp_packet_names[] = { 58 static const char *dccp_packet_names[] = {
@@ -856,83 +848,6 @@ void dccp_shutdown(struct sock *sk, int how)
856 848
857EXPORT_SYMBOL_GPL(dccp_shutdown); 849EXPORT_SYMBOL_GPL(dccp_shutdown);
858 850
859static const struct proto_ops inet_dccp_ops = {
860 .family = PF_INET,
861 .owner = THIS_MODULE,
862 .release = inet_release,
863 .bind = inet_bind,
864 .connect = inet_stream_connect,
865 .socketpair = sock_no_socketpair,
866 .accept = inet_accept,
867 .getname = inet_getname,
868 /* FIXME: work on tcp_poll to rename it to inet_csk_poll */
869 .poll = dccp_poll,
870 .ioctl = inet_ioctl,
871 /* FIXME: work on inet_listen to rename it to sock_common_listen */
872 .listen = inet_dccp_listen,
873 .shutdown = inet_shutdown,
874 .setsockopt = sock_common_setsockopt,
875 .getsockopt = sock_common_getsockopt,
876 .sendmsg = inet_sendmsg,
877 .recvmsg = sock_common_recvmsg,
878 .mmap = sock_no_mmap,
879 .sendpage = sock_no_sendpage,
880};
881
882extern struct net_proto_family inet_family_ops;
883
884static struct inet_protosw dccp_v4_protosw = {
885 .type = SOCK_DCCP,
886 .protocol = IPPROTO_DCCP,
887 .prot = &dccp_prot,
888 .ops = &inet_dccp_ops,
889 .capability = -1,
890 .no_check = 0,
891 .flags = INET_PROTOSW_ICSK,
892};
893
894/*
895 * This is the global socket data structure used for responding to
896 * the Out-of-the-blue (OOTB) packets. A control sock will be created
897 * for this socket at the initialization time.
898 */
899struct socket *dccp_ctl_socket;
900
901static char dccp_ctl_socket_err_msg[] __initdata =
902 KERN_ERR "DCCP: Failed to create the control socket.\n";
903
904static int __init dccp_ctl_sock_init(void)
905{
906 int rc = sock_create_kern(PF_INET, SOCK_DCCP, IPPROTO_DCCP,
907 &dccp_ctl_socket);
908 if (rc < 0)
909 printk(dccp_ctl_socket_err_msg);
910 else {
911 dccp_ctl_socket->sk->sk_allocation = GFP_ATOMIC;
912 inet_sk(dccp_ctl_socket->sk)->uc_ttl = -1;
913
914 /* Unhash it so that IP input processing does not even
915 * see it, we do not wish this socket to see incoming
916 * packets.
917 */
918 dccp_ctl_socket->sk->sk_prot->unhash(dccp_ctl_socket->sk);
919 }
920
921 return rc;
922}
923
924#ifdef CONFIG_IP_DCCP_UNLOAD_HACK
925void dccp_ctl_sock_exit(void)
926{
927 if (dccp_ctl_socket != NULL) {
928 sock_release(dccp_ctl_socket);
929 dccp_ctl_socket = NULL;
930 }
931}
932
933EXPORT_SYMBOL_GPL(dccp_ctl_sock_exit);
934#endif
935
936static int __init dccp_mib_init(void) 851static int __init dccp_mib_init(void)
937{ 852{
938 int rc = -ENOMEM; 853 int rc = -ENOMEM;
@@ -955,7 +870,7 @@ out_free_one:
955 870
956} 871}
957 872
958static int dccp_mib_exit(void) 873static void dccp_mib_exit(void)
959{ 874{
960 free_percpu(dccp_statistics[0]); 875 free_percpu(dccp_statistics[0]);
961 free_percpu(dccp_statistics[1]); 876 free_percpu(dccp_statistics[1]);
@@ -978,18 +893,14 @@ static int __init dccp_init(void)
978{ 893{
979 unsigned long goal; 894 unsigned long goal;
980 int ehash_order, bhash_order, i; 895 int ehash_order, bhash_order, i;
981 int rc = proto_register(&dccp_prot, 1); 896 int rc = -ENOBUFS;
982 897
983 if (rc)
984 goto out;
985
986 rc = -ENOBUFS;
987 dccp_hashinfo.bind_bucket_cachep = 898 dccp_hashinfo.bind_bucket_cachep =
988 kmem_cache_create("dccp_bind_bucket", 899 kmem_cache_create("dccp_bind_bucket",
989 sizeof(struct inet_bind_bucket), 0, 900 sizeof(struct inet_bind_bucket), 0,
990 SLAB_HWCACHE_ALIGN, NULL, NULL); 901 SLAB_HWCACHE_ALIGN, NULL, NULL);
991 if (!dccp_hashinfo.bind_bucket_cachep) 902 if (!dccp_hashinfo.bind_bucket_cachep)
992 goto out_proto_unregister; 903 goto out;
993 904
994 /* 905 /*
995 * Size and allocate the main established and bind bucket 906 * Size and allocate the main established and bind bucket
@@ -1055,33 +966,18 @@ static int __init dccp_init(void)
1055 if (rc) 966 if (rc)
1056 goto out_free_dccp_bhash; 967 goto out_free_dccp_bhash;
1057 968
1058 rc = -EAGAIN;
1059 if (inet_add_protocol(&dccp_protocol, IPPROTO_DCCP))
1060 goto out_free_dccp_v4_mibs;
1061
1062 inet_register_protosw(&dccp_v4_protosw);
1063
1064 rc = dccp_ackvec_init(); 969 rc = dccp_ackvec_init();
1065 if (rc) 970 if (rc)
1066 goto out_unregister_protosw; 971 goto out_free_dccp_mib;
1067 972
1068 rc = dccp_sysctl_init(); 973 rc = dccp_sysctl_init();
1069 if (rc) 974 if (rc)
1070 goto out_ackvec_exit; 975 goto out_ackvec_exit;
1071
1072 rc = dccp_ctl_sock_init();
1073 if (rc)
1074 goto out_sysctl_exit;
1075out: 976out:
1076 return rc; 977 return rc;
1077out_sysctl_exit:
1078 dccp_sysctl_exit();
1079out_ackvec_exit: 978out_ackvec_exit:
1080 dccp_ackvec_exit(); 979 dccp_ackvec_exit();
1081out_unregister_protosw: 980out_free_dccp_mib:
1082 inet_unregister_protosw(&dccp_v4_protosw);
1083 inet_del_protocol(&dccp_protocol, IPPROTO_DCCP);
1084out_free_dccp_v4_mibs:
1085 dccp_mib_exit(); 981 dccp_mib_exit();
1086out_free_dccp_bhash: 982out_free_dccp_bhash:
1087 free_pages((unsigned long)dccp_hashinfo.bhash, bhash_order); 983 free_pages((unsigned long)dccp_hashinfo.bhash, bhash_order);
@@ -1092,21 +988,11 @@ out_free_dccp_ehash:
1092out_free_bind_bucket_cachep: 988out_free_bind_bucket_cachep:
1093 kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep); 989 kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep);
1094 dccp_hashinfo.bind_bucket_cachep = NULL; 990 dccp_hashinfo.bind_bucket_cachep = NULL;
1095out_proto_unregister:
1096 proto_unregister(&dccp_prot);
1097 goto out; 991 goto out;
1098} 992}
1099 993
1100static const char dccp_del_proto_err_msg[] __exitdata =
1101 KERN_ERR "can't remove dccp net_protocol\n";
1102
1103static void __exit dccp_fini(void) 994static void __exit dccp_fini(void)
1104{ 995{
1105 inet_unregister_protosw(&dccp_v4_protosw);
1106
1107 if (inet_del_protocol(&dccp_protocol, IPPROTO_DCCP) < 0)
1108 printk(dccp_del_proto_err_msg);
1109
1110 dccp_mib_exit(); 996 dccp_mib_exit();
1111 free_pages((unsigned long)dccp_hashinfo.bhash, 997 free_pages((unsigned long)dccp_hashinfo.bhash,
1112 get_order(dccp_hashinfo.bhash_size * 998 get_order(dccp_hashinfo.bhash_size *
@@ -1115,7 +1001,6 @@ static void __exit dccp_fini(void)
1115 get_order(dccp_hashinfo.ehash_size * 1001 get_order(dccp_hashinfo.ehash_size *
1116 sizeof(struct inet_ehash_bucket))); 1002 sizeof(struct inet_ehash_bucket)));
1117 kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep); 1003 kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep);
1118 proto_unregister(&dccp_prot);
1119 dccp_ackvec_exit(); 1004 dccp_ackvec_exit();
1120 dccp_sysctl_exit(); 1005 dccp_sysctl_exit();
1121} 1006}
@@ -1123,13 +1008,6 @@ static void __exit dccp_fini(void)
1123module_init(dccp_init); 1008module_init(dccp_init);
1124module_exit(dccp_fini); 1009module_exit(dccp_fini);
1125 1010
1126/*
1127 * __stringify doesn't likes enums, so use SOCK_DCCP (6) and IPPROTO_DCCP (33)
1128 * values directly, Also cover the case where the protocol is not specified,
1129 * i.e. net-pf-PF_INET-proto-0-type-SOCK_DCCP
1130 */
1131MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-33-type-6");
1132MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-0-type-6");
1133MODULE_LICENSE("GPL"); 1011MODULE_LICENSE("GPL");
1134MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@conectiva.com.br>"); 1012MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@conectiva.com.br>");
1135MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol"); 1013MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol");