hc
2025-02-14 bbb9540dc49f70f6b703d1c8d1b85fa5f602d86e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (c) 2015 Tom Herbert <tom@herbertland.com>
 */
 
#ifndef __ILA_H
#define __ILA_H
 
#include <linux/errno.h>
#include <linux/ip.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/socket.h>
#include <linux/skbuff.h>
#include <linux/types.h>
#include <net/checksum.h>
#include <net/genetlink.h>
#include <net/ip.h>
#include <net/protocol.h>
#include <uapi/linux/ila.h>
 
struct ila_locator {
   union {
       __u8            v8[8];
       __be16          v16[4];
       __be32          v32[2];
       __be64        v64;
   };
};
 
struct ila_identifier {
   union {
       struct {
#if defined(__LITTLE_ENDIAN_BITFIELD)
           u8 __space:4;
           u8 csum_neutral:1;
           u8 type:3;
#elif defined(__BIG_ENDIAN_BITFIELD)
           u8 type:3;
           u8 csum_neutral:1;
           u8 __space:4;
#else
#error  "Adjust your <asm/byteorder.h> defines"
#endif
           u8 __space2[7];
       };
       __u8            v8[8];
       __be16          v16[4];
       __be32          v32[2];
       __be64        v64;
   };
};
 
#define CSUM_NEUTRAL_FLAG    htonl(0x10000000)
 
struct ila_addr {
   union {
       struct in6_addr addr;
       struct {
           struct ila_locator loc;
           struct ila_identifier ident;
       };
   };
};
 
static inline struct ila_addr *ila_a2i(struct in6_addr *addr)
{
   return (struct ila_addr *)addr;
}
 
struct ila_params {
   struct ila_locator locator;
   struct ila_locator locator_match;
   __wsum csum_diff;
   u8 csum_mode;
   u8 ident_type;
};
 
static inline __wsum compute_csum_diff8(const __be32 *from, const __be32 *to)
{
   __be32 diff[] = {
       ~from[0], ~from[1], to[0], to[1],
   };
 
   return csum_partial(diff, sizeof(diff), 0);
}
 
static inline bool ila_csum_neutral_set(struct ila_identifier ident)
{
   return !!(ident.csum_neutral);
}
 
void ila_update_ipv6_locator(struct sk_buff *skb, struct ila_params *p,
                bool set_csum_neutral);
 
void ila_init_saved_csum(struct ila_params *p);
 
struct ila_net {
   struct {
       struct rhashtable rhash_table;
       spinlock_t *locks; /* Bucket locks for entry manipulation */
       unsigned int locks_mask;
       bool hooks_registered;
   } xlat;
};
 
int ila_lwt_init(void);
void ila_lwt_fini(void);
 
int ila_xlat_init_net(struct net *net);
void ila_xlat_exit_net(struct net *net);
 
int ila_xlat_nl_cmd_add_mapping(struct sk_buff *skb, struct genl_info *info);
int ila_xlat_nl_cmd_del_mapping(struct sk_buff *skb, struct genl_info *info);
int ila_xlat_nl_cmd_get_mapping(struct sk_buff *skb, struct genl_info *info);
int ila_xlat_nl_cmd_flush(struct sk_buff *skb, struct genl_info *info);
int ila_xlat_nl_dump_start(struct netlink_callback *cb);
int ila_xlat_nl_dump_done(struct netlink_callback *cb);
int ila_xlat_nl_dump(struct sk_buff *skb, struct netlink_callback *cb);
 
extern unsigned int ila_net_id;
 
extern struct genl_family ila_nl_family;
 
#endif /* __ILA_H */