Loading...
Note: File does not exist in v6.8.
1// SPDX-License-Identifier: GPL-2.0
2/* Copyright Amazon.com Inc. or its affiliates. */
3
4#ifndef _TEST_TCP_SYNCOOKIE_H
5#define _TEST_TCP_SYNCOOKIE_H
6
7#define __packed __attribute__((__packed__))
8#define __force
9
10#define swap(a, b) \
11 do { \
12 typeof(a) __tmp = (a); \
13 (a) = (b); \
14 (b) = __tmp; \
15 } while (0)
16
17#define swap_array(a, b) \
18 do { \
19 typeof(a) __tmp[sizeof(a)]; \
20 __builtin_memcpy(__tmp, a, sizeof(a)); \
21 __builtin_memcpy(a, b, sizeof(a)); \
22 __builtin_memcpy(b, __tmp, sizeof(a)); \
23 } while (0)
24
25/* linux/unaligned.h */
26#define __get_unaligned_t(type, ptr) ({ \
27 const struct { type x; } __packed * __pptr = (typeof(__pptr))(ptr); \
28 __pptr->x; \
29})
30
31#define get_unaligned(ptr) __get_unaligned_t(typeof(*(ptr)), (ptr))
32
33static inline u16 get_unaligned_be16(const void *p)
34{
35 return bpf_ntohs(__get_unaligned_t(__be16, p));
36}
37
38static inline u32 get_unaligned_be32(const void *p)
39{
40 return bpf_ntohl(__get_unaligned_t(__be32, p));
41}
42
43/* lib/checksum.c */
44static inline u32 from64to32(u64 x)
45{
46 /* add up 32-bit and 32-bit for 32+c bit */
47 x = (x & 0xffffffff) + (x >> 32);
48 /* add up carry.. */
49 x = (x & 0xffffffff) + (x >> 32);
50 return (u32)x;
51}
52
53static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
54 __u32 len, __u8 proto, __wsum sum)
55{
56 unsigned long long s = (__force u32)sum;
57
58 s += (__force u32)saddr;
59 s += (__force u32)daddr;
60#ifdef __BIG_ENDIAN
61 s += proto + len;
62#else
63 s += (proto + len) << 8;
64#endif
65 return (__force __wsum)from64to32(s);
66}
67
68/* asm-generic/checksum.h */
69static inline __sum16 csum_fold(__wsum csum)
70{
71 u32 sum = (__force u32)csum;
72
73 sum = (sum & 0xffff) + (sum >> 16);
74 sum = (sum & 0xffff) + (sum >> 16);
75 return (__force __sum16)~sum;
76}
77
78static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr, __u32 len,
79 __u8 proto, __wsum sum)
80{
81 return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
82}
83
84/* net/ipv6/ip6_checksum.c */
85static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
86 const struct in6_addr *daddr,
87 __u32 len, __u8 proto, __wsum csum)
88{
89 int carry;
90 __u32 ulen;
91 __u32 uproto;
92 __u32 sum = (__force u32)csum;
93
94 sum += (__force u32)saddr->in6_u.u6_addr32[0];
95 carry = (sum < (__force u32)saddr->in6_u.u6_addr32[0]);
96 sum += carry;
97
98 sum += (__force u32)saddr->in6_u.u6_addr32[1];
99 carry = (sum < (__force u32)saddr->in6_u.u6_addr32[1]);
100 sum += carry;
101
102 sum += (__force u32)saddr->in6_u.u6_addr32[2];
103 carry = (sum < (__force u32)saddr->in6_u.u6_addr32[2]);
104 sum += carry;
105
106 sum += (__force u32)saddr->in6_u.u6_addr32[3];
107 carry = (sum < (__force u32)saddr->in6_u.u6_addr32[3]);
108 sum += carry;
109
110 sum += (__force u32)daddr->in6_u.u6_addr32[0];
111 carry = (sum < (__force u32)daddr->in6_u.u6_addr32[0]);
112 sum += carry;
113
114 sum += (__force u32)daddr->in6_u.u6_addr32[1];
115 carry = (sum < (__force u32)daddr->in6_u.u6_addr32[1]);
116 sum += carry;
117
118 sum += (__force u32)daddr->in6_u.u6_addr32[2];
119 carry = (sum < (__force u32)daddr->in6_u.u6_addr32[2]);
120 sum += carry;
121
122 sum += (__force u32)daddr->in6_u.u6_addr32[3];
123 carry = (sum < (__force u32)daddr->in6_u.u6_addr32[3]);
124 sum += carry;
125
126 ulen = (__force u32)bpf_htonl((__u32)len);
127 sum += ulen;
128 carry = (sum < ulen);
129 sum += carry;
130
131 uproto = (__force u32)bpf_htonl(proto);
132 sum += uproto;
133 carry = (sum < uproto);
134 sum += carry;
135
136 return csum_fold((__force __wsum)sum);
137}
138#endif