3 * ct6.h - skeleton vpp engine plug-in header file
5 * Copyright (c) <current-year> <your-organization>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 #ifndef __included_ct6_h__
19 #define __included_ct6_h__
21 #include <vnet/vnet.h>
22 #include <vnet/ip/ip.h>
23 #include <vnet/ethernet/ethernet.h>
24 #include <vppinfra/bihash_48_8.h>
26 #include <vppinfra/hash.h>
27 #include <vppinfra/error.h>
29 typedef CLIB_PACKED (struct
40 u8 proto; /* byte 37 */
48 ct6_session_key_t key;
58 /* API message ID base */
61 /* session lookup table */
62 clib_bihash_48_8_t session_hash;
63 u8 feature_initialized;
65 /* per_thread session pools */
66 ct6_session_t **sessions;
70 /* Config parameters */
71 f64 session_timeout_interval;
72 uword session_hash_memory;
73 u32 session_hash_buckets;
74 u32 max_sessions_per_worker;
77 vlib_main_t *vlib_main;
78 vnet_main_t *vnet_main;
79 ethernet_main_t *ethernet_main;
82 extern ct6_main_t ct6_main;
84 extern vlib_node_registration_t ct6_out2in_node;
85 extern vlib_node_registration_t ct6_in2out_node;
87 format_function_t format_ct6_session;
89 ct6_session_t *ct6_create_or_recycle_session (ct6_main_t * cmp,
90 clib_bihash_kv_48_8_t * kvpp,
91 f64 now, u32 my_thread_index,
92 u32 * recyclep, u32 * createp);
95 ct6_lru_remove (ct6_main_t * cmp, ct6_session_t * s0)
97 ct6_session_t *next_sess, *prev_sess;
101 thread_index = s0->thread_index;
103 s0_index = s0 - cmp->sessions[thread_index];
105 /* Deal with list heads */
106 if (s0_index == cmp->first_index[thread_index])
107 cmp->first_index[thread_index] = s0->next_index;
108 if (s0_index == cmp->last_index[thread_index])
109 cmp->last_index[thread_index] = s0->prev_index;
112 if (s0->next_index != ~0)
114 next_sess = pool_elt_at_index (cmp->sessions[thread_index],
116 next_sess->prev_index = s0->prev_index;
119 if (s0->prev_index != ~0)
121 prev_sess = pool_elt_at_index (cmp->sessions[thread_index],
123 prev_sess->next_index = s0->next_index;
128 ct6_lru_add (ct6_main_t * cmp, ct6_session_t * s0, f64 now)
130 ct6_session_t *next_sess;
135 s0->expires = now + cmp->session_timeout_interval;
136 thread_index = s0->thread_index;
138 s0_index = s0 - cmp->sessions[thread_index];
141 * Re-add at the head of the forward LRU list,
142 * tail of the reverse LRU list
144 if (cmp->first_index[thread_index] != ~0)
146 next_sess = pool_elt_at_index (cmp->sessions[thread_index],
147 cmp->first_index[thread_index]);
148 next_sess->prev_index = s0_index;
153 /* s0 now the new head of the LRU forward list */
154 s0->next_index = cmp->first_index[thread_index];
155 cmp->first_index[thread_index] = s0_index;
157 /* single session case: also the tail of the reverse LRU list */
158 if (cmp->last_index[thread_index] == ~0)
159 cmp->last_index[thread_index] = s0_index;
163 ct6_update_session_hit (ct6_main_t * cmp, ct6_session_t * s0, f64 now)
165 ct6_lru_remove (cmp, s0);
166 ct6_lru_add (cmp, s0, now);
169 #endif /* __included_ct6_h__ */
172 * fd.io coding-style-patch-verification: ON
175 * eval: (c-set-style "gnu")