cregit-Linux how code gets into the kernel

Release 4.18 net/ipv6/netfilter.c

Directory: net/ipv6
/*
 * IPv6 specific functions of netfilter core
 *
 * Rusty Russell (C) 2000 -- This code is GPL.
 * Patrick McHardy (C) 2006-2012
 */
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/ipv6.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv6.h>
#include <linux/export.h>
#include <net/addrconf.h>
#include <net/dst.h>
#include <net/ipv6.h>
#include <net/ip6_route.h>
#include <net/xfrm.h>
#include <net/ip6_checksum.h>
#include <net/netfilter/nf_queue.h>


int ip6_route_me_harder(struct net *net, struct sk_buff *skb) { const struct ipv6hdr *iph = ipv6_hdr(skb); struct sock *sk = sk_to_full_sk(skb->sk); unsigned int hh_len; struct dst_entry *dst; struct flowi6 fl6 = { .flowi6_oif = sk ? sk->sk_bound_dev_if : 0, .flowi6_mark = skb->mark, .flowi6_uid = sock_net_uid(net, sk), .daddr = iph->daddr, .saddr = iph->saddr, }; int err; dst = ip6_route_output(net, sk, &fl6); err = dst->error; if (err) { IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); net_dbg_ratelimited("ip6_route_me_harder: No more route\n"); dst_release(dst); return err; } /* Drop old route. */ skb_dst_drop(skb); skb_dst_set(skb, dst); #ifdef CONFIG_XFRM if (!(IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) && xfrm_decode_session(skb, flowi6_to_flowi(&fl6), AF_INET6) == 0) { skb_dst_set(skb, NULL); dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), sk, 0); if (IS_ERR(dst)) return PTR_ERR(dst); skb_dst_set(skb, dst); } #endif /* Change in oif may mean change in hh_len. */ hh_len = skb_dst(skb)->dev->hard_header_len; if (skb_headroom(skb) < hh_len && pskb_expand_head(skb, HH_DATA_ALIGN(hh_len - skb_headroom(skb)), 0, GFP_ATOMIC)) return -ENOMEM; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy9432.53%315.79%
Harald Welte5920.42%15.26%
Ulrich Weber4716.26%15.26%
Eric Dumazet248.30%315.79%
David S. Miller248.30%210.53%
Lorenzo Colitti103.46%15.26%
Sergey Popovich103.46%15.26%
Yasuyuki Kozakai62.08%15.26%
Eric W. Biedermann51.73%15.26%
Alexey Dobriyan41.38%210.53%
Arnaldo Carvalho de Melo31.04%15.26%
Joe Perches20.69%15.26%
Daniel Lezcano10.35%15.26%
Total289100.00%19100.00%

EXPORT_SYMBOL(ip6_route_me_harder);
static int nf_ip6_reroute(struct sk_buff *skb, const struct nf_queue_entry *entry) { struct ip6_rt_info *rt_info = nf_queue_entry_reroute(entry); if (entry->state.hook == NF_INET_LOCAL_OUT) { const struct ipv6hdr *iph = ipv6_hdr(skb); if (!ipv6_addr_equal(&iph->daddr, &rt_info->daddr) || !ipv6_addr_equal(&iph->saddr, &rt_info->saddr) || skb->mark != rt_info->mark) return ip6_route_me_harder(entry->state.net, skb); } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Harald Welte7370.87%19.09%
Eric Leblond87.77%19.09%
Patrick McHardy76.80%327.27%
Pablo Neira Ayuso43.88%19.09%
Arnaldo Carvalho de Melo32.91%19.09%
Herbert Xu32.91%19.09%
David S. Miller21.94%19.09%
Eric W. Biedermann21.94%19.09%
Eric Dumazet10.97%19.09%
Total103100.00%11100.00%


static int nf_ip6_route(struct net *net, struct dst_entry **dst, struct flowi *fl, bool strict) { static const struct ipv6_pinfo fake_pinfo; static const struct inet_sock fake_sk = { /* makes ip6_route_output set RT6_LOOKUP_F_IFACE: */ .sk.sk_bound_dev_if = 1, .pinet6 = (struct ipv6_pinfo *) &fake_pinfo, }; const void *sk = strict ? &fake_sk : NULL; struct dst_entry *result; int err; result = ip6_route_output(net, sk, &fl->u.ip6); err = result->error; if (err) dst_release(result); else *dst = result; return err; }

Contributors

PersonTokensPropCommitsCommitProp
Florian Westphal8572.03%350.00%
Patrick McHardy2722.88%116.67%
David S. Miller54.24%116.67%
Daniel Lezcano10.85%116.67%
Total118100.00%6100.00%


__sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook, unsigned int dataoff, u_int8_t protocol) { const struct ipv6hdr *ip6h = ipv6_hdr(skb); __sum16 csum = 0; switch (skb->ip_summed) { case CHECKSUM_COMPLETE: if (hook != NF_INET_PRE_ROUTING && hook != NF_INET_LOCAL_IN) break; if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, skb->len - dataoff, protocol, csum_sub(skb->csum, skb_checksum(skb, 0, dataoff, 0)))) { skb->ip_summed = CHECKSUM_UNNECESSARY; break; } /* fall through */ case CHECKSUM_NONE: skb->csum = ~csum_unfold( csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, skb->len - dataoff, protocol, csum_sub(0, skb_checksum(skb, 0, dataoff, 0)))); csum = __skb_checksum_complete(skb); } return csum; }

Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy16094.67%342.86%
Al Viro52.96%228.57%
Arnaldo Carvalho de Melo31.78%114.29%
Eric Dumazet10.59%114.29%
Total169100.00%7100.00%

EXPORT_SYMBOL(nf_ip6_checksum);
static __sum16 nf_ip6_checksum_partial(struct sk_buff *skb, unsigned int hook, unsigned int dataoff, unsigned int len, u_int8_t protocol) { const struct ipv6hdr *ip6h = ipv6_hdr(skb); __wsum hsum; __sum16 csum = 0; switch (skb->ip_summed) { case CHECKSUM_COMPLETE: if (len == skb->len - dataoff) return nf_ip6_checksum(skb, hook, dataoff, protocol); /* fall through */ case CHECKSUM_NONE: hsum = skb_checksum(skb, 0, dataoff, 0); skb->csum = ~csum_unfold(csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, skb->len - dataoff, protocol, csum_sub(0, hsum))); skb->ip_summed = CHECKSUM_NONE; return __skb_checksum_complete_head(skb, dataoff + len); } return csum; }

Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy14798.00%133.33%
Shan Wei21.33%133.33%
Eric Dumazet10.67%133.33%
Total150100.00%3100.00%

; static const struct nf_ipv6_ops ipv6ops = { .chk_addr = ipv6_chk_addr, .route_input = ip6_route_input, .fragment = ip6_fragment, .checksum = nf_ip6_checksum, .checksum_partial = nf_ip6_checksum_partial, .route = nf_ip6_route, .reroute = nf_ip6_reroute, };
int __init ipv6_netfilter_init(void) { RCU_INIT_POINTER(nf_ipv6_ops, &ipv6ops); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Harald Welte1052.63%133.33%
Florian Westphal842.11%133.33%
Pablo Neira Ayuso15.26%133.33%
Total19100.00%3100.00%

/* This can be called from inet6_init() on errors, so it cannot * be marked __exit. -DaveM */
void ipv6_netfilter_fini(void) { RCU_INIT_POINTER(nf_ipv6_ops, NULL); }

Contributors

PersonTokensPropCommitsCommitProp
Harald Welte750.00%150.00%
Florian Westphal750.00%150.00%
Total14100.00%2100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy44946.92%1326.00%
Harald Welte17718.50%24.00%
Florian Westphal11512.02%48.00%
Ulrich Weber474.91%12.00%
David S. Miller323.34%48.00%
Eric Dumazet272.82%36.00%
Pablo Neira Ayuso262.72%510.00%
Bernhard Thaler101.04%24.00%
Sergey Popovich101.04%12.00%
Lorenzo Colitti101.04%12.00%
Arnaldo Carvalho de Melo90.94%12.00%
Eric Leblond80.84%12.00%
Eric W. Biedermann70.73%12.00%
Yasuyuki Kozakai60.63%12.00%
Al Viro50.52%24.00%
Alexey Dobriyan40.42%24.00%
Brian Haley30.31%12.00%
Paul Gortmaker30.31%12.00%
Herbert Xu30.31%12.00%
Joe Perches20.21%12.00%
Shan Wei20.21%12.00%
Daniel Lezcano20.21%12.00%
Total957100.00%50100.00%
Directory: net/ipv6
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.