]> asedeno.scripts.mit.edu Git - linux.git/blob - net/netfilter/utils.c
nvmet: check fileio lba range access boundaries
[linux.git] / net / netfilter / utils.c
1 #include <linux/kernel.h>
2 #include <linux/netfilter.h>
3 #include <linux/netfilter_ipv4.h>
4 #include <linux/netfilter_ipv6.h>
5 #include <net/netfilter/nf_queue.h>
6
7 __sum16 nf_checksum(struct sk_buff *skb, unsigned int hook,
8                     unsigned int dataoff, u_int8_t protocol,
9                     unsigned short family)
10 {
11         const struct nf_ipv6_ops *v6ops;
12         __sum16 csum = 0;
13
14         switch (family) {
15         case AF_INET:
16                 csum = nf_ip_checksum(skb, hook, dataoff, protocol);
17                 break;
18         case AF_INET6:
19                 v6ops = rcu_dereference(nf_ipv6_ops);
20                 if (v6ops)
21                         csum = v6ops->checksum(skb, hook, dataoff, protocol);
22                 break;
23         }
24
25         return csum;
26 }
27 EXPORT_SYMBOL_GPL(nf_checksum);
28
29 __sum16 nf_checksum_partial(struct sk_buff *skb, unsigned int hook,
30                             unsigned int dataoff, unsigned int len,
31                             u_int8_t protocol, unsigned short family)
32 {
33         const struct nf_ipv6_ops *v6ops;
34         __sum16 csum = 0;
35
36         switch (family) {
37         case AF_INET:
38                 csum = nf_ip_checksum_partial(skb, hook, dataoff, len,
39                                               protocol);
40                 break;
41         case AF_INET6:
42                 v6ops = rcu_dereference(nf_ipv6_ops);
43                 if (v6ops)
44                         csum = v6ops->checksum_partial(skb, hook, dataoff, len,
45                                                        protocol);
46                 break;
47         }
48
49         return csum;
50 }
51 EXPORT_SYMBOL_GPL(nf_checksum_partial);
52
53 int nf_route(struct net *net, struct dst_entry **dst, struct flowi *fl,
54              bool strict, unsigned short family)
55 {
56         const struct nf_ipv6_ops *v6ops;
57         int ret = 0;
58
59         switch (family) {
60         case AF_INET:
61                 ret = nf_ip_route(net, dst, fl, strict);
62                 break;
63         case AF_INET6:
64                 v6ops = rcu_dereference(nf_ipv6_ops);
65                 if (v6ops)
66                         ret = v6ops->route(net, dst, fl, strict);
67                 break;
68         }
69
70         return ret;
71 }
72 EXPORT_SYMBOL_GPL(nf_route);
73
74 int nf_reroute(struct sk_buff *skb, struct nf_queue_entry *entry)
75 {
76         const struct nf_ipv6_ops *v6ops;
77         int ret = 0;
78
79         switch (entry->state.pf) {
80         case AF_INET:
81                 ret = nf_ip_reroute(skb, entry);
82                 break;
83         case AF_INET6:
84                 v6ops = rcu_dereference(nf_ipv6_ops);
85                 if (v6ops)
86                         ret = v6ops->reroute(skb, entry);
87                 break;
88         }
89         return ret;
90 }