OSDN Git Service

23cbde859ba4c79b89c6eb731cf001a51dd30f43
[immortalwrt/immortalwrt.git] / package / kernel / shortcut-fe / src / sfe_cm.h
1 /*
2  * sfe_cm.h
3  *      Shortcut forwarding engine.
4  *
5  * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
6  * Permission to use, copy, modify, and/or distribute this software for
7  * any purpose with or without fee is hereby granted, provided that the
8  * above copyright notice and this permission notice appear in all copies.
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
15  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 /*
19  * connection flags.
20  */
21 #define SFE_CREATE_FLAG_NO_SEQ_CHECK BIT(0)
22                                         /* Indicates that we should not check sequence numbers */
23 #define SFE_CREATE_FLAG_REMARK_PRIORITY BIT(1)
24                                         /* Indicates that we should remark priority of skb */
25 #define SFE_CREATE_FLAG_REMARK_DSCP BIT(2)
26                                         /* Indicates that we should remark DSCP of packet */
27
28 /*
29  * IPv6 address structure
30  */
31 struct sfe_ipv6_addr {
32         __be32 addr[4];
33 };
34
35 typedef union {
36         __be32                  ip;
37         struct sfe_ipv6_addr    ip6[1];
38 } sfe_ip_addr_t;
39
40 /*
41  * connection creation structure.
42  */
43 struct sfe_connection_create {
44         int protocol;
45         struct net_device *src_dev;
46         struct net_device *dest_dev;
47         u32 flags;
48         u32 src_mtu;
49         u32 dest_mtu;
50         sfe_ip_addr_t src_ip;
51         sfe_ip_addr_t src_ip_xlate;
52         sfe_ip_addr_t dest_ip;
53         sfe_ip_addr_t dest_ip_xlate;
54         __be16 src_port;
55         __be16 src_port_xlate;
56         __be16 dest_port;
57         __be16 dest_port_xlate;
58         u8 src_mac[ETH_ALEN];
59         u8 src_mac_xlate[ETH_ALEN];
60         u8 dest_mac[ETH_ALEN];
61         u8 dest_mac_xlate[ETH_ALEN];
62         u8 src_td_window_scale;
63         u32 src_td_max_window;
64         u32 src_td_end;
65         u32 src_td_max_end;
66         u8 dest_td_window_scale;
67         u32 dest_td_max_window;
68         u32 dest_td_end;
69         u32 dest_td_max_end;
70         u32 mark;
71 #ifdef CONFIG_XFRM
72         u32 original_accel;
73         u32 reply_accel;
74 #endif
75         u32 src_priority;
76         u32 dest_priority;
77         u32 src_dscp;
78         u32 dest_dscp;
79 };
80
81 /*
82  * connection destruction structure.
83  */
84 struct sfe_connection_destroy {
85         int protocol;
86         sfe_ip_addr_t src_ip;
87         sfe_ip_addr_t dest_ip;
88         __be16 src_port;
89         __be16 dest_port;
90 };
91
92 typedef enum sfe_sync_reason {
93         SFE_SYNC_REASON_STATS,  /* Sync is to synchronize stats */
94         SFE_SYNC_REASON_FLUSH,  /* Sync is to flush a entry */
95         SFE_SYNC_REASON_DESTROY /* Sync is to destroy a entry(requested by connection manager) */
96 } sfe_sync_reason_t;
97
98 /*
99  * Structure used to sync connection stats/state back within the system.
100  *
101  * NOTE: The addresses here are NON-NAT addresses, i.e. the true endpoint addressing.
102  * 'src' is the creator of the connection.
103  */
104 struct sfe_connection_sync {
105         struct net_device *src_dev;
106         struct net_device *dest_dev;
107         int is_v6;                      /* Is it for ipv6? */
108         int protocol;                   /* IP protocol number (IPPROTO_...) */
109         sfe_ip_addr_t src_ip;           /* Non-NAT source address, i.e. the creator of the connection */
110         sfe_ip_addr_t src_ip_xlate;     /* NATed source address */
111         __be16 src_port;                /* Non-NAT source port */
112         __be16 src_port_xlate;          /* NATed source port */
113         sfe_ip_addr_t dest_ip;          /* Non-NAT destination address, i.e. to whom the connection was created */
114         sfe_ip_addr_t dest_ip_xlate;    /* NATed destination address */
115         __be16 dest_port;               /* Non-NAT destination port */
116         __be16 dest_port_xlate;         /* NATed destination port */
117         u32 src_td_max_window;
118         u32 src_td_end;
119         u32 src_td_max_end;
120         u64 src_packet_count;
121         u64 src_byte_count;
122         u32 src_new_packet_count;
123         u32 src_new_byte_count;
124         u32 dest_td_max_window;
125         u32 dest_td_end;
126         u32 dest_td_max_end;
127         u64 dest_packet_count;
128         u64 dest_byte_count;
129         u32 dest_new_packet_count;
130         u32 dest_new_byte_count;
131         u32 reason;             /* reason for stats sync message, i.e. destroy, flush, period sync */
132         u64 delta_jiffies;              /* Time to be added to the current timeout to keep the connection alive */
133 };
134
135 /*
136  * connection mark structure
137  */
138 struct sfe_connection_mark {
139         int protocol;
140         sfe_ip_addr_t src_ip;
141         sfe_ip_addr_t dest_ip;
142         __be16 src_port;
143         __be16 dest_port;
144         u32 mark;
145 };
146
147 /*
148  * Expose the hook for the receive processing.
149  */
150 extern int (*athrs_fast_nat_recv)(struct sk_buff *skb);
151
152 /*
153  * Expose what should be a static flag in the TCP connection tracker.
154  */
155 extern int nf_ct_tcp_no_window_check;
156
157 /*
158  * This callback will be called in a timer
159  * at 100 times per second to sync stats back to
160  * Linux connection track.
161  *
162  * A RCU lock is taken to prevent this callback
163  * from unregistering.
164  */
165 typedef void (*sfe_sync_rule_callback_t)(struct sfe_connection_sync *);
166
167 /*
168  * IPv4 APIs used by connection manager
169  */
170 int sfe_ipv4_recv(struct net_device *dev, struct sk_buff *skb);
171 int sfe_ipv4_create_rule(struct sfe_connection_create *sic);
172 void sfe_ipv4_destroy_rule(struct sfe_connection_destroy *sid);
173 void sfe_ipv4_destroy_all_rules_for_dev(struct net_device *dev);
174 void sfe_ipv4_register_sync_rule_callback(sfe_sync_rule_callback_t callback);
175 void sfe_ipv4_update_rule(struct sfe_connection_create *sic);
176 void sfe_ipv4_mark_rule(struct sfe_connection_mark *mark);
177
178 #ifdef SFE_SUPPORT_IPV6
179 /*
180  * IPv6 APIs used by connection manager
181  */
182 int sfe_ipv6_recv(struct net_device *dev, struct sk_buff *skb);
183 int sfe_ipv6_create_rule(struct sfe_connection_create *sic);
184 void sfe_ipv6_destroy_rule(struct sfe_connection_destroy *sid);
185 void sfe_ipv6_destroy_all_rules_for_dev(struct net_device *dev);
186 void sfe_ipv6_register_sync_rule_callback(sfe_sync_rule_callback_t callback);
187 void sfe_ipv6_update_rule(struct sfe_connection_create *sic);
188 void sfe_ipv6_mark_rule(struct sfe_connection_mark *mark);
189 #else
190 static inline int sfe_ipv6_recv(struct net_device *dev, struct sk_buff *skb)
191 {
192         return 0;
193 }
194
195 static inline int sfe_ipv6_create_rule(struct sfe_connection_create *sic)
196 {
197         return 0;
198 }
199
200 static inline void sfe_ipv6_destroy_rule(struct sfe_connection_destroy *sid)
201 {
202         return;
203 }
204
205 static inline void sfe_ipv6_destroy_all_rules_for_dev(struct net_device *dev)
206 {
207         return;
208 }
209
210 static inline void sfe_ipv6_register_sync_rule_callback(sfe_sync_rule_callback_t callback)
211 {
212         return;
213 }
214
215 static inline void sfe_ipv6_update_rule(struct sfe_connection_create *sic)
216 {
217         return;
218 }
219
220 static inline void sfe_ipv6_mark_rule(struct sfe_connection_mark *mark)
221 {
222         return;
223 }
224 #endif
225
226 /*
227  * sfe_ipv6_addr_equal()
228  *      compare ipv6 address
229  *
230  * return: 1, equal; 0, no equal
231  */
232 static inline int sfe_ipv6_addr_equal(struct sfe_ipv6_addr *a,
233                                       struct sfe_ipv6_addr *b)
234 {
235         return a->addr[0] == b->addr[0] &&
236                a->addr[1] == b->addr[1] &&
237                a->addr[2] == b->addr[2] &&
238                a->addr[3] == b->addr[3];
239 }
240
241 /*
242  * sfe_ipv4_addr_equal()
243  *      compare ipv4 address
244  *
245  * return: 1, equal; 0, no equal
246  */
247 #define sfe_ipv4_addr_equal(a, b) ((u32)(a) == (u32)(b))
248
249 /*
250  * sfe_addr_equal()
251  *      compare ipv4 or ipv6 address
252  *
253  * return: 1, equal; 0, no equal
254  */
255 static inline int sfe_addr_equal(sfe_ip_addr_t *a,
256                                  sfe_ip_addr_t *b, int is_v4)
257 {
258         return is_v4 ? sfe_ipv4_addr_equal(a->ip, b->ip) : sfe_ipv6_addr_equal(a->ip6, b->ip6);
259 }