FD.io VPP  v19.08.3-2-gbabecb413
Vector Packet Processing
session_table.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2019 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
17 #include <vnet/session/session.h>
18 
19 /**
20  * Pool of session tables
21  */
23 
25 _get_session_tables (void)
26 {
27  return lookup_tables;
28 }
29 
32 {
33  session_table_t *slt;
35  clib_memset (slt, 0, sizeof (*slt));
36  return slt;
37 }
38 
39 u32
41 {
42  return (slt - lookup_tables);
43 }
44 
46 session_table_get (u32 table_index)
47 {
48  if (pool_is_free_index (lookup_tables, table_index))
49  return 0;
50  return pool_elt_at_index (lookup_tables, table_index);
51 }
52 
53 #define foreach_hash_table_parameter \
54  _(v4,session,buckets,20000) \
55  _(v4,session,memory,(64<<20)) \
56  _(v6,session,buckets,20000) \
57  _(v6,session,memory,(64<<20)) \
58  _(v4,halfopen,buckets,20000) \
59  _(v4,halfopen,memory,(64<<20)) \
60  _(v6,halfopen,buckets,20000) \
61  _(v6,halfopen,memory,(64<<20))
62 
63 /**
64  * Initialize session table hash tables
65  *
66  * If vpp configured with set of table parameters it uses them,
67  * otherwise it uses defaults above.
68  */
69 void
71 {
72  u8 all = fib_proto > FIB_PROTOCOL_IP6 ? 1 : 0;
73  int i;
74 
75 #define _(af,table,parm,value) \
76  u32 configured_##af##_##table##_table_##parm = value;
78 #undef _
79 
80 #define _(af,table,parm,value) \
81  if (session_main.configured_##af##_##table##_table_##parm) \
82  configured_##af##_##table##_table_##parm = \
83  session_main.configured_##af##_##table##_table_##parm;
85 #undef _
86 
87  if (fib_proto == FIB_PROTOCOL_IP4 || all)
88  {
89  clib_bihash_init2_args_16_8_t _a, *a = &_a;
90 
91  memset (a, 0, sizeof (*a));
92  a->h = &slt->v4_session_hash;
93  a->name = "v4 session table";
94  a->nbuckets = configured_v4_session_table_buckets;
95  a->memory_size = configured_v4_session_table_memory;
96  a->dont_add_to_all_bihash_list = 1;
97  a->instantiate_immediately = 1;
98  clib_bihash_init2_16_8 (a);
99 
100  memset (a, 0, sizeof (*a));
101  a->h = &slt->v4_half_open_hash;
102  a->name = "v4 half-open table";
103  a->nbuckets = configured_v4_halfopen_table_buckets;
104  a->memory_size = configured_v4_halfopen_table_memory;
105  a->dont_add_to_all_bihash_list = 1;
106  a->instantiate_immediately = 1;
107  clib_bihash_init2_16_8 (a);
108  }
109  if (fib_proto == FIB_PROTOCOL_IP6 || all)
110  {
111  clib_bihash_init2_args_48_8_t _a, *a = &_a;
112 
113  memset (a, 0, sizeof (*a));
114  a->h = &slt->v6_session_hash;
115  a->name = "v6 session table";
116  a->nbuckets = configured_v6_session_table_buckets;
117  a->memory_size = configured_v6_session_table_memory;
118  a->dont_add_to_all_bihash_list = 1;
119  a->instantiate_immediately = 1;
120  clib_bihash_init2_48_8 (a);
121 
122  memset (a, 0, sizeof (*a));
123  a->h = &slt->v6_half_open_hash;
124  a->name = "v6 half-open table";
125  a->nbuckets = configured_v6_halfopen_table_buckets;
126  a->memory_size = configured_v6_halfopen_table_memory;
127  a->dont_add_to_all_bihash_list = 1;
128  a->instantiate_immediately = 1;
129  clib_bihash_init2_48_8 (a);
130  }
131 
132  for (i = 0; i < TRANSPORT_N_PROTO; i++)
133  session_rules_table_init (&slt->session_rules[i]);
134 }
135 
136 typedef struct _ip4_session_table_walk_ctx_t
137 {
139  void *ctx;
141 
142 void
144 {
146  ctx->fn (kvp, ctx->ctx);
147 }
148 
149 void
150 ip4_session_table_walk (clib_bihash_16_8_t * hash,
151  ip4_session_table_walk_fn_t fn, void *arg)
152 {
154  .fn = fn,
155  .ctx = arg,
156  };
157  clib_bihash_foreach_key_value_pair_16_8 (hash, ip4_session_table_walk_cb,
158  &ctx);
159 }
160 
161 /* *INDENT-ON* */
162 /*
163  * fd.io coding-style-patch-verification: ON
164  *
165  * Local Variables:
166  * eval: (c-set-style "gnu")
167  * End:
168  */
struct _ip4_session_table_walk_ctx_t ip4_session_table_walk_ctx_t
void session_rules_table_init(session_rules_table_t *srt)
session_table_t * session_table_alloc(void)
Definition: session_table.c:31
a
Definition: bitmap.h:538
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
int(* ip4_session_table_walk_fn_t)(clib_bihash_kv_16_8_t *kvp, void *ctx)
Definition: session_table.h:60
int i
unsigned char u8
Definition: types.h:56
#define foreach_hash_table_parameter
Definition: session_table.c:53
static session_table_t * lookup_tables
Pool of session tables.
Definition: session_table.c:22
unsigned int u32
Definition: types.h:88
void session_table_init(session_table_t *slt, u8 fib_proto)
Initialize session table hash tables.
Definition: session_table.c:70
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:514
long ctx[MAX_CONNS]
Definition: main.c:144
#define pool_get_aligned(P, E, A)
Allocate an object E from a pool P with alignment A.
Definition: pool.h:230
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
Definition: pool.h:283
session_table_t * session_table_get(u32 table_index)
Definition: session_table.c:46
void ip4_session_table_walk(clib_bihash_16_8_t *hash, ip4_session_table_walk_fn_t fn, void *arg)
void ip4_session_table_walk_cb(clib_bihash_kv_16_8_t *kvp, void *arg)
struct _session_lookup_table session_table_t
u32 session_table_index(session_table_t *slt)
Definition: session_table.c:40
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:59