FD.io VPP
v20.09-64-g4f7b92f0a
Vector Packet Processing
cnat_snat.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2020 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
16
#ifndef __CNAT_SNAT_H__
17
#define __CNAT_SNAT_H__
18
19
#include <
cnat/cnat_types.h
>
20
21
always_inline
int
22
cnat_search_snat_prefix
(ip46_address_t *
addr
,
ip_address_family_t
af)
23
{
24
/* Returns 0 if addr matches any of the listed prefixes */
25
cnat_snat_pfx_table_t
*table = &
cnat_main
.
snat_pfx_table
;
26
clib_bihash_kv_24_8_t
kv, val;
27
int
i
, n_p, rv;
28
n_p =
vec_len
(table->
meta
[af].
prefix_lengths_in_search_order
);
29
if
(
AF_IP4
== af)
30
{
31
kv.
key
[0] = addr->ip4.as_u32;
32
kv.
key
[1] = 0;
33
}
34
else
35
{
36
kv.
key
[0] = addr->as_u64[0];
37
kv.
key
[1] = addr->as_u64[1];
38
}
39
40
/*
41
* start search from a mask length same length or shorter.
42
* we don't want matches longer than the mask passed
43
*/
44
i = 0;
45
for
(; i < n_p; i++)
46
{
47
int
dst_address_length =
48
table->
meta
[af].
prefix_lengths_in_search_order
[
i
];
49
ip6_address_t *
mask
= &table->
ip_masks
[dst_address_length];
50
51
ASSERT
(dst_address_length >= 0 && dst_address_length <= 128);
52
/* As lengths are decreasing, masks are increasingly specific. */
53
kv.
key
[0] &= mask->as_u64[0];
54
kv.
key
[1] &= mask->as_u64[1];
55
kv.
key
[2] = ((
u64
) af << 32) | dst_address_length;
56
rv = clib_bihash_search_inline_2_24_8 (&table->
ip_hash
, &kv, &val);
57
if
(rv == 0)
58
return
0;
59
}
60
return
-1;
61
}
62
63
extern
int
cnat_add_snat_prefix
(
ip_prefix_t
* pfx);
64
extern
int
cnat_del_snat_prefix
(
ip_prefix_t
* pfx);
65
66
/*
67
* fd.io coding-style-patch-verification: ON
68
*
69
* Local Variables:
70
* eval: (c-set-style "gnu")
71
* End:
72
*/
73
74
#endif
cnat_add_snat_prefix
int cnat_add_snat_prefix(ip_prefix_t *pfx)
Definition:
cnat_snat.c:36
cnat_snat_pfx_table_t
Definition:
cnat_types.h:73
u64
unsigned long u64
Definition:
types.h:89
clib_bihash_kv_24_8_t
Definition:
bihash_24_8.h:38
mask
u16 mask
Definition:
flow_types.api:52
addr
vhost_vring_addr_t addr
Definition:
vhost_user.h:111
cnat_types.h
cnat_snat_pfx_table_t::ip_hash
clib_bihash_24_8_t ip_hash
Definition:
cnat_types.h:76
AF_IP4
Definition:
ip_types.h:23
cnat_del_snat_prefix
int cnat_del_snat_prefix(ip_prefix_t *pfx)
Definition:
cnat_snat.c:67
cnat_search_snat_prefix
static int cnat_search_snat_prefix(ip46_address_t *addr, ip_address_family_t af)
Definition:
cnat_snat.h:22
clib_bihash_kv_24_8_t::key
u64 key[3]
Definition:
bihash_24_8.h:40
always_inline
#define always_inline
Definition:
ipsec.h:28
cnat_snat_pfx_table_meta_t::prefix_lengths_in_search_order
u16 * prefix_lengths_in_search_order
Definition:
cnat_types.h:69
i
sll srl srl sll sra u16x4 i
Definition:
vector_sse42.h:317
ASSERT
#define ASSERT(truth)
Definition:
error_bootstrap.h:69
cnat_main_::snat_pfx_table
cnat_snat_pfx_table_t snat_pfx_table
Definition:
cnat_types.h:129
ip_address_family_t
enum ip_address_family_t_ ip_address_family_t
cnat_snat_pfx_table_t::ip_masks
ip6_address_t ip_masks[129]
Definition:
cnat_types.h:80
vec_len
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
Definition:
vec_bootstrap.h:142
cnat_main
cnat_main_t cnat_main
Definition:
cnat_types.c:18
ip_prefix
Definition:
ip_types.h:80
cnat_snat_pfx_table_t::meta
cnat_snat_pfx_table_meta_t meta[2]
Definition:
cnat_types.h:78
src
plugins
cnat
cnat_snat.h
Generated on Thu Jun 3 2021 16:04:14 for FD.io VPP by
1.8.13