/* Sheit... I remember I did this right. Apparently,
* it was magically lost, so this code needs audit */
xdst->u.rt6.rt6i_flags = rt->rt6i_flags & (RTF_ANYCAST |
RTF_LOCAL);
xdst->route_cookie = rt6_get_cookie(rt);
xdst->u.rt6.rt6i_gateway = rt->rt6i_gateway;
xdst->u.rt6.rt6i_dst = rt->rt6i_dst;
xdst->u.rt6.rt6i_src = rt->rt6i_src;
rt6_uncached_list_add(&xdst->u.rt6);
hdr = register_net_sysctl_sz(net, "net/ipv6", table,
ARRAY_SIZE(xfrm6_policy_table)); if (!hdr) goto err_reg;
net->ipv6.sysctl.xfrm6_hdr = hdr; return 0;
err_reg: if (!net_eq(net, &init_net))
kfree(table);
err_alloc: return -ENOMEM;
}
staticvoid __net_exit xfrm6_net_sysctl_exit(struct net *net)
{ conststruct ctl_table *table;
if (!net->ipv6.sysctl.xfrm6_hdr) return;
table = net->ipv6.sysctl.xfrm6_hdr->ctl_table_arg;
unregister_net_sysctl_table(net->ipv6.sysctl.xfrm6_hdr); if (!net_eq(net, &init_net))
kfree(table);
} #else/* CONFIG_SYSCTL */ staticinlineint xfrm6_net_sysctl_init(struct net *net)
{ return 0;
}
staticinlinevoid xfrm6_net_sysctl_exit(struct net *net)
{
} #endif
staticint __net_init xfrm6_net_init(struct net *net)
{ int ret;
memcpy(&net->xfrm.xfrm6_dst_ops, &xfrm6_dst_ops_template, sizeof(xfrm6_dst_ops_template));
ret = dst_entries_init(&net->xfrm.xfrm6_dst_ops); if (ret) return ret;
ret = xfrm6_net_sysctl_init(net); if (ret)
dst_entries_destroy(&net->xfrm.xfrm6_dst_ops);
return ret;
}
staticvoid __net_exit xfrm6_net_exit(struct net *net)
{
xfrm6_net_sysctl_exit(net);
dst_entries_destroy(&net->xfrm.xfrm6_dst_ops);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.