FD.io VPP  v18.01.2-1-g9b554f3
Vector Packet Processing
dslite.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 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 #include <nat/dslite.h>
16 #include <nat/dslite_dpo.h>
17 #include <vnet/fib/fib_table.h>
18 
20 
21 void
23 {
27  uword *p;
29  u32 translation_buckets = 1024;
30  u32 translation_memory_size = 128 << 20;
31  u32 b4_buckets = 128;
32  u32 b4_memory_size = 64 << 20;
33 
34  dm->first_worker_index = 0;
35  dm->num_workers = 0;
36 
37  p = hash_get_mem (tm->thread_registrations_by_name, "workers");
38  if (p)
39  {
40  tr = (vlib_thread_registration_t *) p[0];
41  if (tr)
42  {
43  dm->num_workers = tr->count;
45  }
46  }
47 
48  if (dm->num_workers)
49  dm->port_per_thread = (0xffff - 1024) / dm->num_workers;
50  else
51  dm->port_per_thread = 0xffff - 1024;
52 
54 
55  /* *INDENT-OFF* */
57  {
58  clib_bihash_init_24_8 (&td->in2out, "in2out", translation_buckets,
59  translation_memory_size);
60 
61  clib_bihash_init_8_8 (&td->out2in, "out2in", translation_buckets,
62  translation_memory_size);
63 
64  clib_bihash_init_16_8 (&td->b4_hash, "b4s", b4_buckets, b4_memory_size);
65  }
66  /* *INDENT-ON* */
67 
69 }
70 
71 int
73 {
74  dpo_id_t dpo_v6 = DPO_INVALID;
75 
76  dslite_dpo_create (DPO_PROTO_IP6, 0, &dpo_v6);
77  fib_prefix_t pfx = {
79  .fp_len = 128,
80  .fp_addr.ip6.as_u64[0] = addr->as_u64[0],
81  .fp_addr.ip6.as_u64[1] = addr->as_u64[1],
82  };
84  FIB_ENTRY_FLAG_EXCLUSIVE, &dpo_v6);
85  dpo_reset (&dpo_v6);
86 
87  dm->aftr_ip6_addr.as_u64[0] = addr->as_u64[0];
88  dm->aftr_ip6_addr.as_u64[1] = addr->as_u64[1];
89  return 0;
90 }
91 
92 int
94 {
96  snat_address_t *a = 0;
97  int i = 0;
98  dpo_id_t dpo_v4 = DPO_INVALID;
99  fib_prefix_t pfx = {
101  .fp_len = 32,
102  .fp_addr.ip4.as_u32 = addr->as_u32,
103  };
104 
105  for (i = 0; i < vec_len (dm->addr_pool); i++)
106  {
107  if (dm->addr_pool[i].addr.as_u32 == addr->as_u32)
108  {
109  a = dm->addr_pool + i;
110  break;
111  }
112  }
113  if (is_add)
114  {
115  if (a)
116  return VNET_API_ERROR_VALUE_EXIST;
117  vec_add2 (dm->addr_pool, a, 1);
118  a->addr = *addr;
119 #define _(N, i, n, s) \
120  clib_bitmap_alloc (a->busy_##n##_port_bitmap, 65535); \
121  a->busy_##n##_ports = 0; \
122  vec_validate_init_empty (a->busy_##n##_ports_per_thread, tm->n_vlib_mains - 1, 0);
124 #undef _
125  dslite_dpo_create (DPO_PROTO_IP4, 0, &dpo_v4);
127  FIB_ENTRY_FLAG_EXCLUSIVE, &dpo_v4);
128  dpo_reset (&dpo_v4);
129  }
130  else
131  {
132  if (!a)
133  return VNET_API_ERROR_NO_SUCH_ENTRY;
134 #define _(N, id, n, s) \
135  clib_bitmap_free (a->busy_##n##_port_bitmap); \
136  vec_free (a->busy_##n##_ports_per_thread);
138 #undef _
140  vec_del1 (dm->addr_pool, i);
141  }
142  return 0;
143 }
144 
145 u8 *
146 format_dslite_trace (u8 * s, va_list * args)
147 {
148  CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
149  CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
150  dslite_trace_t *t = va_arg (*args, dslite_trace_t *);
151 
152  s =
153  format (s, "next index %d, session %d", t->next_index, t->session_index);
154 
155  return s;
156 }
157 
158 /*
159  * fd.io coding-style-patch-verification: ON
160  *
161  * Local Variables:
162  * eval: (c-set-style "gnu")
163  * End:
164  */
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:432
fib_protocol_t fp_proto
protocol type
Definition: fib_types.h:181
void dslite_dpo_create(dpo_proto_t dproto, u32 aftr_index, dpo_id_t *dpo)
Definition: dslite_dpo.c:22
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:337
#define CLIB_UNUSED(x)
Definition: clib.h:79
void dslite_init(vlib_main_t *vm)
Definition: dslite.c:22
a
Definition: bitmap.h:516
u16 port_per_thread
Definition: dslite.h:87
u8 * format_dslite_trace(u8 *s, va_list *args)
Definition: dslite.c:146
u64 as_u64[2]
Definition: ip6_packet.h:51
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
Definition: vec.h:557
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:419
u32 session_index
Definition: dslite.h:93
clib_bihash_16_8_t b4_hash
Definition: dslite.h:67
u32 first_worker_index
Definition: dslite.h:86
void fib_table_entry_special_remove(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Remove a &#39;special&#39; entry from the FIB.
Definition: fib_table.c:390
A high priority source a plugin can use.
Definition: fib_entry.h:62
Aggregrate type for a prefix.
Definition: fib_types.h:172
u32 num_workers
Definition: dslite.h:85
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:166
Definition: fib_entry.h:242
clib_bihash_8_8_t out2in
Definition: dslite.h:63
#define vec_del1(v, i)
Delete the element at index I.
Definition: vec.h:801
snat_address_t * addr_pool
Definition: dslite.h:84
int dslite_add_del_pool_addr(dslite_main_t *dm, ip4_address_t *addr, u8 is_add)
Definition: dslite.c:93
void dslite_dpo_module_init(void)
Definition: dslite_dpo.c:69
ip6_address_t aftr_ip6_addr
Definition: dslite.h:81
vlib_main_t * vm
Definition: buffer.c:283
dslite_main_t dslite_main
Definition: dslite.c:19
fib_node_index_t fib_table_entry_special_dpo_add(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
Add a &#39;special&#39; entry to the FIB that links to the DPO passed A special entry is an entry that the FI...
Definition: fib_table.c:290
unsigned int u32
Definition: types.h:88
uword * thread_registrations_by_name
Definition: threads.h:297
ip4_address_t addr
Definition: nat.h:177
u64 uword
Definition: types.h:112
dslite_per_thread_data_t * per_thread_data
Definition: dslite.h:83
u32 next_index
Definition: dslite.h:92
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
unsigned char u8
Definition: types.h:56
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
Definition: dpo.h:193
#define hash_get_mem(h, key)
Definition: hash.h:268
static vlib_thread_main_t * vlib_get_thread_main()
Definition: global_funcs.h:32
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
Definition: dpo.c:228
#define vec_foreach(var, vec)
Vector iterator.
vhost_vring_addr_t addr
Definition: vhost-user.h:83
clib_bihash_24_8_t in2out
Definition: dslite.h:64
int dslite_set_aftr_ip6_addr(dslite_main_t *dm, ip6_address_t *addr)
Definition: dslite.c:72