dpdk: Add support for Mellanox ConnectX-4 devices
[vpp.git] / vnet / test / lisp-cp / test_cp_serdes.c
1 /*
2  * Copyright (c) 2016 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 #include <vnet/vnet.h>
17 #include <vppinfra/error.h>
18 #include <vnet/lisp-cp/lisp_cp_messages.h>
19 #include <vnet/lisp-cp/control.h>
20 #include <vnet/lisp-cp/lisp_msg_serdes.h>
21 #include <vlibapi/api.h>
22 #include <vnet/lisp-cp/packets.h>
23
24 #define _assert(e)                    \
25   error = CLIB_ERROR_ASSERT (e);      \
26   if (error)                          \
27     goto done;
28
29 static void print_chunk(u8 * b, int * offset, int c, char * des)
30 {
31   int i, n = offset[0] + c;;
32   for (i = offset[0]; i < n; i++)
33   {
34     printf("0x%02x, ", b[i]);
35   }
36   printf(" // %s\n", des);
37   *offset += c;
38 }
39
40 void print_map_request(map_request_hdr_t * h)
41 {
42 #define pchunk(_count, _desc) \
43   print_chunk((u8 *)h, &offset, _count, _desc)
44
45   int offset = 0;
46
47   pchunk(4, "data");
48   pchunk(8, "Nonce");
49   pchunk(2, "Source-EID-AFI");
50   pchunk(4, "Source EID Address");
51   pchunk(2, "ITR-RLOC-AFI 1");
52   pchunk(4, "ITR-RLOC Address 1");
53   pchunk(2, "ITR-RLOC-AFI 2");
54   pchunk(16, "ITR-RLOC Address 2");
55   pchunk(1, "REC: reserved");
56   pchunk(1, "REC: EID mask-len");
57   pchunk(2, "REC: EID-prefix-AFI");
58   pchunk(4, "REC: EID-prefix");
59   printf("\n");
60 }
61
62 static clib_error_t * test_lisp_msg_push_ecm ()
63 {
64   vlib_main_t * vm = vlib_get_main ();
65   clib_error_t * error = 0;
66   gid_address_t la, ra;
67   vlib_buffer_t * b = 0;
68   u32 buff_len = 900;
69   int lp = 0x15, rp = 0x14;
70
71   b = clib_mem_alloc (buff_len);
72   memset((u8 *)b, 0, buff_len);
73   b->current_length = buff_len;
74   b->current_data = sizeof(udp_header_t) + sizeof(ip4_header_t) +
75     sizeof(ecm_hdr_t) + 1;
76
77   la.type = GID_ADDR_IP_PREFIX;
78   la.ippref.addr.ip.v4.as_u32 = 0xa1b2c3d4;
79   la.ippref.addr.version = IP4;
80
81   ra.type = GID_ADDR_IP_PREFIX;
82   ra.ippref.addr.ip.v4.as_u32 = 0x90817263;
83   ra.ippref.addr.version = IP4;
84
85   ecm_hdr_t * lh = lisp_msg_push_ecm (vm, b, lp, rp, &la, &ra);
86
87   u8 expected_ecm_hdr[] = {
88     0x80, 0x00, 0x00, 0x00
89   };
90   _assert(0 == memcmp(expected_ecm_hdr, lh, sizeof(expected_ecm_hdr)));
91
92   ip4_header_t * ih = (ip4_header_t *) (lh + 1);
93   /* clear ip checksum */
94   memset((u8 *)ih + 10, 0, 2);
95
96   u8 expected_ip4_hdr[] = {
97     0x45,                   /* version; IHL */
98     0x00,                   /* services */
99     0x03, 0xa0,             /* total length */
100     0x00, 0x00,             /* identification */
101     0x40, 0x00,             /* flags; fragment offset*/
102     0xff,                   /* TTL */
103     0x11,                   /* protocol */
104     0x00, 0x00,             /* header checksum */
105     0xd4, 0xc3, 0xb2, 0xa1, /* src IP */
106     0x63, 0x72, 0x81, 0x90, /* dst IP */
107   };
108   _assert(0 == memcmp(ih, expected_ip4_hdr, sizeof(expected_ip4_hdr)));
109
110   udp_header_t * uh = (udp_header_t *) (ih + 1);
111   /* clear udp checksum */
112   memset((u8 *)uh + 6, 0, 2);
113
114   u8 expected_udp_hdr[] = {
115     0x00, 0x15, /* src port */
116     0x00, 0x14, /* dst port */
117     0x03, 0x8c, /* length */
118     0x00, 0x00, /* checksum */
119   };
120   _assert(0 == memcmp(uh, expected_udp_hdr, sizeof(expected_udp_hdr)));
121
122 done:
123   clib_mem_free (b);
124   return error;
125 }
126
127 static clib_error_t * test_lisp_msg_parse_mapping_record ()
128 {
129   clib_error_t * error = 0;
130   locator_t probed;
131   locator_t * locs = 0;
132   vlib_buffer_t * b = 0;
133   gid_address_t eid;
134   u32 buff_len = 500;
135
136   b = clib_mem_alloc (buff_len);
137   memset((u8 *)b, 0, buff_len);
138
139   u8 map_reply_records[] = {
140     /* 1. record */
141     0x01, 0x02, 0x03, 0x04, /* record TTL */
142     0x01,                   /* locator count */
143     0x00, 0x00, 0x00,       /* eid-mask-len; ... */
144     0x00, 0x00,             /* reserved; map-version num */
145     0x00, 0x01,             /* EID-Prefix-AFI */
146     0x33, 0x44, 0x55, 0x66, /* eid-prefix */
147     /* loc */
148     0x0a,                   /* prority */
149     0x0b,                   /* weight */
150     0x0c,                   /* m-prority */
151     0x0d,                   /* m-weight */
152     0x00, 0x00,             /* unused flags */
153     0x00, 0x01,             /* Loc-AFI */
154     0xaa, 0xbb, 0xcc, 0xdd, /* Loator */
155   };
156   b->current_length = buff_len;
157   clib_memcpy(b->data, map_reply_records, sizeof(map_reply_records));
158
159   lisp_msg_parse_mapping_record (b, &eid, &locs, &probed);
160   _assert(vec_len (locs) == 1);
161   _assert(eid.ippref.addr.ip.v4.as_u32 == 0x66554433);
162   _assert(locs[0].local == 0);
163   _assert(locs[0].address.ippref.addr.ip.v4.as_u32 == 0xddccbbaa);
164   _assert(locs[0].address.type == GID_ADDR_IP_PREFIX);
165   _assert(locs[0].priority == 0xa);
166   _assert(locs[0].weight == 0xb);
167   _assert(locs[0].mpriority == 0xc);
168   _assert(locs[0].mweight == 0xd);
169
170 done:
171   clib_mem_free (b);
172   if (locs)
173     vec_free (locs);
174   return error;
175 }
176
177 static map_request_hdr_t *
178 build_map_request (lisp_cp_main_t * lcm, vlib_buffer_t * b,
179                    gid_address_t * rlocs)
180 {
181   gid_address_t _seid, * seid = &_seid;
182   gid_address_t _deid, * deid = &_deid;
183   u8 is_smr_invoked = 1;
184   u8 rloc_probe_set = 0;
185   u64 nonce = 0;
186   map_request_hdr_t * h = 0;
187   memset (deid, 0, sizeof (deid[0]));
188   memset (seid, 0, sizeof (seid[0]));
189
190   gid_address_type (seid) = GID_ADDR_IP_PREFIX;
191   ip_address_t * ip_addr = &gid_address_ip (seid);
192   ip_addr_v4 (ip_addr).as_u32 = 0x12345678;
193   seid->ippref.addr.version = IP4;
194
195   gid_address_type (deid) = GID_ADDR_IP_PREFIX;
196   ip_address_t * ip_addr2 = &gid_address_ip (deid);
197   ip_addr_v4 (ip_addr2).as_u32 = 0x9abcdef0;
198   deid->ippref.addr.version = IP4;
199   gid_address_ippref_len (deid) = 24;
200
201   h = lisp_msg_put_mreq (lcm, b, seid, deid, rlocs,
202                      is_smr_invoked, rloc_probe_set, &nonce);
203   vec_free(rlocs);
204   return h;
205 }
206
207 static void
208 generate_rlocs (gid_address_t **rlocs, u32 * count)
209 {
210   gid_address_t gid_addr_data, * gid_addr = &gid_addr_data;
211   memset (gid_addr, 0, sizeof (gid_addr[0]));
212   ip_address_t * addr = &gid_address_ip (gid_addr);
213
214   gid_address_type (gid_addr) = GID_ADDR_IP_PREFIX;
215
216   ip_addr_version (addr) = IP4;
217   ip_addr_v4 (addr).data_u32 = 0x10203040;
218   vec_add1 (rlocs[0], gid_addr[0]);
219
220   ip_addr_v6 (addr).as_u32[0] = 0xffeeddcc;
221   ip_addr_v6 (addr).as_u32[1] = 0xbbaa9988;
222   ip_addr_v6 (addr).as_u32[2] = 0x77665544;
223   ip_addr_v6 (addr).as_u32[3] = 0x33221100;
224   ip_addr_version (addr) = IP6;
225   vec_add1 (rlocs[0], gid_addr[0]);
226 }
227
228 static clib_error_t * test_lisp_msg_parse ()
229 {
230   gid_address_t eid;
231   lisp_cp_main_t * lcm = vnet_lisp_cp_get_main();
232   map_request_hdr_t *h;
233   gid_address_t gid;
234   clib_error_t * error = 0;
235   vlib_buffer_t * b;
236   gid_address_t * rlocs_decode = 0, * rlocs = 0;
237   u32 rloc_count_parse = 0;
238
239   u8 * data = clib_mem_alloc(500);
240   memset(data, 0, 500);
241   b = (vlib_buffer_t *) data;
242
243   generate_rlocs (&rlocs_decode, &rloc_count_parse);
244   h = build_map_request (lcm, b, rlocs_decode);
245
246   vlib_buffer_pull(b, sizeof(*h));
247   u32 len = lisp_msg_parse_addr(b, &gid);
248   _assert (len == 2 + 4
249       /* Source-EID-AFI field lenght + IPv4 address length */);
250   _assert (gid.ippref.addr.ip.v4.as_u32 == 0x12345678);
251   _assert (gid.ippref.addr.version == IP4);
252
253   u8 rloc_count = MREQ_ITR_RLOC_COUNT(h) + 1;
254   lisp_msg_parse_itr_rlocs (b, &rlocs, rloc_count);
255
256   _assert (vec_len (rlocs) == 2);
257   _assert (rlocs[0].ippref.addr.ip.v4.as_u32 == 0x10203040);
258   _assert (rlocs[0].ippref.addr.version == IP4);
259
260   _assert (rlocs[1].ippref.addr.ip.v6.as_u32[0] == 0xffeeddcc);
261   _assert (rlocs[1].ippref.addr.ip.v6.as_u32[1] == 0xbbaa9988);
262   _assert (rlocs[1].ippref.addr.ip.v6.as_u32[2] == 0x77665544);
263   _assert (rlocs[1].ippref.addr.ip.v6.as_u32[3] == 0x33221100);
264   _assert (rlocs[1].ippref.addr.version == IP6);
265
266   lisp_msg_parse_eid_rec (b, &eid);
267   _assert (eid.ippref.addr.ip.v4.as_u32 == 0x9abcdef0);
268   _assert (eid.ippref.addr.version == IP4);
269   _assert (eid.ippref.len == 24);
270
271 done:
272   clib_mem_free (data);
273   if (rlocs)
274     vec_free (rlocs);
275   return error;
276 }
277
278 static clib_error_t * test_lisp_msg_put_mreq_with_lcaf ()
279 {
280   lisp_cp_main_t * lcm = vnet_lisp_cp_get_main ();
281   clib_error_t * error = 0;
282   map_request_hdr_t *h = 0;
283   gid_address_t * rlocs = 0;
284
285   ip_prefix_t ippref;
286   ip_prefix_version (&ippref) = IP4;
287   ip4_address_t * ip = &ip_prefix_v4 (&ippref);
288   ip->as_u32 = 0x11223344;
289
290   gid_address_t g =
291     {
292       .type = GID_ADDR_IP_PREFIX,
293       .ippref = ippref,
294       .vni = 0x90919293,
295       .vni_mask = 0x17
296     };
297   vec_add1 (rlocs, g);
298
299   u8 * data = clib_mem_alloc (500);
300   memset (data, 0, 500);
301
302   h = build_map_request (lcm, (vlib_buffer_t *) data, rlocs);
303
304   /* clear Nonce to simplify comparison */
305   memset ((u8 *)h + 4, 0, 8);
306
307   u8 expected_data[] =
308     {
309       0x10, 0x40, 0x00, 0x01, /* type; flags; IRC; REC count */
310       0x00, 0x00, 0x00, 0x00,
311       0x00, 0x00, 0x00, 0x00, /* nonce */
312       0x00, 0x01,             /* Source-EID-AFI */
313       0x78, 0x56, 0x34, 0x12, /* Source EID Address */
314
315       /* RLOCs */
316       0x40, 0x03,             /* AFI = LCAF*/
317       /* LCAF header*/
318       0x00, 0x00,             /* reserved1, flags */
319       0x02,                   /* type = Instance ID */
320       0x17,                   /* IID mask-len */
321       0x00, 0x0a,             /* lenght */
322       0x90, 0x91, 0x92, 0x93, /* IID / VNI */
323
324       0x00, 0x01,             /* AFI = ipv4 */
325       0x44, 0x33, 0x22, 0x11, /* ITR-RLOC Address 1 */
326
327       /* record */
328       0x00,                   /* reserved */
329       0x18,                   /* EID mask-len */
330       0x00, 0x01,             /* EID-prefix-AFI */
331       0xf0, 0xde, 0xbc, 0x9a, /* EID-prefix */
332     };
333
334   _assert (0 == memcmp (expected_data, (u8 *) h, sizeof (expected_data)));
335 done:
336   clib_mem_free (data);
337   return error;
338 }
339
340 static clib_error_t * test_lisp_msg_put_mreq ()
341 {
342   lisp_cp_main_t * lcm = vnet_lisp_cp_get_main();
343   clib_error_t * error = 0;
344   map_request_hdr_t *h;
345   gid_address_t * rlocs = 0;
346   u32 rloc_count = 0;
347
348   u8 * data = clib_mem_alloc(500);
349   memset(data, 0, 500);
350
351   generate_rlocs (&rlocs, &rloc_count);
352   h = build_map_request (lcm, (vlib_buffer_t *) data, rlocs);
353
354   /* clear Nonce to simplify comparison */
355   memset((u8 *)h + 4, 0, 8);
356
357   print_map_request(h);
358
359   u8 expected_data[50] = {
360     0x10, 0x40, 0x01, 0x01, /* type; flags; IRC; REC count */
361     0x00, 0x00, 0x00, 0x00,
362     0x00, 0x00, 0x00, 0x00, /* nonce */
363     0x00, 0x01,             /* Source-EID-AFI */
364     0x78, 0x56, 0x34, 0x12, /* Source EID Address */
365
366     /* RLOCs */
367     0x00, 0x01,             /* ITR-RLOC-AFI 1 */
368     0x40, 0x30, 0x20, 0x10, /* ITR-RLOC Address 1 */
369     0x00, 0x02,             /* ITR-RLOC-AFI 2 */
370     0xcc, 0xdd, 0xee, 0xff,
371     0x88, 0x99, 0xaa, 0xbb,
372     0x44, 0x55, 0x66, 0x77,
373     0x00, 0x11, 0x22, 0x33, /* ITR-RLOC Address 2 */
374
375     /* record */
376     0x00,                   /* reserved */
377     0x18,                   /* EID mask-len */
378     0x00, 0x01,             /* EID-prefix-AFI */
379     0xf0, 0xde, 0xbc, 0x9a, /* EID-prefix */
380   };
381   _assert (0 == memcmp (expected_data, (u8 *) h, sizeof (expected_data)));
382
383 done:
384   clib_mem_free (data);
385   return error;
386 }
387
388 /* generate a vector of eid records */
389 static mapping_t *
390 build_test_map_records ()
391 {
392   mapping_t * records = 0;
393
394   mapping_t r = {
395     .ttl = 0x44332211,
396     .eid = {
397       .type = GID_ADDR_MAC,
398       .mac = {1, 2, 3, 4, 5, 6},
399       .vni = 0x0
400     }
401   };
402
403   locator_t loc = {
404     .weight = 1,
405     .priority = 2,
406     .local = 1,
407     .address = {
408       .type = GID_ADDR_IP_PREFIX,
409       .ippref = {
410         .addr = {
411           .ip.v4.as_u32 = 0x99887766,
412           .version = IP4
413         }
414       }
415     }
416   };
417   vec_add1 (r.locators, loc);
418   vec_add1 (records, r);
419
420   return records;
421 }
422
423 static void
424 free_test_map_records (mapping_t * maps)
425 {
426   mapping_t * map;
427   vec_foreach (map, maps)
428     {
429       vec_free (map->locators);
430     }
431   vec_free (maps);
432 }
433
434 static clib_error_t *
435 test_lisp_map_register ()
436 {
437   vlib_buffer_t *b;
438   clib_error_t * error = 0;
439   u64 nonce;
440   u32 msg_len = 0;
441   mapping_t * records = build_test_map_records ();
442
443   u8 * data = clib_mem_alloc(500);
444   memset(data, 0, 500);
445   b = (vlib_buffer_t *) data;
446
447   lisp_msg_put_map_register (b, records, 1 /* want map notify */,
448                             20 /* length of HMAC_SHA_1_96 */,
449                             &nonce, &msg_len);
450   free_test_map_records (records);
451
452   /* clear Nonce to simplify comparison */
453   memset((u8 *)b->data + 4, 0, 8);
454
455   /* clear authentication data */
456   memset ((u8 *)b->data + 16, 0, 20);
457
458   u8 expected_data[] = {
459     0x30, 0x00, 0x01, 0x01, /* type; rsvd; want notify; REC count */
460     0x00, 0x00, 0x00, 0x00,
461     0x00, 0x00, 0x00, 0x00, /* nonce */
462     0x00, 0x00, 0x00, 0x00, /* key id, auth data length:
463                               both are zeroes because those are set in another
464                               function (see auth_data_len_by_key_id())*/
465     0x00, 0x00, 0x00, 0x00,
466     0x00, 0x00, 0x00, 0x00,
467     0x00, 0x00, 0x00, 0x00,
468     0x00, 0x00, 0x00, 0x00,
469     0x00, 0x00, 0x00, 0x00, /* auth data */
470
471     /* first record */
472     0x44, 0x33, 0x22, 0x11, /* ttl */
473     0x01, 0x00, 0x00, 0x00, /* loc count, eid len, ACT, A */
474     0x00, 0x00, 0x40, 0x05, /* rsvd, map ver num, AFI = MAC */
475     0x01, 0x02, 0x03, 0x04,
476     0x05, 0x06,             /* MAC EID */
477
478     /* locator 1 */
479     0x02, 0x01, 0x00, 0x00, /* prio, weight, mprio, mweight */
480     0x00, 0x04, 0x00, 0x01, /* flags, AFI = ipv4 */
481     0x66, 0x77, 0x88, 0x99, /* ipv4 locator address */
482   };
483   _assert (0 == memcmp (expected_data, b->data, sizeof (expected_data)));
484 done:
485   clib_mem_free (data);
486   return error;
487 }
488
489 static clib_error_t *
490 test_lisp_parse_lcaf ()
491 {
492   int i;
493   clib_error_t * error = 0;
494   gid_address_t eid;
495   locator_t * locs = 0;
496   locator_t probed;
497   vlib_buffer_t * b = 0;
498   u32 buff_len = 500;
499
500   b = clib_mem_alloc (buff_len);
501   memset ((u8 *)b, 0, buff_len);
502
503   u8 map_reply_records[] =
504     {
505       /* 1. record */
506       0x01, 0x02, 0x03, 0x04, /* record TTL */
507       0x03,                   /* locator count */
508       0x00, 0x00, 0x00,       /* eid-mask-len; ... */
509       0x00, 0x00,             /* reserved; map-version num */
510       0x00, 0x01,             /* EID-Prefix-AFI */
511       0x33, 0x44, 0x55, 0x66, /* eid-prefix */
512
513       /* 1st locator */
514       0x0a,                   /* prority */
515       0x0b,                   /* weight */
516       0x0c,                   /* m-prority */
517       0x0d,                   /* m-weight */
518       0x00, 0x00,             /* unused flags */
519       0x40, 0x03,             /* Loc-AFI = LCAF*/
520
521       /* LCAF header*/
522       0x00, 0x00,             /* reserved1, flags */
523       0x02,                   /* type = Instance ID */
524       0x18,                   /* IID mask-len */
525       0x00, 0x0a,             /* lenght */
526       /* LCAF Instance ID */
527       0x00, 0x00, 0x00, 0x09, /* iid */
528       0x00, 0x01,             /* AFI = ipv4 */
529       0x10, 0xbb, 0xcc, 0xdd, /* ipv4 loator address */
530
531       /* 2nd locator */
532       0x07,                   /* prority */
533       0x06,                   /* weight */
534       0x05,                   /* m-prority */
535       0x04,                   /* m-weight */
536       0x00, 0x00,             /* unused flags */
537       0x40, 0x03,             /* Loc-AFI = LCAF*/
538
539       /* LCAF header*/
540       0x00, 0x00,             /* reserved1, flags */
541       0x02,                   /* type = Instance ID */
542       0x18,                   /* IID mask-len */
543       0x00, 0x16,             /* iid length + next AFI lenght */
544       /* LCAF Instance ID */
545       0x22, 0x44, 0x66, 0x88, /* iid */
546       0x00, 0x02,             /* AFI = ipv6 */
547       0xcc, 0xdd, 0xee, 0xff,
548       0x88, 0x99, 0xaa, 0xbb,
549       0x44, 0x55, 0x66, 0x77,
550       0x00, 0x11, 0x22, 0x33, /* ipv6 locator address */
551
552       /* 3rd locator */
553       0x0a,                   /* prority */
554       0x0b,                   /* weight */
555       0x0c,                   /* m-prority */
556       0x0d,                   /* m-weight */
557       0x00, 0x00,             /* unused flags */
558       0x00, 0x01,             /* Loc-AFI */
559       0xaa, 0xbb, 0xcc, 0xdd, /* Loator */
560     };
561
562   b->current_length = buff_len;
563   memcpy (b->data, map_reply_records, sizeof (map_reply_records));
564
565   lisp_msg_parse_mapping_record (b, &eid, &locs, &probed);
566   _assert (vec_len (locs) == 3);
567   _assert (eid.ippref.addr.ip.v4.as_u32 == 0x66554433);
568
569   /* check 1st locator - an LCAF with ipv4 */
570   _assert (locs[0].local == 0);
571   _assert (locs[0].priority == 0xa);
572   _assert (locs[0].weight == 0xb);
573   _assert (locs[0].mpriority == 0xc);
574   _assert (locs[0].mweight == 0xd);
575
576   _assert (gid_address_type (&locs[0].address) == GID_ADDR_IP_PREFIX);
577   _assert (gid_address_vni (&locs[0].address) == 0x09);
578   ip_prefix_t * ip_pref = &gid_address_ippref (&locs[0].address);
579   _assert (IP4 == ip_prefix_version (ip_pref));
580
581   /* 2nd locator - LCAF entry with ipv6 address */
582   _assert (locs[1].local == 0);
583   _assert (locs[1].priority == 0x7);
584   _assert (locs[1].weight == 0x6);
585   _assert (locs[1].mpriority == 0x5);
586   _assert (locs[1].mweight == 0x4);
587
588   _assert (gid_address_type (&locs[1].address) == GID_ADDR_IP_PREFIX);
589   _assert (0x22446688 == gid_address_vni (&locs[1].address));
590   ip_pref = &gid_address_ippref (&locs[1].address);
591   _assert (IP6 == ip_prefix_version (ip_pref));
592
593   /* 3rd locator - simple ipv4 address */
594   _assert (gid_address_type (&locs[2].address) == GID_ADDR_IP_PREFIX);
595 done:
596   clib_mem_free (b);
597
598   for (i = 0; i < 3; i++)
599     locator_free (&locs[i]);
600   vec_free (locs);
601   return error;
602 }
603
604 #define foreach_test_case                 \
605   _(lisp_msg_put_mreq)                    \
606   _(lisp_msg_put_mreq_with_lcaf)          \
607   _(lisp_msg_push_ecm)                    \
608   _(lisp_msg_parse)                       \
609   _(lisp_msg_parse_mapping_record)        \
610   _(lisp_parse_lcaf)                      \
611   _(lisp_map_register)
612
613 int run_tests (void)
614 {
615   clib_error_t * error;
616
617 #define _(_test_name)                   \
618   error = test_ ## _test_name ();       \
619   if (error)                            \
620     {                                   \
621       clib_error_report (error);        \
622       return 0;                         \
623     }
624
625   foreach_test_case
626 #undef _
627
628   return 0;
629 }
630
631 int main()
632 {
633   return run_tests ();
634 }
635 #undef _assert