Release 4.11 net/ipv6/xfrm6_policy.c
/*
* xfrm6_policy.c: based on xfrm4_policy.c
*
* Authors:
* Mitsuru KANDA @USAGI
* Kazunori MIYAZAWA @USAGI
* Kunihiro Ishiguro <kunihiro@ipinfusion.com>
* IPv6 support
* YOSHIFUJI Hideaki
* Split up af-specific portion
*
*/
#include <linux/err.h>
#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <net/addrconf.h>
#include <net/dst.h>
#include <net/xfrm.h>
#include <net/ip.h>
#include <net/ipv6.h>
#include <net/ip6_route.h>
#include <net/l3mdev.h>
#if IS_ENABLED(CONFIG_IPV6_MIP6)
#include <net/mip6.h>
#endif
static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos, int oif,
const xfrm_address_t *saddr,
const xfrm_address_t *daddr)
{
struct flowi6 fl6;
struct dst_entry *dst;
int err;
memset(&fl6, 0, sizeof(fl6));
fl6.flowi6_oif = l3mdev_master_ifindex_by_index(net, oif);
fl6.flowi6_flags = FLOWI_FLAG_SKIP_NH_OIF;
memcpy(&fl6.daddr, daddr, sizeof(fl6.daddr));
if (saddr)
memcpy(&fl6.saddr, saddr, sizeof(fl6.saddr));
dst = ip6_route_output(net, NULL, &fl6);
err = dst->error;
if (dst->error) {
dst_release(dst);
dst = ERR_PTR(err);
}
return dst;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Herbert Xu | 65 | 43.33% | 1 | 9.09% |
David S. Miller | 27 | 18.00% | 2 | 18.18% |
David Ahern | 20 | 13.33% | 3 | 27.27% |
Ville Nuorvala | 17 | 11.33% | 1 | 9.09% |
Hideaki Yoshifuji / 吉藤英明 | 13 | 8.67% | 1 | 9.09% |
Alexey Dobriyan | 6 | 4.00% | 1 | 9.09% |
Patrick McHardy | 1 | 0.67% | 1 | 9.09% |
Daniel Lezcano | 1 | 0.67% | 1 | 9.09% |
Total | 150 | 100.00% | 11 | 100.00% |
static int xfrm6_get_saddr(struct net *net, int oif,
xfrm_address_t *saddr, xfrm_address_t *daddr)
{
struct dst_entry *dst;
struct net_device *dev;
dst = xfrm6_dst_lookup(net, 0, oif, NULL, daddr);
if (IS_ERR(dst))
return -EHOSTUNREACH;
dev = ip6_dst_idev(dst)->dev;
ipv6_dev_get_saddr(dev_net(dev), dev, &daddr->in6, 0, &saddr->in6);
dst_release(dst);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Patrick McHardy | 44 | 45.36% | 1 | 11.11% |
Herbert Xu | 17 | 17.53% | 1 | 11.11% |
Brian Haley | 16 | 16.49% | 1 | 11.11% |
Alexey Dobriyan | 7 | 7.22% | 2 | 22.22% |
Hideaki Yoshifuji / 吉藤英明 | 6 | 6.19% | 2 | 22.22% |
David Ahern | 5 | 5.15% | 1 | 11.11% |
Jiri Benc | 2 | 2.06% | 1 | 11.11% |
Total | 97 | 100.00% | 9 | 100.00% |
static int xfrm6_get_tos(const struct flowi *fl)
{
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Herbert Xu | 13 | 86.67% | 1 | 33.33% |
Hideaki Yoshifuji / 吉藤英明 | 1 | 6.67% | 1 | 33.33% |
David S. Miller | 1 | 6.67% | 1 | 33.33% |
Total | 15 | 100.00% | 3 | 100.00% |
static int xfrm6_init_path(struct xfrm_dst *path, struct dst_entry *dst,
int nfheader_len)
{
if (dst->ops->family == AF_INET6) {
struct rt6_info *rt = (struct rt6_info *)dst;
path->path_cookie = rt6_get_cookie(rt);
}
path->u.rt6.rt6i_nfheader_len = nfheader_len;
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Masahide Nakamura | 62 | 95.38% | 1 | 50.00% |
Martin KaFai Lau | 3 | 4.62% | 1 | 50.00% |
Total | 65 | 100.00% | 2 | 100.00% |
static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
const struct flowi *fl)
{
struct rt6_info *rt = (struct rt6_info *)xdst->route;
xdst->u.dst.dev = dev;
dev_hold(dev);
xdst->u.rt6.rt6i_idev = in6_dev_get(dev);
if (!xdst->u.rt6.rt6i_idev) {
dev_put(dev);
return -ENODEV;
}
/* 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->u.rt6.rt6i_metric = rt->rt6i_metric;
xdst->u.rt6.rt6i_node = rt->rt6i_node;
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;
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Hideaki Yoshifuji / 吉藤英明 | 71 | 40.11% | 2 | 18.18% |
Herbert Xu | 69 | 38.98% | 4 | 36.36% |
Tom Lendacky | 20 | 11.30% | 1 | 9.09% |
Américo Wang | 7 | 3.95% | 1 | 9.09% |
Masahide Nakamura | 6 | 3.39% | 1 | 9.09% |
Martin KaFai Lau | 3 | 1.69% | 1 | 9.09% |
David S. Miller | 1 | 0.56% | 1 | 9.09% |
Total | 177 | 100.00% | 11 | 100.00% |
static inline void
_decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
{
struct flowi6 *fl6 = &fl->u.ip6;
int onlyproto = 0;
const struct ipv6hdr *hdr = ipv6_hdr(skb);
u16 offset = sizeof(*hdr);
struct ipv6_opt_hdr *exthdr;
const unsigned char *nh = skb_network_header(skb);
u16 nhoff = IP6CB(skb)->nhoff;
int oif = 0;
u8 nexthdr;
if (!nhoff)
nhoff = offsetof(struct ipv6hdr, nexthdr);
nexthdr = nh[nhoff];
if (skb_dst(skb))
oif = skb_dst(skb)->dev->ifindex;
memset(fl6, 0, sizeof(struct flowi6));
fl6->flowi6_mark = skb->mark;
fl6->flowi6_oif = reverse ? skb->skb_iif : oif;
fl6->daddr = reverse ? hdr->saddr : hdr->daddr;
fl6->saddr = reverse ? hdr->daddr : hdr->saddr;
while (nh + offset + 1 < skb->data ||
pskb_may_pull(skb, nh + offset + 1 - skb->data)) {
nh = skb_network_header(skb);
exthdr = (struct ipv6_opt_hdr *)(nh + offset);
switch (nexthdr) {
case NEXTHDR_FRAGMENT:
onlyproto = 1;
case NEXTHDR_ROUTING:
case NEXTHDR_HOP:
case NEXTHDR_DEST:
offset += ipv6_optlen(exthdr);
nexthdr = exthdr->nexthdr;
exthdr = (struct ipv6_opt_hdr *)(nh + offset);
break;
case IPPROTO_UDP:
case IPPROTO_UDPLITE:
case IPPROTO_TCP:
case IPPROTO_SCTP:
case IPPROTO_DCCP:
if (!onlyproto && (nh + offset + 4 < skb->data ||
pskb_may_pull(skb, nh + offset + 4 - skb->data))) {
__be16 *ports;
nh = skb_network_header(skb);
ports = (__be16 *)(nh + offset);
fl6->fl6_sport = ports[!!reverse];
fl6->fl6_dport = ports[!reverse];
}
fl6->flowi6_proto = nexthdr;
return;
case IPPROTO_ICMPV6:
if (!onlyproto && (nh + offset + 2 < skb->data ||
pskb_may_pull(skb, nh + offset + 2 - skb->data))) {
u8 *icmp;
nh = skb_network_header(skb);
icmp = (u8 *)(nh + offset);
fl6->fl6_icmp_type = icmp[0];
fl6->fl6_icmp_code = icmp[1];
}
fl6->flowi6_proto = nexthdr;
return;
#if IS_ENABLED(CONFIG_IPV6_MIP6)
case IPPROTO_MH:
offset += ipv6_optlen(exthdr);
if (!onlyproto && (nh + offset + 3 < skb->data ||
pskb_may_pull(skb, nh + offset + 3 - skb->data))) {
struct ip6_mh *mh;
nh = skb_network_header(skb);
mh = (struct ip6_mh *)(nh + offset);
fl6->fl6_mh_type = mh->ip6mh_type;
}
fl6->flowi6_proto = nexthdr;
return;
#endif
/* XXX Why are there these headers? */
case IPPROTO_AH:
case IPPROTO_ESP:
case IPPROTO_COMP:
default:
fl6->fl6_ipsec_spi = 0;
fl6->flowi6_proto = nexthdr;
return;
}
}
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Hideaki Yoshifuji / 吉藤英明 | 180 | 30.46% | 3 | 9.38% |
Masahide Nakamura | 101 | 17.09% | 3 | 9.38% |
Steffen Klassert | 63 | 10.66% | 4 | 12.50% |
David S. Miller | 48 | 8.12% | 3 | 9.38% |
Li RongQing | 44 | 7.45% | 1 | 3.12% |
Herbert Xu | 31 | 5.25% | 2 | 6.25% |
Mathias Krause | 24 | 4.06% | 1 | 3.12% |
Wei Yongjun | 22 | 3.72% | 1 | 3.12% |
Arnaldo Carvalho de Melo | 21 | 3.55% | 2 | 6.25% |
Nicolas Dichtel | 21 | 3.55% | 1 | 3.12% |
David Ahern | 8 | 1.35% | 2 | 6.25% |
Hajime Tazaki | 7 | 1.18% | 1 | 3.12% |
Peter Kosyh | 6 | 1.02% | 1 | 3.12% |
James Morris | 3 | 0.51% | 1 | 3.12% |
Gerrit Renker | 3 | 0.51% | 1 | 3.12% |
Patrick McHardy | 3 | 0.51% | 1 | 3.12% |
Al Viro | 2 | 0.34% | 1 | 3.12% |
Alexey Dobriyan | 2 | 0.34% | 1 | 3.12% |
Américo Wang | 1 | 0.17% | 1 | 3.12% |
Eric Dumazet | 1 | 0.17% | 1 | 3.12% |
Total | 591 | 100.00% | 32 | 100.00% |
static inline int xfrm6_garbage_collect(struct dst_ops *ops)
{
struct net *net = container_of(ops, struct net, xfrm.xfrm6_dst_ops);
xfrm_garbage_collect_deferred(net);
return dst_entries_get_fast(ops) > ops->gc_thresh * 2;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Alexey Dobriyan | 23 | 50.00% | 2 | 33.33% |
Hideaki Yoshifuji / 吉藤英明 | 17 | 36.96% | 1 | 16.67% |
Daniel Lezcano | 4 | 8.70% | 1 | 16.67% |
Florian Westphal | 1 | 2.17% | 1 | 16.67% |
Eric Dumazet | 1 | 2.17% | 1 | 16.67% |
Total | 46 | 100.00% | 6 | 100.00% |
static void xfrm6_update_pmtu(struct dst_entry *dst, struct sock *sk,
struct sk_buff *skb, u32 mtu)
{
struct xfrm_dst *xdst = (struct xfrm_dst *)dst;
struct dst_entry *path = xdst->route;
path->ops->update_pmtu(path, sk, skb, mtu);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Hideaki Yoshifuji / 吉藤英明 | 32 | 53.33% | 1 | 33.33% |
David S. Miller | 14 | 23.33% | 1 | 33.33% |
Herbert Xu | 14 | 23.33% | 1 | 33.33% |
Total | 60 | 100.00% | 3 | 100.00% |
static void xfrm6_redirect(struct dst_entry *dst, struct sock *sk,
struct sk_buff *skb)
{
struct xfrm_dst *xdst = (struct xfrm_dst *)dst;
struct dst_entry *path = xdst->route;
path->ops->redirect(path, sk, skb);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
David S. Miller | 55 | 100.00% | 2 | 100.00% |
Total | 55 | 100.00% | 2 | 100.00% |
static void xfrm6_dst_destroy(struct dst_entry *dst)
{
struct xfrm_dst *xdst = (struct xfrm_dst *)dst;
if (likely(xdst->u.rt6.rt6i_idev))
in6_dev_put(xdst->u.rt6.rt6i_idev);
dst_destroy_metrics_generic(dst);
xfrm_dst_destroy(xdst);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Herbert Xu | 52 | 91.23% | 1 | 50.00% |
David S. Miller | 5 | 8.77% | 1 | 50.00% |
Total | 57 | 100.00% | 2 | 100.00% |
static void xfrm6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
int unregister)
{
struct xfrm_dst *xdst;
if (!unregister)
return;
xdst = (struct xfrm_dst *)dst;
if (xdst->u.rt6.rt6i_idev->dev == dev) {
struct inet6_dev *loopback_idev =
in6_dev_get(dev_net(dev)->loopback_dev);
BUG_ON(!loopback_idev);
do {
in6_dev_put(xdst->u.rt6.rt6i_idev);
xdst->u.rt6.rt6i_idev = loopback_idev;
in6_dev_hold(loopback_idev);
xdst = (struct xfrm_dst *)xdst->u.dst.child;
} while (xdst->u.dst.xfrm);
__in6_dev_put(loopback_idev);
}
xfrm_dst_ifdown(dst, dev);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Herbert Xu | 138 | 96.50% | 1 | 33.33% |
Hideaki Yoshifuji / 吉藤英明 | 3 | 2.10% | 1 | 33.33% |
Denis V. Lunev | 2 | 1.40% | 1 | 33.33% |
Total | 143 | 100.00% | 3 | 100.00% |
static struct dst_ops xfrm6_dst_ops_template = {
.family = AF_INET6,
.gc = xfrm6_garbage_collect,
.update_pmtu = xfrm6_update_pmtu,
.redirect = xfrm6_redirect,
.cow_metrics = dst_cow_metrics_generic,
.destroy = xfrm6_dst_destroy,
.ifdown = xfrm6_dst_ifdown,
.local_out = __ip6_local_out,
.gc_thresh = INT_MAX,
};
static const struct xfrm_policy_afinfo xfrm6_policy_afinfo = {
.dst_ops = &xfrm6_dst_ops_template,
.dst_lookup = xfrm6_dst_lookup,
.get_saddr = xfrm6_get_saddr,
.decode_session = _decode_session6,
.get_tos = xfrm6_get_tos,
.init_path = xfrm6_init_path,
.fill_dst = xfrm6_fill_dst,
.blackhole_route = ip6_blackhole_route,
};
static int __init xfrm6_policy_init(void)
{
return xfrm_policy_register_afinfo(&xfrm6_policy_afinfo, AF_INET6);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Hideaki Yoshifuji / 吉藤英明 | 12 | 66.67% | 1 | 25.00% |
Daniel Lezcano | 3 | 16.67% | 1 | 25.00% |
Florian Westphal | 2 | 11.11% | 1 | 25.00% |
Patrick McHardy | 1 | 5.56% | 1 | 25.00% |
Total | 18 | 100.00% | 4 | 100.00% |
static void xfrm6_policy_fini(void)
{
xfrm_policy_unregister_afinfo(&xfrm6_policy_afinfo);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Hideaki Yoshifuji / 吉藤英明 | 13 | 92.86% | 1 | 50.00% |
Patrick McHardy | 1 | 7.14% | 1 | 50.00% |
Total | 14 | 100.00% | 2 | 100.00% |
#ifdef CONFIG_SYSCTL
static struct ctl_table xfrm6_policy_table[] = {
{
.procname = "xfrm6_gc_thresh",
.data = &init_net.xfrm.xfrm6_dst_ops.gc_thresh,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
},
{ }
};
static int __net_init xfrm6_net_sysctl_init(struct net *net)
{
struct ctl_table *table;
struct ctl_table_header *hdr;
table = xfrm6_policy_table;
if (!net_eq(net, &init_net)) {
table = kmemdup(table, sizeof(xfrm6_policy_table), GFP_KERNEL);
if (!table)
goto err_alloc;
table[0].data = &net->xfrm.xfrm6_dst_ops.gc_thresh;
}
hdr = register_net_sysctl(net, "net/ipv6", 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;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Michal Kubeček | 128 | 96.24% | 1 | 33.33% |
Neil Horman | 4 | 3.01% | 1 | 33.33% |
Dan Streetman | 1 | 0.75% | 1 | 33.33% |
Total | 133 | 100.00% | 3 | 100.00% |
static void __net_exit xfrm6_net_sysctl_exit(struct net *net)
{
struct 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);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Michal Kubeček | 66 | 97.06% | 1 | 33.33% |
Dan Streetman | 1 | 1.47% | 1 | 33.33% |
Ian Morris | 1 | 1.47% | 1 | 33.33% |
Total | 68 | 100.00% | 3 | 100.00% |
#else /* CONFIG_SYSCTL */
static inline int xfrm6_net_sysctl_init(struct net *net)
{
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dan Streetman | 14 | 93.33% | 1 | 50.00% |
Arnd Bergmann | 1 | 6.67% | 1 | 50.00% |
Total | 15 | 100.00% | 2 | 100.00% |
static inline void xfrm6_net_sysctl_exit(struct net *net)
{
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dan Streetman | 10 | 90.91% | 1 | 50.00% |
Arnd Bergmann | 1 | 9.09% | 1 | 50.00% |
Total | 11 | 100.00% | 2 | 100.00% |
#endif
static int __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;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dan Streetman | 76 | 100.00% | 1 | 100.00% |
Total | 76 | 100.00% | 1 | 100.00% |
static void __net_exit xfrm6_net_exit(struct net *net)
{
xfrm6_net_sysctl_exit(net);
dst_entries_destroy(&net->xfrm.xfrm6_dst_ops);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dan Streetman | 27 | 100.00% | 1 | 100.00% |
Total | 27 | 100.00% | 1 | 100.00% |
static struct pernet_operations xfrm6_net_ops = {
.init = xfrm6_net_init,
.exit = xfrm6_net_exit,
};
int __init xfrm6_init(void)
{
int ret;
ret = xfrm6_policy_init();
if (ret)
goto out;
ret = xfrm6_state_init();
if (ret)
goto out_policy;
ret = xfrm6_protocol_init();
if (ret)
goto out_state;
register_pernet_subsys(&xfrm6_net_ops);
out:
return ret;
out_state:
xfrm6_state_fini();
out_policy:
xfrm6_policy_fini();
goto out;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Daniel Lezcano | 35 | 49.30% | 1 | 20.00% |
Steffen Klassert | 17 | 23.94% | 1 | 20.00% |
Hideaki Yoshifuji / 吉藤英明 | 13 | 18.31% | 1 | 20.00% |
Neil Horman | 4 | 5.63% | 1 | 20.00% |
Michal Kubeček | 2 | 2.82% | 1 | 20.00% |
Total | 71 | 100.00% | 5 | 100.00% |
void xfrm6_fini(void)
{
unregister_pernet_subsys(&xfrm6_net_ops);
xfrm6_protocol_fini();
xfrm6_policy_fini();
xfrm6_state_fini();
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Hideaki Yoshifuji / 吉藤英明 | 13 | 59.09% | 1 | 25.00% |
Michal Kubeček | 3 | 13.64% | 1 | 25.00% |
Steffen Klassert | 3 | 13.64% | 1 | 25.00% |
Neil Horman | 3 | 13.64% | 1 | 25.00% |
Total | 22 | 100.00% | 4 | 100.00% |
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Herbert Xu | 437 | 20.56% | 11 | 12.79% |
Hideaki Yoshifuji / 吉藤英明 | 433 | 20.37% | 7 | 8.14% |
Michal Kubeček | 215 | 10.11% | 1 | 1.16% |
Masahide Nakamura | 184 | 8.65% | 4 | 4.65% |
David S. Miller | 169 | 7.95% | 11 | 12.79% |
Dan Streetman | 136 | 6.40% | 1 | 1.16% |
Steffen Klassert | 84 | 3.95% | 6 | 6.98% |
Patrick McHardy | 57 | 2.68% | 3 | 3.49% |
Neil Horman | 55 | 2.59% | 1 | 1.16% |
Li RongQing | 44 | 2.07% | 1 | 1.16% |
Daniel Lezcano | 43 | 2.02% | 3 | 3.49% |
Alexey Dobriyan | 42 | 1.98% | 5 | 5.81% |
David Ahern | 36 | 1.69% | 6 | 6.98% |
Mathias Krause | 24 | 1.13% | 1 | 1.16% |
Wei Yongjun | 22 | 1.03% | 1 | 1.16% |
Arnaldo Carvalho de Melo | 21 | 0.99% | 2 | 2.33% |
Nicolas Dichtel | 21 | 0.99% | 1 | 1.16% |
Tom Lendacky | 20 | 0.94% | 1 | 1.16% |
Ville Nuorvala | 17 | 0.80% | 1 | 1.16% |
Brian Haley | 16 | 0.75% | 1 | 1.16% |
Américo Wang | 9 | 0.42% | 2 | 2.33% |
Hajime Tazaki | 7 | 0.33% | 1 | 1.16% |
Peter Kosyh | 6 | 0.28% | 1 | 1.16% |
Martin KaFai Lau | 6 | 0.28% | 1 | 1.16% |
Florian Westphal | 4 | 0.19% | 3 | 3.49% |
James Morris | 3 | 0.14% | 1 | 1.16% |
Gerrit Renker | 3 | 0.14% | 1 | 1.16% |
Ian Morris | 2 | 0.09% | 2 | 2.33% |
Al Viro | 2 | 0.09% | 1 | 1.16% |
Eric Dumazet | 2 | 0.09% | 2 | 2.33% |
Arnd Bergmann | 2 | 0.09% | 1 | 1.16% |
Denis V. Lunev | 2 | 0.09% | 1 | 1.16% |
Jiri Benc | 2 | 0.09% | 1 | 1.16% |
Total | 2126 | 100.00% | 86 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.