static __net_exit void dccp_net_exit(struct net *net) { struct dccp_net *dn = dccp_pernet(net); #ifdef CONFIG_SYSCTL unregister_net_sysctl_table(dn->sysctl_header); kfree(dn->sysctl_table); #endif kfree(dn); net_assign_generic(net, dccp_net_id, NULL); }
static __net_init int dccp_net_init(struct net *net) { struct dccp_net *dn; int err; dn = kmalloc(sizeof(*dn), GFP_KERNEL); if (!dn) return -ENOMEM; /* default values */ dn->dccp_loose = 1; dn->dccp_timeout[CT_DCCP_REQUEST] = 2 * DCCP_MSL; dn->dccp_timeout[CT_DCCP_RESPOND] = 4 * DCCP_MSL; dn->dccp_timeout[CT_DCCP_PARTOPEN] = 4 * DCCP_MSL; dn->dccp_timeout[CT_DCCP_OPEN] = 12 * 3600 * HZ; dn->dccp_timeout[CT_DCCP_CLOSEREQ] = 64 * HZ; dn->dccp_timeout[CT_DCCP_CLOSING] = 64 * HZ; dn->dccp_timeout[CT_DCCP_TIMEWAIT] = 2 * DCCP_MSL; err = net_assign_generic(net, dccp_net_id, dn); if (err) goto out; #ifdef CONFIG_SYSCTL err = -ENOMEM; dn->sysctl_table = kmemdup(dccp_sysctl_table, sizeof(dccp_sysctl_table), GFP_KERNEL); if (!dn->sysctl_table) goto out; dn->sysctl_table[0].data = &dn->dccp_timeout[CT_DCCP_REQUEST]; dn->sysctl_table[1].data = &dn->dccp_timeout[CT_DCCP_RESPOND]; dn->sysctl_table[2].data = &dn->dccp_timeout[CT_DCCP_PARTOPEN]; dn->sysctl_table[3].data = &dn->dccp_timeout[CT_DCCP_OPEN]; dn->sysctl_table[4].data = &dn->dccp_timeout[CT_DCCP_CLOSEREQ]; dn->sysctl_table[5].data = &dn->dccp_timeout[CT_DCCP_CLOSING]; dn->sysctl_table[6].data = &dn->dccp_timeout[CT_DCCP_TIMEWAIT]; dn->sysctl_table[7].data = &dn->dccp_loose; dn->sysctl_header = register_net_sysctl_table(net, nf_net_netfilter_sysctl_path, dn->sysctl_table); if (!dn->sysctl_header) { kfree(dn->sysctl_table); goto out; } #endif return 0; out: kfree(dn); return err; }
static int sit_init_net(struct net *net) { int err; struct sit_net *sitn; if (!(get_exec_env()->features & VE_FEATURE_SIT)) return 0; err = -ENOMEM; sitn = kzalloc(sizeof(struct sit_net), GFP_KERNEL); if (sitn == NULL) goto err_alloc; err = net_assign_generic(net, sit_net_id, sitn); if (err < 0) goto err_assign; sitn->tunnels[0] = sitn->tunnels_wc; sitn->tunnels[1] = sitn->tunnels_l; sitn->tunnels[2] = sitn->tunnels_r; sitn->tunnels[3] = sitn->tunnels_r_l; sitn->fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel), "sit0", ipip6_tunnel_setup); if (!sitn->fb_tunnel_dev) { err = -ENOMEM; goto err_alloc_dev; } dev_net_set(sitn->fb_tunnel_dev, net); ipip6_fb_tunnel_init(sitn->fb_tunnel_dev); if ((err = register_netdev(sitn->fb_tunnel_dev))) goto err_reg_dev; return 0; err_reg_dev: dev_put(sitn->fb_tunnel_dev); free_netdev(sitn->fb_tunnel_dev); err_alloc_dev: /* nothing */ err_assign: kfree(sitn); err_alloc: return err; }
static int ip6_tnl_init_net(struct net *net) { int err; struct ip6_tnl_net *ip6n; err = -ENOMEM; ip6n = kzalloc(sizeof(struct ip6_tnl_net), GFP_KERNEL); if (ip6n == NULL) goto err_alloc; err = net_assign_generic(net, ip6_tnl_net_id, ip6n); if (err < 0) goto err_assign; ip6n->tnls[0] = ip6n->tnls_wc; ip6n->tnls[1] = ip6n->tnls_r_l; err = -ENOMEM; ip6n->fb_tnl_dev = alloc_netdev(sizeof(struct ip6_tnl), "ip6tnl0", ip6_tnl_dev_setup); if (!ip6n->fb_tnl_dev) goto err_alloc_dev; dev_net_set(ip6n->fb_tnl_dev, net); ip6_fb_tnl_dev_init(ip6n->fb_tnl_dev); err = register_netdev(ip6n->fb_tnl_dev); if (err < 0) goto err_register; return 0; err_register: free_netdev(ip6n->fb_tnl_dev); err_alloc_dev: /* nothing */ err_assign: kfree(ip6n); err_alloc: return err; }