1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _PFXLEN_H
3#define _PFXLEN_H
4
5#include <asm/byteorder.h>
6#include <linux/netfilter.h>
7#include <net/tcp.h>
8
9/* Prefixlen maps, by Jan Engelhardt  */
10extern const union nf_inet_addr ip_set_netmask_map[];
11extern const union nf_inet_addr ip_set_hostmask_map[];
12
13static inline __be32
14ip_set_netmask(u8 pfxlen)
15{
16	return ip_set_netmask_map[pfxlen].ip;
17}
18
19static inline const __be32 *
20ip_set_netmask6(u8 pfxlen)
21{
22	return &ip_set_netmask_map[pfxlen].ip6[0];
23}
24
25static inline u32
26ip_set_hostmask(u8 pfxlen)
27{
28	return (__force u32) ip_set_hostmask_map[pfxlen].ip;
29}
30
31static inline const __be32 *
32ip_set_hostmask6(u8 pfxlen)
33{
34	return &ip_set_hostmask_map[pfxlen].ip6[0];
35}
36
37extern u32 ip_set_range_to_cidr(u32 from, u32 to, u8 *cidr);
38
39#define ip_set_mask_from_to(from, to, cidr)	\
40do {						\
41	from &= ip_set_hostmask(cidr);		\
42	to = from | ~ip_set_hostmask(cidr);	\
43} while (0)
44
45static inline void
46ip6_netmask(union nf_inet_addr *ip, u8 prefix)
47{
48	ip->ip6[0] &= ip_set_netmask6(prefix)[0];
49	ip->ip6[1] &= ip_set_netmask6(prefix)[1];
50	ip->ip6[2] &= ip_set_netmask6(prefix)[2];
51	ip->ip6[3] &= ip_set_netmask6(prefix)[3];
52}
53
54#endif /*_PFXLEN_H */
55