aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/appletalk/ddp.c19
-rw-r--r--net/bridge/netfilter/ebt_802_3.c8
-rw-r--r--net/bridge/netfilter/ebt_among.c8
-rw-r--r--net/bridge/netfilter/ebt_arp.c8
-rw-r--r--net/bridge/netfilter/ebt_arpreply.c8
-rw-r--r--net/bridge/netfilter/ebt_dnat.c8
-rw-r--r--net/bridge/netfilter/ebt_ip.c8
-rw-r--r--net/bridge/netfilter/ebt_limit.c8
-rw-r--r--net/bridge/netfilter/ebt_log.c8
-rw-r--r--net/bridge/netfilter/ebt_mark.c8
-rw-r--r--net/bridge/netfilter/ebt_mark_m.c8
-rw-r--r--net/bridge/netfilter/ebt_pkttype.c8
-rw-r--r--net/bridge/netfilter/ebt_redirect.c8
-rw-r--r--net/bridge/netfilter/ebt_snat.c8
-rw-r--r--net/bridge/netfilter/ebt_stp.c8
-rw-r--r--net/bridge/netfilter/ebt_ulog.c8
-rw-r--r--net/bridge/netfilter/ebt_vlan.c8
-rw-r--r--net/bridge/netfilter/ebtable_broute.c8
-rw-r--r--net/bridge/netfilter/ebtable_filter.c8
-rw-r--r--net/bridge/netfilter/ebtable_nat.c8
-rw-r--r--net/bridge/netfilter/ebtables.c8
-rw-r--r--net/core/sock.c93
-rw-r--r--net/decnet/netfilter/dn_rtmsg.c8
-rw-r--r--net/econet/af_econet.c124
-rw-r--r--net/ieee80211/ieee80211_wx.c4
-rw-r--r--net/ieee80211/softmac/ieee80211softmac_module.c17
-rw-r--r--net/ieee80211/softmac/ieee80211softmac_priv.h2
-rw-r--r--net/ieee80211/softmac/ieee80211softmac_wx.c12
-rw-r--r--net/ipv4/Kconfig17
-rw-r--r--net/ipv4/Makefile3
-rw-r--r--net/ipv4/ipip.c79
-rw-r--r--net/ipv4/netfilter.c8
-rw-r--r--net/ipv4/netfilter/arp_tables.c8
-rw-r--r--net/ipv4/netfilter/arpt_mangle.c8
-rw-r--r--net/ipv4/netfilter/arptable_filter.c8
-rw-r--r--net/ipv4/netfilter/ip_conntrack_amanda.c8
-rw-r--r--net/ipv4/netfilter/ip_conntrack_ftp.c10
-rw-r--r--net/ipv4/netfilter/ip_conntrack_helper_pptp.c8
-rw-r--r--net/ipv4/netfilter/ip_conntrack_irc.c12
-rw-r--r--net/ipv4/netfilter/ip_conntrack_netbios_ns.c8
-rw-r--r--net/ipv4/netfilter/ip_conntrack_proto_sctp.c8
-rw-r--r--net/ipv4/netfilter/ip_conntrack_standalone.c8
-rw-r--r--net/ipv4/netfilter/ip_conntrack_tftp.c10
-rw-r--r--net/ipv4/netfilter/ip_nat_amanda.c8
-rw-r--r--net/ipv4/netfilter/ip_nat_ftp.c8
-rw-r--r--net/ipv4/netfilter/ip_nat_helper_pptp.c8
-rw-r--r--net/ipv4/netfilter/ip_nat_irc.c8
-rw-r--r--net/ipv4/netfilter/ip_nat_snmp_basic.c8
-rw-r--r--net/ipv4/netfilter/ip_nat_standalone.c8
-rw-r--r--net/ipv4/netfilter/ip_nat_tftp.c8
-rw-r--r--net/ipv4/netfilter/ip_queue.c8
-rw-r--r--net/ipv4/netfilter/ip_tables.c8
-rw-r--r--net/ipv4/netfilter/ipt_CLUSTERIP.c8
-rw-r--r--net/ipv4/netfilter/ipt_DSCP.c8
-rw-r--r--net/ipv4/netfilter/ipt_ECN.c8
-rw-r--r--net/ipv4/netfilter/ipt_LOG.c8
-rw-r--r--net/ipv4/netfilter/ipt_MASQUERADE.c8
-rw-r--r--net/ipv4/netfilter/ipt_NETMAP.c8
-rw-r--r--net/ipv4/netfilter/ipt_REDIRECT.c8
-rw-r--r--net/ipv4/netfilter/ipt_REJECT.c8
-rw-r--r--net/ipv4/netfilter/ipt_SAME.c8
-rw-r--r--net/ipv4/netfilter/ipt_TCPMSS.c8
-rw-r--r--net/ipv4/netfilter/ipt_TOS.c8
-rw-r--r--net/ipv4/netfilter/ipt_TTL.c8
-rw-r--r--net/ipv4/netfilter/ipt_ULOG.c8
-rw-r--r--net/ipv4/netfilter/ipt_addrtype.c8
-rw-r--r--net/ipv4/netfilter/ipt_ah.c8
-rw-r--r--net/ipv4/netfilter/ipt_dscp.c8
-rw-r--r--net/ipv4/netfilter/ipt_ecn.c8
-rw-r--r--net/ipv4/netfilter/ipt_esp.c8
-rw-r--r--net/ipv4/netfilter/ipt_hashlimit.c8
-rw-r--r--net/ipv4/netfilter/ipt_iprange.c8
-rw-r--r--net/ipv4/netfilter/ipt_multiport.c8
-rw-r--r--net/ipv4/netfilter/ipt_owner.c8
-rw-r--r--net/ipv4/netfilter/ipt_recent.c8
-rw-r--r--net/ipv4/netfilter/ipt_tos.c8
-rw-r--r--net/ipv4/netfilter/ipt_ttl.c8
-rw-r--r--net/ipv4/netfilter/iptable_filter.c8
-rw-r--r--net/ipv4/netfilter/iptable_mangle.c8
-rw-r--r--net/ipv4/netfilter/iptable_raw.c8
-rw-r--r--net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c8
-rw-r--r--net/ipv4/tcp_cong.c2
-rw-r--r--net/ipv4/tunnel4.c113
-rw-r--r--net/ipv4/xfrm4_tunnel.c79
-rw-r--r--net/ipv6/Kconfig19
-rw-r--r--net/ipv6/Makefile3
-rw-r--r--net/ipv6/ip6_tunnel.c45
-rw-r--r--net/ipv6/netfilter/ip6_queue.c8
-rw-r--r--net/ipv6/netfilter/ip6_tables.c8
-rw-r--r--net/ipv6/netfilter/ip6t_HL.c8
-rw-r--r--net/ipv6/netfilter/ip6t_LOG.c8
-rw-r--r--net/ipv6/netfilter/ip6t_REJECT.c8
-rw-r--r--net/ipv6/netfilter/ip6t_ah.c8
-rw-r--r--net/ipv6/netfilter/ip6t_dst.c8
-rw-r--r--net/ipv6/netfilter/ip6t_esp.c8
-rw-r--r--net/ipv6/netfilter/ip6t_eui64.c8
-rw-r--r--net/ipv6/netfilter/ip6t_frag.c8
-rw-r--r--net/ipv6/netfilter/ip6t_hbh.c8
-rw-r--r--net/ipv6/netfilter/ip6t_hl.c8
-rw-r--r--net/ipv6/netfilter/ip6t_multiport.c8
-rw-r--r--net/ipv6/netfilter/ip6t_owner.c8
-rw-r--r--net/ipv6/netfilter/ip6t_rt.c8
-rw-r--r--net/ipv6/netfilter/ip6table_filter.c8
-rw-r--r--net/ipv6/netfilter/ip6table_mangle.c8
-rw-r--r--net/ipv6/netfilter/ip6table_raw.c8
-rw-r--r--net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c8
-rw-r--r--net/ipv6/tunnel6.c131
-rw-r--r--net/ipv6/xfrm6_input.c5
-rw-r--r--net/ipv6/xfrm6_tunnel.c81
-rw-r--r--net/ipx/af_ipx.c26
-rw-r--r--net/irda/af_irda.c25
-rw-r--r--net/netfilter/nf_conntrack_ftp.c10
-rw-r--r--net/netfilter/nf_conntrack_proto_sctp.c8
-rw-r--r--net/netfilter/nf_conntrack_standalone.c8
-rw-r--r--net/netfilter/nfnetlink_log.c8
-rw-r--r--net/netfilter/nfnetlink_queue.c8
-rw-r--r--net/netfilter/xt_CLASSIFY.c8
-rw-r--r--net/netfilter/xt_CONNMARK.c8
-rw-r--r--net/netfilter/xt_MARK.c8
-rw-r--r--net/netfilter/xt_NFQUEUE.c8
-rw-r--r--net/netfilter/xt_NOTRACK.c8
-rw-r--r--net/netfilter/xt_comment.c8
-rw-r--r--net/netfilter/xt_connbytes.c8
-rw-r--r--net/netfilter/xt_connmark.c8
-rw-r--r--net/netfilter/xt_conntrack.c8
-rw-r--r--net/netfilter/xt_dccp.c8
-rw-r--r--net/netfilter/xt_helper.c8
-rw-r--r--net/netfilter/xt_length.c8
-rw-r--r--net/netfilter/xt_limit.c8
-rw-r--r--net/netfilter/xt_mac.c8
-rw-r--r--net/netfilter/xt_mark.c8
-rw-r--r--net/netfilter/xt_physdev.c8
-rw-r--r--net/netfilter/xt_pkttype.c8
-rw-r--r--net/netfilter/xt_realm.c8
-rw-r--r--net/netfilter/xt_sctp.c8
-rw-r--r--net/netfilter/xt_state.c8
-rw-r--r--net/netfilter/xt_string.c8
-rw-r--r--net/netfilter/xt_tcpmss.c8
-rw-r--r--net/netfilter/xt_tcpudp.c8
-rw-r--r--net/socket.c6
140 files changed, 1086 insertions, 773 deletions
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c
index 697ac55e29d..7b1eb9a4fc9 100644
--- a/net/appletalk/ddp.c
+++ b/net/appletalk/ddp.c
@@ -1819,6 +1819,22 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1819 return rc; 1819 return rc;
1820} 1820}
1821 1821
1822
1823#ifdef CONFIG_COMPAT
1824static int atalk_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1825{
1826 /*
1827 * All Appletalk ioctls except SIOCATALKDIFADDR are standard. And
1828 * SIOCATALKDIFADDR is handled by upper layer as well, so there is
1829 * nothing to do. Eventually SIOCATALKDIFADDR should be moved
1830 * here so there is no generic SIOCPROTOPRIVATE translation in the
1831 * system.
1832 */
1833 return -ENOIOCTLCMD;
1834}
1835#endif
1836
1837
1822static struct net_proto_family atalk_family_ops = { 1838static struct net_proto_family atalk_family_ops = {
1823 .family = PF_APPLETALK, 1839 .family = PF_APPLETALK,
1824 .create = atalk_create, 1840 .create = atalk_create,
@@ -1836,6 +1852,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(atalk_dgram_ops) = {
1836 .getname = atalk_getname, 1852 .getname = atalk_getname,
1837 .poll = datagram_poll, 1853 .poll = datagram_poll,
1838 .ioctl = atalk_ioctl, 1854 .ioctl = atalk_ioctl,
1855#ifdef CONFIG_COMPAT
1856 .compat_ioctl = atalk_compat_ioctl,
1857#endif
1839 .listen = sock_no_listen, 1858 .listen = sock_no_listen,
1840 .shutdown = sock_no_shutdown, 1859 .shutdown = sock_no_shutdown,
1841 .setsockopt = sock_no_setsockopt, 1860 .setsockopt = sock_no_setsockopt,
diff --git a/net/bridge/netfilter/ebt_802_3.c b/net/bridge/netfilter/ebt_802_3.c
index 468ebdf4bc1..d42f63f5e9f 100644
--- a/net/bridge/netfilter/ebt_802_3.c
+++ b/net/bridge/netfilter/ebt_802_3.c
@@ -58,16 +58,16 @@ static struct ebt_match filter_802_3 =
58 .me = THIS_MODULE, 58 .me = THIS_MODULE,
59}; 59};
60 60
61static int __init init(void) 61static int __init ebt_802_3_init(void)
62{ 62{
63 return ebt_register_match(&filter_802_3); 63 return ebt_register_match(&filter_802_3);
64} 64}
65 65
66static void __exit fini(void) 66static void __exit ebt_802_3_fini(void)
67{ 67{
68 ebt_unregister_match(&filter_802_3); 68 ebt_unregister_match(&filter_802_3);
69} 69}
70 70
71module_init(init); 71module_init(ebt_802_3_init);
72module_exit(fini); 72module_exit(ebt_802_3_fini);
73MODULE_LICENSE("GPL"); 73MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_among.c b/net/bridge/netfilter/ebt_among.c
index 5a1f5e3bff1..a614485828a 100644
--- a/net/bridge/netfilter/ebt_among.c
+++ b/net/bridge/netfilter/ebt_among.c
@@ -213,16 +213,16 @@ static struct ebt_match filter_among = {
213 .me = THIS_MODULE, 213 .me = THIS_MODULE,
214}; 214};
215 215
216static int __init init(void) 216static int __init ebt_among_init(void)
217{ 217{
218 return ebt_register_match(&filter_among); 218 return ebt_register_match(&filter_among);
219} 219}
220 220
221static void __exit fini(void) 221static void __exit ebt_among_fini(void)
222{ 222{
223 ebt_unregister_match(&filter_among); 223 ebt_unregister_match(&filter_among);
224} 224}
225 225
226module_init(init); 226module_init(ebt_among_init);
227module_exit(fini); 227module_exit(ebt_among_fini);
228MODULE_LICENSE("GPL"); 228MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_arp.c b/net/bridge/netfilter/ebt_arp.c
index b94c48cb6e4..a6c81d9f73b 100644
--- a/net/bridge/netfilter/ebt_arp.c
+++ b/net/bridge/netfilter/ebt_arp.c
@@ -125,16 +125,16 @@ static struct ebt_match filter_arp =
125 .me = THIS_MODULE, 125 .me = THIS_MODULE,
126}; 126};
127 127
128static int __init init(void) 128static int __init ebt_arp_init(void)
129{ 129{
130 return ebt_register_match(&filter_arp); 130 return ebt_register_match(&filter_arp);
131} 131}
132 132
133static void __exit fini(void) 133static void __exit ebt_arp_fini(void)
134{ 134{
135 ebt_unregister_match(&filter_arp); 135 ebt_unregister_match(&filter_arp);
136} 136}
137 137
138module_init(init); 138module_init(ebt_arp_init);
139module_exit(fini); 139module_exit(ebt_arp_fini);
140MODULE_LICENSE("GPL"); 140MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_arpreply.c b/net/bridge/netfilter/ebt_arpreply.c
index b934de90f7c..d19fc4b328d 100644
--- a/net/bridge/netfilter/ebt_arpreply.c
+++ b/net/bridge/netfilter/ebt_arpreply.c
@@ -82,16 +82,16 @@ static struct ebt_target reply_target =
82 .me = THIS_MODULE, 82 .me = THIS_MODULE,
83}; 83};
84 84
85static int __init init(void) 85static int __init ebt_arpreply_init(void)
86{ 86{
87 return ebt_register_target(&reply_target); 87 return ebt_register_target(&reply_target);
88} 88}
89 89
90static void __exit fini(void) 90static void __exit ebt_arpreply_fini(void)
91{ 91{
92 ebt_unregister_target(&reply_target); 92 ebt_unregister_target(&reply_target);
93} 93}
94 94
95module_init(init); 95module_init(ebt_arpreply_init);
96module_exit(fini); 96module_exit(ebt_arpreply_fini);
97MODULE_LICENSE("GPL"); 97MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_dnat.c b/net/bridge/netfilter/ebt_dnat.c
index f5463086c7b..4582659dff0 100644
--- a/net/bridge/netfilter/ebt_dnat.c
+++ b/net/bridge/netfilter/ebt_dnat.c
@@ -61,16 +61,16 @@ static struct ebt_target dnat =
61 .me = THIS_MODULE, 61 .me = THIS_MODULE,
62}; 62};
63 63
64static int __init init(void) 64static int __init ebt_dnat_init(void)
65{ 65{
66 return ebt_register_target(&dnat); 66 return ebt_register_target(&dnat);
67} 67}
68 68
69static void __exit fini(void) 69static void __exit ebt_dnat_fini(void)
70{ 70{
71 ebt_unregister_target(&dnat); 71 ebt_unregister_target(&dnat);
72} 72}
73 73
74module_init(init); 74module_init(ebt_dnat_init);
75module_exit(fini); 75module_exit(ebt_dnat_fini);
76MODULE_LICENSE("GPL"); 76MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_ip.c b/net/bridge/netfilter/ebt_ip.c
index dc5d0b2427c..65b665ce57b 100644
--- a/net/bridge/netfilter/ebt_ip.c
+++ b/net/bridge/netfilter/ebt_ip.c
@@ -112,16 +112,16 @@ static struct ebt_match filter_ip =
112 .me = THIS_MODULE, 112 .me = THIS_MODULE,
113}; 113};
114 114
115static int __init init(void) 115static int __init ebt_ip_init(void)
116{ 116{
117 return ebt_register_match(&filter_ip); 117 return ebt_register_match(&filter_ip);
118} 118}
119 119
120static void __exit fini(void) 120static void __exit ebt_ip_fini(void)
121{ 121{
122 ebt_unregister_match(&filter_ip); 122 ebt_unregister_match(&filter_ip);
123} 123}
124 124
125module_init(init); 125module_init(ebt_ip_init);
126module_exit(fini); 126module_exit(ebt_ip_fini);
127MODULE_LICENSE("GPL"); 127MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_limit.c b/net/bridge/netfilter/ebt_limit.c
index 637c8844cd5..d48fa5cb26c 100644
--- a/net/bridge/netfilter/ebt_limit.c
+++ b/net/bridge/netfilter/ebt_limit.c
@@ -98,16 +98,16 @@ static struct ebt_match ebt_limit_reg =
98 .me = THIS_MODULE, 98 .me = THIS_MODULE,
99}; 99};
100 100
101static int __init init(void) 101static int __init ebt_limit_init(void)
102{ 102{
103 return ebt_register_match(&ebt_limit_reg); 103 return ebt_register_match(&ebt_limit_reg);
104} 104}
105 105
106static void __exit fini(void) 106static void __exit ebt_limit_fini(void)
107{ 107{
108 ebt_unregister_match(&ebt_limit_reg); 108 ebt_unregister_match(&ebt_limit_reg);
109} 109}
110 110
111module_init(init); 111module_init(ebt_limit_init);
112module_exit(fini); 112module_exit(ebt_limit_fini);
113MODULE_LICENSE("GPL"); 113MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_log.c b/net/bridge/netfilter/ebt_log.c
index 288ff1d4ccc..d159c92cca8 100644
--- a/net/bridge/netfilter/ebt_log.c
+++ b/net/bridge/netfilter/ebt_log.c
@@ -188,7 +188,7 @@ static struct nf_logger ebt_log_logger = {
188 .me = THIS_MODULE, 188 .me = THIS_MODULE,
189}; 189};
190 190
191static int __init init(void) 191static int __init ebt_log_init(void)
192{ 192{
193 int ret; 193 int ret;
194 194
@@ -205,12 +205,12 @@ static int __init init(void)
205 return 0; 205 return 0;
206} 206}
207 207
208static void __exit fini(void) 208static void __exit ebt_log_fini(void)
209{ 209{
210 nf_log_unregister_logger(&ebt_log_logger); 210 nf_log_unregister_logger(&ebt_log_logger);
211 ebt_unregister_watcher(&log); 211 ebt_unregister_watcher(&log);
212} 212}
213 213
214module_init(init); 214module_init(ebt_log_init);
215module_exit(fini); 215module_exit(ebt_log_fini);
216MODULE_LICENSE("GPL"); 216MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_mark.c b/net/bridge/netfilter/ebt_mark.c
index c93d35ab95c..770c0df972a 100644
--- a/net/bridge/netfilter/ebt_mark.c
+++ b/net/bridge/netfilter/ebt_mark.c
@@ -52,16 +52,16 @@ static struct ebt_target mark_target =
52 .me = THIS_MODULE, 52 .me = THIS_MODULE,
53}; 53};
54 54
55static int __init init(void) 55static int __init ebt_mark_init(void)
56{ 56{
57 return ebt_register_target(&mark_target); 57 return ebt_register_target(&mark_target);
58} 58}
59 59
60static void __exit fini(void) 60static void __exit ebt_mark_fini(void)
61{ 61{
62 ebt_unregister_target(&mark_target); 62 ebt_unregister_target(&mark_target);
63} 63}
64 64
65module_init(init); 65module_init(ebt_mark_init);
66module_exit(fini); 66module_exit(ebt_mark_fini);
67MODULE_LICENSE("GPL"); 67MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_mark_m.c b/net/bridge/netfilter/ebt_mark_m.c
index 625102de149..a6413e4b498 100644
--- a/net/bridge/netfilter/ebt_mark_m.c
+++ b/net/bridge/netfilter/ebt_mark_m.c
@@ -47,16 +47,16 @@ static struct ebt_match filter_mark =
47 .me = THIS_MODULE, 47 .me = THIS_MODULE,
48}; 48};
49 49
50static int __init init(void) 50static int __init ebt_mark_m_init(void)
51{ 51{
52 return ebt_register_match(&filter_mark); 52 return ebt_register_match(&filter_mark);
53} 53}
54 54
55static void __exit fini(void) 55static void __exit ebt_mark_m_fini(void)
56{ 56{
57 ebt_unregister_match(&filter_mark); 57 ebt_unregister_match(&filter_mark);
58} 58}
59 59
60module_init(init); 60module_init(ebt_mark_m_init);
61module_exit(fini); 61module_exit(ebt_mark_m_fini);
62MODULE_LICENSE("GPL"); 62MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_pkttype.c b/net/bridge/netfilter/ebt_pkttype.c
index ecd3b42b19b..4fffd70e4da 100644
--- a/net/bridge/netfilter/ebt_pkttype.c
+++ b/net/bridge/netfilter/ebt_pkttype.c
@@ -44,16 +44,16 @@ static struct ebt_match filter_pkttype =
44 .me = THIS_MODULE, 44 .me = THIS_MODULE,
45}; 45};
46 46
47static int __init init(void) 47static int __init ebt_pkttype_init(void)
48{ 48{
49 return ebt_register_match(&filter_pkttype); 49 return ebt_register_match(&filter_pkttype);
50} 50}
51 51
52static void __exit fini(void) 52static void __exit ebt_pkttype_fini(void)
53{ 53{
54 ebt_unregister_match(&filter_pkttype); 54 ebt_unregister_match(&filter_pkttype);
55} 55}
56 56
57module_init(init); 57module_init(ebt_pkttype_init);
58module_exit(fini); 58module_exit(ebt_pkttype_fini);
59MODULE_LICENSE("GPL"); 59MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_redirect.c b/net/bridge/netfilter/ebt_redirect.c
index 1538b438666..9f378eab72d 100644
--- a/net/bridge/netfilter/ebt_redirect.c
+++ b/net/bridge/netfilter/ebt_redirect.c
@@ -66,16 +66,16 @@ static struct ebt_target redirect_target =
66 .me = THIS_MODULE, 66 .me = THIS_MODULE,
67}; 67};
68 68
69static int __init init(void) 69static int __init ebt_redirect_init(void)
70{ 70{
71 return ebt_register_target(&redirect_target); 71 return ebt_register_target(&redirect_target);
72} 72}
73 73
74static void __exit fini(void) 74static void __exit ebt_redirect_fini(void)
75{ 75{
76 ebt_unregister_target(&redirect_target); 76 ebt_unregister_target(&redirect_target);
77} 77}
78 78
79module_init(init); 79module_init(ebt_redirect_init);
80module_exit(fini); 80module_exit(ebt_redirect_fini);
81MODULE_LICENSE("GPL"); 81MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_snat.c b/net/bridge/netfilter/ebt_snat.c
index 1529bdcb9a4..cbb33e24ca8 100644
--- a/net/bridge/netfilter/ebt_snat.c
+++ b/net/bridge/netfilter/ebt_snat.c
@@ -61,16 +61,16 @@ static struct ebt_target snat =
61 .me = THIS_MODULE, 61 .me = THIS_MODULE,
62}; 62};
63 63
64static int __init init(void) 64static int __init ebt_snat_init(void)
65{ 65{
66 return ebt_register_target(&snat); 66 return ebt_register_target(&snat);
67} 67}
68 68
69static void __exit fini(void) 69static void __exit ebt_snat_fini(void)
70{ 70{
71 ebt_unregister_target(&snat); 71 ebt_unregister_target(&snat);
72} 72}
73 73
74module_init(init); 74module_init(ebt_snat_init);
75module_exit(fini); 75module_exit(ebt_snat_fini);
76MODULE_LICENSE("GPL"); 76MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_stp.c b/net/bridge/netfilter/ebt_stp.c
index 0248c67277e..a0bed82145e 100644
--- a/net/bridge/netfilter/ebt_stp.c
+++ b/net/bridge/netfilter/ebt_stp.c
@@ -180,16 +180,16 @@ static struct ebt_match filter_stp =
180 .me = THIS_MODULE, 180 .me = THIS_MODULE,
181}; 181};
182 182
183static int __init init(void) 183static int __init ebt_stp_init(void)
184{ 184{
185 return ebt_register_match(&filter_stp); 185 return ebt_register_match(&filter_stp);
186} 186}
187 187
188static void __exit fini(void) 188static void __exit ebt_stp_fini(void)
189{ 189{
190 ebt_unregister_match(&filter_stp); 190 ebt_unregister_match(&filter_stp);
191} 191}
192 192
193module_init(init); 193module_init(ebt_stp_init);
194module_exit(fini); 194module_exit(ebt_stp_fini);
195MODULE_LICENSE("GPL"); 195MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebt_ulog.c b/net/bridge/netfilter/ebt_ulog.c
index 802baf755ef..ee5a5176126 100644
--- a/net/bridge/netfilter/ebt_ulog.c
+++ b/net/bridge/netfilter/ebt_ulog.c
@@ -281,7 +281,7 @@ static struct nf_logger ebt_ulog_logger = {
281 .me = THIS_MODULE, 281 .me = THIS_MODULE,
282}; 282};
283 283
284static int __init init(void) 284static int __init ebt_ulog_init(void)
285{ 285{
286 int i, ret = 0; 286 int i, ret = 0;
287 287
@@ -316,7 +316,7 @@ static int __init init(void)
316 return ret; 316 return ret;
317} 317}
318 318
319static void __exit fini(void) 319static void __exit ebt_ulog_fini(void)
320{ 320{
321 ebt_ulog_buff_t *ub; 321 ebt_ulog_buff_t *ub;
322 int i; 322 int i;
@@ -337,8 +337,8 @@ static void __exit fini(void)
337 sock_release(ebtulognl->sk_socket); 337 sock_release(ebtulognl->sk_socket);
338} 338}
339 339
340module_init(init); 340module_init(ebt_ulog_init);
341module_exit(fini); 341module_exit(ebt_ulog_fini);
342MODULE_LICENSE("GPL"); 342MODULE_LICENSE("GPL");
343MODULE_AUTHOR("Bart De Schuymer <bdschuym@pandora.be>"); 343MODULE_AUTHOR("Bart De Schuymer <bdschuym@pandora.be>");
344MODULE_DESCRIPTION("ebtables userspace logging module for bridged Ethernet" 344MODULE_DESCRIPTION("ebtables userspace logging module for bridged Ethernet"
diff --git a/net/bridge/netfilter/ebt_vlan.c b/net/bridge/netfilter/ebt_vlan.c
index db60d734908..a2b452862b7 100644
--- a/net/bridge/netfilter/ebt_vlan.c
+++ b/net/bridge/netfilter/ebt_vlan.c
@@ -178,7 +178,7 @@ static struct ebt_match filter_vlan = {
178 .me = THIS_MODULE, 178 .me = THIS_MODULE,
179}; 179};
180 180
181static int __init init(void) 181static int __init ebt_vlan_init(void)
182{ 182{
183 DEBUG_MSG("ebtables 802.1Q extension module v" 183 DEBUG_MSG("ebtables 802.1Q extension module v"
184 MODULE_VERS "\n"); 184 MODULE_VERS "\n");
@@ -186,10 +186,10 @@ static int __init init(void)
186 return ebt_register_match(&filter_vlan); 186 return ebt_register_match(&filter_vlan);
187} 187}
188 188
189static void __exit fini(void) 189static void __exit ebt_vlan_fini(void)
190{ 190{
191 ebt_unregister_match(&filter_vlan); 191 ebt_unregister_match(&filter_vlan);
192} 192}
193 193
194module_init(init); 194module_init(ebt_vlan_init);
195module_exit(fini); 195module_exit(ebt_vlan_fini);
diff --git a/net/bridge/netfilter/ebtable_broute.c b/net/bridge/netfilter/ebtable_broute.c
index 1767c94cd3d..9a6e548e148 100644
--- a/net/bridge/netfilter/ebtable_broute.c
+++ b/net/bridge/netfilter/ebtable_broute.c
@@ -62,7 +62,7 @@ static int ebt_broute(struct sk_buff **pskb)
62 return 0; /* bridge it */ 62 return 0; /* bridge it */
63} 63}
64 64
65static int __init init(void) 65static int __init ebtable_broute_init(void)
66{ 66{
67 int ret; 67 int ret;
68 68
@@ -74,13 +74,13 @@ static int __init init(void)
74 return ret; 74 return ret;
75} 75}
76 76
77static void __exit fini(void) 77static void __exit ebtable_broute_fini(void)
78{ 78{
79 br_should_route_hook = NULL; 79 br_should_route_hook = NULL;
80 synchronize_net(); 80 synchronize_net();
81 ebt_unregister_table(&broute_table); 81 ebt_unregister_table(&broute_table);
82} 82}
83 83
84module_init(init); 84module_init(ebtable_broute_init);
85module_exit(fini); 85module_exit(ebtable_broute_fini);
86MODULE_LICENSE("GPL"); 86MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebtable_filter.c b/net/bridge/netfilter/ebtable_filter.c
index c18666e0392..3d5bd44f239 100644
--- a/net/bridge/netfilter/ebtable_filter.c
+++ b/net/bridge/netfilter/ebtable_filter.c
@@ -91,7 +91,7 @@ static struct nf_hook_ops ebt_ops_filter[] = {
91 }, 91 },
92}; 92};
93 93
94static int __init init(void) 94static int __init ebtable_filter_init(void)
95{ 95{
96 int i, j, ret; 96 int i, j, ret;
97 97
@@ -109,7 +109,7 @@ cleanup:
109 return ret; 109 return ret;
110} 110}
111 111
112static void __exit fini(void) 112static void __exit ebtable_filter_fini(void)
113{ 113{
114 int i; 114 int i;
115 115
@@ -118,6 +118,6 @@ static void __exit fini(void)
118 ebt_unregister_table(&frame_filter); 118 ebt_unregister_table(&frame_filter);
119} 119}
120 120
121module_init(init); 121module_init(ebtable_filter_init);
122module_exit(fini); 122module_exit(ebtable_filter_fini);
123MODULE_LICENSE("GPL"); 123MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebtable_nat.c b/net/bridge/netfilter/ebtable_nat.c
index 828cac2cc4a..04dd42efda1 100644
--- a/net/bridge/netfilter/ebtable_nat.c
+++ b/net/bridge/netfilter/ebtable_nat.c
@@ -98,7 +98,7 @@ static struct nf_hook_ops ebt_ops_nat[] = {
98 }, 98 },
99}; 99};
100 100
101static int __init init(void) 101static int __init ebtable_nat_init(void)
102{ 102{
103 int i, ret, j; 103 int i, ret, j;
104 104
@@ -116,7 +116,7 @@ cleanup:
116 return ret; 116 return ret;
117} 117}
118 118
119static void __exit fini(void) 119static void __exit ebtable_nat_fini(void)
120{ 120{
121 int i; 121 int i;
122 122
@@ -125,6 +125,6 @@ static void __exit fini(void)
125 ebt_unregister_table(&frame_nat); 125 ebt_unregister_table(&frame_nat);
126} 126}
127 127
128module_init(init); 128module_init(ebtable_nat_init);
129module_exit(fini); 129module_exit(ebtable_nat_fini);
130MODULE_LICENSE("GPL"); 130MODULE_LICENSE("GPL");
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index 99795336720..01eae97c53d 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -1487,7 +1487,7 @@ static struct nf_sockopt_ops ebt_sockopts =
1487 .get = do_ebt_get_ctl, 1487 .get = do_ebt_get_ctl,
1488}; 1488};
1489 1489
1490static int __init init(void) 1490static int __init ebtables_init(void)
1491{ 1491{
1492 int ret; 1492 int ret;
1493 1493
@@ -1501,7 +1501,7 @@ static int __init init(void)
1501 return 0; 1501 return 0;
1502} 1502}
1503 1503
1504static void __exit fini(void) 1504static void __exit ebtables_fini(void)
1505{ 1505{
1506 nf_unregister_sockopt(&ebt_sockopts); 1506 nf_unregister_sockopt(&ebt_sockopts);
1507 printk(KERN_NOTICE "Ebtables v2.0 unregistered\n"); 1507 printk(KERN_NOTICE "Ebtables v2.0 unregistered\n");
@@ -1516,6 +1516,6 @@ EXPORT_SYMBOL(ebt_unregister_watcher);
1516EXPORT_SYMBOL(ebt_register_target); 1516EXPORT_SYMBOL(ebt_register_target);
1517EXPORT_SYMBOL(ebt_unregister_target); 1517EXPORT_SYMBOL(ebt_unregister_target);
1518EXPORT_SYMBOL(ebt_do_table); 1518EXPORT_SYMBOL(ebt_do_table);
1519module_init(init); 1519module_init(ebtables_init);
1520module_exit(fini); 1520module_exit(ebtables_fini);
1521MODULE_LICENSE("GPL"); 1521MODULE_LICENSE("GPL");
diff --git a/net/core/sock.c b/net/core/sock.c
index e110b900414..a96ea7dd0fc 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -187,6 +187,99 @@ static void sock_disable_timestamp(struct sock *sk)
187} 187}
188 188
189 189
190int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
191{
192 int err = 0;
193 int skb_len;
194
195 /* Cast skb->rcvbuf to unsigned... It's pointless, but reduces
196 number of warnings when compiling with -W --ANK
197 */
198 if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
199 (unsigned)sk->sk_rcvbuf) {
200 err = -ENOMEM;
201 goto out;
202 }
203
204 /* It would be deadlock, if sock_queue_rcv_skb is used
205 with socket lock! We assume that users of this
206 function are lock free.
207 */
208 err = sk_filter(sk, skb, 1);
209 if (err)
210 goto out;
211
212 skb->dev = NULL;
213 skb_set_owner_r(skb, sk);
214
215 /* Cache the SKB length before we tack it onto the receive
216 * queue. Once it is added it no longer belongs to us and
217 * may be freed by other threads of control pulling packets
218 * from the queue.
219 */
220 skb_len = skb->len;
221
222 skb_queue_tail(&sk->sk_receive_queue, skb);
223
224 if (!sock_flag(sk, SOCK_DEAD))
225 sk->sk_data_ready(sk, skb_len);
226out:
227 return err;
228}
229EXPORT_SYMBOL(sock_queue_rcv_skb);
230
231int sk_receive_skb(struct sock *sk, struct sk_buff *skb)
232{
233 int rc = NET_RX_SUCCESS;
234
235 if (sk_filter(sk, skb, 0))
236 goto discard_and_relse;
237
238 skb->dev = NULL;
239
240 bh_lock_sock(sk);
241 if (!sock_owned_by_user(sk))
242 rc = sk->sk_backlog_rcv(sk, skb);
243 else
244 sk_add_backlog(sk, skb);
245 bh_unlock_sock(sk);
246out:
247 sock_put(sk);
248 return rc;
249discard_and_relse:
250 kfree_skb(skb);
251 goto out;
252}
253EXPORT_SYMBOL(sk_receive_skb);
254
255struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie)
256{
257 struct dst_entry *dst = sk->sk_dst_cache;
258
259 if (dst && dst->obsolete && dst->ops->check(dst, cookie) == NULL) {
260 sk->sk_dst_cache = NULL;
261 dst_release(dst);
262 return NULL;
263 }
264
265 return dst;
266}
267EXPORT_SYMBOL(__sk_dst_check);
268
269struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie)
270{
271 struct dst_entry *dst = sk_dst_get(sk);
272
273 if (dst && dst->obsolete && dst->ops->check(dst, cookie) == NULL) {
274 sk_dst_reset(sk);
275 dst_release(dst);
276 return NULL;
277 }
278
279 return dst;
280}
281EXPORT_SYMBOL(sk_dst_check);
282
190/* 283/*
191 * This is meant for all protocols to use and covers goings on 284 * This is meant for all protocols to use and covers goings on
192 * at the socket level. Everything here is generic. 285 * at the socket level. Everything here is generic.
diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c
index 16a5a31e212..74133ecd770 100644
--- a/net/decnet/netfilter/dn_rtmsg.c
+++ b/net/decnet/netfilter/dn_rtmsg.c
@@ -133,7 +133,7 @@ static struct nf_hook_ops dnrmg_ops = {
133 .priority = NF_DN_PRI_DNRTMSG, 133 .priority = NF_DN_PRI_DNRTMSG,
134}; 134};
135 135
136static int __init init(void) 136static int __init dn_rtmsg_init(void)
137{ 137{
138 int rv = 0; 138 int rv = 0;
139 139
@@ -152,7 +152,7 @@ static int __init init(void)
152 return rv; 152 return rv;
153} 153}
154 154
155static void __exit fini(void) 155static void __exit dn_rtmsg_fini(void)
156{ 156{
157 nf_unregister_hook(&dnrmg_ops); 157 nf_unregister_hook(&dnrmg_ops);
158 sock_release(dnrmg->sk_socket); 158 sock_release(dnrmg->sk_socket);
@@ -164,6 +164,6 @@ MODULE_AUTHOR("Steven Whitehouse <steve@chygwyn.com>");
164MODULE_LICENSE("GPL"); 164MODULE_LICENSE("GPL");
165MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_DNRTMSG); 165MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_DNRTMSG);
166 166
167module_init(init); 167module_init(dn_rtmsg_init);
168module_exit(fini); 168module_exit(dn_rtmsg_fini);
169 169
diff --git a/net/econet/af_econet.c b/net/econet/af_econet.c
index c792994d795..868265619db 100644
--- a/net/econet/af_econet.c
+++ b/net/econet/af_econet.c
@@ -42,6 +42,7 @@
42#include <linux/spinlock.h> 42#include <linux/spinlock.h>
43#include <linux/rcupdate.h> 43#include <linux/rcupdate.h>
44#include <linux/bitops.h> 44#include <linux/bitops.h>
45#include <linux/mutex.h>
45 46
46#include <asm/uaccess.h> 47#include <asm/uaccess.h>
47#include <asm/system.h> 48#include <asm/system.h>
@@ -49,6 +50,7 @@
49static const struct proto_ops econet_ops; 50static const struct proto_ops econet_ops;
50static struct hlist_head econet_sklist; 51static struct hlist_head econet_sklist;
51static DEFINE_RWLOCK(econet_lock); 52static DEFINE_RWLOCK(econet_lock);
53static DEFINE_MUTEX(econet_mutex);
52 54
53/* Since there are only 256 possible network numbers (or fewer, depends 55/* Since there are only 256 possible network numbers (or fewer, depends
54 how you count) it makes sense to use a simple lookup table. */ 56 how you count) it makes sense to use a simple lookup table. */
@@ -124,6 +126,8 @@ static int econet_recvmsg(struct kiocb *iocb, struct socket *sock,
124 126
125 msg->msg_namelen = sizeof(struct sockaddr_ec); 127 msg->msg_namelen = sizeof(struct sockaddr_ec);
126 128
129 mutex_lock(&econet_mutex);
130
127 /* 131 /*
128 * Call the generic datagram receiver. This handles all sorts 132 * Call the generic datagram receiver. This handles all sorts
129 * of horrible races and re-entrancy so we can forget about it 133 * of horrible races and re-entrancy so we can forget about it
@@ -174,6 +178,7 @@ static int econet_recvmsg(struct kiocb *iocb, struct socket *sock,
174out_free: 178out_free:
175 skb_free_datagram(sk, skb); 179 skb_free_datagram(sk, skb);
176out: 180out:
181 mutex_unlock(&econet_mutex);
177 return err; 182 return err;
178} 183}
179 184
@@ -184,8 +189,8 @@ out:
184static int econet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) 189static int econet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
185{ 190{
186 struct sockaddr_ec *sec = (struct sockaddr_ec *)uaddr; 191 struct sockaddr_ec *sec = (struct sockaddr_ec *)uaddr;
187 struct sock *sk=sock->sk; 192 struct sock *sk;
188 struct econet_sock *eo = ec_sk(sk); 193 struct econet_sock *eo;
189 194
190 /* 195 /*
191 * Check legality 196 * Check legality
@@ -195,11 +200,18 @@ static int econet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len
195 sec->sec_family != AF_ECONET) 200 sec->sec_family != AF_ECONET)
196 return -EINVAL; 201 return -EINVAL;
197 202
203 mutex_lock(&econet_mutex);
204
205 sk = sock->sk;
206 eo = ec_sk(sk);
207
198 eo->cb = sec->cb; 208 eo->cb = sec->cb;
199 eo->port = sec->port; 209 eo->port = sec->port;
200 eo->station = sec->addr.station; 210 eo->station = sec->addr.station;
201 eo->net = sec->addr.net; 211 eo->net = sec->addr.net;
202 212
213 mutex_unlock(&econet_mutex);
214
203 return 0; 215 return 0;
204} 216}
205 217
@@ -284,6 +296,8 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
284 * Get and verify the address. 296 * Get and verify the address.
285 */ 297 */
286 298
299 mutex_lock(&econet_mutex);
300
287 if (saddr == NULL) { 301 if (saddr == NULL) {
288 struct econet_sock *eo = ec_sk(sk); 302 struct econet_sock *eo = ec_sk(sk);
289 303
@@ -292,8 +306,10 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
292 port = eo->port; 306 port = eo->port;
293 cb = eo->cb; 307 cb = eo->cb;
294 } else { 308 } else {
295 if (msg->msg_namelen < sizeof(struct sockaddr_ec)) 309 if (msg->msg_namelen < sizeof(struct sockaddr_ec)) {
310 mutex_unlock(&econet_mutex);
296 return -EINVAL; 311 return -EINVAL;
312 }
297 addr.station = saddr->addr.station; 313 addr.station = saddr->addr.station;
298 addr.net = saddr->addr.net; 314 addr.net = saddr->addr.net;
299 port = saddr->port; 315 port = saddr->port;
@@ -304,19 +320,21 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
304 dev = net2dev_map[addr.net]; 320 dev = net2dev_map[addr.net];
305 321
306 /* If not directly reachable, use some default */ 322 /* If not directly reachable, use some default */
307 if (dev == NULL) 323 if (dev == NULL) {
308 {
309 dev = net2dev_map[0]; 324 dev = net2dev_map[0];
310 /* No interfaces at all? */ 325 /* No interfaces at all? */
311 if (dev == NULL) 326 if (dev == NULL) {
327 mutex_unlock(&econet_mutex);
312 return -ENETDOWN; 328 return -ENETDOWN;
329 }
313 } 330 }
314 331
315 if (len + 15 > dev->mtu) 332 if (len + 15 > dev->mtu) {
333 mutex_unlock(&econet_mutex);
316 return -EMSGSIZE; 334 return -EMSGSIZE;
335 }
317 336
318 if (dev->type == ARPHRD_ECONET) 337 if (dev->type == ARPHRD_ECONET) {
319 {
320 /* Real hardware Econet. We're not worthy etc. */ 338 /* Real hardware Econet. We're not worthy etc. */
321#ifdef CONFIG_ECONET_NATIVE 339#ifdef CONFIG_ECONET_NATIVE
322 unsigned short proto = 0; 340 unsigned short proto = 0;
@@ -374,6 +392,7 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
374 392
375 dev_queue_xmit(skb); 393 dev_queue_xmit(skb);
376 dev_put(dev); 394 dev_put(dev);
395 mutex_unlock(&econet_mutex);
377 return(len); 396 return(len);
378 397
379 out_free: 398 out_free:
@@ -384,14 +403,18 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
384#else 403#else
385 err = -EPROTOTYPE; 404 err = -EPROTOTYPE;
386#endif 405#endif
406 mutex_unlock(&econet_mutex);
407
387 return err; 408 return err;
388 } 409 }
389 410
390#ifdef CONFIG_ECONET_AUNUDP 411#ifdef CONFIG_ECONET_AUNUDP
391 /* AUN virtual Econet. */ 412 /* AUN virtual Econet. */
392 413
393 if (udpsock == NULL) 414 if (udpsock == NULL) {
415 mutex_unlock(&econet_mutex);
394 return -ENETDOWN; /* No socket - can't send */ 416 return -ENETDOWN; /* No socket - can't send */
417 }
395 418
396 /* Make up a UDP datagram and hand it off to some higher intellect. */ 419 /* Make up a UDP datagram and hand it off to some higher intellect. */
397 420
@@ -438,8 +461,10 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
438 void __user *base = msg->msg_iov[i].iov_base; 461 void __user *base = msg->msg_iov[i].iov_base;
439 size_t len = msg->msg_iov[i].iov_len; 462 size_t len = msg->msg_iov[i].iov_len;
440 /* Check it now since we switch to KERNEL_DS later. */ 463 /* Check it now since we switch to KERNEL_DS later. */
441 if (!access_ok(VERIFY_READ, base, len)) 464 if (!access_ok(VERIFY_READ, base, len)) {
465 mutex_unlock(&econet_mutex);
442 return -EFAULT; 466 return -EFAULT;
467 }
443 iov[i+1].iov_base = base; 468 iov[i+1].iov_base = base;
444 iov[i+1].iov_len = len; 469 iov[i+1].iov_len = len;
445 size += len; 470 size += len;
@@ -447,8 +472,11 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
447 472
448 /* Get a skbuff (no data, just holds our cb information) */ 473 /* Get a skbuff (no data, just holds our cb information) */
449 if ((skb = sock_alloc_send_skb(sk, 0, 474 if ((skb = sock_alloc_send_skb(sk, 0,
450 msg->msg_flags & MSG_DONTWAIT, &err)) == NULL) 475 msg->msg_flags & MSG_DONTWAIT,
476 &err)) == NULL) {
477 mutex_unlock(&econet_mutex);
451 return err; 478 return err;
479 }
452 480
453 eb = (struct ec_cb *)&skb->cb; 481 eb = (struct ec_cb *)&skb->cb;
454 482
@@ -475,6 +503,8 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
475#else 503#else
476 err = -EPROTOTYPE; 504 err = -EPROTOTYPE;
477#endif 505#endif
506 mutex_unlock(&econet_mutex);
507
478 return err; 508 return err;
479} 509}
480 510
@@ -485,18 +515,25 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
485static int econet_getname(struct socket *sock, struct sockaddr *uaddr, 515static int econet_getname(struct socket *sock, struct sockaddr *uaddr,
486 int *uaddr_len, int peer) 516 int *uaddr_len, int peer)
487{ 517{
488 struct sock *sk = sock->sk; 518 struct sock *sk;
489 struct econet_sock *eo = ec_sk(sk); 519 struct econet_sock *eo;
490 struct sockaddr_ec *sec = (struct sockaddr_ec *)uaddr; 520 struct sockaddr_ec *sec = (struct sockaddr_ec *)uaddr;
491 521
492 if (peer) 522 if (peer)
493 return -EOPNOTSUPP; 523 return -EOPNOTSUPP;
494 524
525 mutex_lock(&econet_mutex);
526
527 sk = sock->sk;
528 eo = ec_sk(sk);
529
495 sec->sec_family = AF_ECONET; 530 sec->sec_family = AF_ECONET;
496 sec->port = eo->port; 531 sec->port = eo->port;
497 sec->addr.station = eo->station; 532 sec->addr.station = eo->station;
498 sec->addr.net = eo->net; 533 sec->addr.net = eo->net;
499 534
535 mutex_unlock(&econet_mutex);
536
500 *uaddr_len = sizeof(*sec); 537 *uaddr_len = sizeof(*sec);
501 return 0; 538 return 0;
502} 539}
@@ -522,10 +559,13 @@ static void econet_destroy_timer(unsigned long data)
522 559
523static int econet_release(struct socket *sock) 560static int econet_release(struct socket *sock)
524{ 561{
525 struct sock *sk = sock->sk; 562 struct sock *sk;
526 563
564 mutex_lock(&econet_mutex);
565
566 sk = sock->sk;
527 if (!sk) 567 if (!sk)
528 return 0; 568 goto out_unlock;
529 569
530 econet_remove_socket(&econet_sklist, sk); 570 econet_remove_socket(&econet_sklist, sk);
531 571
@@ -549,10 +589,14 @@ static int econet_release(struct socket *sock)
549 sk->sk_timer.expires = jiffies + HZ; 589 sk->sk_timer.expires = jiffies + HZ;
550 sk->sk_timer.function = econet_destroy_timer; 590 sk->sk_timer.function = econet_destroy_timer;
551 add_timer(&sk->sk_timer); 591 add_timer(&sk->sk_timer);
552 return 0; 592
593 goto out_unlock;
553 } 594 }
554 595
555 sk_free(sk); 596 sk_free(sk);
597
598out_unlock:
599 mutex_unlock(&econet_mutex);
556 return 0; 600 return 0;
557} 601}
558 602
@@ -608,6 +652,7 @@ static int ec_dev_ioctl(struct socket *sock, unsigned int cmd, void __user *arg)
608 struct ec_device *edev; 652 struct ec_device *edev;
609 struct net_device *dev; 653 struct net_device *dev;
610 struct sockaddr_ec *sec; 654 struct sockaddr_ec *sec;
655 int err;
611 656
612 /* 657 /*
613 * Fetch the caller's info block into kernel space 658 * Fetch the caller's info block into kernel space
@@ -621,38 +666,35 @@ static int ec_dev_ioctl(struct socket *sock, unsigned int cmd, void __user *arg)
621 666
622 sec = (struct sockaddr_ec *)&ifr.ifr_addr; 667 sec = (struct sockaddr_ec *)&ifr.ifr_addr;
623 668
624 switch (cmd) 669 mutex_lock(&econet_mutex);
625 { 670
671 err = 0;
672 switch (cmd) {
626 case SIOCSIFADDR: 673 case SIOCSIFADDR:
627 edev = dev->ec_ptr; 674 edev = dev->ec_ptr;
628 if (edev == NULL) 675 if (edev == NULL) {
629 {
630 /* Magic up a new one. */ 676 /* Magic up a new one. */
631 edev = kmalloc(sizeof(struct ec_device), GFP_KERNEL); 677 edev = kmalloc(sizeof(struct ec_device), GFP_KERNEL);
632 if (edev == NULL) { 678 if (edev == NULL) {
633 printk("af_ec: memory squeeze.\n"); 679 err = -ENOMEM;
634 dev_put(dev); 680 break;
635 return -ENOMEM;
636 } 681 }
637 memset(edev, 0, sizeof(struct ec_device)); 682 memset(edev, 0, sizeof(struct ec_device));
638 dev->ec_ptr = edev; 683 dev->ec_ptr = edev;
639 } 684 } else
640 else
641 net2dev_map[edev->net] = NULL; 685 net2dev_map[edev->net] = NULL;
642 edev->station = sec->addr.station; 686 edev->station = sec->addr.station;
643 edev->net = sec->addr.net; 687 edev->net = sec->addr.net;
644 net2dev_map[sec->addr.net] = dev; 688 net2dev_map[sec->addr.net] = dev;
645 if (!net2dev_map[0]) 689 if (!net2dev_map[0])
646 net2dev_map[0] = dev; 690 net2dev_map[0] = dev;
647 dev_put(dev); 691 break;
648 return 0;
649 692
650 case SIOCGIFADDR: 693 case SIOCGIFADDR:
651 edev = dev->ec_ptr; 694 edev = dev->ec_ptr;
652 if (edev == NULL) 695 if (edev == NULL) {
653 { 696 err = -ENODEV;
654 dev_put(dev); 697 break;
655 return -ENODEV;
656 } 698 }
657 memset(sec, 0, sizeof(struct sockaddr_ec)); 699 memset(sec, 0, sizeof(struct sockaddr_ec));
658 sec->addr.station = edev->station; 700 sec->addr.station = edev->station;
@@ -660,12 +702,19 @@ static int ec_dev_ioctl(struct socket *sock, unsigned int cmd, void __user *arg)
660 sec->sec_family = AF_ECONET; 702 sec->sec_family = AF_ECONET;
661 dev_put(dev); 703 dev_put(dev);
662 if (copy_to_user(arg, &ifr, sizeof(struct ifreq))) 704 if (copy_to_user(arg, &ifr, sizeof(struct ifreq)))
663 return -EFAULT; 705 err = -EFAULT;
664 return 0; 706 break;
707
708 default:
709 err = -EINVAL;
710 break;
665 } 711 }
666 712
713 mutex_unlock(&econet_mutex);
714
667 dev_put(dev); 715 dev_put(dev);
668 return -EINVAL; 716
717 return err;
669} 718}
670 719
671/* 720/*
@@ -699,7 +748,7 @@ static struct net_proto_family econet_family_ops = {
699 .owner = THIS_MODULE, 748 .owner = THIS_MODULE,
700}; 749};
701 750
702static const struct proto_ops SOCKOPS_WRAPPED(econet_ops) = { 751static const struct proto_ops econet_ops = {
703 .family = PF_ECONET, 752 .family = PF_ECONET,
704 .owner = THIS_MODULE, 753 .owner = THIS_MODULE,
705 .release = econet_release, 754 .release = econet_release,
@@ -720,9 +769,6 @@ static const struct proto_ops SOCKOPS_WRAPPED(econet_ops) = {
720 .sendpage = sock_no_sendpage, 769 .sendpage = sock_no_sendpage,
721}; 770};
722 771
723#include <linux/smp_lock.h>
724SOCKOPS_WRAP(econet, PF_ECONET);
725
726#if defined(CONFIG_ECONET_AUNUDP) || defined(CONFIG_ECONET_NATIVE) 772#if defined(CONFIG_ECONET_AUNUDP) || defined(CONFIG_ECONET_NATIVE)
727/* 773/*
728 * Find the listening socket, if any, for the given data. 774 * Find the listening socket, if any, for the given data.
diff --git a/net/ieee80211/ieee80211_wx.c b/net/ieee80211/ieee80211_wx.c
index af7f9bbfd18..b885fd18940 100644
--- a/net/ieee80211/ieee80211_wx.c
+++ b/net/ieee80211/ieee80211_wx.c
@@ -42,7 +42,7 @@ static const char *ieee80211_modes[] = {
42}; 42};
43 43
44#define MAX_CUSTOM_LEN 64 44#define MAX_CUSTOM_LEN 64
45static char *ipw2100_translate_scan(struct ieee80211_device *ieee, 45static char *ieee80211_translate_scan(struct ieee80211_device *ieee,
46 char *start, char *stop, 46 char *start, char *stop,
47 struct ieee80211_network *network) 47 struct ieee80211_network *network)
48{ 48{
@@ -274,7 +274,7 @@ int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
274 274
275 if (ieee->scan_age == 0 || 275 if (ieee->scan_age == 0 ||
276 time_after(network->last_scanned + ieee->scan_age, jiffies)) 276 time_after(network->last_scanned + ieee->scan_age, jiffies))
277 ev = ipw2100_translate_scan(ieee, ev, stop, network); 277 ev = ieee80211_translate_scan(ieee, ev, stop, network);
278 else 278 else
279 IEEE80211_DEBUG_SCAN("Not showing network '%s (" 279 IEEE80211_DEBUG_SCAN("Not showing network '%s ("
280 MAC_FMT ")' due to age (%dms).\n", 280 MAC_FMT ")' due to age (%dms).\n",
diff --git a/net/ieee80211/softmac/ieee80211softmac_module.c b/net/ieee80211/softmac/ieee80211softmac_module.c
index 6f99f781bff..60f06a31f0d 100644
--- a/net/ieee80211/softmac/ieee80211softmac_module.c
+++ b/net/ieee80211/softmac/ieee80211softmac_module.c
@@ -183,16 +183,21 @@ void ieee80211softmac_start(struct net_device *dev)
183 */ 183 */
184 if (mac->txrates_change) 184 if (mac->txrates_change)
185 oldrates = mac->txrates; 185 oldrates = mac->txrates;
186 if (ieee->modulation & IEEE80211_OFDM_MODULATION) { 186 /* FIXME: We don't correctly handle backing down to lower
187 mac->txrates.default_rate = IEEE80211_OFDM_RATE_54MB; 187 rates, so 801.11g devices start off at 11M for now. People
188 change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT; 188 can manually change it if they really need to, but 11M is
189 mac->txrates.default_fallback = IEEE80211_OFDM_RATE_24MB; 189 more reliable. Note similar logic in
190 change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK; 190 ieee80211softmac_wx_set_rate() */
191 } else if (ieee->modulation & IEEE80211_CCK_MODULATION) { 191 if (ieee->modulation & IEEE80211_CCK_MODULATION) {
192 mac->txrates.default_rate = IEEE80211_CCK_RATE_11MB; 192 mac->txrates.default_rate = IEEE80211_CCK_RATE_11MB;
193 change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT; 193 change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT;
194 mac->txrates.default_fallback = IEEE80211_CCK_RATE_5MB; 194 mac->txrates.default_fallback = IEEE80211_CCK_RATE_5MB;
195 change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK; 195 change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK;
196 } else if (ieee->modulation & IEEE80211_OFDM_MODULATION) {
197 mac->txrates.default_rate = IEEE80211_OFDM_RATE_54MB;
198 change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT;
199 mac->txrates.default_fallback = IEEE80211_OFDM_RATE_24MB;
200 change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK;
196 } else 201 } else
197 assert(0); 202 assert(0);
198 if (mac->txrates_change) 203 if (mac->txrates_change)
diff --git a/net/ieee80211/softmac/ieee80211softmac_priv.h b/net/ieee80211/softmac/ieee80211softmac_priv.h
index 9ba7dbd161e..65d9816c8ec 100644
--- a/net/ieee80211/softmac/ieee80211softmac_priv.h
+++ b/net/ieee80211/softmac/ieee80211softmac_priv.h
@@ -167,7 +167,7 @@ static inline int ieee80211softmac_scan_sanity_check(struct ieee80211softmac_dev
167 ) || ieee80211softmac_scan_handlers_check_self(sm); 167 ) || ieee80211softmac_scan_handlers_check_self(sm);
168} 168}
169 169
170#define IEEE80211SOFTMAC_PROBE_DELAY HZ/2 170#define IEEE80211SOFTMAC_PROBE_DELAY HZ/50
171#define IEEE80211SOFTMAC_WORKQUEUE_NAME_LEN (17 + IFNAMSIZ) 171#define IEEE80211SOFTMAC_WORKQUEUE_NAME_LEN (17 + IFNAMSIZ)
172 172
173struct ieee80211softmac_network { 173struct ieee80211softmac_network {
diff --git a/net/ieee80211/softmac/ieee80211softmac_wx.c b/net/ieee80211/softmac/ieee80211softmac_wx.c
index e1a9bc6d36f..b559aa9b550 100644
--- a/net/ieee80211/softmac/ieee80211softmac_wx.c
+++ b/net/ieee80211/softmac/ieee80211softmac_wx.c
@@ -135,11 +135,15 @@ ieee80211softmac_wx_set_rate(struct net_device *net_dev,
135 int err = -EINVAL; 135 int err = -EINVAL;
136 136
137 if (in_rate == -1) { 137 if (in_rate == -1) {
138 /* automatic detect */ 138 /* FIXME: We don't correctly handle backing down to lower
139 if (ieee->modulation & IEEE80211_OFDM_MODULATION) 139 rates, so 801.11g devices start off at 11M for now. People
140 in_rate = 54000000; 140 can manually change it if they really need to, but 11M is
141 else 141 more reliable. Note similar logic in
142 ieee80211softmac_wx_set_rate() */
143 if (ieee->modulation & IEEE80211_CCK_MODULATION)
142 in_rate = 11000000; 144 in_rate = 11000000;
145 else
146 in_rate = 54000000;
143 } 147 }
144 148
145 switch (in_rate) { 149 switch (in_rate) {
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig
index 011cca7ae02..e40f7532237 100644
--- a/net/ipv4/Kconfig
+++ b/net/ipv4/Kconfig
@@ -235,6 +235,7 @@ config IP_PNP_RARP
235# bool ' IP: ARP support' CONFIG_IP_PNP_ARP 235# bool ' IP: ARP support' CONFIG_IP_PNP_ARP
236config NET_IPIP 236config NET_IPIP
237 tristate "IP: tunneling" 237 tristate "IP: tunneling"
238 select INET_TUNNEL
238 ---help--- 239 ---help---
239 Tunneling means encapsulating data of one protocol type within 240 Tunneling means encapsulating data of one protocol type within
240 another protocol and sending it over a channel that understands the 241 another protocol and sending it over a channel that understands the
@@ -395,7 +396,7 @@ config INET_ESP
395config INET_IPCOMP 396config INET_IPCOMP
396 tristate "IP: IPComp transformation" 397 tristate "IP: IPComp transformation"
397 select XFRM 398 select XFRM
398 select INET_TUNNEL 399 select INET_XFRM_TUNNEL
399 select CRYPTO 400 select CRYPTO
400 select CRYPTO_DEFLATE 401 select CRYPTO_DEFLATE
401 ---help--- 402 ---help---
@@ -404,14 +405,14 @@ config INET_IPCOMP
404 405
405 If unsure, say Y. 406 If unsure, say Y.
406 407
408config INET_XFRM_TUNNEL
409 tristate
410 select INET_TUNNEL
411 default n
412
407config INET_TUNNEL 413config INET_TUNNEL
408 tristate "IP: tunnel transformation" 414 tristate
409 select XFRM 415 default n
410 ---help---
411 Support for generic IP tunnel transformation, which is required by
412 the IP tunneling module as well as tunnel mode IPComp.
413
414 If unsure, say Y.
415 416
416config INET_DIAG 417config INET_DIAG
417 tristate "INET: socket monitoring interface" 418 tristate "INET: socket monitoring interface"
diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile
index 35e5f599909..9ef50a0b9d2 100644
--- a/net/ipv4/Makefile
+++ b/net/ipv4/Makefile
@@ -22,7 +22,8 @@ obj-$(CONFIG_SYN_COOKIES) += syncookies.o
22obj-$(CONFIG_INET_AH) += ah4.o 22obj-$(CONFIG_INET_AH) += ah4.o
23obj-$(CONFIG_INET_ESP) += esp4.o 23obj-$(CONFIG_INET_ESP) += esp4.o
24obj-$(CONFIG_INET_IPCOMP) += ipcomp.o 24obj-$(CONFIG_INET_IPCOMP) += ipcomp.o
25obj-$(CONFIG_INET_TUNNEL) += xfrm4_tunnel.o 25obj-$(CONFIG_INET_XFRM_TUNNEL) += xfrm4_tunnel.o
26obj-$(CONFIG_INET_TUNNEL) += tunnel4.o
26obj-$(CONFIG_IP_PNP) += ipconfig.o 27obj-$(CONFIG_IP_PNP) += ipconfig.o
27obj-$(CONFIG_IP_ROUTE_MULTIPATH_RR) += multipath_rr.o 28obj-$(CONFIG_IP_ROUTE_MULTIPATH_RR) += multipath_rr.o
28obj-$(CONFIG_IP_ROUTE_MULTIPATH_RANDOM) += multipath_random.o 29obj-$(CONFIG_IP_ROUTE_MULTIPATH_RANDOM) += multipath_random.o
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c
index 03d13742a4b..eef07b0916a 100644
--- a/net/ipv4/ipip.c
+++ b/net/ipv4/ipip.c
@@ -114,7 +114,6 @@
114#include <net/sock.h> 114#include <net/sock.h>
115#include <net/ip.h> 115#include <net/ip.h>
116#include <net/icmp.h> 116#include <net/icmp.h>
117#include <net/protocol.h>
118#include <net/ipip.h> 117#include <net/ipip.h>
119#include <net/inet_ecn.h> 118#include <net/inet_ecn.h>
120#include <net/xfrm.h> 119#include <net/xfrm.h>
@@ -274,7 +273,7 @@ static void ipip_tunnel_uninit(struct net_device *dev)
274 dev_put(dev); 273 dev_put(dev);
275} 274}
276 275
277static void ipip_err(struct sk_buff *skb, u32 info) 276static int ipip_err(struct sk_buff *skb, u32 info)
278{ 277{
279#ifndef I_WISH_WORLD_WERE_PERFECT 278#ifndef I_WISH_WORLD_WERE_PERFECT
280 279
@@ -286,21 +285,22 @@ static void ipip_err(struct sk_buff *skb, u32 info)
286 int type = skb->h.icmph->type; 285 int type = skb->h.icmph->type;
287 int code = skb->h.icmph->code; 286 int code = skb->h.icmph->code;
288 struct ip_tunnel *t; 287 struct ip_tunnel *t;
288 int err;
289 289
290 switch (type) { 290 switch (type) {
291 default: 291 default:
292 case ICMP_PARAMETERPROB: 292 case ICMP_PARAMETERPROB:
293 return; 293 return 0;
294 294
295 case ICMP_DEST_UNREACH: 295 case ICMP_DEST_UNREACH:
296 switch (code) { 296 switch (code) {
297 case ICMP_SR_FAILED: 297 case ICMP_SR_FAILED:
298 case ICMP_PORT_UNREACH: 298 case ICMP_PORT_UNREACH:
299 /* Impossible event. */ 299 /* Impossible event. */
300 return; 300 return 0;
301 case ICMP_FRAG_NEEDED: 301 case ICMP_FRAG_NEEDED:
302 /* Soft state for pmtu is maintained by IP core. */ 302 /* Soft state for pmtu is maintained by IP core. */
303 return; 303 return 0;
304 default: 304 default:
305 /* All others are translated to HOST_UNREACH. 305 /* All others are translated to HOST_UNREACH.
306 rfc2003 contains "deep thoughts" about NET_UNREACH, 306 rfc2003 contains "deep thoughts" about NET_UNREACH,
@@ -311,14 +311,18 @@ static void ipip_err(struct sk_buff *skb, u32 info)
311 break; 311 break;
312 case ICMP_TIME_EXCEEDED: 312 case ICMP_TIME_EXCEEDED:
313 if (code != ICMP_EXC_TTL) 313 if (code != ICMP_EXC_TTL)
314 return; 314 return 0;
315 break; 315 break;
316 } 316 }
317 317
318 err = -ENOENT;
319
318 read_lock(&ipip_lock); 320 read_lock(&ipip_lock);
319 t = ipip_tunnel_lookup(iph->daddr, iph->saddr); 321 t = ipip_tunnel_lookup(iph->daddr, iph->saddr);
320 if (t == NULL || t->parms.iph.daddr == 0) 322 if (t == NULL || t->parms.iph.daddr == 0)
321 goto out; 323 goto out;
324
325 err = 0;
322 if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED) 326 if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED)
323 goto out; 327 goto out;
324 328
@@ -329,7 +333,7 @@ static void ipip_err(struct sk_buff *skb, u32 info)
329 t->err_time = jiffies; 333 t->err_time = jiffies;
330out: 334out:
331 read_unlock(&ipip_lock); 335 read_unlock(&ipip_lock);
332 return; 336 return err;
333#else 337#else
334 struct iphdr *iph = (struct iphdr*)dp; 338 struct iphdr *iph = (struct iphdr*)dp;
335 int hlen = iph->ihl<<2; 339 int hlen = iph->ihl<<2;
@@ -344,15 +348,15 @@ out:
344 struct rtable *rt; 348 struct rtable *rt;
345 349
346 if (len < hlen + sizeof(struct iphdr)) 350 if (len < hlen + sizeof(struct iphdr))
347 return; 351 return 0;
348 eiph = (struct iphdr*)(dp + hlen); 352 eiph = (struct iphdr*)(dp + hlen);
349 353
350 switch (type) { 354 switch (type) {
351 default: 355 default:
352 return; 356 return 0;
353 case ICMP_PARAMETERPROB: 357 case ICMP_PARAMETERPROB:
354 if (skb->h.icmph->un.gateway < hlen) 358 if (skb->h.icmph->un.gateway < hlen)
355 return; 359 return 0;
356 360
357 /* So... This guy found something strange INSIDE encapsulated 361 /* So... This guy found something strange INSIDE encapsulated
358 packet. Well, he is fool, but what can we do ? 362 packet. Well, he is fool, but what can we do ?
@@ -366,16 +370,16 @@ out:
366 case ICMP_SR_FAILED: 370 case ICMP_SR_FAILED:
367 case ICMP_PORT_UNREACH: 371 case ICMP_PORT_UNREACH:
368 /* Impossible event. */ 372 /* Impossible event. */
369 return; 373 return 0;
370 case ICMP_FRAG_NEEDED: 374 case ICMP_FRAG_NEEDED:
371 /* And it is the only really necessary thing :-) */ 375 /* And it is the only really necessary thing :-) */
372 rel_info = ntohs(skb->h.icmph->un.frag.mtu); 376 rel_info = ntohs(skb->h.icmph->un.frag.mtu);
373 if (rel_info < hlen+68) 377 if (rel_info < hlen+68)
374 return; 378 return 0;
375 rel_info -= hlen; 379 rel_info -= hlen;
376 /* BSD 4.2 MORE DOES NOT EXIST IN NATURE. */ 380 /* BSD 4.2 MORE DOES NOT EXIST IN NATURE. */
377 if (rel_info > ntohs(eiph->tot_len)) 381 if (rel_info > ntohs(eiph->tot_len))
378 return; 382 return 0;
379 break; 383 break;
380 default: 384 default:
381 /* All others are translated to HOST_UNREACH. 385 /* All others are translated to HOST_UNREACH.
@@ -389,14 +393,14 @@ out:
389 break; 393 break;
390 case ICMP_TIME_EXCEEDED: 394 case ICMP_TIME_EXCEEDED:
391 if (code != ICMP_EXC_TTL) 395 if (code != ICMP_EXC_TTL)
392 return; 396 return 0;
393 break; 397 break;
394 } 398 }
395 399
396 /* Prepare fake skb to feed it to icmp_send */ 400 /* Prepare fake skb to feed it to icmp_send */
397 skb2 = skb_clone(skb, GFP_ATOMIC); 401 skb2 = skb_clone(skb, GFP_ATOMIC);
398 if (skb2 == NULL) 402 if (skb2 == NULL)
399 return; 403 return 0;
400 dst_release(skb2->dst); 404 dst_release(skb2->dst);
401 skb2->dst = NULL; 405 skb2->dst = NULL;
402 skb_pull(skb2, skb->data - (u8*)eiph); 406 skb_pull(skb2, skb->data - (u8*)eiph);
@@ -409,7 +413,7 @@ out:
409 fl.proto = IPPROTO_IPIP; 413 fl.proto = IPPROTO_IPIP;
410 if (ip_route_output_key(&rt, &key)) { 414 if (ip_route_output_key(&rt, &key)) {
411 kfree_skb(skb2); 415 kfree_skb(skb2);
412 return; 416 return 0;
413 } 417 }
414 skb2->dev = rt->u.dst.dev; 418 skb2->dev = rt->u.dst.dev;
415 419
@@ -424,14 +428,14 @@ out:
424 rt->u.dst.dev->type != ARPHRD_TUNNEL) { 428 rt->u.dst.dev->type != ARPHRD_TUNNEL) {
425 ip_rt_put(rt); 429 ip_rt_put(rt);
426 kfree_skb(skb2); 430 kfree_skb(skb2);
427 return; 431 return 0;
428 } 432 }
429 } else { 433 } else {
430 ip_rt_put(rt); 434 ip_rt_put(rt);
431 if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, skb2->dev) || 435 if (ip_route_input(skb2, eiph->daddr, eiph->saddr, eiph->tos, skb2->dev) ||
432 skb2->dst->dev->type != ARPHRD_TUNNEL) { 436 skb2->dst->dev->type != ARPHRD_TUNNEL) {
433 kfree_skb(skb2); 437 kfree_skb(skb2);
434 return; 438 return 0;
435 } 439 }
436 } 440 }
437 441
@@ -439,7 +443,7 @@ out:
439 if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) { 443 if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED) {
440 if (rel_info > dst_mtu(skb2->dst)) { 444 if (rel_info > dst_mtu(skb2->dst)) {
441 kfree_skb(skb2); 445 kfree_skb(skb2);
442 return; 446 return 0;
443 } 447 }
444 skb2->dst->ops->update_pmtu(skb2->dst, rel_info); 448 skb2->dst->ops->update_pmtu(skb2->dst, rel_info);
445 rel_info = htonl(rel_info); 449 rel_info = htonl(rel_info);
@@ -453,7 +457,7 @@ out:
453 457
454 icmp_send(skb2, rel_type, rel_code, rel_info); 458 icmp_send(skb2, rel_type, rel_code, rel_info);
455 kfree_skb(skb2); 459 kfree_skb(skb2);
456 return; 460 return 0;
457#endif 461#endif
458} 462}
459 463
@@ -855,39 +859,12 @@ static int __init ipip_fb_tunnel_init(struct net_device *dev)
855 return 0; 859 return 0;
856} 860}
857 861
858#ifdef CONFIG_INET_TUNNEL
859static struct xfrm_tunnel ipip_handler = { 862static struct xfrm_tunnel ipip_handler = {
860 .handler = ipip_rcv, 863 .handler = ipip_rcv,
861 .err_handler = ipip_err, 864 .err_handler = ipip_err,
865 .priority = 1,
862}; 866};
863 867
864static inline int ipip_register(void)
865{
866 return xfrm4_tunnel_register(&ipip_handler);
867}
868
869static inline int ipip_unregister(void)
870{
871 return xfrm4_tunnel_deregister(&ipip_handler);
872}
873#else
874static struct net_protocol ipip_protocol = {
875 .handler = ipip_rcv,
876 .err_handler = ipip_err,
877 .no_policy = 1,
878};
879
880static inline int ipip_register(void)
881{
882 return inet_add_protocol(&ipip_protocol, IPPROTO_IPIP);
883}
884
885static inline int ipip_unregister(void)
886{
887 return inet_del_protocol(&ipip_protocol, IPPROTO_IPIP);
888}
889#endif
890
891static char banner[] __initdata = 868static char banner[] __initdata =
892 KERN_INFO "IPv4 over IPv4 tunneling driver\n"; 869 KERN_INFO "IPv4 over IPv4 tunneling driver\n";
893 870
@@ -897,7 +874,7 @@ static int __init ipip_init(void)
897 874
898 printk(banner); 875 printk(banner);
899 876
900 if (ipip_register() < 0) { 877 if (xfrm4_tunnel_register(&ipip_handler)) {
901 printk(KERN_INFO "ipip init: can't register tunnel\n"); 878 printk(KERN_INFO "ipip init: can't register tunnel\n");
902 return -EAGAIN; 879 return -EAGAIN;
903 } 880 }
@@ -919,7 +896,7 @@ static int __init ipip_init(void)
919 err2: 896 err2:
920 free_netdev(ipip_fb_tunnel_dev); 897 free_netdev(ipip_fb_tunnel_dev);
921 err1: 898 err1:
922 ipip_unregister(); 899 xfrm4_tunnel_deregister(&ipip_handler);
923 goto out; 900 goto out;
924} 901}
925 902
@@ -939,7 +916,7 @@ static void __exit ipip_destroy_tunnels(void)
939 916
940static void __exit ipip_fini(void) 917static void __exit ipip_fini(void)
941{ 918{
942 if (ipip_unregister() < 0) 919 if (xfrm4_tunnel_deregister(&ipip_handler))
943 printk(KERN_INFO "ipip close: can't deregister tunnel\n"); 920 printk(KERN_INFO "ipip close: can't deregister tunnel\n");
944 921
945 rtnl_lock(); 922 rtnl_lock();
diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c
index ed42cdc57cd..b5ad9ac2fbc 100644
--- a/net/ipv4/netfilter.c
+++ b/net/ipv4/netfilter.c
@@ -167,15 +167,15 @@ static struct nf_queue_rerouter ip_reroute = {
167 .reroute = queue_reroute, 167 .reroute = queue_reroute,
168}; 168};
169 169
170static int init(void) 170static int ipv4_netfilter_init(void)
171{ 171{
172 return nf_register_queue_rerouter(PF_INET, &ip_reroute); 172 return nf_register_queue_rerouter(PF_INET, &ip_reroute);
173} 173}
174 174
175static void fini(void) 175static void ipv4_netfilter_fini(void)
176{ 176{
177 nf_unregister_queue_rerouter(PF_INET); 177 nf_unregister_queue_rerouter(PF_INET);
178} 178}
179 179
180module_init(init); 180module_init(ipv4_netfilter_init);
181module_exit(fini); 181module_exit(ipv4_netfilter_fini);
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
index ff0c594a419..a44a5d73457 100644
--- a/net/ipv4/netfilter/arp_tables.c
+++ b/net/ipv4/netfilter/arp_tables.c
@@ -1166,7 +1166,7 @@ static struct nf_sockopt_ops arpt_sockopts = {
1166 .get = do_arpt_get_ctl, 1166 .get = do_arpt_get_ctl,
1167}; 1167};
1168 1168
1169static int __init init(void) 1169static int __init arp_tables_init(void)
1170{ 1170{
1171 int ret; 1171 int ret;
1172 1172
@@ -1187,7 +1187,7 @@ static int __init init(void)
1187 return 0; 1187 return 0;
1188} 1188}
1189 1189
1190static void __exit fini(void) 1190static void __exit arp_tables_fini(void)
1191{ 1191{
1192 nf_unregister_sockopt(&arpt_sockopts); 1192 nf_unregister_sockopt(&arpt_sockopts);
1193 xt_proto_fini(NF_ARP); 1193 xt_proto_fini(NF_ARP);
@@ -1197,5 +1197,5 @@ EXPORT_SYMBOL(arpt_register_table);
1197EXPORT_SYMBOL(arpt_unregister_table); 1197EXPORT_SYMBOL(arpt_unregister_table);
1198EXPORT_SYMBOL(arpt_do_table); 1198EXPORT_SYMBOL(arpt_do_table);
1199 1199
1200module_init(init); 1200module_init(arp_tables_init);
1201module_exit(fini); 1201module_exit(arp_tables_fini);
diff --git a/net/ipv4/netfilter/arpt_mangle.c b/net/ipv4/netfilter/arpt_mangle.c
index 0f2a95350e2..a58325c1ceb 100644
--- a/net/ipv4/netfilter/arpt_mangle.c
+++ b/net/ipv4/netfilter/arpt_mangle.c
@@ -89,7 +89,7 @@ static struct arpt_target arpt_mangle_reg = {
89 .me = THIS_MODULE, 89 .me = THIS_MODULE,
90}; 90};
91 91
92static int __init init(void) 92static int __init arpt_mangle_init(void)
93{ 93{
94 if (arpt_register_target(&arpt_mangle_reg)) 94 if (arpt_register_target(&arpt_mangle_reg))
95 return -EINVAL; 95 return -EINVAL;
@@ -97,10 +97,10 @@ static int __init init(void)
97 return 0; 97 return 0;
98} 98}
99 99
100static void __exit fini(void) 100static void __exit arpt_mangle_fini(void)
101{ 101{
102 arpt_unregister_target(&arpt_mangle_reg); 102 arpt_unregister_target(&arpt_mangle_reg);
103} 103}
104 104
105module_init(init); 105module_init(arpt_mangle_init);
106module_exit(fini); 106module_exit(arpt_mangle_fini);
diff --git a/net/ipv4/netfilter/arptable_filter.c b/net/ipv4/netfilter/arptable_filter.c
index f6ab45f4868..d0d379c7df9 100644
--- a/net/ipv4/netfilter/arptable_filter.c
+++ b/net/ipv4/netfilter/arptable_filter.c
@@ -179,7 +179,7 @@ static struct nf_hook_ops arpt_ops[] = {
179 }, 179 },
180}; 180};
181 181
182static int __init init(void) 182static int __init arptable_filter_init(void)
183{ 183{
184 int ret, i; 184 int ret, i;
185 185
@@ -201,7 +201,7 @@ cleanup_hooks:
201 return ret; 201 return ret;
202} 202}
203 203
204static void __exit fini(void) 204static void __exit arptable_filter_fini(void)
205{ 205{
206 unsigned int i; 206 unsigned int i;
207 207
@@ -211,5 +211,5 @@ static void __exit fini(void)
211 arpt_unregister_table(&packet_filter); 211 arpt_unregister_table(&packet_filter);
212} 212}
213 213
214module_init(init); 214module_init(arptable_filter_init);
215module_exit(fini); 215module_exit(arptable_filter_fini);
diff --git a/net/ipv4/netfilter/ip_conntrack_amanda.c b/net/ipv4/netfilter/ip_conntrack_amanda.c
index 84e4f79b7ff..a604b1ccfda 100644
--- a/net/ipv4/netfilter/ip_conntrack_amanda.c
+++ b/net/ipv4/netfilter/ip_conntrack_amanda.c
@@ -153,13 +153,13 @@ static struct ip_conntrack_helper amanda_helper = {
153 }, 153 },
154}; 154};
155 155
156static void __exit fini(void) 156static void __exit ip_conntrack_amanda_fini(void)
157{ 157{
158 ip_conntrack_helper_unregister(&amanda_helper); 158 ip_conntrack_helper_unregister(&amanda_helper);
159 kfree(amanda_buffer); 159 kfree(amanda_buffer);
160} 160}
161 161
162static int __init init(void) 162static int __init ip_conntrack_amanda_init(void)
163{ 163{
164 int ret; 164 int ret;
165 165
@@ -177,5 +177,5 @@ static int __init init(void)
177 177
178} 178}
179 179
180module_init(init); 180module_init(ip_conntrack_amanda_init);
181module_exit(fini); 181module_exit(ip_conntrack_amanda_fini);
diff --git a/net/ipv4/netfilter/ip_conntrack_ftp.c b/net/ipv4/netfilter/ip_conntrack_ftp.c
index e627e585617..3e542bf28a9 100644
--- a/net/ipv4/netfilter/ip_conntrack_ftp.c
+++ b/net/ipv4/netfilter/ip_conntrack_ftp.c
@@ -453,7 +453,7 @@ static struct ip_conntrack_helper ftp[MAX_PORTS];
453static char ftp_names[MAX_PORTS][sizeof("ftp-65535")]; 453static char ftp_names[MAX_PORTS][sizeof("ftp-65535")];
454 454
455/* Not __exit: called from init() */ 455/* Not __exit: called from init() */
456static void fini(void) 456static void ip_conntrack_ftp_fini(void)
457{ 457{
458 int i; 458 int i;
459 for (i = 0; i < ports_c; i++) { 459 for (i = 0; i < ports_c; i++) {
@@ -465,7 +465,7 @@ static void fini(void)
465 kfree(ftp_buffer); 465 kfree(ftp_buffer);
466} 466}
467 467
468static int __init init(void) 468static int __init ip_conntrack_ftp_init(void)
469{ 469{
470 int i, ret; 470 int i, ret;
471 char *tmpname; 471 char *tmpname;
@@ -499,12 +499,12 @@ static int __init init(void)
499 ret = ip_conntrack_helper_register(&ftp[i]); 499 ret = ip_conntrack_helper_register(&ftp[i]);
500 500
501 if (ret) { 501 if (ret) {
502 fini(); 502 ip_conntrack_ftp_fini();
503 return ret; 503 return ret;
504 } 504 }
505 } 505 }
506 return 0; 506 return 0;
507} 507}
508 508
509module_init(init); 509module_init(ip_conntrack_ftp_init);
510module_exit(fini); 510module_exit(ip_conntrack_ftp_fini);
diff --git a/net/ipv4/netfilter/ip_conntrack_helper_pptp.c b/net/ipv4/netfilter/ip_conntrack_helper_pptp.c
index d716bba798f..7d3ba4302e9 100644
--- a/net/ipv4/netfilter/ip_conntrack_helper_pptp.c
+++ b/net/ipv4/netfilter/ip_conntrack_helper_pptp.c
@@ -766,7 +766,7 @@ extern void ip_ct_proto_gre_fini(void);
766extern int __init ip_ct_proto_gre_init(void); 766extern int __init ip_ct_proto_gre_init(void);
767 767
768/* ip_conntrack_pptp initialization */ 768/* ip_conntrack_pptp initialization */
769static int __init init(void) 769static int __init ip_conntrack_helper_pptp_init(void)
770{ 770{
771 int retcode; 771 int retcode;
772 772
@@ -786,15 +786,15 @@ static int __init init(void)
786 return 0; 786 return 0;
787} 787}
788 788
789static void __exit fini(void) 789static void __exit ip_conntrack_helper_pptp_fini(void)
790{ 790{
791 ip_conntrack_helper_unregister(&pptp); 791 ip_conntrack_helper_unregister(&pptp);
792 ip_ct_proto_gre_fini(); 792 ip_ct_proto_gre_fini();
793 printk("ip_conntrack_pptp version %s unloaded\n", IP_CT_PPTP_VERSION); 793 printk("ip_conntrack_pptp version %s unloaded\n", IP_CT_PPTP_VERSION);
794} 794}
795 795
796module_init(init); 796module_init(ip_conntrack_helper_pptp_init);
797module_exit(fini); 797module_exit(ip_conntrack_helper_pptp_fini);
798 798
799EXPORT_SYMBOL(ip_nat_pptp_hook_outbound); 799EXPORT_SYMBOL(ip_nat_pptp_hook_outbound);
800EXPORT_SYMBOL(ip_nat_pptp_hook_inbound); 800EXPORT_SYMBOL(ip_nat_pptp_hook_inbound);
diff --git a/net/ipv4/netfilter/ip_conntrack_irc.c b/net/ipv4/netfilter/ip_conntrack_irc.c
index c51a2cf71b4..a2ac5ce544b 100644
--- a/net/ipv4/netfilter/ip_conntrack_irc.c
+++ b/net/ipv4/netfilter/ip_conntrack_irc.c
@@ -242,9 +242,9 @@ static int help(struct sk_buff **pskb,
242static struct ip_conntrack_helper irc_helpers[MAX_PORTS]; 242static struct ip_conntrack_helper irc_helpers[MAX_PORTS];
243static char irc_names[MAX_PORTS][sizeof("irc-65535")]; 243static char irc_names[MAX_PORTS][sizeof("irc-65535")];
244 244
245static void fini(void); 245static void ip_conntrack_irc_fini(void);
246 246
247static int __init init(void) 247static int __init ip_conntrack_irc_init(void)
248{ 248{
249 int i, ret; 249 int i, ret;
250 struct ip_conntrack_helper *hlpr; 250 struct ip_conntrack_helper *hlpr;
@@ -288,7 +288,7 @@ static int __init init(void)
288 if (ret) { 288 if (ret) {
289 printk("ip_conntrack_irc: ERROR registering port %d\n", 289 printk("ip_conntrack_irc: ERROR registering port %d\n",
290 ports[i]); 290 ports[i]);
291 fini(); 291 ip_conntrack_irc_fini();
292 return -EBUSY; 292 return -EBUSY;
293 } 293 }
294 } 294 }
@@ -297,7 +297,7 @@ static int __init init(void)
297 297
298/* This function is intentionally _NOT_ defined as __exit, because 298/* This function is intentionally _NOT_ defined as __exit, because
299 * it is needed by the init function */ 299 * it is needed by the init function */
300static void fini(void) 300static void ip_conntrack_irc_fini(void)
301{ 301{
302 int i; 302 int i;
303 for (i = 0; i < ports_c; i++) { 303 for (i = 0; i < ports_c; i++) {
@@ -308,5 +308,5 @@ static void fini(void)
308 kfree(irc_buffer); 308 kfree(irc_buffer);
309} 309}
310 310
311module_init(init); 311module_init(ip_conntrack_irc_init);
312module_exit(fini); 312module_exit(ip_conntrack_irc_fini);
diff --git a/net/ipv4/netfilter/ip_conntrack_netbios_ns.c b/net/ipv4/netfilter/ip_conntrack_netbios_ns.c
index 4e68e16a261..a566a81325b 100644
--- a/net/ipv4/netfilter/ip_conntrack_netbios_ns.c
+++ b/net/ipv4/netfilter/ip_conntrack_netbios_ns.c
@@ -127,16 +127,16 @@ static struct ip_conntrack_helper helper = {
127 .help = help, 127 .help = help,
128}; 128};
129 129
130static int __init init(void) 130static int __init ip_conntrack_netbios_ns_init(void)
131{ 131{
132 helper.timeout = timeout; 132 helper.timeout = timeout;
133 return ip_conntrack_helper_register(&helper); 133 return ip_conntrack_helper_register(&helper);
134} 134}
135 135
136static void __exit fini(void) 136static void __exit ip_conntrack_netbios_ns_fini(void)
137{ 137{
138 ip_conntrack_helper_unregister(&helper); 138 ip_conntrack_helper_unregister(&helper);
139} 139}
140 140
141module_init(init); 141module_init(ip_conntrack_netbios_ns_init);
142module_exit(fini); 142module_exit(ip_conntrack_netbios_ns_fini);
diff --git a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c
index be602e8aeab..5259abd0fb4 100644
--- a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c
+++ b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c
@@ -609,7 +609,7 @@ static ctl_table ip_ct_net_table[] = {
609static struct ctl_table_header *ip_ct_sysctl_header; 609static struct ctl_table_header *ip_ct_sysctl_header;
610#endif 610#endif
611 611
612static int __init init(void) 612static int __init ip_conntrack_proto_sctp_init(void)
613{ 613{
614 int ret; 614 int ret;
615 615
@@ -640,7 +640,7 @@ static int __init init(void)
640 return ret; 640 return ret;
641} 641}
642 642
643static void __exit fini(void) 643static void __exit ip_conntrack_proto_sctp_fini(void)
644{ 644{
645 ip_conntrack_protocol_unregister(&ip_conntrack_protocol_sctp); 645 ip_conntrack_protocol_unregister(&ip_conntrack_protocol_sctp);
646#ifdef CONFIG_SYSCTL 646#ifdef CONFIG_SYSCTL
@@ -649,8 +649,8 @@ static void __exit fini(void)
649 DEBUGP("SCTP conntrack module unloaded\n"); 649 DEBUGP("SCTP conntrack module unloaded\n");
650} 650}
651 651
652module_init(init); 652module_init(ip_conntrack_proto_sctp_init);
653module_exit(fini); 653module_exit(ip_conntrack_proto_sctp_fini);
654 654
655MODULE_LICENSE("GPL"); 655MODULE_LICENSE("GPL");
656MODULE_AUTHOR("Kiran Kumar Immidi"); 656MODULE_AUTHOR("Kiran Kumar Immidi");
diff --git a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c
index 833fcb4be5e..52076026db3 100644
--- a/net/ipv4/netfilter/ip_conntrack_standalone.c
+++ b/net/ipv4/netfilter/ip_conntrack_standalone.c
@@ -929,18 +929,18 @@ void ip_conntrack_protocol_unregister(struct ip_conntrack_protocol *proto)
929 ip_ct_iterate_cleanup(kill_proto, &proto->proto); 929 ip_ct_iterate_cleanup(kill_proto, &proto->proto);
930} 930}
931 931
932static int __init init(void) 932static int __init ip_conntrack_standalone_init(void)
933{ 933{
934 return init_or_cleanup(1); 934 return init_or_cleanup(1);
935} 935}
936 936
937static void __exit fini(void) 937static void __exit ip_conntrack_standalone_fini(void)
938{ 938{
939 init_or_cleanup(0); 939 init_or_cleanup(0);
940} 940}
941 941
942module_init(init); 942module_init(ip_conntrack_standalone_init);
943module_exit(fini); 943module_exit(ip_conntrack_standalone_fini);
944 944
945/* Some modules need us, but don't depend directly on any symbol. 945/* Some modules need us, but don't depend directly on any symbol.
946 They should call this. */ 946 They should call this. */
diff --git a/net/ipv4/netfilter/ip_conntrack_tftp.c b/net/ipv4/netfilter/ip_conntrack_tftp.c
index 4ba4463cec2..7e33d3bed5e 100644
--- a/net/ipv4/netfilter/ip_conntrack_tftp.c
+++ b/net/ipv4/netfilter/ip_conntrack_tftp.c
@@ -103,7 +103,7 @@ static int tftp_help(struct sk_buff **pskb,
103static struct ip_conntrack_helper tftp[MAX_PORTS]; 103static struct ip_conntrack_helper tftp[MAX_PORTS];
104static char tftp_names[MAX_PORTS][sizeof("tftp-65535")]; 104static char tftp_names[MAX_PORTS][sizeof("tftp-65535")];
105 105
106static void fini(void) 106static void ip_conntrack_tftp_fini(void)
107{ 107{
108 int i; 108 int i;
109 109
@@ -114,7 +114,7 @@ static void fini(void)
114 } 114 }
115} 115}
116 116
117static int __init init(void) 117static int __init ip_conntrack_tftp_init(void)
118{ 118{
119 int i, ret; 119 int i, ret;
120 char *tmpname; 120 char *tmpname;
@@ -148,12 +148,12 @@ static int __init init(void)
148 if (ret) { 148 if (ret) {
149 printk("ERROR registering helper for port %d\n", 149 printk("ERROR registering helper for port %d\n",
150 ports[i]); 150 ports[i]);
151 fini(); 151 ip_conntrack_tftp_fini();
152 return(ret); 152 return(ret);
153 } 153 }
154 } 154 }
155 return(0); 155 return(0);
156} 156}
157 157
158module_init(init); 158module_init(ip_conntrack_tftp_init);
159module_exit(fini); 159module_exit(ip_conntrack_tftp_fini);
diff --git a/net/ipv4/netfilter/ip_nat_amanda.c b/net/ipv4/netfilter/ip_nat_amanda.c
index 706c8074f42..3a888715bbf 100644
--- a/net/ipv4/netfilter/ip_nat_amanda.c
+++ b/net/ipv4/netfilter/ip_nat_amanda.c
@@ -68,19 +68,19 @@ static unsigned int help(struct sk_buff **pskb,
68 return ret; 68 return ret;
69} 69}
70 70
71static void __exit fini(void) 71static void __exit ip_nat_amanda_fini(void)
72{ 72{
73 ip_nat_amanda_hook = NULL; 73 ip_nat_amanda_hook = NULL;
74 /* Make sure noone calls it, meanwhile. */ 74 /* Make sure noone calls it, meanwhile. */
75 synchronize_net(); 75 synchronize_net();
76} 76}
77 77
78static int __init init(void) 78static int __init ip_nat_amanda_init(void)
79{ 79{
80 BUG_ON(ip_nat_amanda_hook); 80 BUG_ON(ip_nat_amanda_hook);
81 ip_nat_amanda_hook = help; 81 ip_nat_amanda_hook = help;
82 return 0; 82 return 0;
83} 83}
84 84
85module_init(init); 85module_init(ip_nat_amanda_init);
86module_exit(fini); 86module_exit(ip_nat_amanda_fini);
diff --git a/net/ipv4/netfilter/ip_nat_ftp.c b/net/ipv4/netfilter/ip_nat_ftp.c
index b8daab3c64a..3328fc5c5f5 100644
--- a/net/ipv4/netfilter/ip_nat_ftp.c
+++ b/net/ipv4/netfilter/ip_nat_ftp.c
@@ -154,14 +154,14 @@ static unsigned int ip_nat_ftp(struct sk_buff **pskb,
154 return NF_ACCEPT; 154 return NF_ACCEPT;
155} 155}
156 156
157static void __exit fini(void) 157static void __exit ip_nat_ftp_fini(void)
158{ 158{
159 ip_nat_ftp_hook = NULL; 159 ip_nat_ftp_hook = NULL;
160 /* Make sure noone calls it, meanwhile. */ 160 /* Make sure noone calls it, meanwhile. */
161 synchronize_net(); 161 synchronize_net();
162} 162}
163 163
164static int __init init(void) 164static int __init ip_nat_ftp_init(void)
165{ 165{
166 BUG_ON(ip_nat_ftp_hook); 166 BUG_ON(ip_nat_ftp_hook);
167 ip_nat_ftp_hook = ip_nat_ftp; 167 ip_nat_ftp_hook = ip_nat_ftp;
@@ -177,5 +177,5 @@ static int warn_set(const char *val, struct kernel_param *kp)
177} 177}
178module_param_call(ports, warn_set, NULL, NULL, 0); 178module_param_call(ports, warn_set, NULL, NULL, 0);
179 179
180module_init(init); 180module_init(ip_nat_ftp_init);
181module_exit(fini); 181module_exit(ip_nat_ftp_fini);
diff --git a/net/ipv4/netfilter/ip_nat_helper_pptp.c b/net/ipv4/netfilter/ip_nat_helper_pptp.c
index b9c016c063b..f3977726ff0 100644
--- a/net/ipv4/netfilter/ip_nat_helper_pptp.c
+++ b/net/ipv4/netfilter/ip_nat_helper_pptp.c
@@ -370,7 +370,7 @@ pptp_inbound_pkt(struct sk_buff **pskb,
370extern int __init ip_nat_proto_gre_init(void); 370extern int __init ip_nat_proto_gre_init(void);
371extern void __exit ip_nat_proto_gre_fini(void); 371extern void __exit ip_nat_proto_gre_fini(void);
372 372
373static int __init init(void) 373static int __init ip_nat_helper_pptp_init(void)
374{ 374{
375 int ret; 375 int ret;
376 376
@@ -396,7 +396,7 @@ static int __init init(void)
396 return 0; 396 return 0;
397} 397}
398 398
399static void __exit fini(void) 399static void __exit ip_nat_helper_pptp_fini(void)
400{ 400{
401 DEBUGP("cleanup_module\n" ); 401 DEBUGP("cleanup_module\n" );
402 402
@@ -412,5 +412,5 @@ static void __exit fini(void)
412 printk("ip_nat_pptp version %s unloaded\n", IP_NAT_PPTP_VERSION); 412 printk("ip_nat_pptp version %s unloaded\n", IP_NAT_PPTP_VERSION);
413} 413}
414 414
415module_init(init); 415module_init(ip_nat_helper_pptp_init);
416module_exit(fini); 416module_exit(ip_nat_helper_pptp_fini);
diff --git a/net/ipv4/netfilter/ip_nat_irc.c b/net/ipv4/netfilter/ip_nat_irc.c
index 461c833eaca..a767123e082 100644
--- a/net/ipv4/netfilter/ip_nat_irc.c
+++ b/net/ipv4/netfilter/ip_nat_irc.c
@@ -96,14 +96,14 @@ static unsigned int help(struct sk_buff **pskb,
96 return ret; 96 return ret;
97} 97}
98 98
99static void __exit fini(void) 99static void __exit ip_nat_irc_fini(void)
100{ 100{
101 ip_nat_irc_hook = NULL; 101 ip_nat_irc_hook = NULL;
102 /* Make sure noone calls it, meanwhile. */ 102 /* Make sure noone calls it, meanwhile. */
103 synchronize_net(); 103 synchronize_net();
104} 104}
105 105
106static int __init init(void) 106static int __init ip_nat_irc_init(void)
107{ 107{
108 BUG_ON(ip_nat_irc_hook); 108 BUG_ON(ip_nat_irc_hook);
109 ip_nat_irc_hook = help; 109 ip_nat_irc_hook = help;
@@ -119,5 +119,5 @@ static int warn_set(const char *val, struct kernel_param *kp)
119} 119}
120module_param_call(ports, warn_set, NULL, NULL, 0); 120module_param_call(ports, warn_set, NULL, NULL, 0);
121 121
122module_init(init); 122module_init(ip_nat_irc_init);
123module_exit(fini); 123module_exit(ip_nat_irc_fini);
diff --git a/net/ipv4/netfilter/ip_nat_snmp_basic.c b/net/ipv4/netfilter/ip_nat_snmp_basic.c
index f029da2a60e..c6225384553 100644
--- a/net/ipv4/netfilter/ip_nat_snmp_basic.c
+++ b/net/ipv4/netfilter/ip_nat_snmp_basic.c
@@ -1324,7 +1324,7 @@ static struct ip_conntrack_helper snmp_trap_helper = {
1324 * 1324 *
1325 *****************************************************************************/ 1325 *****************************************************************************/
1326 1326
1327static int __init init(void) 1327static int __init ip_nat_snmp_basic_init(void)
1328{ 1328{
1329 int ret = 0; 1329 int ret = 0;
1330 1330
@@ -1339,13 +1339,13 @@ static int __init init(void)
1339 return ret; 1339 return ret;
1340} 1340}
1341 1341
1342static void __exit fini(void) 1342static void __exit ip_nat_snmp_basic_fini(void)
1343{ 1343{
1344 ip_conntrack_helper_unregister(&snmp_helper); 1344 ip_conntrack_helper_unregister(&snmp_helper);
1345 ip_conntrack_helper_unregister(&snmp_trap_helper); 1345 ip_conntrack_helper_unregister(&snmp_trap_helper);
1346} 1346}
1347 1347
1348module_init(init); 1348module_init(ip_nat_snmp_basic_init);
1349module_exit(fini); 1349module_exit(ip_nat_snmp_basic_fini);
1350 1350
1351module_param(debug, bool, 0600); 1351module_param(debug, bool, 0600);
diff --git a/net/ipv4/netfilter/ip_nat_standalone.c b/net/ipv4/netfilter/ip_nat_standalone.c
index 380aef3d786..3505b0de2e0 100644
--- a/net/ipv4/netfilter/ip_nat_standalone.c
+++ b/net/ipv4/netfilter/ip_nat_standalone.c
@@ -425,17 +425,17 @@ static int init_or_cleanup(int init)
425 return ret; 425 return ret;
426} 426}
427 427
428static int __init init(void) 428static int __init ip_nat_standalone_init(void)
429{ 429{
430 return init_or_cleanup(1); 430 return init_or_cleanup(1);
431} 431}
432 432
433static void __exit fini(void) 433static void __exit ip_nat_standalone_fini(void)
434{ 434{
435 init_or_cleanup(0); 435 init_or_cleanup(0);
436} 436}
437 437
438module_init(init); 438module_init(ip_nat_standalone_init);
439module_exit(fini); 439module_exit(ip_nat_standalone_fini);
440 440
441MODULE_LICENSE("GPL"); 441MODULE_LICENSE("GPL");
diff --git a/net/ipv4/netfilter/ip_nat_tftp.c b/net/ipv4/netfilter/ip_nat_tftp.c
index 43c3bd7c118..94a78015451 100644
--- a/net/ipv4/netfilter/ip_nat_tftp.c
+++ b/net/ipv4/netfilter/ip_nat_tftp.c
@@ -53,19 +53,19 @@ static unsigned int help(struct sk_buff **pskb,
53 return NF_ACCEPT; 53 return NF_ACCEPT;
54} 54}
55 55
56static void __exit fini(void) 56static void __exit ip_nat_tftp_fini(void)
57{ 57{
58 ip_nat_tftp_hook = NULL; 58 ip_nat_tftp_hook = NULL;
59 /* Make sure noone calls it, meanwhile. */ 59 /* Make sure noone calls it, meanwhile. */
60 synchronize_net(); 60 synchronize_net();
61} 61}
62 62
63static int __init init(void) 63static int __init ip_nat_tftp_init(void)
64{ 64{
65 BUG_ON(ip_nat_tftp_hook); 65 BUG_ON(ip_nat_tftp_hook);
66 ip_nat_tftp_hook = help; 66 ip_nat_tftp_hook = help;
67 return 0; 67 return 0;
68} 68}
69 69
70module_init(init); 70module_init(ip_nat_tftp_init);
71module_exit(fini); 71module_exit(ip_nat_tftp_fini);
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c
index 1655866c55b..896a244f8f9 100644
--- a/net/ipv4/netfilter/ip_queue.c
+++ b/net/ipv4/netfilter/ip_queue.c
@@ -717,13 +717,13 @@ cleanup_netlink_notifier:
717 return status; 717 return status;
718} 718}
719 719
720static int __init init(void) 720static int __init ip_queue_init(void)
721{ 721{
722 722
723 return init_or_cleanup(1); 723 return init_or_cleanup(1);
724} 724}
725 725
726static void __exit fini(void) 726static void __exit ip_queue_fini(void)
727{ 727{
728 init_or_cleanup(0); 728 init_or_cleanup(0);
729} 729}
@@ -732,5 +732,5 @@ MODULE_DESCRIPTION("IPv4 packet queue handler");
732MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>"); 732MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
733MODULE_LICENSE("GPL"); 733MODULE_LICENSE("GPL");
734 734
735module_init(init); 735module_init(ip_queue_init);
736module_exit(fini); 736module_exit(ip_queue_fini);
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
index a7b194c4d79..460fd905fad 100644
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
@@ -1364,7 +1364,7 @@ static struct ipt_match icmp_matchstruct = {
1364 .checkentry = icmp_checkentry, 1364 .checkentry = icmp_checkentry,
1365}; 1365};
1366 1366
1367static int __init init(void) 1367static int __init ip_tables_init(void)
1368{ 1368{
1369 int ret; 1369 int ret;
1370 1370
@@ -1386,7 +1386,7 @@ static int __init init(void)
1386 return 0; 1386 return 0;
1387} 1387}
1388 1388
1389static void __exit fini(void) 1389static void __exit ip_tables_fini(void)
1390{ 1390{
1391 nf_unregister_sockopt(&ipt_sockopts); 1391 nf_unregister_sockopt(&ipt_sockopts);
1392 1392
@@ -1400,5 +1400,5 @@ static void __exit fini(void)
1400EXPORT_SYMBOL(ipt_register_table); 1400EXPORT_SYMBOL(ipt_register_table);
1401EXPORT_SYMBOL(ipt_unregister_table); 1401EXPORT_SYMBOL(ipt_unregister_table);
1402EXPORT_SYMBOL(ipt_do_table); 1402EXPORT_SYMBOL(ipt_do_table);
1403module_init(init); 1403module_init(ip_tables_init);
1404module_exit(fini); 1404module_exit(ip_tables_fini);
diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c
index 61e11edcd6a..e4768a31718 100644
--- a/net/ipv4/netfilter/ipt_CLUSTERIP.c
+++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c
@@ -770,15 +770,15 @@ cleanup_none:
770 return -EINVAL; 770 return -EINVAL;
771} 771}
772 772
773static int __init init(void) 773static int __init ipt_clusterip_init(void)
774{ 774{
775 return init_or_cleanup(0); 775 return init_or_cleanup(0);
776} 776}
777 777
778static void __exit fini(void) 778static void __exit ipt_clusterip_fini(void)
779{ 779{
780 init_or_cleanup(1); 780 init_or_cleanup(1);
781} 781}
782 782
783module_init(init); 783module_init(ipt_clusterip_init);
784module_exit(fini); 784module_exit(ipt_clusterip_fini);
diff --git a/net/ipv4/netfilter/ipt_DSCP.c b/net/ipv4/netfilter/ipt_DSCP.c
index cfb0b90e598..c8e971288df 100644
--- a/net/ipv4/netfilter/ipt_DSCP.c
+++ b/net/ipv4/netfilter/ipt_DSCP.c
@@ -82,15 +82,15 @@ static struct ipt_target ipt_dscp_reg = {
82 .me = THIS_MODULE, 82 .me = THIS_MODULE,
83}; 83};
84 84
85static int __init init(void) 85static int __init ipt_dscp_init(void)
86{ 86{
87 return ipt_register_target(&ipt_dscp_reg); 87 return ipt_register_target(&ipt_dscp_reg);
88} 88}
89 89
90static void __exit fini(void) 90static void __exit ipt_dscp_fini(void)
91{ 91{
92 ipt_unregister_target(&ipt_dscp_reg); 92 ipt_unregister_target(&ipt_dscp_reg);
93} 93}
94 94
95module_init(init); 95module_init(ipt_dscp_init);
96module_exit(fini); 96module_exit(ipt_dscp_fini);
diff --git a/net/ipv4/netfilter/ipt_ECN.c b/net/ipv4/netfilter/ipt_ECN.c
index b9b80f90c84..4adf5c9d34f 100644
--- a/net/ipv4/netfilter/ipt_ECN.c
+++ b/net/ipv4/netfilter/ipt_ECN.c
@@ -151,15 +151,15 @@ static struct ipt_target ipt_ecn_reg = {
151 .me = THIS_MODULE, 151 .me = THIS_MODULE,
152}; 152};
153 153
154static int __init init(void) 154static int __init ipt_ecn_init(void)
155{ 155{
156 return ipt_register_target(&ipt_ecn_reg); 156 return ipt_register_target(&ipt_ecn_reg);
157} 157}
158 158
159static void __exit fini(void) 159static void __exit ipt_ecn_fini(void)
160{ 160{
161 ipt_unregister_target(&ipt_ecn_reg); 161 ipt_unregister_target(&ipt_ecn_reg);
162} 162}
163 163
164module_init(init); 164module_init(ipt_ecn_init);
165module_exit(fini); 165module_exit(ipt_ecn_fini);
diff --git a/net/ipv4/netfilter/ipt_LOG.c b/net/ipv4/netfilter/ipt_LOG.c
index 750d3221b28..39fd4c2a238 100644
--- a/net/ipv4/netfilter/ipt_LOG.c
+++ b/net/ipv4/netfilter/ipt_LOG.c
@@ -471,7 +471,7 @@ static struct nf_logger ipt_log_logger ={
471 .me = THIS_MODULE, 471 .me = THIS_MODULE,
472}; 472};
473 473
474static int __init init(void) 474static int __init ipt_log_init(void)
475{ 475{
476 if (ipt_register_target(&ipt_log_reg)) 476 if (ipt_register_target(&ipt_log_reg))
477 return -EINVAL; 477 return -EINVAL;
@@ -485,11 +485,11 @@ static int __init init(void)
485 return 0; 485 return 0;
486} 486}
487 487
488static void __exit fini(void) 488static void __exit ipt_log_fini(void)
489{ 489{
490 nf_log_unregister_logger(&ipt_log_logger); 490 nf_log_unregister_logger(&ipt_log_logger);
491 ipt_unregister_target(&ipt_log_reg); 491 ipt_unregister_target(&ipt_log_reg);
492} 492}
493 493
494module_init(init); 494module_init(ipt_log_init);
495module_exit(fini); 495module_exit(ipt_log_fini);
diff --git a/net/ipv4/netfilter/ipt_MASQUERADE.c b/net/ipv4/netfilter/ipt_MASQUERADE.c
index e0c321c3bae..8b3e7f99b86 100644
--- a/net/ipv4/netfilter/ipt_MASQUERADE.c
+++ b/net/ipv4/netfilter/ipt_MASQUERADE.c
@@ -175,7 +175,7 @@ static struct ipt_target masquerade = {
175 .me = THIS_MODULE, 175 .me = THIS_MODULE,
176}; 176};
177 177
178static int __init init(void) 178static int __init ipt_masquerade_init(void)
179{ 179{
180 int ret; 180 int ret;
181 181
@@ -191,12 +191,12 @@ static int __init init(void)
191 return ret; 191 return ret;
192} 192}
193 193
194static void __exit fini(void) 194static void __exit ipt_masquerade_fini(void)
195{ 195{
196 ipt_unregister_target(&masquerade); 196 ipt_unregister_target(&masquerade);
197 unregister_netdevice_notifier(&masq_dev_notifier); 197 unregister_netdevice_notifier(&masq_dev_notifier);
198 unregister_inetaddr_notifier(&masq_inet_notifier); 198 unregister_inetaddr_notifier(&masq_inet_notifier);
199} 199}
200 200
201module_init(init); 201module_init(ipt_masquerade_init);
202module_exit(fini); 202module_exit(ipt_masquerade_fini);
diff --git a/net/ipv4/netfilter/ipt_NETMAP.c b/net/ipv4/netfilter/ipt_NETMAP.c
index fba181c2a42..2fcf1075b02 100644
--- a/net/ipv4/netfilter/ipt_NETMAP.c
+++ b/net/ipv4/netfilter/ipt_NETMAP.c
@@ -98,15 +98,15 @@ static struct ipt_target target_module = {
98 .me = THIS_MODULE 98 .me = THIS_MODULE
99}; 99};
100 100
101static int __init init(void) 101static int __init ipt_netmap_init(void)
102{ 102{
103 return ipt_register_target(&target_module); 103 return ipt_register_target(&target_module);
104} 104}
105 105
106static void __exit fini(void) 106static void __exit ipt_netmap_fini(void)
107{ 107{
108 ipt_unregister_target(&target_module); 108 ipt_unregister_target(&target_module);
109} 109}
110 110
111module_init(init); 111module_init(ipt_netmap_init);
112module_exit(fini); 112module_exit(ipt_netmap_fini);
diff --git a/net/ipv4/netfilter/ipt_REDIRECT.c b/net/ipv4/netfilter/ipt_REDIRECT.c
index be3da7c4b87..f290463232d 100644
--- a/net/ipv4/netfilter/ipt_REDIRECT.c
+++ b/net/ipv4/netfilter/ipt_REDIRECT.c
@@ -112,15 +112,15 @@ static struct ipt_target redirect_reg = {
112 .me = THIS_MODULE, 112 .me = THIS_MODULE,
113}; 113};
114 114
115static int __init init(void) 115static int __init ipt_redirect_init(void)
116{ 116{
117 return ipt_register_target(&redirect_reg); 117 return ipt_register_target(&redirect_reg);
118} 118}
119 119
120static void __exit fini(void) 120static void __exit ipt_redirect_fini(void)
121{ 121{
122 ipt_unregister_target(&redirect_reg); 122 ipt_unregister_target(&redirect_reg);
123} 123}
124 124
125module_init(init); 125module_init(ipt_redirect_init);
126module_exit(fini); 126module_exit(ipt_redirect_fini);
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c
index 9d3b3579f27..4269a5440d4 100644
--- a/net/ipv4/netfilter/ipt_REJECT.c
+++ b/net/ipv4/netfilter/ipt_REJECT.c
@@ -313,15 +313,15 @@ static struct ipt_target ipt_reject_reg = {
313 .me = THIS_MODULE, 313 .me = THIS_MODULE,
314}; 314};
315 315
316static int __init init(void) 316static int __init ipt_reject_init(void)
317{ 317{
318 return ipt_register_target(&ipt_reject_reg); 318 return ipt_register_target(&ipt_reject_reg);
319} 319}
320 320
321static void __exit fini(void) 321static void __exit ipt_reject_fini(void)
322{ 322{
323 ipt_unregister_target(&ipt_reject_reg); 323 ipt_unregister_target(&ipt_reject_reg);
324} 324}
325 325
326module_init(init); 326module_init(ipt_reject_init);
327module_exit(fini); 327module_exit(ipt_reject_fini);
diff --git a/net/ipv4/netfilter/ipt_SAME.c b/net/ipv4/netfilter/ipt_SAME.c
index 7e2ebc9d945..7169b09b5a6 100644
--- a/net/ipv4/netfilter/ipt_SAME.c
+++ b/net/ipv4/netfilter/ipt_SAME.c
@@ -189,16 +189,16 @@ static struct ipt_target same_reg = {
189 .me = THIS_MODULE, 189 .me = THIS_MODULE,
190}; 190};
191 191
192static int __init init(void) 192static int __init ipt_same_init(void)
193{ 193{
194 return ipt_register_target(&same_reg); 194 return ipt_register_target(&same_reg);
195} 195}
196 196
197static void __exit fini(void) 197static void __exit ipt_same_fini(void)
198{ 198{
199 ipt_unregister_target(&same_reg); 199 ipt_unregister_target(&same_reg);
200} 200}
201 201
202module_init(init); 202module_init(ipt_same_init);
203module_exit(fini); 203module_exit(ipt_same_fini);
204 204
diff --git a/net/ipv4/netfilter/ipt_TCPMSS.c b/net/ipv4/netfilter/ipt_TCPMSS.c
index c4fc50ec2dd..ef2fe5b3f0d 100644
--- a/net/ipv4/netfilter/ipt_TCPMSS.c
+++ b/net/ipv4/netfilter/ipt_TCPMSS.c
@@ -243,15 +243,15 @@ static struct ipt_target ipt_tcpmss_reg = {
243 .me = THIS_MODULE, 243 .me = THIS_MODULE,
244}; 244};
245 245
246static int __init init(void) 246static int __init ipt_tcpmss_init(void)
247{ 247{
248 return ipt_register_target(&ipt_tcpmss_reg); 248 return ipt_register_target(&ipt_tcpmss_reg);
249} 249}
250 250
251static void __exit fini(void) 251static void __exit ipt_tcpmss_fini(void)
252{ 252{
253 ipt_unregister_target(&ipt_tcpmss_reg); 253 ipt_unregister_target(&ipt_tcpmss_reg);
254} 254}
255 255
256module_init(init); 256module_init(ipt_tcpmss_init);
257module_exit(fini); 257module_exit(ipt_tcpmss_fini);
diff --git a/net/ipv4/netfilter/ipt_TOS.c b/net/ipv4/netfilter/ipt_TOS.c
index 9aa7817657f..1c7a5ca399b 100644
--- a/net/ipv4/netfilter/ipt_TOS.c
+++ b/net/ipv4/netfilter/ipt_TOS.c
@@ -81,15 +81,15 @@ static struct ipt_target ipt_tos_reg = {
81 .me = THIS_MODULE, 81 .me = THIS_MODULE,
82}; 82};
83 83
84static int __init init(void) 84static int __init ipt_tos_init(void)
85{ 85{
86 return ipt_register_target(&ipt_tos_reg); 86 return ipt_register_target(&ipt_tos_reg);
87} 87}
88 88
89static void __exit fini(void) 89static void __exit ipt_tos_fini(void)
90{ 90{
91 ipt_unregister_target(&ipt_tos_reg); 91 ipt_unregister_target(&ipt_tos_reg);
92} 92}
93 93
94module_init(init); 94module_init(ipt_tos_init);
95module_exit(fini); 95module_exit(ipt_tos_fini);
diff --git a/net/ipv4/netfilter/ipt_TTL.c b/net/ipv4/netfilter/ipt_TTL.c
index 5009a003d57..f48892ae0be 100644
--- a/net/ipv4/netfilter/ipt_TTL.c
+++ b/net/ipv4/netfilter/ipt_TTL.c
@@ -94,15 +94,15 @@ static struct ipt_target ipt_TTL = {
94 .me = THIS_MODULE, 94 .me = THIS_MODULE,
95}; 95};
96 96
97static int __init init(void) 97static int __init ipt_ttl_init(void)
98{ 98{
99 return ipt_register_target(&ipt_TTL); 99 return ipt_register_target(&ipt_TTL);
100} 100}
101 101
102static void __exit fini(void) 102static void __exit ipt_ttl_fini(void)
103{ 103{
104 ipt_unregister_target(&ipt_TTL); 104 ipt_unregister_target(&ipt_TTL);
105} 105}
106 106
107module_init(init); 107module_init(ipt_ttl_init);
108module_exit(fini); 108module_exit(ipt_ttl_fini);
diff --git a/net/ipv4/netfilter/ipt_ULOG.c b/net/ipv4/netfilter/ipt_ULOG.c
index a82a32ed0e2..c84cc03389d 100644
--- a/net/ipv4/netfilter/ipt_ULOG.c
+++ b/net/ipv4/netfilter/ipt_ULOG.c
@@ -374,7 +374,7 @@ static struct nf_logger ipt_ulog_logger = {
374 .me = THIS_MODULE, 374 .me = THIS_MODULE,
375}; 375};
376 376
377static int __init init(void) 377static int __init ipt_ulog_init(void)
378{ 378{
379 int i; 379 int i;
380 380
@@ -407,7 +407,7 @@ static int __init init(void)
407 return 0; 407 return 0;
408} 408}
409 409
410static void __exit fini(void) 410static void __exit ipt_ulog_fini(void)
411{ 411{
412 ulog_buff_t *ub; 412 ulog_buff_t *ub;
413 int i; 413 int i;
@@ -435,5 +435,5 @@ static void __exit fini(void)
435 435
436} 436}
437 437
438module_init(init); 438module_init(ipt_ulog_init);
439module_exit(fini); 439module_exit(ipt_ulog_fini);
diff --git a/net/ipv4/netfilter/ipt_addrtype.c b/net/ipv4/netfilter/ipt_addrtype.c
index 5fdf85d0efc..893dae210b0 100644
--- a/net/ipv4/netfilter/ipt_addrtype.c
+++ b/net/ipv4/netfilter/ipt_addrtype.c
@@ -51,15 +51,15 @@ static struct ipt_match addrtype_match = {
51 .me = THIS_MODULE 51 .me = THIS_MODULE
52}; 52};
53 53
54static int __init init(void) 54static int __init ipt_addrtype_init(void)
55{ 55{
56 return ipt_register_match(&addrtype_match); 56 return ipt_register_match(&addrtype_match);
57} 57}
58 58
59static void __exit fini(void) 59static void __exit ipt_addrtype_fini(void)
60{ 60{
61 ipt_unregister_match(&addrtype_match); 61 ipt_unregister_match(&addrtype_match);
62} 62}
63 63
64module_init(init); 64module_init(ipt_addrtype_init);
65module_exit(fini); 65module_exit(ipt_addrtype_fini);
diff --git a/net/ipv4/netfilter/ipt_ah.c b/net/ipv4/netfilter/ipt_ah.c
index 35a21fb1f8e..2927135873d 100644
--- a/net/ipv4/netfilter/ipt_ah.c
+++ b/net/ipv4/netfilter/ipt_ah.c
@@ -96,15 +96,15 @@ static struct ipt_match ah_match = {
96 .me = THIS_MODULE, 96 .me = THIS_MODULE,
97}; 97};
98 98
99static int __init init(void) 99static int __init ipt_ah_init(void)
100{ 100{
101 return ipt_register_match(&ah_match); 101 return ipt_register_match(&ah_match);
102} 102}
103 103
104static void __exit cleanup(void) 104static void __exit ipt_ah_fini(void)
105{ 105{
106 ipt_unregister_match(&ah_match); 106 ipt_unregister_match(&ah_match);
107} 107}
108 108
109module_init(init); 109module_init(ipt_ah_init);
110module_exit(cleanup); 110module_exit(ipt_ah_fini);
diff --git a/net/ipv4/netfilter/ipt_dscp.c b/net/ipv4/netfilter/ipt_dscp.c
index 11963c385de..47177591aeb 100644
--- a/net/ipv4/netfilter/ipt_dscp.c
+++ b/net/ipv4/netfilter/ipt_dscp.c
@@ -39,16 +39,16 @@ static struct ipt_match dscp_match = {
39 .me = THIS_MODULE, 39 .me = THIS_MODULE,
40}; 40};
41 41
42static int __init init(void) 42static int __init ipt_dscp_init(void)
43{ 43{
44 return ipt_register_match(&dscp_match); 44 return ipt_register_match(&dscp_match);
45} 45}
46 46
47static void __exit fini(void) 47static void __exit ipt_dscp_fini(void)
48{ 48{
49 ipt_unregister_match(&dscp_match); 49 ipt_unregister_match(&dscp_match);
50 50
51} 51}
52 52
53module_init(init); 53module_init(ipt_dscp_init);
54module_exit(fini); 54module_exit(ipt_dscp_fini);
diff --git a/net/ipv4/netfilter/ipt_ecn.c b/net/ipv4/netfilter/ipt_ecn.c
index d7e29f6a38d..b2825041493 100644
--- a/net/ipv4/netfilter/ipt_ecn.c
+++ b/net/ipv4/netfilter/ipt_ecn.c
@@ -118,15 +118,15 @@ static struct ipt_match ecn_match = {
118 .me = THIS_MODULE, 118 .me = THIS_MODULE,
119}; 119};
120 120
121static int __init init(void) 121static int __init ipt_ecn_init(void)
122{ 122{
123 return ipt_register_match(&ecn_match); 123 return ipt_register_match(&ecn_match);
124} 124}
125 125
126static void __exit fini(void) 126static void __exit ipt_ecn_fini(void)
127{ 127{
128 ipt_unregister_match(&ecn_match); 128 ipt_unregister_match(&ecn_match);
129} 129}
130 130
131module_init(init); 131module_init(ipt_ecn_init);
132module_exit(fini); 132module_exit(ipt_ecn_fini);
diff --git a/net/ipv4/netfilter/ipt_esp.c b/net/ipv4/netfilter/ipt_esp.c
index af0d5ec79cb..3840b417a3c 100644
--- a/net/ipv4/netfilter/ipt_esp.c
+++ b/net/ipv4/netfilter/ipt_esp.c
@@ -97,15 +97,15 @@ static struct ipt_match esp_match = {
97 .me = THIS_MODULE, 97 .me = THIS_MODULE,
98}; 98};
99 99
100static int __init init(void) 100static int __init ipt_esp_init(void)
101{ 101{
102 return ipt_register_match(&esp_match); 102 return ipt_register_match(&esp_match);
103} 103}
104 104
105static void __exit cleanup(void) 105static void __exit ipt_esp_fini(void)
106{ 106{
107 ipt_unregister_match(&esp_match); 107 ipt_unregister_match(&esp_match);
108} 108}
109 109
110module_init(init); 110module_init(ipt_esp_init);
111module_exit(cleanup); 111module_exit(ipt_esp_fini);
diff --git a/net/ipv4/netfilter/ipt_hashlimit.c b/net/ipv4/netfilter/ipt_hashlimit.c
index ba5e23505e8..7c6836c4646 100644
--- a/net/ipv4/netfilter/ipt_hashlimit.c
+++ b/net/ipv4/netfilter/ipt_hashlimit.c
@@ -719,15 +719,15 @@ cleanup_nothing:
719 719
720} 720}
721 721
722static int __init init(void) 722static int __init ipt_hashlimit_init(void)
723{ 723{
724 return init_or_fini(0); 724 return init_or_fini(0);
725} 725}
726 726
727static void __exit fini(void) 727static void __exit ipt_hashlimit_fini(void)
728{ 728{
729 init_or_fini(1); 729 init_or_fini(1);
730} 730}
731 731
732module_init(init); 732module_init(ipt_hashlimit_init);
733module_exit(fini); 733module_exit(ipt_hashlimit_fini);
diff --git a/net/ipv4/netfilter/ipt_iprange.c b/net/ipv4/netfilter/ipt_iprange.c
index ae70112f5e0..5202edd8d33 100644
--- a/net/ipv4/netfilter/ipt_iprange.c
+++ b/net/ipv4/netfilter/ipt_iprange.c
@@ -71,15 +71,15 @@ static struct ipt_match iprange_match = {
71 .me = THIS_MODULE 71 .me = THIS_MODULE
72}; 72};
73 73
74static int __init init(void) 74static int __init ipt_iprange_init(void)
75{ 75{
76 return ipt_register_match(&iprange_match); 76 return ipt_register_match(&iprange_match);
77} 77}
78 78
79static void __exit fini(void) 79static void __exit ipt_iprange_fini(void)
80{ 80{
81 ipt_unregister_match(&iprange_match); 81 ipt_unregister_match(&iprange_match);
82} 82}
83 83
84module_init(init); 84module_init(ipt_iprange_init);
85module_exit(fini); 85module_exit(ipt_iprange_fini);
diff --git a/net/ipv4/netfilter/ipt_multiport.c b/net/ipv4/netfilter/ipt_multiport.c
index bd07f7c5387..ac95d8390bc 100644
--- a/net/ipv4/netfilter/ipt_multiport.c
+++ b/net/ipv4/netfilter/ipt_multiport.c
@@ -171,7 +171,7 @@ static struct ipt_match multiport_match_v1 = {
171 .me = THIS_MODULE, 171 .me = THIS_MODULE,
172}; 172};
173 173
174static int __init init(void) 174static int __init ipt_multiport_init(void)
175{ 175{
176 int err; 176 int err;
177 177
@@ -185,11 +185,11 @@ static int __init init(void)
185 return err; 185 return err;
186} 186}
187 187
188static void __exit fini(void) 188static void __exit ipt_multiport_fini(void)
189{ 189{
190 ipt_unregister_match(&multiport_match); 190 ipt_unregister_match(&multiport_match);
191 ipt_unregister_match(&multiport_match_v1); 191 ipt_unregister_match(&multiport_match_v1);
192} 192}
193 193
194module_init(init); 194module_init(ipt_multiport_init);
195module_exit(fini); 195module_exit(ipt_multiport_fini);
diff --git a/net/ipv4/netfilter/ipt_owner.c b/net/ipv4/netfilter/ipt_owner.c
index 3900428771f..5ac6ac023b5 100644
--- a/net/ipv4/netfilter/ipt_owner.c
+++ b/net/ipv4/netfilter/ipt_owner.c
@@ -78,15 +78,15 @@ static struct ipt_match owner_match = {
78 .me = THIS_MODULE, 78 .me = THIS_MODULE,
79}; 79};
80 80
81static int __init init(void) 81static int __init ipt_owner_init(void)
82{ 82{
83 return ipt_register_match(&owner_match); 83 return ipt_register_match(&owner_match);
84} 84}
85 85
86static void __exit fini(void) 86static void __exit ipt_owner_fini(void)
87{ 87{
88 ipt_unregister_match(&owner_match); 88 ipt_unregister_match(&owner_match);
89} 89}
90 90
91module_init(init); 91module_init(ipt_owner_init);
92module_exit(fini); 92module_exit(ipt_owner_fini);
diff --git a/net/ipv4/netfilter/ipt_recent.c b/net/ipv4/netfilter/ipt_recent.c
index 06792ead1da..14384328570 100644
--- a/net/ipv4/netfilter/ipt_recent.c
+++ b/net/ipv4/netfilter/ipt_recent.c
@@ -962,7 +962,7 @@ static struct ipt_match recent_match = {
962}; 962};
963 963
964/* Kernel module initialization. */ 964/* Kernel module initialization. */
965static int __init init(void) 965static int __init ipt_recent_init(void)
966{ 966{
967 int err, count; 967 int err, count;
968 968
@@ -995,7 +995,7 @@ static int __init init(void)
995} 995}
996 996
997/* Kernel module destruction. */ 997/* Kernel module destruction. */
998static void __exit fini(void) 998static void __exit ipt_recent_fini(void)
999{ 999{
1000 ipt_unregister_match(&recent_match); 1000 ipt_unregister_match(&recent_match);
1001 1001
@@ -1003,5 +1003,5 @@ static void __exit fini(void)
1003} 1003}
1004 1004
1005/* Register our module with the kernel. */ 1005/* Register our module with the kernel. */
1006module_init(init); 1006module_init(ipt_recent_init);
1007module_exit(fini); 1007module_exit(ipt_recent_fini);
diff --git a/net/ipv4/netfilter/ipt_tos.c b/net/ipv4/netfilter/ipt_tos.c
index e404e92ddd0..5549c39c785 100644
--- a/net/ipv4/netfilter/ipt_tos.c
+++ b/net/ipv4/netfilter/ipt_tos.c
@@ -39,15 +39,15 @@ static struct ipt_match tos_match = {
39 .me = THIS_MODULE, 39 .me = THIS_MODULE,
40}; 40};
41 41
42static int __init init(void) 42static int __init ipt_multiport_init(void)
43{ 43{
44 return ipt_register_match(&tos_match); 44 return ipt_register_match(&tos_match);
45} 45}
46 46
47static void __exit fini(void) 47static void __exit ipt_multiport_fini(void)
48{ 48{
49 ipt_unregister_match(&tos_match); 49 ipt_unregister_match(&tos_match);
50} 50}
51 51
52module_init(init); 52module_init(ipt_multiport_init);
53module_exit(fini); 53module_exit(ipt_multiport_fini);
diff --git a/net/ipv4/netfilter/ipt_ttl.c b/net/ipv4/netfilter/ipt_ttl.c
index ae7ce4d8d90..a5243bdb87d 100644
--- a/net/ipv4/netfilter/ipt_ttl.c
+++ b/net/ipv4/netfilter/ipt_ttl.c
@@ -55,16 +55,16 @@ static struct ipt_match ttl_match = {
55 .me = THIS_MODULE, 55 .me = THIS_MODULE,
56}; 56};
57 57
58static int __init init(void) 58static int __init ipt_ttl_init(void)
59{ 59{
60 return ipt_register_match(&ttl_match); 60 return ipt_register_match(&ttl_match);
61} 61}
62 62
63static void __exit fini(void) 63static void __exit ipt_ttl_fini(void)
64{ 64{
65 ipt_unregister_match(&ttl_match); 65 ipt_unregister_match(&ttl_match);
66 66
67} 67}
68 68
69module_init(init); 69module_init(ipt_ttl_init);
70module_exit(fini); 70module_exit(ipt_ttl_fini);
diff --git a/net/ipv4/netfilter/iptable_filter.c b/net/ipv4/netfilter/iptable_filter.c
index 212a3079085..3d80aefe9cf 100644
--- a/net/ipv4/netfilter/iptable_filter.c
+++ b/net/ipv4/netfilter/iptable_filter.c
@@ -139,7 +139,7 @@ static struct nf_hook_ops ipt_ops[] = {
139static int forward = NF_ACCEPT; 139static int forward = NF_ACCEPT;
140module_param(forward, bool, 0000); 140module_param(forward, bool, 0000);
141 141
142static int __init init(void) 142static int __init iptable_filter_init(void)
143{ 143{
144 int ret; 144 int ret;
145 145
@@ -181,7 +181,7 @@ static int __init init(void)
181 return ret; 181 return ret;
182} 182}
183 183
184static void __exit fini(void) 184static void __exit iptable_filter_fini(void)
185{ 185{
186 unsigned int i; 186 unsigned int i;
187 187
@@ -191,5 +191,5 @@ static void __exit fini(void)
191 ipt_unregister_table(&packet_filter); 191 ipt_unregister_table(&packet_filter);
192} 192}
193 193
194module_init(init); 194module_init(iptable_filter_init);
195module_exit(fini); 195module_exit(iptable_filter_fini);
diff --git a/net/ipv4/netfilter/iptable_mangle.c b/net/ipv4/netfilter/iptable_mangle.c
index 3212a5cc4b6..412fc96cc89 100644
--- a/net/ipv4/netfilter/iptable_mangle.c
+++ b/net/ipv4/netfilter/iptable_mangle.c
@@ -201,7 +201,7 @@ static struct nf_hook_ops ipt_ops[] = {
201 }, 201 },
202}; 202};
203 203
204static int __init init(void) 204static int __init iptable_mangle_init(void)
205{ 205{
206 int ret; 206 int ret;
207 207
@@ -247,7 +247,7 @@ static int __init init(void)
247 return ret; 247 return ret;
248} 248}
249 249
250static void __exit fini(void) 250static void __exit iptable_mangle_fini(void)
251{ 251{
252 unsigned int i; 252 unsigned int i;
253 253
@@ -257,5 +257,5 @@ static void __exit fini(void)
257 ipt_unregister_table(&packet_mangler); 257 ipt_unregister_table(&packet_mangler);
258} 258}
259 259
260module_init(init); 260module_init(iptable_mangle_init);
261module_exit(fini); 261module_exit(iptable_mangle_fini);
diff --git a/net/ipv4/netfilter/iptable_raw.c b/net/ipv4/netfilter/iptable_raw.c
index fdb9e9c81e8..03cc79a6160 100644
--- a/net/ipv4/netfilter/iptable_raw.c
+++ b/net/ipv4/netfilter/iptable_raw.c
@@ -116,7 +116,7 @@ static struct nf_hook_ops ipt_ops[] = {
116 }, 116 },
117}; 117};
118 118
119static int __init init(void) 119static int __init iptable_raw_init(void)
120{ 120{
121 int ret; 121 int ret;
122 122
@@ -144,7 +144,7 @@ static int __init init(void)
144 return ret; 144 return ret;
145} 145}
146 146
147static void __exit fini(void) 147static void __exit iptable_raw_fini(void)
148{ 148{
149 unsigned int i; 149 unsigned int i;
150 150
@@ -154,6 +154,6 @@ static void __exit fini(void)
154 ipt_unregister_table(&packet_raw); 154 ipt_unregister_table(&packet_raw);
155} 155}
156 156
157module_init(init); 157module_init(iptable_raw_init);
158module_exit(fini); 158module_exit(iptable_raw_fini);
159MODULE_LICENSE("GPL"); 159MODULE_LICENSE("GPL");
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
index c8abc9d859b..4afbc699d3b 100644
--- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
+++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
@@ -571,18 +571,18 @@ static int init_or_cleanup(int init)
571MODULE_ALIAS("nf_conntrack-" __stringify(AF_INET)); 571MODULE_ALIAS("nf_conntrack-" __stringify(AF_INET));
572MODULE_LICENSE("GPL"); 572MODULE_LICENSE("GPL");
573 573
574static int __init init(void) 574static int __init nf_conntrack_l3proto_ipv4_init(void)
575{ 575{
576 need_conntrack(); 576 need_conntrack();
577 return init_or_cleanup(1); 577 return init_or_cleanup(1);
578} 578}
579 579
580static void __exit fini(void) 580static void __exit nf_conntrack_l3proto_ipv4_fini(void)
581{ 581{
582 init_or_cleanup(0); 582 init_or_cleanup(0);
583} 583}
584 584
585module_init(init); 585module_init(nf_conntrack_l3proto_ipv4_init);
586module_exit(fini); 586module_exit(nf_conntrack_l3proto_ipv4_fini);
587 587
588EXPORT_SYMBOL(nf_ct_ipv4_gather_frags); 588EXPORT_SYMBOL(nf_ct_ipv4_gather_frags);
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c
index e688c687d62..91c2f41c7f5 100644
--- a/net/ipv4/tcp_cong.c
+++ b/net/ipv4/tcp_cong.c
@@ -223,7 +223,7 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 rtt, u32 in_flight,
223 223
224 /* In dangerous area, increase slowly. */ 224 /* In dangerous area, increase slowly. */
225 else if (sysctl_tcp_abc) { 225 else if (sysctl_tcp_abc) {
226 /* RFC3465: Apppriate Byte Count 226 /* RFC3465: Appropriate Byte Count
227 * increase once for each full cwnd acked 227 * increase once for each full cwnd acked
228 */ 228 */
229 if (tp->bytes_acked >= tp->snd_cwnd*tp->mss_cache) { 229 if (tp->bytes_acked >= tp->snd_cwnd*tp->mss_cache) {
diff --git a/net/ipv4/tunnel4.c b/net/ipv4/tunnel4.c
new file mode 100644
index 00000000000..0d7d386dac2
--- /dev/null
+++ b/net/ipv4/tunnel4.c
@@ -0,0 +1,113 @@
1/* tunnel4.c: Generic IP tunnel transformer.
2 *
3 * Copyright (C) 2003 David S. Miller (davem@redhat.com)
4 */
5
6#include <linux/init.h>
7#include <linux/module.h>
8#include <linux/mutex.h>
9#include <linux/netdevice.h>
10#include <linux/skbuff.h>
11#include <net/protocol.h>
12#include <net/xfrm.h>
13
14static struct xfrm_tunnel *tunnel4_handlers;
15static DEFINE_MUTEX(tunnel4_mutex);
16
17int xfrm4_tunnel_register(struct xfrm_tunnel *handler)
18{
19 struct xfrm_tunnel **pprev;
20 int ret = -EEXIST;
21 int priority = handler->priority;
22
23 mutex_lock(&tunnel4_mutex);
24
25 for (pprev = &tunnel4_handlers; *pprev; pprev = &(*pprev)->next) {
26 if ((*pprev)->priority > priority)
27 break;
28 if ((*pprev)->priority == priority)
29 goto err;
30 }
31
32 handler->next = *pprev;
33 *pprev = handler;
34
35 ret = 0;
36
37err:
38 mutex_unlock(&tunnel4_mutex);
39
40 return ret;
41}
42
43EXPORT_SYMBOL(xfrm4_tunnel_register);
44
45int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler)
46{
47 struct xfrm_tunnel **pprev;
48 int ret = -ENOENT;
49
50 mutex_lock(&tunnel4_mutex);
51
52 for (pprev = &tunnel4_handlers; *pprev; pprev = &(*pprev)->next) {
53 if (*pprev == handler) {
54 *pprev = handler->next;
55 ret = 0;
56 break;
57 }
58 }
59
60 mutex_unlock(&tunnel4_mutex);
61
62 synchronize_net();
63
64 return ret;
65}
66
67EXPORT_SYMBOL(xfrm4_tunnel_deregister);
68
69static int tunnel4_rcv(struct sk_buff *skb)
70{
71 struct xfrm_tunnel *handler;
72
73 for (handler = tunnel4_handlers; handler; handler = handler->next)
74 if (!handler->handler(skb))
75 return 0;
76
77 kfree_skb(skb);
78 return 0;
79}
80
81static void tunnel4_err(struct sk_buff *skb, u32 info)
82{
83 struct xfrm_tunnel *handler;
84
85 for (handler = tunnel4_handlers; handler; handler = handler->next)
86 if (!handler->err_handler(skb, info))
87 break;
88}
89
90static struct net_protocol tunnel4_protocol = {
91 .handler = tunnel4_rcv,
92 .err_handler = tunnel4_err,
93 .no_policy = 1,
94};
95
96static int __init tunnel4_init(void)
97{
98 if (inet_add_protocol(&tunnel4_protocol, IPPROTO_IPIP)) {
99 printk(KERN_ERR "tunnel4 init: can't add protocol\n");
100 return -EAGAIN;
101 }
102 return 0;
103}
104
105static void __exit tunnel4_fini(void)
106{
107 if (inet_del_protocol(&tunnel4_protocol, IPPROTO_IPIP))
108 printk(KERN_ERR "tunnel4 close: can't remove protocol\n");
109}
110
111module_init(tunnel4_init);
112module_exit(tunnel4_fini);
113MODULE_LICENSE("GPL");
diff --git a/net/ipv4/xfrm4_tunnel.c b/net/ipv4/xfrm4_tunnel.c
index b08d56b117f..2d670935c2b 100644
--- a/net/ipv4/xfrm4_tunnel.c
+++ b/net/ipv4/xfrm4_tunnel.c
@@ -26,64 +26,6 @@ static int ipip_xfrm_rcv(struct xfrm_state *x, struct xfrm_decap_state *decap, s
26 return 0; 26 return 0;
27} 27}
28 28
29static struct xfrm_tunnel *ipip_handler;
30static DEFINE_MUTEX(xfrm4_tunnel_mutex);
31
32int xfrm4_tunnel_register(struct xfrm_tunnel *handler)
33{
34 int ret;
35
36 mutex_lock(&xfrm4_tunnel_mutex);
37 ret = 0;
38 if (ipip_handler != NULL)
39 ret = -EINVAL;
40 if (!ret)
41 ipip_handler = handler;
42 mutex_unlock(&xfrm4_tunnel_mutex);
43
44 return ret;
45}
46
47EXPORT_SYMBOL(xfrm4_tunnel_register);
48
49int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler)
50{
51 int ret;
52
53 mutex_lock(&xfrm4_tunnel_mutex);
54 ret = 0;
55 if (ipip_handler != handler)
56 ret = -EINVAL;
57 if (!ret)
58 ipip_handler = NULL;
59 mutex_unlock(&xfrm4_tunnel_mutex);
60
61 synchronize_net();
62
63 return ret;
64}
65
66EXPORT_SYMBOL(xfrm4_tunnel_deregister);
67
68static int ipip_rcv(struct sk_buff *skb)
69{
70 struct xfrm_tunnel *handler = ipip_handler;
71
72 /* Tunnel devices take precedence. */
73 if (handler && handler->handler(skb) == 0)
74 return 0;
75
76 return xfrm4_rcv(skb);
77}
78
79static void ipip_err(struct sk_buff *skb, u32 info)
80{
81 struct xfrm_tunnel *handler = ipip_handler;
82
83 if (handler)
84 handler->err_handler(skb, info);
85}
86
87static int ipip_init_state(struct xfrm_state *x) 29static int ipip_init_state(struct xfrm_state *x)
88{ 30{
89 if (!x->props.mode) 31 if (!x->props.mode)
@@ -111,10 +53,15 @@ static struct xfrm_type ipip_type = {
111 .output = ipip_output 53 .output = ipip_output
112}; 54};
113 55
114static struct net_protocol ipip_protocol = { 56static int xfrm_tunnel_err(struct sk_buff *skb, u32 info)
115 .handler = ipip_rcv, 57{
116 .err_handler = ipip_err, 58 return -ENOENT;
117 .no_policy = 1, 59}
60
61static struct xfrm_tunnel xfrm_tunnel_handler = {
62 .handler = xfrm4_rcv,
63 .err_handler = xfrm_tunnel_err,
64 .priority = 2,
118}; 65};
119 66
120static int __init ipip_init(void) 67static int __init ipip_init(void)
@@ -123,8 +70,8 @@ static int __init ipip_init(void)
123 printk(KERN_INFO "ipip init: can't add xfrm type\n"); 70 printk(KERN_INFO "ipip init: can't add xfrm type\n");
124 return -EAGAIN; 71 return -EAGAIN;
125 } 72 }
126 if (inet_add_protocol(&ipip_protocol, IPPROTO_IPIP) < 0) { 73 if (xfrm4_tunnel_register(&xfrm_tunnel_handler)) {
127 printk(KERN_INFO "ipip init: can't add protocol\n"); 74 printk(KERN_INFO "ipip init: can't add xfrm handler\n");
128 xfrm_unregister_type(&ipip_type, AF_INET); 75 xfrm_unregister_type(&ipip_type, AF_INET);
129 return -EAGAIN; 76 return -EAGAIN;
130 } 77 }
@@ -133,8 +80,8 @@ static int __init ipip_init(void)
133 80
134static void __exit ipip_fini(void) 81static void __exit ipip_fini(void)
135{ 82{
136 if (inet_del_protocol(&ipip_protocol, IPPROTO_IPIP) < 0) 83 if (xfrm4_tunnel_deregister(&xfrm_tunnel_handler))
137 printk(KERN_INFO "ipip close: can't remove protocol\n"); 84 printk(KERN_INFO "ipip close: can't remove xfrm handler\n");
138 if (xfrm_unregister_type(&ipip_type, AF_INET) < 0) 85 if (xfrm_unregister_type(&ipip_type, AF_INET) < 0)
139 printk(KERN_INFO "ipip close: can't remove xfrm type\n"); 86 printk(KERN_INFO "ipip close: can't remove xfrm type\n");
140} 87}
diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig
index e6f83b6a2b7..f8a107ab559 100644
--- a/net/ipv6/Kconfig
+++ b/net/ipv6/Kconfig
@@ -88,7 +88,7 @@ config INET6_IPCOMP
88 tristate "IPv6: IPComp transformation" 88 tristate "IPv6: IPComp transformation"
89 depends on IPV6 89 depends on IPV6
90 select XFRM 90 select XFRM
91 select INET6_TUNNEL 91 select INET6_XFRM_TUNNEL
92 select CRYPTO 92 select CRYPTO
93 select CRYPTO_DEFLATE 93 select CRYPTO_DEFLATE
94 ---help--- 94 ---help---
@@ -97,19 +97,18 @@ config INET6_IPCOMP
97 97
98 If unsure, say Y. 98 If unsure, say Y.
99 99
100config INET6_XFRM_TUNNEL
101 tristate
102 select INET6_TUNNEL
103 default n
104
100config INET6_TUNNEL 105config INET6_TUNNEL
101 tristate "IPv6: tunnel transformation" 106 tristate
102 depends on IPV6 107 default n
103 select XFRM
104 ---help---
105 Support for generic IPv6-in-IPv6 tunnel transformation, which is
106 required by the IPv6-in-IPv6 tunneling module as well as tunnel mode
107 IPComp.
108
109 If unsure, say Y.
110 108
111config IPV6_TUNNEL 109config IPV6_TUNNEL
112 tristate "IPv6: IPv6-in-IPv6 tunnel" 110 tristate "IPv6: IPv6-in-IPv6 tunnel"
111 select INET6_TUNNEL
113 depends on IPV6 112 depends on IPV6
114 ---help--- 113 ---help---
115 Support for IPv6-in-IPv6 tunnels described in RFC 2473. 114 Support for IPv6-in-IPv6 tunnels described in RFC 2473.
diff --git a/net/ipv6/Makefile b/net/ipv6/Makefile
index 41877abd22e..a760b0988fb 100644
--- a/net/ipv6/Makefile
+++ b/net/ipv6/Makefile
@@ -18,7 +18,8 @@ ipv6-objs += $(ipv6-y)
18obj-$(CONFIG_INET6_AH) += ah6.o 18obj-$(CONFIG_INET6_AH) += ah6.o
19obj-$(CONFIG_INET6_ESP) += esp6.o 19obj-$(CONFIG_INET6_ESP) += esp6.o
20obj-$(CONFIG_INET6_IPCOMP) += ipcomp6.o 20obj-$(CONFIG_INET6_IPCOMP) += ipcomp6.o
21obj-$(CONFIG_INET6_TUNNEL) += xfrm6_tunnel.o 21obj-$(CONFIG_INET6_XFRM_TUNNEL) += xfrm6_tunnel.o
22obj-$(CONFIG_INET6_TUNNEL) += tunnel6.o
22obj-$(CONFIG_NETFILTER) += netfilter/ 23obj-$(CONFIG_NETFILTER) += netfilter/
23 24
24obj-$(CONFIG_IPV6_TUNNEL) += ip6_tunnel.o 25obj-$(CONFIG_IPV6_TUNNEL) += ip6_tunnel.o
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 48597538db3..ff9040c9255 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -44,7 +44,6 @@
44 44
45#include <net/ip.h> 45#include <net/ip.h>
46#include <net/ipv6.h> 46#include <net/ipv6.h>
47#include <net/protocol.h>
48#include <net/ip6_route.h> 47#include <net/ip6_route.h>
49#include <net/addrconf.h> 48#include <net/addrconf.h>
50#include <net/ip6_tunnel.h> 49#include <net/ip6_tunnel.h>
@@ -391,7 +390,7 @@ parse_tlv_tnl_enc_lim(struct sk_buff *skb, __u8 * raw)
391 * to the specifications in RFC 2473. 390 * to the specifications in RFC 2473.
392 **/ 391 **/
393 392
394static void 393static int
395ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, 394ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
396 int type, int code, int offset, __u32 info) 395 int type, int code, int offset, __u32 info)
397{ 396{
@@ -402,6 +401,7 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
402 int rel_code = ICMPV6_ADDR_UNREACH; 401 int rel_code = ICMPV6_ADDR_UNREACH;
403 __u32 rel_info = 0; 402 __u32 rel_info = 0;
404 __u16 len; 403 __u16 len;
404 int err = -ENOENT;
405 405
406 /* If the packet doesn't contain the original IPv6 header we are 406 /* If the packet doesn't contain the original IPv6 header we are
407 in trouble since we might need the source address for further 407 in trouble since we might need the source address for further
@@ -411,6 +411,8 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
411 if ((t = ip6ip6_tnl_lookup(&ipv6h->daddr, &ipv6h->saddr)) == NULL) 411 if ((t = ip6ip6_tnl_lookup(&ipv6h->daddr, &ipv6h->saddr)) == NULL)
412 goto out; 412 goto out;
413 413
414 err = 0;
415
414 switch (type) { 416 switch (type) {
415 __u32 teli; 417 __u32 teli;
416 struct ipv6_tlv_tnl_enc_lim *tel; 418 struct ipv6_tlv_tnl_enc_lim *tel;
@@ -492,6 +494,7 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
492 } 494 }
493out: 495out:
494 read_unlock(&ip6ip6_lock); 496 read_unlock(&ip6ip6_lock);
497 return err;
495} 498}
496 499
497static inline void ip6ip6_ecn_decapsulate(struct ipv6hdr *outer_iph, 500static inline void ip6ip6_ecn_decapsulate(struct ipv6hdr *outer_iph,
@@ -511,9 +514,8 @@ static inline void ip6ip6_ecn_decapsulate(struct ipv6hdr *outer_iph,
511 **/ 514 **/
512 515
513static int 516static int
514ip6ip6_rcv(struct sk_buff **pskb) 517ip6ip6_rcv(struct sk_buff *skb)
515{ 518{
516 struct sk_buff *skb = *pskb;
517 struct ipv6hdr *ipv6h; 519 struct ipv6hdr *ipv6h;
518 struct ip6_tnl *t; 520 struct ip6_tnl *t;
519 521
@@ -1112,39 +1114,12 @@ ip6ip6_fb_tnl_dev_init(struct net_device *dev)
1112 return 0; 1114 return 0;
1113} 1115}
1114 1116
1115#ifdef CONFIG_INET6_TUNNEL
1116static struct xfrm6_tunnel ip6ip6_handler = { 1117static struct xfrm6_tunnel ip6ip6_handler = {
1117 .handler = ip6ip6_rcv, 1118 .handler = ip6ip6_rcv,
1118 .err_handler = ip6ip6_err, 1119 .err_handler = ip6ip6_err,
1120 .priority = 1,
1119}; 1121};
1120 1122
1121static inline int ip6ip6_register(void)
1122{
1123 return xfrm6_tunnel_register(&ip6ip6_handler);
1124}
1125
1126static inline int ip6ip6_unregister(void)
1127{
1128 return xfrm6_tunnel_deregister(&ip6ip6_handler);
1129}
1130#else
1131static struct inet6_protocol xfrm6_tunnel_protocol = {
1132 .handler = ip6ip6_rcv,
1133 .err_handler = ip6ip6_err,
1134 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
1135};
1136
1137static inline int ip6ip6_register(void)
1138{
1139 return inet6_add_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6);
1140}
1141
1142static inline int ip6ip6_unregister(void)
1143{
1144 return inet6_del_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6);
1145}
1146#endif
1147
1148/** 1123/**
1149 * ip6_tunnel_init - register protocol and reserve needed resources 1124 * ip6_tunnel_init - register protocol and reserve needed resources
1150 * 1125 *
@@ -1155,7 +1130,7 @@ static int __init ip6_tunnel_init(void)
1155{ 1130{
1156 int err; 1131 int err;
1157 1132
1158 if (ip6ip6_register() < 0) { 1133 if (xfrm6_tunnel_register(&ip6ip6_handler)) {
1159 printk(KERN_ERR "ip6ip6 init: can't register tunnel\n"); 1134 printk(KERN_ERR "ip6ip6 init: can't register tunnel\n");
1160 return -EAGAIN; 1135 return -EAGAIN;
1161 } 1136 }
@@ -1174,7 +1149,7 @@ static int __init ip6_tunnel_init(void)
1174 } 1149 }
1175 return 0; 1150 return 0;
1176fail: 1151fail:
1177 ip6ip6_unregister(); 1152 xfrm6_tunnel_deregister(&ip6ip6_handler);
1178 return err; 1153 return err;
1179} 1154}
1180 1155
@@ -1184,7 +1159,7 @@ fail:
1184 1159
1185static void __exit ip6_tunnel_cleanup(void) 1160static void __exit ip6_tunnel_cleanup(void)
1186{ 1161{
1187 if (ip6ip6_unregister() < 0) 1162 if (xfrm6_tunnel_deregister(&ip6ip6_handler))
1188 printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n"); 1163 printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n");
1189 1164
1190 unregister_netdev(ip6ip6_fb_tnl_dev); 1165 unregister_netdev(ip6ip6_fb_tnl_dev);
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c
index 344eab3b5da..e81c6a9dab8 100644
--- a/net/ipv6/netfilter/ip6_queue.c
+++ b/net/ipv6/netfilter/ip6_queue.c
@@ -713,13 +713,13 @@ cleanup_netlink_notifier:
713 return status; 713 return status;
714} 714}
715 715
716static int __init init(void) 716static int __init ip6_queue_init(void)
717{ 717{
718 718
719 return init_or_cleanup(1); 719 return init_or_cleanup(1);
720} 720}
721 721
722static void __exit fini(void) 722static void __exit ip6_queue_fini(void)
723{ 723{
724 init_or_cleanup(0); 724 init_or_cleanup(0);
725} 725}
@@ -727,5 +727,5 @@ static void __exit fini(void)
727MODULE_DESCRIPTION("IPv6 packet queue handler"); 727MODULE_DESCRIPTION("IPv6 packet queue handler");
728MODULE_LICENSE("GPL"); 728MODULE_LICENSE("GPL");
729 729
730module_init(init); 730module_init(ip6_queue_init);
731module_exit(fini); 731module_exit(ip6_queue_fini);
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
index db3c9ae98e9..3ecf2db841f 100644
--- a/net/ipv6/netfilter/ip6_tables.c
+++ b/net/ipv6/netfilter/ip6_tables.c
@@ -1406,7 +1406,7 @@ static struct ip6t_match icmp6_matchstruct = {
1406 .family = AF_INET6, 1406 .family = AF_INET6,
1407}; 1407};
1408 1408
1409static int __init init(void) 1409static int __init ip6_tables_init(void)
1410{ 1410{
1411 int ret; 1411 int ret;
1412 1412
@@ -1429,7 +1429,7 @@ static int __init init(void)
1429 return 0; 1429 return 0;
1430} 1430}
1431 1431
1432static void __exit fini(void) 1432static void __exit ip6_tables_fini(void)
1433{ 1433{
1434 nf_unregister_sockopt(&ip6t_sockopts); 1434 nf_unregister_sockopt(&ip6t_sockopts);
1435 xt_unregister_match(&icmp6_matchstruct); 1435 xt_unregister_match(&icmp6_matchstruct);
@@ -1517,5 +1517,5 @@ EXPORT_SYMBOL(ip6t_do_table);
1517EXPORT_SYMBOL(ip6t_ext_hdr); 1517EXPORT_SYMBOL(ip6t_ext_hdr);
1518EXPORT_SYMBOL(ipv6_find_hdr); 1518EXPORT_SYMBOL(ipv6_find_hdr);
1519 1519
1520module_init(init); 1520module_init(ip6_tables_init);
1521module_exit(fini); 1521module_exit(ip6_tables_fini);
diff --git a/net/ipv6/netfilter/ip6t_HL.c b/net/ipv6/netfilter/ip6t_HL.c
index da14c6d86bc..b8eff8ee69b 100644
--- a/net/ipv6/netfilter/ip6t_HL.c
+++ b/net/ipv6/netfilter/ip6t_HL.c
@@ -93,15 +93,15 @@ static struct ip6t_target ip6t_HL = {
93 .me = THIS_MODULE 93 .me = THIS_MODULE
94}; 94};
95 95
96static int __init init(void) 96static int __init ip6t_hl_init(void)
97{ 97{
98 return ip6t_register_target(&ip6t_HL); 98 return ip6t_register_target(&ip6t_HL);
99} 99}
100 100
101static void __exit fini(void) 101static void __exit ip6t_hl_fini(void)
102{ 102{
103 ip6t_unregister_target(&ip6t_HL); 103 ip6t_unregister_target(&ip6t_HL);
104} 104}
105 105
106module_init(init); 106module_init(ip6t_hl_init);
107module_exit(fini); 107module_exit(ip6t_hl_fini);
diff --git a/net/ipv6/netfilter/ip6t_LOG.c b/net/ipv6/netfilter/ip6t_LOG.c
index 07c6bcbe4c5..a96c0de14b0 100644
--- a/net/ipv6/netfilter/ip6t_LOG.c
+++ b/net/ipv6/netfilter/ip6t_LOG.c
@@ -483,7 +483,7 @@ static struct nf_logger ip6t_logger = {
483 .me = THIS_MODULE, 483 .me = THIS_MODULE,
484}; 484};
485 485
486static int __init init(void) 486static int __init ip6t_log_init(void)
487{ 487{
488 if (ip6t_register_target(&ip6t_log_reg)) 488 if (ip6t_register_target(&ip6t_log_reg))
489 return -EINVAL; 489 return -EINVAL;
@@ -497,11 +497,11 @@ static int __init init(void)
497 return 0; 497 return 0;
498} 498}
499 499
500static void __exit fini(void) 500static void __exit ip6t_log_fini(void)
501{ 501{
502 nf_log_unregister_logger(&ip6t_logger); 502 nf_log_unregister_logger(&ip6t_logger);
503 ip6t_unregister_target(&ip6t_log_reg); 503 ip6t_unregister_target(&ip6t_log_reg);
504} 504}
505 505
506module_init(init); 506module_init(ip6t_log_init);
507module_exit(fini); 507module_exit(ip6t_log_fini);
diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c
index ddfa38575fe..de1175c27f6 100644
--- a/net/ipv6/netfilter/ip6t_REJECT.c
+++ b/net/ipv6/netfilter/ip6t_REJECT.c
@@ -255,17 +255,17 @@ static struct ip6t_target ip6t_reject_reg = {
255 .me = THIS_MODULE 255 .me = THIS_MODULE
256}; 256};
257 257
258static int __init init(void) 258static int __init ip6t_reject_init(void)
259{ 259{
260 if (ip6t_register_target(&ip6t_reject_reg)) 260 if (ip6t_register_target(&ip6t_reject_reg))
261 return -EINVAL; 261 return -EINVAL;
262 return 0; 262 return 0;
263} 263}
264 264
265static void __exit fini(void) 265static void __exit ip6t_reject_fini(void)
266{ 266{
267 ip6t_unregister_target(&ip6t_reject_reg); 267 ip6t_unregister_target(&ip6t_reject_reg);
268} 268}
269 269
270module_init(init); 270module_init(ip6t_reject_init);
271module_exit(fini); 271module_exit(ip6t_reject_fini);
diff --git a/net/ipv6/netfilter/ip6t_ah.c b/net/ipv6/netfilter/ip6t_ah.c
index 178f6fb1e53..2f7bb20c758 100644
--- a/net/ipv6/netfilter/ip6t_ah.c
+++ b/net/ipv6/netfilter/ip6t_ah.c
@@ -122,15 +122,15 @@ static struct ip6t_match ah_match = {
122 .me = THIS_MODULE, 122 .me = THIS_MODULE,
123}; 123};
124 124
125static int __init init(void) 125static int __init ip6t_ah_init(void)
126{ 126{
127 return ip6t_register_match(&ah_match); 127 return ip6t_register_match(&ah_match);
128} 128}
129 129
130static void __exit cleanup(void) 130static void __exit ip6t_ah_fini(void)
131{ 131{
132 ip6t_unregister_match(&ah_match); 132 ip6t_unregister_match(&ah_match);
133} 133}
134 134
135module_init(init); 135module_init(ip6t_ah_init);
136module_exit(cleanup); 136module_exit(ip6t_ah_fini);
diff --git a/net/ipv6/netfilter/ip6t_dst.c b/net/ipv6/netfilter/ip6t_dst.c
index e97a7022698..9422413d057 100644
--- a/net/ipv6/netfilter/ip6t_dst.c
+++ b/net/ipv6/netfilter/ip6t_dst.c
@@ -206,15 +206,15 @@ static struct ip6t_match opts_match = {
206 .me = THIS_MODULE, 206 .me = THIS_MODULE,
207}; 207};
208 208
209static int __init init(void) 209static int __init ip6t_dst_init(void)
210{ 210{
211 return ip6t_register_match(&opts_match); 211 return ip6t_register_match(&opts_match);
212} 212}
213 213
214static void __exit cleanup(void) 214static void __exit ip6t_dst_fini(void)
215{ 215{
216 ip6t_unregister_match(&opts_match); 216 ip6t_unregister_match(&opts_match);
217} 217}
218 218
219module_init(init); 219module_init(ip6t_dst_init);
220module_exit(cleanup); 220module_exit(ip6t_dst_fini);
diff --git a/net/ipv6/netfilter/ip6t_esp.c b/net/ipv6/netfilter/ip6t_esp.c
index 540b8bfd505..36bedad2c6f 100644
--- a/net/ipv6/netfilter/ip6t_esp.c
+++ b/net/ipv6/netfilter/ip6t_esp.c
@@ -101,15 +101,15 @@ static struct ip6t_match esp_match = {
101 .me = THIS_MODULE, 101 .me = THIS_MODULE,
102}; 102};
103 103
104static int __init init(void) 104static int __init ip6t_esp_init(void)
105{ 105{
106 return ip6t_register_match(&esp_match); 106 return ip6t_register_match(&esp_match);
107} 107}
108 108
109static void __exit cleanup(void) 109static void __exit ip6t_esp_fini(void)
110{ 110{
111 ip6t_unregister_match(&esp_match); 111 ip6t_unregister_match(&esp_match);
112} 112}
113 113
114module_init(init); 114module_init(ip6t_esp_init);
115module_exit(cleanup); 115module_exit(ip6t_esp_fini);
diff --git a/net/ipv6/netfilter/ip6t_eui64.c b/net/ipv6/netfilter/ip6t_eui64.c
index d4b0bad5283..94dbdb8b458 100644
--- a/net/ipv6/netfilter/ip6t_eui64.c
+++ b/net/ipv6/netfilter/ip6t_eui64.c
@@ -70,15 +70,15 @@ static struct ip6t_match eui64_match = {
70 .me = THIS_MODULE, 70 .me = THIS_MODULE,
71}; 71};
72 72
73static int __init init(void) 73static int __init ip6t_eui64_init(void)
74{ 74{
75 return ip6t_register_match(&eui64_match); 75 return ip6t_register_match(&eui64_match);
76} 76}
77 77
78static void __exit fini(void) 78static void __exit ip6t_eui64_fini(void)
79{ 79{
80 ip6t_unregister_match(&eui64_match); 80 ip6t_unregister_match(&eui64_match);
81} 81}
82 82
83module_init(init); 83module_init(ip6t_eui64_init);
84module_exit(fini); 84module_exit(ip6t_eui64_fini);
diff --git a/net/ipv6/netfilter/ip6t_frag.c b/net/ipv6/netfilter/ip6t_frag.c
index 4c41e14823d..06768c84bd3 100644
--- a/net/ipv6/netfilter/ip6t_frag.c
+++ b/net/ipv6/netfilter/ip6t_frag.c
@@ -139,15 +139,15 @@ static struct ip6t_match frag_match = {
139 .me = THIS_MODULE, 139 .me = THIS_MODULE,
140}; 140};
141 141
142static int __init init(void) 142static int __init ip6t_frag_init(void)
143{ 143{
144 return ip6t_register_match(&frag_match); 144 return ip6t_register_match(&frag_match);
145} 145}
146 146
147static void __exit cleanup(void) 147static void __exit ip6t_frag_fini(void)
148{ 148{
149 ip6t_unregister_match(&frag_match); 149 ip6t_unregister_match(&frag_match);
150} 150}
151 151
152module_init(init); 152module_init(ip6t_frag_init);
153module_exit(cleanup); 153module_exit(ip6t_frag_fini);
diff --git a/net/ipv6/netfilter/ip6t_hbh.c b/net/ipv6/netfilter/ip6t_hbh.c
index b4a1fdfe6ab..374f1be85c0 100644
--- a/net/ipv6/netfilter/ip6t_hbh.c
+++ b/net/ipv6/netfilter/ip6t_hbh.c
@@ -206,15 +206,15 @@ static struct ip6t_match opts_match = {
206 .me = THIS_MODULE, 206 .me = THIS_MODULE,
207}; 207};
208 208
209static int __init init(void) 209static int __init ip6t_hbh_init(void)
210{ 210{
211 return ip6t_register_match(&opts_match); 211 return ip6t_register_match(&opts_match);
212} 212}
213 213
214static void __exit cleanup(void) 214static void __exit ip6t_hbh_fini(void)
215{ 215{
216 ip6t_unregister_match(&opts_match); 216 ip6t_unregister_match(&opts_match);
217} 217}
218 218
219module_init(init); 219module_init(ip6t_hbh_init);
220module_exit(cleanup); 220module_exit(ip6t_hbh_fini);
diff --git a/net/ipv6/netfilter/ip6t_hl.c b/net/ipv6/netfilter/ip6t_hl.c
index 374055733b2..44a729e17c4 100644
--- a/net/ipv6/netfilter/ip6t_hl.c
+++ b/net/ipv6/netfilter/ip6t_hl.c
@@ -55,16 +55,16 @@ static struct ip6t_match hl_match = {
55 .me = THIS_MODULE, 55 .me = THIS_MODULE,
56}; 56};
57 57
58static int __init init(void) 58static int __init ip6t_hl_init(void)
59{ 59{
60 return ip6t_register_match(&hl_match); 60 return ip6t_register_match(&hl_match);
61} 61}
62 62
63static void __exit fini(void) 63static void __exit ip6t_hl_fini(void)
64{ 64{
65 ip6t_unregister_match(&hl_match); 65 ip6t_unregister_match(&hl_match);
66 66
67} 67}
68 68
69module_init(init); 69module_init(ip6t_hl_init);
70module_exit(fini); 70module_exit(ip6t_hl_fini);
diff --git a/net/ipv6/netfilter/ip6t_multiport.c b/net/ipv6/netfilter/ip6t_multiport.c
index 752b65d21c7..10c48ba596d 100644
--- a/net/ipv6/netfilter/ip6t_multiport.c
+++ b/net/ipv6/netfilter/ip6t_multiport.c
@@ -111,15 +111,15 @@ static struct ip6t_match multiport_match = {
111 .me = THIS_MODULE, 111 .me = THIS_MODULE,
112}; 112};
113 113
114static int __init init(void) 114static int __init ip6t_multiport_init(void)
115{ 115{
116 return ip6t_register_match(&multiport_match); 116 return ip6t_register_match(&multiport_match);
117} 117}
118 118
119static void __exit fini(void) 119static void __exit ip6t_multiport_fini(void)
120{ 120{
121 ip6t_unregister_match(&multiport_match); 121 ip6t_unregister_match(&multiport_match);
122} 122}
123 123
124module_init(init); 124module_init(ip6t_multiport_init);
125module_exit(fini); 125module_exit(ip6t_multiport_fini);
diff --git a/net/ipv6/netfilter/ip6t_owner.c b/net/ipv6/netfilter/ip6t_owner.c
index e2cee3bcdef..5d047990cd4 100644
--- a/net/ipv6/netfilter/ip6t_owner.c
+++ b/net/ipv6/netfilter/ip6t_owner.c
@@ -79,15 +79,15 @@ static struct ip6t_match owner_match = {
79 .me = THIS_MODULE, 79 .me = THIS_MODULE,
80}; 80};
81 81
82static int __init init(void) 82static int __init ip6t_owner_init(void)
83{ 83{
84 return ip6t_register_match(&owner_match); 84 return ip6t_register_match(&owner_match);
85} 85}
86 86
87static void __exit fini(void) 87static void __exit ip6t_owner_fini(void)
88{ 88{
89 ip6t_unregister_match(&owner_match); 89 ip6t_unregister_match(&owner_match);
90} 90}
91 91
92module_init(init); 92module_init(ip6t_owner_init);
93module_exit(fini); 93module_exit(ip6t_owner_fini);
diff --git a/net/ipv6/netfilter/ip6t_rt.c b/net/ipv6/netfilter/ip6t_rt.c
index 4c6b55bb225..fbb0184a41d 100644
--- a/net/ipv6/netfilter/ip6t_rt.c
+++ b/net/ipv6/netfilter/ip6t_rt.c
@@ -225,15 +225,15 @@ static struct ip6t_match rt_match = {
225 .me = THIS_MODULE, 225 .me = THIS_MODULE,
226}; 226};
227 227
228static int __init init(void) 228static int __init ip6t_rt_init(void)
229{ 229{
230 return ip6t_register_match(&rt_match); 230 return ip6t_register_match(&rt_match);
231} 231}
232 232
233static void __exit cleanup(void) 233static void __exit ip6t_rt_fini(void)
234{ 234{
235 ip6t_unregister_match(&rt_match); 235 ip6t_unregister_match(&rt_match);
236} 236}
237 237
238module_init(init); 238module_init(ip6t_rt_init);
239module_exit(cleanup); 239module_exit(ip6t_rt_fini);
diff --git a/net/ipv6/netfilter/ip6table_filter.c b/net/ipv6/netfilter/ip6table_filter.c
index ce4a968e1f7..e5e724d9ee6 100644
--- a/net/ipv6/netfilter/ip6table_filter.c
+++ b/net/ipv6/netfilter/ip6table_filter.c
@@ -159,7 +159,7 @@ static struct nf_hook_ops ip6t_ops[] = {
159static int forward = NF_ACCEPT; 159static int forward = NF_ACCEPT;
160module_param(forward, bool, 0000); 160module_param(forward, bool, 0000);
161 161
162static int __init init(void) 162static int __init ip6table_filter_init(void)
163{ 163{
164 int ret; 164 int ret;
165 165
@@ -201,7 +201,7 @@ static int __init init(void)
201 return ret; 201 return ret;
202} 202}
203 203
204static void __exit fini(void) 204static void __exit ip6table_filter_fini(void)
205{ 205{
206 unsigned int i; 206 unsigned int i;
207 207
@@ -211,5 +211,5 @@ static void __exit fini(void)
211 ip6t_unregister_table(&packet_filter); 211 ip6t_unregister_table(&packet_filter);
212} 212}
213 213
214module_init(init); 214module_init(ip6table_filter_init);
215module_exit(fini); 215module_exit(ip6table_filter_fini);
diff --git a/net/ipv6/netfilter/ip6table_mangle.c b/net/ipv6/netfilter/ip6table_mangle.c
index 30a4627e000..e1f0f6ae984 100644
--- a/net/ipv6/netfilter/ip6table_mangle.c
+++ b/net/ipv6/netfilter/ip6table_mangle.c
@@ -228,7 +228,7 @@ static struct nf_hook_ops ip6t_ops[] = {
228 }, 228 },
229}; 229};
230 230
231static int __init init(void) 231static int __init ip6table_mangle_init(void)
232{ 232{
233 int ret; 233 int ret;
234 234
@@ -274,7 +274,7 @@ static int __init init(void)
274 return ret; 274 return ret;
275} 275}
276 276
277static void __exit fini(void) 277static void __exit ip6table_mangle_fini(void)
278{ 278{
279 unsigned int i; 279 unsigned int i;
280 280
@@ -284,5 +284,5 @@ static void __exit fini(void)
284 ip6t_unregister_table(&packet_mangler); 284 ip6t_unregister_table(&packet_mangler);
285} 285}
286 286
287module_init(init); 287module_init(ip6table_mangle_init);
288module_exit(fini); 288module_exit(ip6table_mangle_fini);
diff --git a/net/ipv6/netfilter/ip6table_raw.c b/net/ipv6/netfilter/ip6table_raw.c
index db28ba3855e..54d1fffd62b 100644
--- a/net/ipv6/netfilter/ip6table_raw.c
+++ b/net/ipv6/netfilter/ip6table_raw.c
@@ -142,7 +142,7 @@ static struct nf_hook_ops ip6t_ops[] = {
142 }, 142 },
143}; 143};
144 144
145static int __init init(void) 145static int __init ip6table_raw_init(void)
146{ 146{
147 int ret; 147 int ret;
148 148
@@ -170,7 +170,7 @@ static int __init init(void)
170 return ret; 170 return ret;
171} 171}
172 172
173static void __exit fini(void) 173static void __exit ip6table_raw_fini(void)
174{ 174{
175 unsigned int i; 175 unsigned int i;
176 176
@@ -180,6 +180,6 @@ static void __exit fini(void)
180 ip6t_unregister_table(&packet_raw); 180 ip6t_unregister_table(&packet_raw);
181} 181}
182 182
183module_init(init); 183module_init(ip6table_raw_init);
184module_exit(fini); 184module_exit(ip6table_raw_fini);
185MODULE_LICENSE("GPL"); 185MODULE_LICENSE("GPL");
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
index c16f62934bd..c8b5a96cbb0 100644
--- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
+++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
@@ -588,16 +588,16 @@ MODULE_ALIAS("nf_conntrack-" __stringify(AF_INET6));
588MODULE_LICENSE("GPL"); 588MODULE_LICENSE("GPL");
589MODULE_AUTHOR("Yasuyuki KOZAKAI @USAGI <yasuyuki.kozakai@toshiba.co.jp>"); 589MODULE_AUTHOR("Yasuyuki KOZAKAI @USAGI <yasuyuki.kozakai@toshiba.co.jp>");
590 590
591static int __init init(void) 591static int __init nf_conntrack_l3proto_ipv6_init(void)
592{ 592{
593 need_conntrack(); 593 need_conntrack();
594 return init_or_cleanup(1); 594 return init_or_cleanup(1);
595} 595}
596 596
597static void __exit fini(void) 597static void __exit nf_conntrack_l3proto_ipv6_fini(void)
598{ 598{
599 init_or_cleanup(0); 599 init_or_cleanup(0);
600} 600}
601 601
602module_init(init); 602module_init(nf_conntrack_l3proto_ipv6_init);
603module_exit(fini); 603module_exit(nf_conntrack_l3proto_ipv6_fini);
diff --git a/net/ipv6/tunnel6.c b/net/ipv6/tunnel6.c
new file mode 100644
index 00000000000..5659b52284b
--- /dev/null
+++ b/net/ipv6/tunnel6.c
@@ -0,0 +1,131 @@
1/*
2 * Copyright (C)2003,2004 USAGI/WIDE Project
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Authors Mitsuru KANDA <mk@linux-ipv6.org>
19 * YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
20 */
21
22#include <linux/init.h>
23#include <linux/module.h>
24#include <linux/mutex.h>
25#include <linux/netdevice.h>
26#include <linux/skbuff.h>
27#include <net/protocol.h>
28#include <net/xfrm.h>
29
30static struct xfrm6_tunnel *tunnel6_handlers;
31static DEFINE_MUTEX(tunnel6_mutex);
32
33int xfrm6_tunnel_register(struct xfrm6_tunnel *handler)
34{
35 struct xfrm6_tunnel **pprev;
36 int ret = -EEXIST;
37 int priority = handler->priority;
38
39 mutex_lock(&tunnel6_mutex);
40
41 for (pprev = &tunnel6_handlers; *pprev; pprev = &(*pprev)->next) {
42 if ((*pprev)->priority > priority)
43 break;
44 if ((*pprev)->priority == priority)
45 goto err;
46 }
47
48 handler->next = *pprev;
49 *pprev = handler;
50
51 ret = 0;
52
53err:
54 mutex_unlock(&tunnel6_mutex);
55
56 return ret;
57}
58
59EXPORT_SYMBOL(xfrm6_tunnel_register);
60
61int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler)
62{
63 struct xfrm6_tunnel **pprev;
64 int ret = -ENOENT;
65
66 mutex_lock(&tunnel6_mutex);
67
68 for (pprev = &tunnel6_handlers; *pprev; pprev = &(*pprev)->next) {
69 if (*pprev == handler) {
70 *pprev = handler->next;
71 ret = 0;
72 break;
73 }
74 }
75
76 mutex_unlock(&tunnel6_mutex);
77
78 synchronize_net();
79
80 return ret;
81}
82
83EXPORT_SYMBOL(xfrm6_tunnel_deregister);
84
85static int tunnel6_rcv(struct sk_buff **pskb)
86{
87 struct sk_buff *skb = *pskb;
88 struct xfrm6_tunnel *handler;
89
90 for (handler = tunnel6_handlers; handler; handler = handler->next)
91 if (!handler->handler(skb))
92 return 0;
93
94 kfree_skb(skb);
95 return 0;
96}
97
98static void tunnel6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
99 int type, int code, int offset, __u32 info)
100{
101 struct xfrm6_tunnel *handler;
102
103 for (handler = tunnel6_handlers; handler; handler = handler->next)
104 if (!handler->err_handler(skb, opt, type, code, offset, info))
105 break;
106}
107
108static struct inet6_protocol tunnel6_protocol = {
109 .handler = tunnel6_rcv,
110 .err_handler = tunnel6_err,
111 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
112};
113
114static int __init tunnel6_init(void)
115{
116 if (inet6_add_protocol(&tunnel6_protocol, IPPROTO_IPV6)) {
117 printk(KERN_ERR "tunnel6 init(): can't add protocol\n");
118 return -EAGAIN;
119 }
120 return 0;
121}
122
123static void __exit tunnel6_fini(void)
124{
125 if (inet6_del_protocol(&tunnel6_protocol, IPPROTO_IPV6))
126 printk(KERN_ERR "tunnel6 close: can't remove protocol\n");
127}
128
129module_init(tunnel6_init);
130module_exit(tunnel6_fini);
131MODULE_LICENSE("GPL");
diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c
index 1ca2da68ef6..cccf8b76f04 100644
--- a/net/ipv6/xfrm6_input.c
+++ b/net/ipv6/xfrm6_input.c
@@ -28,9 +28,8 @@ static inline void ipip6_ecn_decapsulate(struct sk_buff *skb)
28 IP6_ECN_set_ce(inner_iph); 28 IP6_ECN_set_ce(inner_iph);
29} 29}
30 30
31int xfrm6_rcv_spi(struct sk_buff **pskb, u32 spi) 31int xfrm6_rcv_spi(struct sk_buff *skb, u32 spi)
32{ 32{
33 struct sk_buff *skb = *pskb;
34 int err; 33 int err;
35 u32 seq; 34 u32 seq;
36 struct sec_decap_state xfrm_vec[XFRM_MAX_DEPTH]; 35 struct sec_decap_state xfrm_vec[XFRM_MAX_DEPTH];
@@ -159,5 +158,5 @@ EXPORT_SYMBOL(xfrm6_rcv_spi);
159 158
160int xfrm6_rcv(struct sk_buff **pskb) 159int xfrm6_rcv(struct sk_buff **pskb)
161{ 160{
162 return xfrm6_rcv_spi(pskb, 0); 161 return xfrm6_rcv_spi(*pskb, 0);
163} 162}
diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c
index 08f9abbdf1d..a8f6776c518 100644
--- a/net/ipv6/xfrm6_tunnel.c
+++ b/net/ipv6/xfrm6_tunnel.c
@@ -28,7 +28,6 @@
28#include <net/ip.h> 28#include <net/ip.h>
29#include <net/xfrm.h> 29#include <net/xfrm.h>
30#include <net/ipv6.h> 30#include <net/ipv6.h>
31#include <net/protocol.h>
32#include <linux/ipv6.h> 31#include <linux/ipv6.h>
33#include <linux/icmpv6.h> 32#include <linux/icmpv6.h>
34#include <linux/mutex.h> 33#include <linux/mutex.h>
@@ -357,71 +356,18 @@ static int xfrm6_tunnel_input(struct xfrm_state *x, struct xfrm_decap_state *dec
357 return 0; 356 return 0;
358} 357}
359 358
360static struct xfrm6_tunnel *xfrm6_tunnel_handler; 359static int xfrm6_tunnel_rcv(struct sk_buff *skb)
361static DEFINE_MUTEX(xfrm6_tunnel_mutex);
362
363int xfrm6_tunnel_register(struct xfrm6_tunnel *handler)
364{ 360{
365 int ret;
366
367 mutex_lock(&xfrm6_tunnel_mutex);
368 ret = 0;
369 if (xfrm6_tunnel_handler != NULL)
370 ret = -EINVAL;
371 if (!ret)
372 xfrm6_tunnel_handler = handler;
373 mutex_unlock(&xfrm6_tunnel_mutex);
374
375 return ret;
376}
377
378EXPORT_SYMBOL(xfrm6_tunnel_register);
379
380int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler)
381{
382 int ret;
383
384 mutex_lock(&xfrm6_tunnel_mutex);
385 ret = 0;
386 if (xfrm6_tunnel_handler != handler)
387 ret = -EINVAL;
388 if (!ret)
389 xfrm6_tunnel_handler = NULL;
390 mutex_unlock(&xfrm6_tunnel_mutex);
391
392 synchronize_net();
393
394 return ret;
395}
396
397EXPORT_SYMBOL(xfrm6_tunnel_deregister);
398
399static int xfrm6_tunnel_rcv(struct sk_buff **pskb)
400{
401 struct sk_buff *skb = *pskb;
402 struct xfrm6_tunnel *handler = xfrm6_tunnel_handler;
403 struct ipv6hdr *iph = skb->nh.ipv6h; 361 struct ipv6hdr *iph = skb->nh.ipv6h;
404 u32 spi; 362 u32 spi;
405 363
406 /* device-like_ip6ip6_handler() */
407 if (handler && handler->handler(pskb) == 0)
408 return 0;
409
410 spi = xfrm6_tunnel_spi_lookup((xfrm_address_t *)&iph->saddr); 364 spi = xfrm6_tunnel_spi_lookup((xfrm_address_t *)&iph->saddr);
411 return xfrm6_rcv_spi(pskb, spi); 365 return xfrm6_rcv_spi(skb, spi);
412} 366}
413 367
414static void xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt, 368static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
415 int type, int code, int offset, __u32 info) 369 int type, int code, int offset, __u32 info)
416{ 370{
417 struct xfrm6_tunnel *handler = xfrm6_tunnel_handler;
418
419 /* call here first for device-like ip6ip6 err handling */
420 if (handler) {
421 handler->err_handler(skb, opt, type, code, offset, info);
422 return;
423 }
424
425 /* xfrm6_tunnel native err handling */ 371 /* xfrm6_tunnel native err handling */
426 switch (type) { 372 switch (type) {
427 case ICMPV6_DEST_UNREACH: 373 case ICMPV6_DEST_UNREACH:
@@ -462,7 +408,8 @@ static void xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
462 default: 408 default:
463 break; 409 break;
464 } 410 }
465 return; 411
412 return 0;
466} 413}
467 414
468static int xfrm6_tunnel_init_state(struct xfrm_state *x) 415static int xfrm6_tunnel_init_state(struct xfrm_state *x)
@@ -493,10 +440,10 @@ static struct xfrm_type xfrm6_tunnel_type = {
493 .output = xfrm6_tunnel_output, 440 .output = xfrm6_tunnel_output,
494}; 441};
495 442
496static struct inet6_protocol xfrm6_tunnel_protocol = { 443static struct xfrm6_tunnel xfrm6_tunnel_handler = {
497 .handler = xfrm6_tunnel_rcv, 444 .handler = xfrm6_tunnel_rcv,
498 .err_handler = xfrm6_tunnel_err, 445 .err_handler = xfrm6_tunnel_err,
499 .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, 446 .priority = 2,
500}; 447};
501 448
502static int __init xfrm6_tunnel_init(void) 449static int __init xfrm6_tunnel_init(void)
@@ -508,16 +455,16 @@ static int __init xfrm6_tunnel_init(void)
508 "xfrm6_tunnel init: can't add xfrm type\n"); 455 "xfrm6_tunnel init: can't add xfrm type\n");
509 return -EAGAIN; 456 return -EAGAIN;
510 } 457 }
511 if (inet6_add_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6) < 0) { 458 if (xfrm6_tunnel_register(&xfrm6_tunnel_handler)) {
512 X6TPRINTK1(KERN_ERR 459 X6TPRINTK1(KERN_ERR
513 "xfrm6_tunnel init(): can't add protocol\n"); 460 "xfrm6_tunnel init(): can't add handler\n");
514 xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6); 461 xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6);
515 return -EAGAIN; 462 return -EAGAIN;
516 } 463 }
517 if (xfrm6_tunnel_spi_init() < 0) { 464 if (xfrm6_tunnel_spi_init() < 0) {
518 X6TPRINTK1(KERN_ERR 465 X6TPRINTK1(KERN_ERR
519 "xfrm6_tunnel init: failed to initialize spi\n"); 466 "xfrm6_tunnel init: failed to initialize spi\n");
520 inet6_del_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6); 467 xfrm6_tunnel_deregister(&xfrm6_tunnel_handler);
521 xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6); 468 xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6);
522 return -EAGAIN; 469 return -EAGAIN;
523 } 470 }
@@ -529,9 +476,9 @@ static void __exit xfrm6_tunnel_fini(void)
529 X6TPRINTK3(KERN_DEBUG "%s()\n", __FUNCTION__); 476 X6TPRINTK3(KERN_DEBUG "%s()\n", __FUNCTION__);
530 477
531 xfrm6_tunnel_spi_fini(); 478 xfrm6_tunnel_spi_fini();
532 if (inet6_del_protocol(&xfrm6_tunnel_protocol, IPPROTO_IPV6) < 0) 479 if (xfrm6_tunnel_deregister(&xfrm6_tunnel_handler))
533 X6TPRINTK1(KERN_ERR 480 X6TPRINTK1(KERN_ERR
534 "xfrm6_tunnel close: can't remove protocol\n"); 481 "xfrm6_tunnel close: can't remove handler\n");
535 if (xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6) < 0) 482 if (xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6) < 0)
536 X6TPRINTK1(KERN_ERR 483 X6TPRINTK1(KERN_ERR
537 "xfrm6_tunnel close: can't remove xfrm type\n"); 484 "xfrm6_tunnel close: can't remove xfrm type\n");
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c
index 0fb513a34d1..2dbf134d526 100644
--- a/net/ipx/af_ipx.c
+++ b/net/ipx/af_ipx.c
@@ -1892,6 +1892,29 @@ static int ipx_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1892 return rc; 1892 return rc;
1893} 1893}
1894 1894
1895
1896#ifdef CONFIG_COMPAT
1897static int ipx_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1898{
1899 /*
1900 * These 4 commands use same structure on 32bit and 64bit. Rest of IPX
1901 * commands is handled by generic ioctl code. As these commands are
1902 * SIOCPROTOPRIVATE..SIOCPROTOPRIVATE+3, they cannot be handled by generic
1903 * code.
1904 */
1905 switch (cmd) {
1906 case SIOCAIPXITFCRT:
1907 case SIOCAIPXPRISLT:
1908 case SIOCIPXCFGDATA:
1909 case SIOCIPXNCPCONN:
1910 return ipx_ioctl(sock, cmd, arg);
1911 default:
1912 return -ENOIOCTLCMD;
1913 }
1914}
1915#endif
1916
1917
1895/* 1918/*
1896 * Socket family declarations 1919 * Socket family declarations
1897 */ 1920 */
@@ -1913,6 +1936,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = {
1913 .getname = ipx_getname, 1936 .getname = ipx_getname,
1914 .poll = datagram_poll, 1937 .poll = datagram_poll,
1915 .ioctl = ipx_ioctl, 1938 .ioctl = ipx_ioctl,
1939#ifdef CONFIG_COMPAT
1940 .compat_ioctl = ipx_compat_ioctl,
1941#endif
1916 .listen = sock_no_listen, 1942 .listen = sock_no_listen,
1917 .shutdown = sock_no_shutdown, /* FIXME: support shutdown */ 1943 .shutdown = sock_no_shutdown, /* FIXME: support shutdown */
1918 .setsockopt = ipx_setsockopt, 1944 .setsockopt = ipx_setsockopt,
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
index 627b1134223..2f37c9f35e2 100644
--- a/net/irda/af_irda.c
+++ b/net/irda/af_irda.c
@@ -1830,6 +1830,19 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1830 return 0; 1830 return 0;
1831} 1831}
1832 1832
1833#ifdef CONFIG_COMPAT
1834/*
1835 * Function irda_ioctl (sock, cmd, arg)
1836 */
1837static int irda_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1838{
1839 /*
1840 * All IRDA's ioctl are standard ones.
1841 */
1842 return -ENOIOCTLCMD;
1843}
1844#endif
1845
1833/* 1846/*
1834 * Function irda_setsockopt (sock, level, optname, optval, optlen) 1847 * Function irda_setsockopt (sock, level, optname, optval, optlen)
1835 * 1848 *
@@ -2476,6 +2489,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = {
2476 .getname = irda_getname, 2489 .getname = irda_getname,
2477 .poll = irda_poll, 2490 .poll = irda_poll,
2478 .ioctl = irda_ioctl, 2491 .ioctl = irda_ioctl,
2492#ifdef CONFIG_COMPAT
2493 .compat_ioctl = irda_compat_ioctl,
2494#endif
2479 .listen = irda_listen, 2495 .listen = irda_listen,
2480 .shutdown = irda_shutdown, 2496 .shutdown = irda_shutdown,
2481 .setsockopt = irda_setsockopt, 2497 .setsockopt = irda_setsockopt,
@@ -2497,6 +2513,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = {
2497 .getname = irda_getname, 2513 .getname = irda_getname,
2498 .poll = datagram_poll, 2514 .poll = datagram_poll,
2499 .ioctl = irda_ioctl, 2515 .ioctl = irda_ioctl,
2516#ifdef CONFIG_COMPAT
2517 .compat_ioctl = irda_compat_ioctl,
2518#endif
2500 .listen = irda_listen, 2519 .listen = irda_listen,
2501 .shutdown = irda_shutdown, 2520 .shutdown = irda_shutdown,
2502 .setsockopt = irda_setsockopt, 2521 .setsockopt = irda_setsockopt,
@@ -2518,6 +2537,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = {
2518 .getname = irda_getname, 2537 .getname = irda_getname,
2519 .poll = datagram_poll, 2538 .poll = datagram_poll,
2520 .ioctl = irda_ioctl, 2539 .ioctl = irda_ioctl,
2540#ifdef CONFIG_COMPAT
2541 .compat_ioctl = irda_compat_ioctl,
2542#endif
2521 .listen = irda_listen, 2543 .listen = irda_listen,
2522 .shutdown = irda_shutdown, 2544 .shutdown = irda_shutdown,
2523 .setsockopt = irda_setsockopt, 2545 .setsockopt = irda_setsockopt,
@@ -2540,6 +2562,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = {
2540 .getname = irda_getname, 2562 .getname = irda_getname,
2541 .poll = datagram_poll, 2563 .poll = datagram_poll,
2542 .ioctl = irda_ioctl, 2564 .ioctl = irda_ioctl,
2565#ifdef CONFIG_COMPAT
2566 .compat_ioctl = irda_compat_ioctl,
2567#endif
2543 .listen = sock_no_listen, 2568 .listen = sock_no_listen,
2544 .shutdown = irda_shutdown, 2569 .shutdown = irda_shutdown,
2545 .setsockopt = irda_setsockopt, 2570 .setsockopt = irda_setsockopt,
diff --git a/net/netfilter/nf_conntrack_ftp.c b/net/netfilter/nf_conntrack_ftp.c
index cd191b0d4ac..e38a4b5a308 100644
--- a/net/netfilter/nf_conntrack_ftp.c
+++ b/net/netfilter/nf_conntrack_ftp.c
@@ -624,7 +624,7 @@ static struct nf_conntrack_helper ftp[MAX_PORTS][2];
624static char ftp_names[MAX_PORTS][2][sizeof("ftp-65535")]; 624static char ftp_names[MAX_PORTS][2][sizeof("ftp-65535")];
625 625
626/* don't make this __exit, since it's called from __init ! */ 626/* don't make this __exit, since it's called from __init ! */
627static void fini(void) 627static void nf_conntrack_ftp_fini(void)
628{ 628{
629 int i, j; 629 int i, j;
630 for (i = 0; i < ports_c; i++) { 630 for (i = 0; i < ports_c; i++) {
@@ -642,7 +642,7 @@ static void fini(void)
642 kfree(ftp_buffer); 642 kfree(ftp_buffer);
643} 643}
644 644
645static int __init init(void) 645static int __init nf_conntrack_ftp_init(void)
646{ 646{
647 int i, j = -1, ret = 0; 647 int i, j = -1, ret = 0;
648 char *tmpname; 648 char *tmpname;
@@ -683,7 +683,7 @@ static int __init init(void)
683 printk("nf_ct_ftp: failed to register helper " 683 printk("nf_ct_ftp: failed to register helper "
684 " for pf: %d port: %d\n", 684 " for pf: %d port: %d\n",
685 ftp[i][j].tuple.src.l3num, ports[i]); 685 ftp[i][j].tuple.src.l3num, ports[i]);
686 fini(); 686 nf_conntrack_ftp_fini();
687 return ret; 687 return ret;
688 } 688 }
689 } 689 }
@@ -692,5 +692,5 @@ static int __init init(void)
692 return 0; 692 return 0;
693} 693}
694 694
695module_init(init); 695module_init(nf_conntrack_ftp_init);
696module_exit(fini); 696module_exit(nf_conntrack_ftp_fini);
diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c
index cf798e61e37..9cccc325b68 100644
--- a/net/netfilter/nf_conntrack_proto_sctp.c
+++ b/net/netfilter/nf_conntrack_proto_sctp.c
@@ -615,7 +615,7 @@ static ctl_table nf_ct_net_table[] = {
615static struct ctl_table_header *nf_ct_sysctl_header; 615static struct ctl_table_header *nf_ct_sysctl_header;
616#endif 616#endif
617 617
618int __init init(void) 618int __init nf_conntrack_proto_sctp_init(void)
619{ 619{
620 int ret; 620 int ret;
621 621
@@ -652,7 +652,7 @@ int __init init(void)
652 return ret; 652 return ret;
653} 653}
654 654
655void __exit fini(void) 655void __exit nf_conntrack_proto_sctp_fini(void)
656{ 656{
657 nf_conntrack_protocol_unregister(&nf_conntrack_protocol_sctp6); 657 nf_conntrack_protocol_unregister(&nf_conntrack_protocol_sctp6);
658 nf_conntrack_protocol_unregister(&nf_conntrack_protocol_sctp4); 658 nf_conntrack_protocol_unregister(&nf_conntrack_protocol_sctp4);
@@ -662,8 +662,8 @@ void __exit fini(void)
662 DEBUGP("SCTP conntrack module unloaded\n"); 662 DEBUGP("SCTP conntrack module unloaded\n");
663} 663}
664 664
665module_init(init); 665module_init(nf_conntrack_proto_sctp_init);
666module_exit(fini); 666module_exit(nf_conntrack_proto_sctp_fini);
667 667
668MODULE_LICENSE("GPL"); 668MODULE_LICENSE("GPL");
669MODULE_AUTHOR("Kiran Kumar Immidi"); 669MODULE_AUTHOR("Kiran Kumar Immidi");
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c
index 75577e175b3..c72aa3cd22e 100644
--- a/net/netfilter/nf_conntrack_standalone.c
+++ b/net/netfilter/nf_conntrack_standalone.c
@@ -806,18 +806,18 @@ void nf_conntrack_protocol_unregister(struct nf_conntrack_protocol *proto)
806 nf_ct_iterate_cleanup(kill_proto, proto); 806 nf_ct_iterate_cleanup(kill_proto, proto);
807} 807}
808 808
809static int __init init(void) 809static int __init nf_conntrack_standalone_init(void)
810{ 810{
811 return init_or_cleanup(1); 811 return init_or_cleanup(1);
812} 812}
813 813
814static void __exit fini(void) 814static void __exit nf_conntrack_standalone_fini(void)
815{ 815{
816 init_or_cleanup(0); 816 init_or_cleanup(0);
817} 817}
818 818
819module_init(init); 819module_init(nf_conntrack_standalone_init);
820module_exit(fini); 820module_exit(nf_conntrack_standalone_fini);
821 821
822/* Some modules need us, but don't depend directly on any symbol. 822/* Some modules need us, but don't depend directly on any symbol.
823 They should call this. */ 823 They should call this. */
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
index 54cbbaa712d..3e3f5448bac 100644
--- a/net/netfilter/nfnetlink_log.c
+++ b/net/netfilter/nfnetlink_log.c
@@ -1081,13 +1081,13 @@ cleanup_netlink_notifier:
1081 return status; 1081 return status;
1082} 1082}
1083 1083
1084static int __init init(void) 1084static int __init nfnetlink_log_init(void)
1085{ 1085{
1086 1086
1087 return init_or_cleanup(1); 1087 return init_or_cleanup(1);
1088} 1088}
1089 1089
1090static void __exit fini(void) 1090static void __exit nfnetlink_log_fini(void)
1091{ 1091{
1092 init_or_cleanup(0); 1092 init_or_cleanup(0);
1093} 1093}
@@ -1097,5 +1097,5 @@ MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
1097MODULE_LICENSE("GPL"); 1097MODULE_LICENSE("GPL");
1098MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_ULOG); 1098MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_ULOG);
1099 1099
1100module_init(init); 1100module_init(nfnetlink_log_init);
1101module_exit(fini); 1101module_exit(nfnetlink_log_fini);
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c
index b5701662182..d0e62f68139 100644
--- a/net/netfilter/nfnetlink_queue.c
+++ b/net/netfilter/nfnetlink_queue.c
@@ -1117,13 +1117,13 @@ cleanup_netlink_notifier:
1117 return status; 1117 return status;
1118} 1118}
1119 1119
1120static int __init init(void) 1120static int __init nfnetlink_queue_init(void)
1121{ 1121{
1122 1122
1123 return init_or_cleanup(1); 1123 return init_or_cleanup(1);
1124} 1124}
1125 1125
1126static void __exit fini(void) 1126static void __exit nfnetlink_queue_fini(void)
1127{ 1127{
1128 init_or_cleanup(0); 1128 init_or_cleanup(0);
1129} 1129}
@@ -1133,5 +1133,5 @@ MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
1133MODULE_LICENSE("GPL"); 1133MODULE_LICENSE("GPL");
1134MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_QUEUE); 1134MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_QUEUE);
1135 1135
1136module_init(init); 1136module_init(nfnetlink_queue_init);
1137module_exit(fini); 1137module_exit(nfnetlink_queue_fini);
diff --git a/net/netfilter/xt_CLASSIFY.c b/net/netfilter/xt_CLASSIFY.c
index 3cd2ac90a25..e54e5773001 100644
--- a/net/netfilter/xt_CLASSIFY.c
+++ b/net/netfilter/xt_CLASSIFY.c
@@ -62,7 +62,7 @@ static struct xt_target classify6_reg = {
62}; 62};
63 63
64 64
65static int __init init(void) 65static int __init xt_classify_init(void)
66{ 66{
67 int ret; 67 int ret;
68 68
@@ -77,11 +77,11 @@ static int __init init(void)
77 return ret; 77 return ret;
78} 78}
79 79
80static void __exit fini(void) 80static void __exit xt_classify_fini(void)
81{ 81{
82 xt_unregister_target(&classify_reg); 82 xt_unregister_target(&classify_reg);
83 xt_unregister_target(&classify6_reg); 83 xt_unregister_target(&classify6_reg);
84} 84}
85 85
86module_init(init); 86module_init(xt_classify_init);
87module_exit(fini); 87module_exit(xt_classify_fini);
diff --git a/net/netfilter/xt_CONNMARK.c b/net/netfilter/xt_CONNMARK.c
index 35448b8e688..60c375d36f0 100644
--- a/net/netfilter/xt_CONNMARK.c
+++ b/net/netfilter/xt_CONNMARK.c
@@ -115,7 +115,7 @@ static struct xt_target connmark6_reg = {
115 .me = THIS_MODULE 115 .me = THIS_MODULE
116}; 116};
117 117
118static int __init init(void) 118static int __init xt_connmark_init(void)
119{ 119{
120 int ret; 120 int ret;
121 121
@@ -132,11 +132,11 @@ static int __init init(void)
132 return ret; 132 return ret;
133} 133}
134 134
135static void __exit fini(void) 135static void __exit xt_connmark_fini(void)
136{ 136{
137 xt_unregister_target(&connmark_reg); 137 xt_unregister_target(&connmark_reg);
138 xt_unregister_target(&connmark6_reg); 138 xt_unregister_target(&connmark6_reg);
139} 139}
140 140
141module_init(init); 141module_init(xt_connmark_init);
142module_exit(fini); 142module_exit(xt_connmark_fini);
diff --git a/net/netfilter/xt_MARK.c b/net/netfilter/xt_MARK.c
index 73bdd5c80e1..ee9c34edc76 100644
--- a/net/netfilter/xt_MARK.c
+++ b/net/netfilter/xt_MARK.c
@@ -145,7 +145,7 @@ static struct xt_target ip6t_mark_reg_v0 = {
145 .revision = 0, 145 .revision = 0,
146}; 146};
147 147
148static int __init init(void) 148static int __init xt_mark_init(void)
149{ 149{
150 int err; 150 int err;
151 151
@@ -166,12 +166,12 @@ static int __init init(void)
166 return err; 166 return err;
167} 167}
168 168
169static void __exit fini(void) 169static void __exit xt_mark_fini(void)
170{ 170{
171 xt_unregister_target(&ipt_mark_reg_v0); 171 xt_unregister_target(&ipt_mark_reg_v0);
172 xt_unregister_target(&ipt_mark_reg_v1); 172 xt_unregister_target(&ipt_mark_reg_v1);
173 xt_unregister_target(&ip6t_mark_reg_v0); 173 xt_unregister_target(&ip6t_mark_reg_v0);
174} 174}
175 175
176module_init(init); 176module_init(xt_mark_init);
177module_exit(fini); 177module_exit(xt_mark_fini);
diff --git a/net/netfilter/xt_NFQUEUE.c b/net/netfilter/xt_NFQUEUE.c
index 2873e1c60f6..86ccceb61fd 100644
--- a/net/netfilter/xt_NFQUEUE.c
+++ b/net/netfilter/xt_NFQUEUE.c
@@ -61,7 +61,7 @@ static struct xt_target arpt_NFQ_reg = {
61 .me = THIS_MODULE, 61 .me = THIS_MODULE,
62}; 62};
63 63
64static int __init init(void) 64static int __init xt_nfqueue_init(void)
65{ 65{
66 int ret; 66 int ret;
67 ret = xt_register_target(&ipt_NFQ_reg); 67 ret = xt_register_target(&ipt_NFQ_reg);
@@ -83,12 +83,12 @@ out_ip:
83 return ret; 83 return ret;
84} 84}
85 85
86static void __exit fini(void) 86static void __exit xt_nfqueue_fini(void)
87{ 87{
88 xt_unregister_target(&arpt_NFQ_reg); 88 xt_unregister_target(&arpt_NFQ_reg);
89 xt_unregister_target(&ip6t_NFQ_reg); 89 xt_unregister_target(&ip6t_NFQ_reg);
90 xt_unregister_target(&ipt_NFQ_reg); 90 xt_unregister_target(&ipt_NFQ_reg);
91} 91}
92 92
93module_init(init); 93module_init(xt_nfqueue_init);
94module_exit(fini); 94module_exit(xt_nfqueue_fini);
diff --git a/net/netfilter/xt_NOTRACK.c b/net/netfilter/xt_NOTRACK.c
index cf2ebd76fd6..98f4b5363ce 100644
--- a/net/netfilter/xt_NOTRACK.c
+++ b/net/netfilter/xt_NOTRACK.c
@@ -52,7 +52,7 @@ static struct xt_target notrack6_reg = {
52 .me = THIS_MODULE, 52 .me = THIS_MODULE,
53}; 53};
54 54
55static int __init init(void) 55static int __init xt_notrack_init(void)
56{ 56{
57 int ret; 57 int ret;
58 58
@@ -67,11 +67,11 @@ static int __init init(void)
67 return ret; 67 return ret;
68} 68}
69 69
70static void __exit fini(void) 70static void __exit xt_notrack_fini(void)
71{ 71{
72 xt_unregister_target(&notrack6_reg); 72 xt_unregister_target(&notrack6_reg);
73 xt_unregister_target(&notrack_reg); 73 xt_unregister_target(&notrack_reg);
74} 74}
75 75
76module_init(init); 76module_init(xt_notrack_init);
77module_exit(fini); 77module_exit(xt_notrack_fini);
diff --git a/net/netfilter/xt_comment.c b/net/netfilter/xt_comment.c
index 2637724b498..197609cb06d 100644
--- a/net/netfilter/xt_comment.c
+++ b/net/netfilter/xt_comment.c
@@ -45,7 +45,7 @@ static struct xt_match comment6_match = {
45 .me = THIS_MODULE 45 .me = THIS_MODULE
46}; 46};
47 47
48static int __init init(void) 48static int __init xt_comment_init(void)
49{ 49{
50 int ret; 50 int ret;
51 51
@@ -60,11 +60,11 @@ static int __init init(void)
60 return ret; 60 return ret;
61} 61}
62 62
63static void __exit fini(void) 63static void __exit xt_comment_fini(void)
64{ 64{
65 xt_unregister_match(&comment_match); 65 xt_unregister_match(&comment_match);
66 xt_unregister_match(&comment6_match); 66 xt_unregister_match(&comment6_match);
67} 67}
68 68
69module_init(init); 69module_init(xt_comment_init);
70module_exit(fini); 70module_exit(xt_comment_fini);
diff --git a/net/netfilter/xt_connbytes.c b/net/netfilter/xt_connbytes.c
index 4985f5ec58c..1396fe2d07c 100644
--- a/net/netfilter/xt_connbytes.c
+++ b/net/netfilter/xt_connbytes.c
@@ -160,7 +160,7 @@ static struct xt_match connbytes6_match = {
160 .me = THIS_MODULE 160 .me = THIS_MODULE
161}; 161};
162 162
163static int __init init(void) 163static int __init xt_connbytes_init(void)
164{ 164{
165 int ret; 165 int ret;
166 ret = xt_register_match(&connbytes_match); 166 ret = xt_register_match(&connbytes_match);
@@ -173,11 +173,11 @@ static int __init init(void)
173 return ret; 173 return ret;
174} 174}
175 175
176static void __exit fini(void) 176static void __exit xt_connbytes_fini(void)
177{ 177{
178 xt_unregister_match(&connbytes_match); 178 xt_unregister_match(&connbytes_match);
179 xt_unregister_match(&connbytes6_match); 179 xt_unregister_match(&connbytes6_match);
180} 180}
181 181
182module_init(init); 182module_init(xt_connbytes_init);
183module_exit(fini); 183module_exit(xt_connbytes_fini);
diff --git a/net/netfilter/xt_connmark.c b/net/netfilter/xt_connmark.c
index 7b16f1ee16b..dc26a27cbca 100644
--- a/net/netfilter/xt_connmark.c
+++ b/net/netfilter/xt_connmark.c
@@ -102,7 +102,7 @@ static struct xt_match connmark6_match = {
102 .me = THIS_MODULE 102 .me = THIS_MODULE
103}; 103};
104 104
105static int __init init(void) 105static int __init xt_connmark_init(void)
106{ 106{
107 int ret; 107 int ret;
108 108
@@ -118,11 +118,11 @@ static int __init init(void)
118 return ret; 118 return ret;
119} 119}
120 120
121static void __exit fini(void) 121static void __exit xt_connmark_fini(void)
122{ 122{
123 xt_unregister_match(&connmark6_match); 123 xt_unregister_match(&connmark6_match);
124 xt_unregister_match(&connmark_match); 124 xt_unregister_match(&connmark_match);
125} 125}
126 126
127module_init(init); 127module_init(xt_connmark_init);
128module_exit(fini); 128module_exit(xt_connmark_fini);
diff --git a/net/netfilter/xt_conntrack.c b/net/netfilter/xt_conntrack.c
index 65a84809fd3..145489a4c3f 100644
--- a/net/netfilter/xt_conntrack.c
+++ b/net/netfilter/xt_conntrack.c
@@ -239,7 +239,7 @@ static struct xt_match conntrack_match = {
239 .me = THIS_MODULE, 239 .me = THIS_MODULE,
240}; 240};
241 241
242static int __init init(void) 242static int __init xt_conntrack_init(void)
243{ 243{
244 int ret; 244 int ret;
245 need_conntrack(); 245 need_conntrack();
@@ -248,10 +248,10 @@ static int __init init(void)
248 return ret; 248 return ret;
249} 249}
250 250
251static void __exit fini(void) 251static void __exit xt_conntrack_fini(void)
252{ 252{
253 xt_unregister_match(&conntrack_match); 253 xt_unregister_match(&conntrack_match);
254} 254}
255 255
256module_init(init); 256module_init(xt_conntrack_init);
257module_exit(fini); 257module_exit(xt_conntrack_fini);
diff --git a/net/netfilter/xt_dccp.c b/net/netfilter/xt_dccp.c
index 2f331decd15..dfb10b648e5 100644
--- a/net/netfilter/xt_dccp.c
+++ b/net/netfilter/xt_dccp.c
@@ -164,7 +164,7 @@ static struct xt_match dccp6_match =
164}; 164};
165 165
166 166
167static int __init init(void) 167static int __init xt_dccp_init(void)
168{ 168{
169 int ret; 169 int ret;
170 170
@@ -191,12 +191,12 @@ out_kfree:
191 return ret; 191 return ret;
192} 192}
193 193
194static void __exit fini(void) 194static void __exit xt_dccp_fini(void)
195{ 195{
196 xt_unregister_match(&dccp6_match); 196 xt_unregister_match(&dccp6_match);
197 xt_unregister_match(&dccp_match); 197 xt_unregister_match(&dccp_match);
198 kfree(dccp_optbuf); 198 kfree(dccp_optbuf);
199} 199}
200 200
201module_init(init); 201module_init(xt_dccp_init);
202module_exit(fini); 202module_exit(xt_dccp_fini);
diff --git a/net/netfilter/xt_helper.c b/net/netfilter/xt_helper.c
index 101f0005e98..799c2a43e3b 100644
--- a/net/netfilter/xt_helper.c
+++ b/net/netfilter/xt_helper.c
@@ -182,7 +182,7 @@ static struct xt_match helper6_match = {
182 .me = THIS_MODULE, 182 .me = THIS_MODULE,
183}; 183};
184 184
185static int __init init(void) 185static int __init xt_helper_init(void)
186{ 186{
187 int ret; 187 int ret;
188 need_conntrack(); 188 need_conntrack();
@@ -198,12 +198,12 @@ static int __init init(void)
198 return ret; 198 return ret;
199} 199}
200 200
201static void __exit fini(void) 201static void __exit xt_helper_fini(void)
202{ 202{
203 xt_unregister_match(&helper_match); 203 xt_unregister_match(&helper_match);
204 xt_unregister_match(&helper6_match); 204 xt_unregister_match(&helper6_match);
205} 205}
206 206
207module_init(init); 207module_init(xt_helper_init);
208module_exit(fini); 208module_exit(xt_helper_fini);
209 209
diff --git a/net/netfilter/xt_length.c b/net/netfilter/xt_length.c
index 38560caef75..109132c9a14 100644
--- a/net/netfilter/xt_length.c
+++ b/net/netfilter/xt_length.c
@@ -68,7 +68,7 @@ static struct xt_match length6_match = {
68 .me = THIS_MODULE, 68 .me = THIS_MODULE,
69}; 69};
70 70
71static int __init init(void) 71static int __init xt_length_init(void)
72{ 72{
73 int ret; 73 int ret;
74 ret = xt_register_match(&length_match); 74 ret = xt_register_match(&length_match);
@@ -81,11 +81,11 @@ static int __init init(void)
81 return ret; 81 return ret;
82} 82}
83 83
84static void __exit fini(void) 84static void __exit xt_length_fini(void)
85{ 85{
86 xt_unregister_match(&length_match); 86 xt_unregister_match(&length_match);
87 xt_unregister_match(&length6_match); 87 xt_unregister_match(&length6_match);
88} 88}
89 89
90module_init(init); 90module_init(xt_length_init);
91module_exit(fini); 91module_exit(xt_length_fini);
diff --git a/net/netfilter/xt_limit.c b/net/netfilter/xt_limit.c
index e91c1a444e7..ce7fdb7e4e0 100644
--- a/net/netfilter/xt_limit.c
+++ b/net/netfilter/xt_limit.c
@@ -153,7 +153,7 @@ static struct xt_match limit6_reg = {
153 .me = THIS_MODULE, 153 .me = THIS_MODULE,
154}; 154};
155 155
156static int __init init(void) 156static int __init xt_limit_init(void)
157{ 157{
158 int ret; 158 int ret;
159 159
@@ -168,11 +168,11 @@ static int __init init(void)
168 return ret; 168 return ret;
169} 169}
170 170
171static void __exit fini(void) 171static void __exit xt_limit_fini(void)
172{ 172{
173 xt_unregister_match(&ipt_limit_reg); 173 xt_unregister_match(&ipt_limit_reg);
174 xt_unregister_match(&limit6_reg); 174 xt_unregister_match(&limit6_reg);
175} 175}
176 176
177module_init(init); 177module_init(xt_limit_init);
178module_exit(fini); 178module_exit(xt_limit_fini);
diff --git a/net/netfilter/xt_mac.c b/net/netfilter/xt_mac.c
index f4defa28a6e..356290ffe38 100644
--- a/net/netfilter/xt_mac.c
+++ b/net/netfilter/xt_mac.c
@@ -62,7 +62,7 @@ static struct xt_match mac6_match = {
62 .me = THIS_MODULE, 62 .me = THIS_MODULE,
63}; 63};
64 64
65static int __init init(void) 65static int __init xt_mac_init(void)
66{ 66{
67 int ret; 67 int ret;
68 ret = xt_register_match(&mac_match); 68 ret = xt_register_match(&mac_match);
@@ -76,11 +76,11 @@ static int __init init(void)
76 return ret; 76 return ret;
77} 77}
78 78
79static void __exit fini(void) 79static void __exit xt_mac_fini(void)
80{ 80{
81 xt_unregister_match(&mac_match); 81 xt_unregister_match(&mac_match);
82 xt_unregister_match(&mac6_match); 82 xt_unregister_match(&mac6_match);
83} 83}
84 84
85module_init(init); 85module_init(xt_mac_init);
86module_exit(fini); 86module_exit(xt_mac_fini);
diff --git a/net/netfilter/xt_mark.c b/net/netfilter/xt_mark.c
index ce0badfeef9..8b385a34886 100644
--- a/net/netfilter/xt_mark.c
+++ b/net/netfilter/xt_mark.c
@@ -69,7 +69,7 @@ static struct xt_match mark6_match = {
69 .me = THIS_MODULE, 69 .me = THIS_MODULE,
70}; 70};
71 71
72static int __init init(void) 72static int __init xt_mark_init(void)
73{ 73{
74 int ret; 74 int ret;
75 ret = xt_register_match(&mark_match); 75 ret = xt_register_match(&mark_match);
@@ -83,11 +83,11 @@ static int __init init(void)
83 return ret; 83 return ret;
84} 84}
85 85
86static void __exit fini(void) 86static void __exit xt_mark_fini(void)
87{ 87{
88 xt_unregister_match(&mark_match); 88 xt_unregister_match(&mark_match);
89 xt_unregister_match(&mark6_match); 89 xt_unregister_match(&mark6_match);
90} 90}
91 91
92module_init(init); 92module_init(xt_mark_init);
93module_exit(fini); 93module_exit(xt_mark_fini);
diff --git a/net/netfilter/xt_physdev.c b/net/netfilter/xt_physdev.c
index 089f4f7e863..5fe4c9df17f 100644
--- a/net/netfilter/xt_physdev.c
+++ b/net/netfilter/xt_physdev.c
@@ -134,7 +134,7 @@ static struct xt_match physdev6_match = {
134 .me = THIS_MODULE, 134 .me = THIS_MODULE,
135}; 135};
136 136
137static int __init init(void) 137static int __init xt_physdev_init(void)
138{ 138{
139 int ret; 139 int ret;
140 140
@@ -149,11 +149,11 @@ static int __init init(void)
149 return ret; 149 return ret;
150} 150}
151 151
152static void __exit fini(void) 152static void __exit xt_physdev_fini(void)
153{ 153{
154 xt_unregister_match(&physdev_match); 154 xt_unregister_match(&physdev_match);
155 xt_unregister_match(&physdev6_match); 155 xt_unregister_match(&physdev6_match);
156} 156}
157 157
158module_init(init); 158module_init(xt_physdev_init);
159module_exit(fini); 159module_exit(xt_physdev_fini);
diff --git a/net/netfilter/xt_pkttype.c b/net/netfilter/xt_pkttype.c
index 8b8bca988ac..3ac703b5cb8 100644
--- a/net/netfilter/xt_pkttype.c
+++ b/net/netfilter/xt_pkttype.c
@@ -49,7 +49,7 @@ static struct xt_match pkttype6_match = {
49 .me = THIS_MODULE, 49 .me = THIS_MODULE,
50}; 50};
51 51
52static int __init init(void) 52static int __init xt_pkttype_init(void)
53{ 53{
54 int ret; 54 int ret;
55 ret = xt_register_match(&pkttype_match); 55 ret = xt_register_match(&pkttype_match);
@@ -63,11 +63,11 @@ static int __init init(void)
63 return ret; 63 return ret;
64} 64}
65 65
66static void __exit fini(void) 66static void __exit xt_pkttype_fini(void)
67{ 67{
68 xt_unregister_match(&pkttype_match); 68 xt_unregister_match(&pkttype_match);
69 xt_unregister_match(&pkttype6_match); 69 xt_unregister_match(&pkttype6_match);
70} 70}
71 71
72module_init(init); 72module_init(xt_pkttype_init);
73module_exit(fini); 73module_exit(xt_pkttype_fini);
diff --git a/net/netfilter/xt_realm.c b/net/netfilter/xt_realm.c
index 5e31a4a835b..a80b7d132b6 100644
--- a/net/netfilter/xt_realm.c
+++ b/net/netfilter/xt_realm.c
@@ -49,15 +49,15 @@ static struct xt_match realm_match = {
49 .me = THIS_MODULE 49 .me = THIS_MODULE
50}; 50};
51 51
52static int __init init(void) 52static int __init xt_realm_init(void)
53{ 53{
54 return xt_register_match(&realm_match); 54 return xt_register_match(&realm_match);
55} 55}
56 56
57static void __exit fini(void) 57static void __exit xt_realm_fini(void)
58{ 58{
59 xt_unregister_match(&realm_match); 59 xt_unregister_match(&realm_match);
60} 60}
61 61
62module_init(init); 62module_init(xt_realm_init);
63module_exit(fini); 63module_exit(xt_realm_fini);
diff --git a/net/netfilter/xt_sctp.c b/net/netfilter/xt_sctp.c
index c6eb24a2fe1..34bd87259a0 100644
--- a/net/netfilter/xt_sctp.c
+++ b/net/netfilter/xt_sctp.c
@@ -200,7 +200,7 @@ static struct xt_match sctp6_match = {
200 .me = THIS_MODULE 200 .me = THIS_MODULE
201}; 201};
202 202
203static int __init init(void) 203static int __init xt_sctp_init(void)
204{ 204{
205 int ret; 205 int ret;
206 ret = xt_register_match(&sctp_match); 206 ret = xt_register_match(&sctp_match);
@@ -214,11 +214,11 @@ static int __init init(void)
214 return ret; 214 return ret;
215} 215}
216 216
217static void __exit fini(void) 217static void __exit xt_sctp_fini(void)
218{ 218{
219 xt_unregister_match(&sctp6_match); 219 xt_unregister_match(&sctp6_match);
220 xt_unregister_match(&sctp_match); 220 xt_unregister_match(&sctp_match);
221} 221}
222 222
223module_init(init); 223module_init(xt_sctp_init);
224module_exit(fini); 224module_exit(xt_sctp_fini);
diff --git a/net/netfilter/xt_state.c b/net/netfilter/xt_state.c
index e6c0be9d94d..f9e304dc450 100644
--- a/net/netfilter/xt_state.c
+++ b/net/netfilter/xt_state.c
@@ -89,7 +89,7 @@ static struct xt_match state6_match = {
89 .me = THIS_MODULE, 89 .me = THIS_MODULE,
90}; 90};
91 91
92static int __init init(void) 92static int __init xt_state_init(void)
93{ 93{
94 int ret; 94 int ret;
95 95
@@ -106,11 +106,11 @@ static int __init init(void)
106 return ret; 106 return ret;
107} 107}
108 108
109static void __exit fini(void) 109static void __exit xt_state_fini(void)
110{ 110{
111 xt_unregister_match(&state_match); 111 xt_unregister_match(&state_match);
112 xt_unregister_match(&state6_match); 112 xt_unregister_match(&state6_match);
113} 113}
114 114
115module_init(init); 115module_init(xt_state_init);
116module_exit(fini); 116module_exit(xt_state_fini);
diff --git a/net/netfilter/xt_string.c b/net/netfilter/xt_string.c
index 703d80fccac..79d9ea6964b 100644
--- a/net/netfilter/xt_string.c
+++ b/net/netfilter/xt_string.c
@@ -91,7 +91,7 @@ static struct xt_match string6_match = {
91 .me = THIS_MODULE 91 .me = THIS_MODULE
92}; 92};
93 93
94static int __init init(void) 94static int __init xt_string_init(void)
95{ 95{
96 int ret; 96 int ret;
97 97
@@ -105,11 +105,11 @@ static int __init init(void)
105 return ret; 105 return ret;
106} 106}
107 107
108static void __exit fini(void) 108static void __exit xt_string_fini(void)
109{ 109{
110 xt_unregister_match(&string_match); 110 xt_unregister_match(&string_match);
111 xt_unregister_match(&string6_match); 111 xt_unregister_match(&string6_match);
112} 112}
113 113
114module_init(init); 114module_init(xt_string_init);
115module_exit(fini); 115module_exit(xt_string_fini);
diff --git a/net/netfilter/xt_tcpmss.c b/net/netfilter/xt_tcpmss.c
index 70a8858ae3f..cf7d335cadc 100644
--- a/net/netfilter/xt_tcpmss.c
+++ b/net/netfilter/xt_tcpmss.c
@@ -112,7 +112,7 @@ static struct xt_match tcpmss6_match = {
112}; 112};
113 113
114 114
115static int __init init(void) 115static int __init xt_tcpmss_init(void)
116{ 116{
117 int ret; 117 int ret;
118 ret = xt_register_match(&tcpmss_match); 118 ret = xt_register_match(&tcpmss_match);
@@ -126,11 +126,11 @@ static int __init init(void)
126 return ret; 126 return ret;
127} 127}
128 128
129static void __exit fini(void) 129static void __exit xt_tcpmss_fini(void)
130{ 130{
131 xt_unregister_match(&tcpmss6_match); 131 xt_unregister_match(&tcpmss6_match);
132 xt_unregister_match(&tcpmss_match); 132 xt_unregister_match(&tcpmss_match);
133} 133}
134 134
135module_init(init); 135module_init(xt_tcpmss_init);
136module_exit(fini); 136module_exit(xt_tcpmss_fini);
diff --git a/net/netfilter/xt_tcpudp.c b/net/netfilter/xt_tcpudp.c
index 14a990eb666..1b61dac9c87 100644
--- a/net/netfilter/xt_tcpudp.c
+++ b/net/netfilter/xt_tcpudp.c
@@ -238,7 +238,7 @@ static struct xt_match udp6_matchstruct = {
238 .me = THIS_MODULE, 238 .me = THIS_MODULE,
239}; 239};
240 240
241static int __init init(void) 241static int __init xt_tcpudp_init(void)
242{ 242{
243 int ret; 243 int ret;
244 ret = xt_register_match(&tcp_matchstruct); 244 ret = xt_register_match(&tcp_matchstruct);
@@ -268,7 +268,7 @@ out_unreg_tcp:
268 return ret; 268 return ret;
269} 269}
270 270
271static void __exit fini(void) 271static void __exit xt_tcpudp_fini(void)
272{ 272{
273 xt_unregister_match(&udp6_matchstruct); 273 xt_unregister_match(&udp6_matchstruct);
274 xt_unregister_match(&udp_matchstruct); 274 xt_unregister_match(&udp_matchstruct);
@@ -276,5 +276,5 @@ static void __exit fini(void)
276 xt_unregister_match(&tcp_matchstruct); 276 xt_unregister_match(&tcp_matchstruct);
277} 277}
278 278
279module_init(init); 279module_init(xt_tcpudp_init);
280module_exit(fini); 280module_exit(xt_tcpudp_fini);
diff --git a/net/socket.c b/net/socket.c
index fcd77eac0cc..b13042f68c0 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -119,6 +119,9 @@ static ssize_t sock_writev(struct file *file, const struct iovec *vector,
119static ssize_t sock_sendpage(struct file *file, struct page *page, 119static ssize_t sock_sendpage(struct file *file, struct page *page,
120 int offset, size_t size, loff_t *ppos, int more); 120 int offset, size_t size, loff_t *ppos, int more);
121 121
122extern ssize_t generic_splice_sendpage(struct inode *inode, struct file *out,
123 size_t len, unsigned int flags);
124
122 125
123/* 126/*
124 * Socket files have a set of 'special' operations as well as the generic file ones. These don't appear 127 * Socket files have a set of 'special' operations as well as the generic file ones. These don't appear
@@ -141,7 +144,8 @@ static struct file_operations socket_file_ops = {
141 .fasync = sock_fasync, 144 .fasync = sock_fasync,
142 .readv = sock_readv, 145 .readv = sock_readv,
143 .writev = sock_writev, 146 .writev = sock_writev,
144 .sendpage = sock_sendpage 147 .sendpage = sock_sendpage,
148 .splice_write = generic_splice_sendpage,
145}; 149};
146 150
147/* 151/*