ipv6: Pull IPv6 GSO registration out of the module
authorVlad Yasevich <vyasevic@redhat.com>
Thu, 15 Nov 2012 08:49:22 +0000 (08:49 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 15 Nov 2012 22:39:24 +0000 (17:39 -0500)
Sing GSO support is now separate, pull it out of the module
and make it its own init call.
Remove the cleanup functions as they are no longer called.

Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
12 files changed:
include/net/protocol.h
net/ipv6/Makefile
net/ipv6/af_inet6.c
net/ipv6/exthdrs.c
net/ipv6/exthdrs_offload.c
net/ipv6/ip6_offload.c
net/ipv6/ip6_offload.h
net/ipv6/protocol.c
net/ipv6/tcp_ipv6.c
net/ipv6/tcpv6_offload.c
net/ipv6/udp.c
net/ipv6/udp_offload.c

index 7019c16378481f0288824e304ade6319b0a3452c..2c90794c139df66cdd6e309d773c35e085c0ff68 100644 (file)
@@ -25,6 +25,7 @@
 #define _PROTOCOL_H
 
 #include <linux/in6.h>
+#include <linux/skbuff.h>
 #if IS_ENABLED(CONFIG_IPV6)
 #include <linux/ipv6.h>
 #endif
@@ -59,8 +60,6 @@ struct inet6_protocol {
 
 #define INET6_PROTO_NOPOLICY   0x1
 #define INET6_PROTO_FINAL      0x2
-/* This should be set for any extension header which is compatible with GSO. */
-#define INET6_PROTO_GSO_EXTHDR 0x4
 #endif
 
 struct net_offload {
@@ -72,6 +71,8 @@ struct net_offload {
        int                     (*gro_complete)(struct sk_buff *skb);
        unsigned int            flags;  /* Flags used by IPv6 for now */
 };
+/* This should be set for any extension header which is compatible with GSO. */
+#define INET6_PROTO_GSO_EXTHDR 0x1
 
 /* This is used to register socket interfaces for IP protocols.  */
 struct inet_protosw {
@@ -93,10 +94,10 @@ struct inet_protosw {
 
 extern const struct net_protocol __rcu *inet_protos[MAX_INET_PROTOS];
 extern const struct net_offload __rcu *inet_offloads[MAX_INET_PROTOS];
+extern const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS];
 
 #if IS_ENABLED(CONFIG_IPV6)
 extern const struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS];
-extern const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS];
 #endif
 
 extern int     inet_add_protocol(const struct net_protocol *prot, unsigned char num);
@@ -109,10 +110,10 @@ extern void       inet_unregister_protosw(struct inet_protosw *p);
 #if IS_ENABLED(CONFIG_IPV6)
 extern int     inet6_add_protocol(const struct inet6_protocol *prot, unsigned char num);
 extern int     inet6_del_protocol(const struct inet6_protocol *prot, unsigned char num);
-extern int     inet6_add_offload(const struct net_offload *prot, unsigned char num);
-extern int     inet6_del_offload(const struct net_offload *prot, unsigned char num);
 extern int     inet6_register_protosw(struct inet_protosw *p);
 extern void    inet6_unregister_protosw(struct inet_protosw *p);
 #endif
+extern int     inet6_add_offload(const struct net_offload *prot, unsigned char num);
+extern int     inet6_del_offload(const struct net_offload *prot, unsigned char num);
 
 #endif /* _PROTOCOL_H */
index cdca302f395c36a59ad75b8a18afc8536d727e87..04a475df98addaabe019db22609e56f960debcc5 100644 (file)
@@ -7,7 +7,7 @@ obj-$(CONFIG_IPV6) += ipv6.o
 ipv6-objs :=   af_inet6.o anycast.o ip6_output.o ip6_input.o addrconf.o \
                addrlabel.o \
                route.o ip6_fib.o ipv6_sockglue.o ndisc.o udp.o udplite.o \
-               raw.o protocol.o icmp.o mcast.o reassembly.o tcp_ipv6.o \
+               raw.o icmp.o mcast.o reassembly.o tcp_ipv6.o \
                exthdrs.o datagram.o ip6_flowlabel.o inet6_connection_sock.o
 
 ipv6-offload :=        ip6_offload.o tcpv6_offload.o udp_offload.o exthdrs_offload.o
@@ -23,7 +23,6 @@ ipv6-$(CONFIG_PROC_FS) += proc.o
 ipv6-$(CONFIG_SYN_COOKIES) += syncookies.o
 
 ipv6-objs += $(ipv6-y)
-ipv6-objs += $(ipv6-offload)
 
 obj-$(CONFIG_INET6_AH) += ah6.o
 obj-$(CONFIG_INET6_ESP) += esp6.o
@@ -41,6 +40,7 @@ obj-$(CONFIG_IPV6_SIT) += sit.o
 obj-$(CONFIG_IPV6_TUNNEL) += ip6_tunnel.o
 obj-$(CONFIG_IPV6_GRE) += ip6_gre.o
 
-obj-y += addrconf_core.o exthdrs_core.o output_core.o
+obj-y += addrconf_core.o exthdrs_core.o output_core.o protocol.o
+obj-y += $(ipv6-offload)
 
 obj-$(subst m,y,$(CONFIG_IPV6)) += inet6_hashtables.o
index c84d5ba60cddba947421af811de4179780082130..7bafc51cda117c1d58270773a0b42818e3addfa9 100644 (file)
@@ -62,7 +62,6 @@
 
 #include <asm/uaccess.h>
 #include <linux/mroute6.h>
-#include "ip6_offload.h"
 
 MODULE_AUTHOR("Cast of dozens");
 MODULE_DESCRIPTION("IPv6 protocol stack for Linux");
@@ -707,14 +706,12 @@ static struct packet_type ipv6_packet_type __read_mostly = {
 
 static int __init ipv6_packet_init(void)
 {
-       ipv6_offload_init();
        dev_add_pack(&ipv6_packet_type);
        return 0;
 }
 
 static void ipv6_packet_cleanup(void)
 {
-       ipv6_offload_cleanup();
        dev_remove_pack(&ipv6_packet_type);
 }
 
index a786a20ad823985299591736ad79f8dbd6d9a78f..473f628f9f203d2e0c58466f32603ce50a330402 100644 (file)
@@ -48,7 +48,6 @@
 #endif
 
 #include <asm/uaccess.h>
-#include "ip6_offload.h"
 
 /*
  *     Parsing tlv encoded headers.
@@ -502,13 +501,9 @@ int __init ipv6_exthdrs_init(void)
 {
        int ret;
 
-       ret = ipv6_exthdrs_offload_init();
-       if (ret)
-               goto out;
-
        ret = inet6_add_protocol(&rthdr_protocol, IPPROTO_ROUTING);
        if (ret)
-               goto out_offload;
+               goto out;
 
        ret = inet6_add_protocol(&destopt_protocol, IPPROTO_DSTOPTS);
        if (ret)
@@ -524,14 +519,11 @@ out_destopt:
        inet6_del_protocol(&destopt_protocol, IPPROTO_DSTOPTS);
 out_rthdr:
        inet6_del_protocol(&rthdr_protocol, IPPROTO_ROUTING);
-out_offload:
-       ipv6_exthdrs_offload_exit();
        goto out;
 };
 
 void ipv6_exthdrs_exit(void)
 {
-       ipv6_exthdrs_offload_exit();
        inet6_del_protocol(&nodata_protocol, IPPROTO_NONE);
        inet6_del_protocol(&destopt_protocol, IPPROTO_DSTOPTS);
        inet6_del_protocol(&rthdr_protocol, IPPROTO_ROUTING);
index 271bf4a970235ffc5fe0fac6a387e2683e9a4a62..cf77f3abfd061280f6a211deb4a24bcd247c944a 100644 (file)
@@ -39,9 +39,3 @@ out_rt:
        inet_del_offload(&rthdr_offload, IPPROTO_ROUTING);
        goto out;
 }
-
-void ipv6_exthdrs_offload_exit(void)
-{
-       inet_del_offload(&rthdr_offload, IPPROTO_ROUTING);
-       inet_del_offload(&rthdr_offload, IPPROTO_DSTOPTS);
-}
index 01cf9835a581d56ec081e1624ff81ff1bef4a143..63d79d9005bd3dc61fbdaf89d798a38c954d005e 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/socket.h>
 #include <linux/netdevice.h>
 #include <linux/skbuff.h>
+#include <linux/printk.h>
 
 #include <net/protocol.h>
 #include <net/ipv6.h>
@@ -262,12 +263,18 @@ static struct packet_offload ipv6_packet_offload __read_mostly = {
        .gro_complete = ipv6_gro_complete,
 };
 
-void __init ipv6_offload_init(void)
+static int __init ipv6_offload_init(void)
 {
+
+       if (tcpv6_offload_init() < 0)
+               pr_crit("%s: Cannot add TCP protocol offload\n", __func__);
+       if (udp_offload_init() < 0)
+               pr_crit("%s: Cannot add UDP protocol offload\n", __func__);
+       if (ipv6_exthdrs_offload_init() < 0)
+               pr_crit("%s: Cannot add EXTHDRS protocol offload\n", __func__);
+
        dev_add_offload(&ipv6_packet_offload);
+       return 0;
 }
 
-void ipv6_offload_cleanup(void)
-{
-       dev_remove_offload(&ipv6_packet_offload);
-}
+fs_initcall(ipv6_offload_init);
index 4e88ddb52a2cf2d324930b736b4274874db21868..2e155c651b35554e6156ec0bd6852736ded3c23c 100644 (file)
 #define __ip6_offload_h
 
 int ipv6_exthdrs_offload_init(void);
-void ipv6_exthdrs_offload_exit(void);
-
 int udp_offload_init(void);
-void udp_offload_cleanup(void);
-
 int tcpv6_offload_init(void);
-void tcpv6_offload_cleanup(void);
-
-extern void ipv6_offload_init(void);
-extern void ipv6_offload_cleanup(void);
 
 #endif
index f7c53a7d5cb05c3f3e0a892f15922db687fc80aa..22d1bd4670dab741b2417051b45370b4a75b42a3 100644 (file)
@@ -25,8 +25,9 @@
 #include <linux/spinlock.h>
 #include <net/protocol.h>
 
+#if IS_ENABLED(CONFIG_IPV6)
 const struct inet6_protocol __rcu *inet6_protos[MAX_INET_PROTOS] __read_mostly;
-const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS] __read_mostly;
+EXPORT_SYMBOL(inet6_protos);
 
 int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char protocol)
 {
@@ -35,13 +36,6 @@ int inet6_add_protocol(const struct inet6_protocol *prot, unsigned char protocol
 }
 EXPORT_SYMBOL(inet6_add_protocol);
 
-int inet6_add_offload(const struct net_offload *prot, unsigned char protocol)
-{
-       return !cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
-                       NULL, prot) ? 0 : -1;
-}
-EXPORT_SYMBOL(inet6_add_offload);
-
 /*
  *     Remove a protocol from the hash tables.
  */
@@ -58,6 +52,16 @@ int inet6_del_protocol(const struct inet6_protocol *prot, unsigned char protocol
        return ret;
 }
 EXPORT_SYMBOL(inet6_del_protocol);
+#endif
+
+const struct net_offload __rcu *inet6_offloads[MAX_INET_PROTOS] __read_mostly;
+
+int inet6_add_offload(const struct net_offload *prot, unsigned char protocol)
+{
+       return !cmpxchg((const struct net_offload **)&inet6_offloads[protocol],
+                       NULL, prot) ? 0 : -1;
+}
+EXPORT_SYMBOL(inet6_add_offload);
 
 int inet6_del_offload(const struct net_offload *prot, unsigned char protocol)
 {
index 5bed594b429d06fe0f920187dc70911824551daa..6c0f2526f3f1742f011195cf00a8f24c9aaa0e99 100644 (file)
@@ -71,7 +71,6 @@
 
 #include <linux/crypto.h>
 #include <linux/scatterlist.h>
-#include "ip6_offload.h"
 
 static void    tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb);
 static void    tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
@@ -2007,13 +2006,9 @@ int __init tcpv6_init(void)
 {
        int ret;
 
-       ret = tcpv6_offload_init();
-       if (ret)
-               goto out;
-
        ret = inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP);
        if (ret)
-               goto out_offload;
+               goto out;
 
        /* register inet6 protocol */
        ret = inet6_register_protosw(&tcpv6_protosw);
@@ -2030,8 +2025,6 @@ out_tcpv6_protosw:
        inet6_unregister_protosw(&tcpv6_protosw);
 out_tcpv6_protocol:
        inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
-out_offload:
-       tcpv6_offload_cleanup();
        goto out;
 }
 
@@ -2040,5 +2033,4 @@ void tcpv6_exit(void)
        unregister_pernet_subsys(&tcpv6_net_ops);
        inet6_unregister_protosw(&tcpv6_protosw);
        inet6_del_protocol(&tcpv6_protocol, IPPROTO_TCP);
-       tcpv6_offload_cleanup();
 }
index edeafedba4708a447fa089e4e9e6566c006964c8..3a27fe685c8ee882e0d94ff6181a9bf6da230be4 100644 (file)
@@ -91,8 +91,3 @@ int __init tcpv6_offload_init(void)
 {
        return inet6_add_offload(&tcpv6_offload, IPPROTO_TCP);
 }
-
-void tcpv6_offload_cleanup(void)
-{
-       inet6_del_offload(&tcpv6_offload, IPPROTO_TCP);
-}
index 013fef740d510c1ee33f0bb0fae98e72f86d1d67..dfaa29b8b2939c03fef13fa416f6fdaef031bf5d 100644 (file)
@@ -50,7 +50,6 @@
 #include <linux/seq_file.h>
 #include <trace/events/skb.h>
 #include "udp_impl.h"
-#include "ip6_offload.h"
 
 int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
 {
@@ -1472,13 +1471,9 @@ int __init udpv6_init(void)
 {
        int ret;
 
-       ret = udp_offload_init();
-       if (ret)
-               goto out;
-
        ret = inet6_add_protocol(&udpv6_protocol, IPPROTO_UDP);
        if (ret)
-               goto out_offload;
+               goto out;
 
        ret = inet6_register_protosw(&udpv6_protosw);
        if (ret)
@@ -1488,8 +1483,6 @@ out:
 
 out_udpv6_protocol:
        inet6_del_protocol(&udpv6_protocol, IPPROTO_UDP);
-out_offload:
-       udp_offload_cleanup();
        goto out;
 }
 
@@ -1497,5 +1490,4 @@ void udpv6_exit(void)
 {
        inet6_unregister_protosw(&udpv6_protosw);
        inet6_del_protocol(&udpv6_protocol, IPPROTO_UDP);
-       udp_offload_cleanup();
 }
index f964d2b366c8c91958f43cb2b4f058546d70ccdd..979e4ab63a8b7031f7b1a5e92c7709999c03632c 100644 (file)
@@ -115,8 +115,3 @@ int __init udp_offload_init(void)
 {
        return inet6_add_offload(&udpv6_offload, IPPROTO_UDP);
 }
-
-void udp_offload_cleanup(void)
-{
-       inet6_del_offload(&udpv6_offload, IPPROTO_UDP);
-}