ipv4: Allow amount of dirty memory from fib resizing to be controllable
[linux-2.6-block.git] / include / net / netfilter / nf_tables_ipv6.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
0ca743a5
PNA
2#ifndef _NF_TABLES_IPV6_H_
3#define _NF_TABLES_IPV6_H_
4
5#include <linux/netfilter_ipv6/ip6_tables.h>
6#include <net/ipv6.h>
7
7a4473a3
PNA
8static inline void nft_set_pktinfo_ipv6(struct nft_pktinfo *pkt,
9 struct sk_buff *skb)
0ca743a5 10{
568af6de 11 unsigned int flags = IP6_FH_F_AUTH;
0ca743a5
PNA
12 int protohdr, thoff = 0;
13 unsigned short frag_off;
14
568af6de 15 protohdr = ipv6_find_hdr(pkt->skb, &thoff, -1, &frag_off, &flags);
8df9e32e 16 if (protohdr < 0) {
7a4473a3 17 nft_set_pktinfo_unspec(pkt, skb);
71212c9b 18 return;
8df9e32e 19 }
0ca743a5 20
beac5afa 21 pkt->tprot_set = true;
4566bf27 22 pkt->tprot = protohdr;
0ca743a5
PNA
23 pkt->xt.thoff = thoff;
24 pkt->xt.fragoff = frag_off;
0ca743a5
PNA
25}
26
7a4473a3
PNA
27static inline int __nft_set_pktinfo_ipv6_validate(struct nft_pktinfo *pkt,
28 struct sk_buff *skb)
ddc8b602
PNA
29{
30#if IS_ENABLED(CONFIG_IPV6)
568af6de 31 unsigned int flags = IP6_FH_F_AUTH;
ddc8b602
PNA
32 struct ipv6hdr *ip6h, _ip6h;
33 unsigned int thoff = 0;
34 unsigned short frag_off;
35 int protohdr;
36 u32 pkt_len;
37
38 ip6h = skb_header_pointer(skb, skb_network_offset(skb), sizeof(*ip6h),
39 &_ip6h);
40 if (!ip6h)
41 return -1;
42
43 if (ip6h->version != 6)
44 return -1;
45
46 pkt_len = ntohs(ip6h->payload_len);
47 if (pkt_len + sizeof(*ip6h) > skb->len)
48 return -1;
49
568af6de 50 protohdr = ipv6_find_hdr(pkt->skb, &thoff, -1, &frag_off, &flags);
ddc8b602
PNA
51 if (protohdr < 0)
52 return -1;
53
54 pkt->tprot_set = true;
55 pkt->tprot = protohdr;
56 pkt->xt.thoff = thoff;
57 pkt->xt.fragoff = frag_off;
58
59 return 0;
60#else
61 return -1;
62#endif
63}
64
7a4473a3
PNA
65static inline void nft_set_pktinfo_ipv6_validate(struct nft_pktinfo *pkt,
66 struct sk_buff *skb)
ddc8b602 67{
7a4473a3
PNA
68 if (__nft_set_pktinfo_ipv6_validate(pkt, skb) < 0)
69 nft_set_pktinfo_unspec(pkt, skb);
ddc8b602
PNA
70}
71
0ca743a5 72#endif