@@ -2360,7 +2360,7 @@ MODULE_AUTHOR("Linux DECnet Project Team
MODULE_LICENSE("GPL");
MODULE_ALIAS_NETPROTO(PF_DECnet);
-static char banner[] __initdata = KERN_INFO "NET4: DECnet for Linux: V.2.5.68s (C) 1995-2003 Linux DECnet Project Team\n";
+static char banner[] __initdata = KERN_INFO "DECnet: DECnet for Linux: V.2.6.32 (C) 1995-2013 Linux DECnet Project Team\n";
static int __init decnet_init(void)
{
@@ -2372,6 +2372,8 @@ static int __init decnet_init(void)
if (rc != 0)
goto out;
+ dn_register_sysctl();
+
dn_neigh_init();
dn_dev_init();
dn_route_init();
@@ -2382,7 +2384,6 @@ static int __init decnet_init(void)
register_netdevice_notifier(&dn_dev_notifier);
proc_net_fops_create(&init_net, "decnet", S_IRUGO, &dn_socket_seq_fops);
- dn_register_sysctl();
out:
return rc;
@@ -2401,8 +2402,6 @@ static void __exit decnet_exit(void)
rtnl_unregister_all(PF_DECnet);
dev_remove_pack(&dn_dix_packet_type);
- dn_unregister_sysctl();
-
unregister_netdevice_notifier(&dn_dev_notifier);
dn_route_cleanup();
@@ -2410,6 +2409,8 @@ static void __exit decnet_exit(void)
dn_neigh_cleanup();
dn_fib_cleanup();
+ dn_unregister_sysctl();
+
proc_net_remove(&init_net, "decnet");
proto_unregister(&dn_proto);
@@ -170,6 +170,8 @@ static int dn_forwarding_sysctl(ctl_tabl
void __user *oldval, size_t __user *oldlenp,
void __user *newval, size_t newlen);
+static struct ctl_table_header *dn_conf_path = NULL;
+
static struct dn_dev_sysctl_table {
struct ctl_table_header *sysctl_header;
ctl_table dn_dev_vars[5];
@@ -1436,6 +1438,14 @@ MODULE_PARM_DESC(addr, "The DECnet addre
void __init dn_dev_init(void)
{
+ struct ctl_path dn_conf[] = {
+ { .procname = "net", .ctl_name = CTL_NET, },
+ { .procname = "decnet", .ctl_name = NET_DECNET, },
+ { .procname = "conf", .ctl_name = NET_DECNET_CONF, },
+ { },
+ };
+ static ctl_table empty[1];
+
if (addr[0] > 63 || addr[0] < 0) {
printk(KERN_ERR "DECnet: Area must be between 0 and 63");
return;
@@ -1448,34 +1458,36 @@ void __init dn_dev_init(void)
decnet_address = cpu_to_le16((addr[0] << 10) | addr[1]);
- dn_dev_devices_on();
-
- rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL);
- rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL);
- rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr);
-
- proc_net_fops_create(&init_net, "decnet_dev", S_IRUGO, &dn_dev_seq_fops);
-
#ifdef CONFIG_SYSCTL
+ dn_conf_path = register_sysctl_paths(dn_conf, empty);
{
int i;
for(i = 0; i < DN_DEV_LIST_SIZE; i++)
dn_dev_sysctl_register(NULL, &dn_dev_list[i]);
}
#endif /* CONFIG_SYSCTL */
+
+ dn_dev_devices_on();
+
+ rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL);
+ rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL);
+ rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr);
+
+ proc_net_fops_create(&init_net, "decnet_dev", S_IRUGO, &dn_dev_seq_fops);
}
void __exit dn_dev_cleanup(void)
{
+ proc_net_remove(&init_net, "decnet_dev");
+
+ dn_dev_devices_off();
+
#ifdef CONFIG_SYSCTL
{
int i;
for(i = 0; i < DN_DEV_LIST_SIZE; i++)
dn_dev_sysctl_unregister(&dn_dev_list[i]);
}
+ unregister_sysctl_table(dn_conf_path);
#endif /* CONFIG_SYSCTL */
-
- proc_net_remove(&init_net, "decnet_dev");
-
- dn_dev_devices_off();
}