FD.io VPP  v17.04-9-g99c0734
Vector Packet Processing
test.c
Go to the documentation of this file.
1 /*
2  * test.c : MAP unit tests
3  *
4  * Copyright (c) 2016 Cisco and/or its affiliates.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #include <assert.h>
19 #include "map.h"
20 
21 static map_domain_t *
22 get_domain(ip4_address_t * ip4_prefix, u8 ip4_prefix_len,
23  ip6_address_t * ip6_prefix, u8 ip6_prefix_len,
24  ip6_address_t * ip6_src, u8 ip6_src_len,
25  u8 ea_bits_len, u8 psid_offset,
26  u8 psid_length, u16 mtu, u8 flags)
27 {
28  map_domain_t * d = malloc(sizeof(*d));
29  u8 suffix_len;
30 
31  /* EA bits must be within the first 64 bits */
32  if (ea_bits_len > 0 && (ip6_prefix_len + ea_bits_len) > 64)
33  return NULL;
34 
35  /* Init domain struct */
36  d->ip4_prefix.as_u32 = ip4_prefix->as_u32;
37  d->ip4_prefix_len = ip4_prefix_len;
38  d->ip6_prefix = *ip6_prefix;
39  d->ip6_prefix_len = ip6_prefix_len;
40  d->ip6_src = *ip6_src;
41  d->ip6_src_len = ip6_src_len;
42  d->ea_bits_len = ea_bits_len;
43  d->psid_offset = psid_offset;
44  d->psid_length = psid_length;
45  d->mtu = mtu;
46  d->flags = flags;
47 
48  /* How many, and which bits to grab from the IPv4 DA */
49  if (ip4_prefix_len + ea_bits_len < 32)
50  {
52  d->suffix_shift = 32 - ip4_prefix_len - ea_bits_len;
53  suffix_len = ea_bits_len;
54  }
55  else
56  {
57  d->suffix_shift = 0;
58  suffix_len = 32 - ip4_prefix_len;
59  }
60  d->suffix_mask = (1 << suffix_len) - 1;
61 
62  d->psid_shift = 16 - psid_length - psid_offset;
63  d->psid_mask = (1 << d->psid_length) - 1;
64 
65  if (ip6_prefix_len + suffix_len + d->psid_length > 64)
66  return NULL;
67 
68  d->ea_shift = 64 - ip6_prefix_len - suffix_len - d->psid_length;
69 
70  return d;
71 }
72 
73 
74 /*
75  * VPP-340:
76  * map_add_domain ip4-pfx 20.0.0.0/8 ip6-pfx 2001:db8::/40 ip6-src 2001:db8:ffff::/96 ea-bits-len 24 psid-offset 0 psid-len 0 map-t
77  * IPv4 src = 100.0.0.1
78  * IPv4 dst = 20.169.201.219
79  * UDP dest port = 1232
80  * IPv6 src = 2001:db8:ffff::6400:1
81  * IPv6 dst = a9c9:dfb8::14a9:c9db:0
82  * a9c9:dfb8::14a9:c9db:0 != 2001:db8:a9:c9db:0:14a9:c9db:0
83  */
84 static void
86 {
87  ip4_address_t ip4_prefix;
88  ip6_address_t ip6_prefix;
89  ip6_address_t ip6_src;
90 
91  ip4_prefix.as_u32 = clib_host_to_net_u32(0x14000000);
92  ip6_prefix.as_u64[0] = clib_host_to_net_u64(0x20010db800000000);
93  ip6_prefix.as_u64[1] = 0;
94  ip6_src.as_u64[0] = clib_host_to_net_u64(0x20010db8ffff0000);
95  map_domain_t * d = get_domain (&ip4_prefix, 8, &ip6_prefix, 40, &ip6_src, 96, 24, 0, 0, 0, MAP_DOMAIN_TRANSLATION);
96 
97  ip6_address_t dst6;
98 
99  dst6.as_u64[0] = map_get_pfx(d, 0x14a9c9db, 1232);
100  dst6.as_u64[1] = map_get_sfx(d, 0x14a9c9db, 1232);
101  assert(dst6.as_u64[0] == 0x20010db800a9c9db);
102  assert(dst6.as_u64[1] == 0x000014a9c9db0000);
103 }
104 
105 /*
106  * VPP-228
107  * ip4-pfx 20.0.0.0/8
108  * ip6-pfx 2001:db8::/<n>
109  * ip6-src 2001:db8:ffff::1
110  * ea-bits-len 16 psid-offset 6 psid-len 8
111  * 20.169.201.219 port 1232
112  */
113 static void
115 {
116  ip4_address_t ip4_prefix;
117  ip6_address_t ip6_prefix;
118  ip6_address_t ip6_src;
119  ip6_address_t dst6;
120 
121  ip4_prefix.as_u32 = clib_host_to_net_u32(0x14000000);
122  ip6_prefix.as_u64[0] = clib_host_to_net_u64(0x20010db800000000);
123  ip6_prefix.as_u64[1] = 0;
124  ip6_src.as_u64[0] = clib_host_to_net_u64(0x20010db8ffff0000);
125  ip6_src.as_u64[1] = clib_host_to_net_u64(0x0000000000000001);
126  map_domain_t * d = get_domain (&ip4_prefix, 16, &ip6_prefix, 48, &ip6_src,
127  128, 16, 6, 8, 0, 0);
128  assert(!d);
129 
130  //20.0.0.0/8 2001:db8::/32 4 2001:db8:a000::14a0:0:0
131  d = get_domain (&ip4_prefix, 8, &ip6_prefix, 32, &ip6_src,
132  128, 4, 0, 0, 0, 0);
133  dst6.as_u64[0] = map_get_pfx(d, 0x14a9c9db, 1232);
134  dst6.as_u64[1] = map_get_sfx(d, 0x14a9c9db, 1232);
135  assert(dst6.as_u64[0] == 0x20010db8a0000000);
136  assert(dst6.as_u64[1] == 0x000014a000000000);
137 
138  //20.0.0.0/8 2001:db8::/32 8 2001:db8:a900::14a9:0:0
139  d = get_domain (&ip4_prefix, 8, &ip6_prefix, 32, &ip6_src,
140  128, 8, 0, 0, 0, 0);
141  dst6.as_u64[0] = map_get_pfx(d, 0x14a9c9db, 1232);
142  dst6.as_u64[1] = map_get_sfx(d, 0x14a9c9db, 1232);
143  assert(dst6.as_u64[0] == 0x20010db8a9000000);
144  assert(dst6.as_u64[1] == 0x000014a900000000);
145 
146  //20.0.0.0/8 2001:db8::/32 10 2001:db8:a9c0::14a9:c000:0
147  d = get_domain (&ip4_prefix, 8, &ip6_prefix, 32, &ip6_src,
148  128, 10, 0, 0, 0, 0);
149  dst6.as_u64[0] = map_get_pfx(d, 0x14a9c9db, 1232);
150  dst6.as_u64[1] = map_get_sfx(d, 0x14a9c9db, 1232);
151  assert(dst6.as_u64[0] == 0x20010db8a9c00000);
152  assert(dst6.as_u64[1] == 0x000014a9c0000000);
153 
154  //20.0.0.0/8 2001:db8::/32 16 2001:db8:a9c9::14a9:c900:0
155  d = get_domain (&ip4_prefix, 8, &ip6_prefix, 32, &ip6_src,
156  128, 16, 0, 0, 0, 0);
157  dst6.as_u64[0] = map_get_pfx(d, 0x14a9c9db, 1232);
158  dst6.as_u64[1] = map_get_sfx(d, 0x14a9c9db, 1232);
159  assert(dst6.as_u64[0] == 0x20010db8a9c90000);
160  assert(dst6.as_u64[1] == 0x000014a9c9000000);
161 
162  //20.0.0.0/8 2001:db8::/32 20 2001:db8:a9c9:d000:0:14a9:c9d0:0
163  d = get_domain (&ip4_prefix, 8, &ip6_prefix, 32, &ip6_src,
164  128, 20, 0, 0, 0, 0);
165  dst6.as_u64[0] = map_get_pfx(d, 0x14a9c9db, 1232);
166  dst6.as_u64[1] = map_get_sfx(d, 0x14a9c9db, 1232);
167  assert(dst6.as_u64[0] == 0x20010db8a9c9d000);
168  assert(dst6.as_u64[1] == 0x000014a9c9d00000);
169 
170  //20.0.0.0/8 2001:db8::/32 23 2001:db8:a9c9:da00:0:14a9:c9da:0
171  d = get_domain (&ip4_prefix, 8, &ip6_prefix, 32, &ip6_src,
172  128, 23, 0, 0, 0, 0);
173  dst6.as_u64[0] = map_get_pfx(d, 0x14a9c9db, 1232);
174  dst6.as_u64[1] = map_get_sfx(d, 0x14a9c9db, 1232);
175  assert(dst6.as_u64[0] == 0x20010db8a9c9da00);
176  assert(dst6.as_u64[1] == 0x000014a9c9da0000);
177 
178  //20.169.201.0/24 2001:db8::/32 7 2001:db8:da00::14a9:c9da:0
179  d = get_domain (&ip4_prefix, 8, &ip6_prefix, 32, &ip6_src,
180  128, 7, 0, 0, 0, 0);
181  dst6.as_u64[0] = map_get_pfx(d, 0x14a9c9db, 1232);
182  dst6.as_u64[1] = map_get_sfx(d, 0x14a9c9db, 1232);
183  assert(dst6.as_u64[0] == 0x20010db8a8000000);
184  assert(dst6.as_u64[1] == 0x000014a800000000);
185 }
186 
187 #define foreach_test_case \
188  _(map_t_destaddr) \
189  _(map_eabits)
190 
191 static void
192 run_tests (void)
193 {
194 #define _(_test_name) \
195  test_ ## _test_name ();
196 
198 #undef _
199 }
200 
201 int main()
202 {
203  run_tests ();
204  return 0;
205 }
u8 psid_length
Definition: map.h:102
map_domain_flags_e flags
Definition: map.h:97
static_always_inline u64 map_get_pfx(map_domain_t *d, u32 addr, u16 port)
Definition: map.h:360
u64 as_u64[2]
Definition: ip6_packet.h:51
#define NULL
Definition: clib.h:55
u32 suffix_mask
Definition: map.h:93
static void run_tests(void)
Definition: test.c:192
static void test_map_eabits(void)
Definition: test.c:114
u8 ea_bits_len
Definition: map.h:100
u8 ip6_prefix_len
Definition: map.h:98
u8 ip6_src_len
Definition: map.h:99
u8 psid_shift
Definition: map.h:105
u8 suffix_shift
Definition: map.h:106
ip4_address_t ip4_prefix
Definition: map.h:94
u8 psid_offset
Definition: map.h:101
ip6_address_t ip6_src
Definition: map.h:90
u16 psid_mask
Definition: map.h:95
u8 ea_shift
Definition: map.h:107
static void test_map_t_destaddr(void)
Definition: test.c:85
ip6_address_t ip6_prefix
Definition: map.h:91
unsigned short u16
Definition: types.h:57
u16 mtu
Definition: map.h:96
unsigned char u8
Definition: types.h:56
u8 ip4_prefix_len
Definition: map.h:110
static map_domain_t * get_domain(ip4_address_t *ip4_prefix, u8 ip4_prefix_len, ip6_address_t *ip6_prefix, u8 ip6_prefix_len, ip6_address_t *ip6_src, u8 ip6_src_len, u8 ea_bits_len, u8 psid_offset, u8 psid_length, u16 mtu, u8 flags)
Definition: test.c:22
static_always_inline u64 map_get_sfx(map_domain_t *d, u32 addr, u16 port)
Definition: map.h:384
int main()
Definition: test.c:201
u32 flags
Definition: vhost-user.h:78
#define foreach_test_case
Definition: test.c:187