summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorwhitespace / reindent <invalid@invalid.invalid>2017-08-09 11:49:42 +0200
committerwhitespace / reindent <invalid@invalid.invalid>2017-08-09 12:03:17 +0200
commitac4d0be5874fafd14212d6007fff7495edc9b152 (patch)
tree5e2f0d3189de928c849f9983406389ade3b098cb /tests
parentMerge pull request #920 from opensourcerouting/static-routes-ifindex-update-3.0 (diff)
downloadfrr-reindent-3.0-after.tar.xz
frr-reindent-3.0-after.zip
indent.py `git ls-files | pcregrep '\.[ch]$' | pcregrep -v '^(ldpd|babeld|nhrpd)/'` Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/bgpd/test_aspath.c2541
-rw-r--r--tests/bgpd/test_capability.c1502
-rw-r--r--tests/bgpd/test_ecommunity.c199
-rw-r--r--tests/bgpd/test_mp_attr.c1760
-rw-r--r--tests/bgpd/test_mpath.c638
-rw-r--r--tests/helpers/c/main.c250
-rw-r--r--tests/helpers/c/prng.c152
-rw-r--r--tests/helpers/c/prng.h10
-rw-r--r--tests/helpers/c/tests.h4
-rw-r--r--tests/lib/cli/common_cli.c83
-rw-r--r--tests/lib/cli/common_cli.h22
-rw-r--r--tests/lib/cli/test_cli.c62
-rw-r--r--tests/lib/cli/test_commands.c575
-rw-r--r--tests/lib/test_buffer.c58
-rw-r--r--tests/lib/test_checksum.c694
-rw-r--r--tests/lib/test_heavy.c97
-rw-r--r--tests/lib/test_heavy_thread.c156
-rw-r--r--tests/lib/test_heavy_wq.c197
-rw-r--r--tests/lib/test_memory.c148
-rw-r--r--tests/lib/test_nexthop_iter.c359
-rw-r--r--tests/lib/test_privs.c192
-rw-r--r--tests/lib/test_segv.c33
-rw-r--r--tests/lib/test_sig.c68
-rw-r--r--tests/lib/test_srcdest_table.c629
-rw-r--r--tests/lib/test_stream.c83
-rw-r--r--tests/lib/test_table.c710
-rw-r--r--tests/lib/test_timer_correctness.c242
-rw-r--r--tests/lib/test_timer_performance.c116
-rw-r--r--tests/test_lblmgr.c141
29 files changed, 6023 insertions, 5698 deletions
diff --git a/tests/bgpd/test_aspath.c b/tests/bgpd/test_aspath.c
index e5ff6a137..a8ecaa571 100644
--- a/tests/bgpd/test_aspath.c
+++ b/tests/bgpd/test_aspath.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright (C) 2005 Sun Microsystems, Inc.
*
* This file is part of Quagga.
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with Quagga; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -45,1345 +45,1346 @@ struct thread_master *master = NULL;
static int failed = 0;
/* specification for a test - what the results should be */
-struct test_spec
-{
- const char *shouldbe; /* the string the path should parse to */
- const char *shouldbe_delete_confed; /* ditto, but once confeds are deleted */
- const unsigned int hops; /* aspath_count_hops result */
- const unsigned int confeds; /* aspath_count_confeds */
- const int private_as; /* whether the private_as check should pass or fail */
+struct test_spec {
+ const char *shouldbe; /* the string the path should parse to */
+ const char *shouldbe_delete_confed; /* ditto, but once confeds are
+ deleted */
+ const unsigned int hops; /* aspath_count_hops result */
+ const unsigned int confeds; /* aspath_count_confeds */
+ const int private_as; /* whether the private_as check should pass or
+ fail */
#define NOT_ALL_PRIVATE 0
#define ALL_PRIVATE 1
- const as_t does_loop; /* an ASN which should trigger loop-check */
- const as_t doesnt_loop; /* one which should not */
- const as_t first; /* the first ASN, if there is one */
+ const as_t does_loop; /* an ASN which should trigger loop-check */
+ const as_t doesnt_loop; /* one which should not */
+ const as_t first; /* the first ASN, if there is one */
#define NULL_ASN 0
};
/* test segments to parse and validate, and use for other tests */
static struct test_segment {
- const char *name;
- const char *desc;
- const u_char asdata[1024];
- int len;
- struct test_spec sp;
-} test_segments [] =
-{
- { /* 0 */
- "seq1",
- "seq(8466,3,52737,4096)",
- { 0x2,0x4, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00 },
- 10,
- { "8466 3 52737 4096",
- "8466 3 52737 4096",
- 4, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
- },
- { /* 1 */
- "seq2",
- "seq(8722) seq(4)",
- { 0x2,0x1, 0x22,0x12,
- 0x2,0x1, 0x00,0x04 },
- 8,
- { "8722 4",
- "8722 4",
- 2, 0, NOT_ALL_PRIVATE, 4, 5, 8722, },
- },
- { /* 2 */
- "seq3",
- "seq(8466,3,52737,4096,8722,4)",
- { 0x2,0x6, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00,
- 0x22,0x12, 0x00,0x04},
- 14,
- { "8466 3 52737 4096 8722 4",
- "8466 3 52737 4096 8722 4",
- 6, 0, NOT_ALL_PRIVATE, 3, 5, 8466 },
- },
- { /* 3 */
- "seqset",
- "seq(8482,51457) set(5204)",
- { 0x2,0x2, 0x21,0x22, 0xc9,0x01,
- 0x1,0x1, 0x14,0x54 },
- 10,
- { "8482 51457 {5204}",
- "8482 51457 {5204}",
- 3, 0, NOT_ALL_PRIVATE, 5204, 51456, 8482},
- },
- { /* 4 */
- "seqset2",
- "seq(8467, 59649) set(4196,48658) set(17322,30745)",
- { 0x2,0x2, 0x21,0x13, 0xe9,0x01,
- 0x1,0x2, 0x10,0x64, 0xbe,0x12,
- 0x1,0x2, 0x43,0xaa, 0x78,0x19 },
- 18,
- { "8467 59649 {4196,48658} {17322,30745}",
- "8467 59649 {4196,48658} {17322,30745}",
- 4, 0, NOT_ALL_PRIVATE, 48658, 1, 8467},
- },
- { /* 5 */
- "multi",
- "seq(6435,59408,21665) set(2457,61697,4369), seq(1842,41590,51793)",
- { 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1,
- 0x1,0x3, 0x09,0x99, 0xf1,0x01, 0x11,0x11,
- 0x2,0x3, 0x07,0x32, 0xa2,0x76, 0xca,0x51 },
- 24,
- { "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
- "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
- 7, 0, NOT_ALL_PRIVATE, 51793, 1, 6435 },
- },
- { /* 6 */
- "confed",
- "confseq(123,456,789)",
- { 0x3,0x3, 0x00,0x7b, 0x01,0xc8, 0x03,0x15 },
- 8,
- { "(123 456 789)",
- "",
- 0, 3, NOT_ALL_PRIVATE, 789, 1, NULL_ASN },
- },
- { /* 7 */
- "confed2",
- "confseq(123,456,789) confseq(111,222)",
- { 0x3,0x3, 0x00,0x7b, 0x01,0xc8, 0x03,0x15,
- 0x3,0x2, 0x00,0x6f, 0x00,0xde },
- 14,
- { "(123 456 789) (111 222)",
- "",
- 0, 5, NOT_ALL_PRIVATE, 111, 1, NULL_ASN },
- },
- { /* 8 */
- "confset",
- "confset(456,123,789)",
- { 0x4,0x3, 0x01,0xc8, 0x00,0x7b, 0x03,0x15 },
- 8,
- { "[123,456,789]",
- "",
- 0, 1, NOT_ALL_PRIVATE, 123, 1, NULL_ASN },
- },
- { /* 9 */
- "confmulti",
- "confseq(123,456,789) confset(222,111) seq(8722) set(4196,48658)",
- { 0x3,0x3, 0x00,0x7b, 0x01,0xc8, 0x03,0x15,
- 0x4,0x2, 0x00,0xde, 0x00,0x6f,
- 0x2,0x1, 0x22,0x12,
- 0x1,0x2, 0x10,0x64, 0xbe,0x12 },
- 24,
- { "(123 456 789) [111,222] 8722 {4196,48658}",
- "8722 {4196,48658}",
- 2, 4, NOT_ALL_PRIVATE, 123, 1, NULL_ASN },
- },
- { /* 10 */
- "seq4",
- "seq(8466,2,52737,4096,8722,4)",
- { 0x2,0x6, 0x21,0x12, 0x00,0x02, 0xce,0x01, 0x10,0x00,
- 0x22,0x12, 0x00,0x04},
- 14,
- { "8466 2 52737 4096 8722 4",
- "8466 2 52737 4096 8722 4",
- 6, 0, NOT_ALL_PRIVATE, 4096, 1, 8466 },
- },
- { /* 11 */
- "tripleseq1",
- "seq(8466,2,52737) seq(4096,8722,4) seq(8722)",
- { 0x2,0x3, 0x21,0x12, 0x00,0x02, 0xce,0x01,
- 0x2,0x3, 0x10,0x00, 0x22,0x12, 0x00,0x04,
- 0x2,0x1, 0x22,0x12},
- 20,
- { "8466 2 52737 4096 8722 4 8722",
- "8466 2 52737 4096 8722 4 8722",
- 7, 0, NOT_ALL_PRIVATE, 4096, 1, 8466 },
- },
- { /* 12 */
- "someprivate",
- "seq(8466,64512,52737,65535)",
- { 0x2,0x4, 0x21,0x12, 0xfc,0x00, 0xce,0x01, 0xff,0xff },
- 10,
- { "8466 64512 52737 65535",
- "8466 64512 52737 65535",
- 4, 0, NOT_ALL_PRIVATE, 65535, 4, 8466 },
- },
- { /* 13 */
- "allprivate",
- "seq(65534,64512,64513,65535)",
- { 0x2,0x4, 0xff,0xfe, 0xfc,0x00, 0xfc,0x01, 0xff,0xff },
- 10,
- { "65534 64512 64513 65535",
- "65534 64512 64513 65535",
- 4, 0, ALL_PRIVATE, 65534, 4, 65534 },
- },
- { /* 14 */
- "long",
- "seq(8466,3,52737,4096,34285,<repeated 49 more times>)",
- { 0x2,0xfa, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed,
- 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x85,0xed, },
- 502,
- { "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285",
-
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285",
- 250, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
- },
- { /* 15 */
- "seq1extra",
- "seq(8466,3,52737,4096,3456)",
- { 0x2,0x5, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x0d,0x80 },
- 12,
- { "8466 3 52737 4096 3456",
- "8466 3 52737 4096 3456",
- 5, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
- },
- { /* 16 */
- "empty",
- "<empty>",
- {},
- 0,
- { "", "", 0, 0, 0, 0, 0, 0 },
- },
- { /* 17 */
- "redundantset",
- "seq(8466,3,52737,4096,3456) set(7099,8153,8153,8153)",
- { 0x2,0x5, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x0d,0x80,
- 0x1,0x4, 0x1b,0xbb, 0x1f,0xd9, 0x1f,0xd9, 0x1f,0xd9 },
- 22,
- {
- /* We shouldn't ever /generate/ such paths. However, we should
- * cope with them fine.
- */
- "8466 3 52737 4096 3456 {7099,8153}",
- "8466 3 52737 4096 3456 {7099,8153}",
- 6, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
- },
- { /* 18 */
- "reconcile_lead_asp",
- "seq(6435,59408,21665) set(23456,23456,23456), seq(23456,23456,23456)",
- { 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1,
- 0x1,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0,
- 0x2,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0 },
- 24,
- { "6435 59408 21665 {23456} 23456 23456 23456",
- "6435 59408 21665 {23456} 23456 23456 23456",
- 7, 0, NOT_ALL_PRIVATE, 23456, 1, 6435 },
- },
- { /* 19 */
- "reconcile_new_asp",
- "set(2457,61697,4369), seq(1842,41591,51793)",
- {
- 0x1,0x3, 0x09,0x99, 0xf1,0x01, 0x11,0x11,
- 0x2,0x3, 0x07,0x32, 0xa2,0x77, 0xca,0x51 },
- 16,
- { "{2457,4369,61697} 1842 41591 51793",
- "{2457,4369,61697} 1842 41591 51793",
- 4, 0, NOT_ALL_PRIVATE, 51793, 1, 2457 },
- },
- { /* 20 */
- "reconcile_confed",
- "confseq(123,456,789) confset(456,124,788) seq(6435,59408,21665)"
- " set(23456,23456,23456), seq(23456,23456,23456)",
- { 0x3,0x3, 0x00,0x7b, 0x01,0xc8, 0x03,0x15,
- 0x4,0x3, 0x01,0xc8, 0x00,0x7c, 0x03,0x14,
- 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1,
- 0x1,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0,
- 0x2,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0 },
- 40,
- { "(123 456 789) [124,456,788] 6435 59408 21665"
- " {23456} 23456 23456 23456",
- "6435 59408 21665 {23456} 23456 23456 23456",
- 7, 4, NOT_ALL_PRIVATE, 23456, 1, 6435 },
- },
- { /* 21 */
- "reconcile_start_trans",
- "seq(23456,23456,23456) seq(6435,59408,21665)",
- { 0x2,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0,
- 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1, },
- 16,
- { "23456 23456 23456 6435 59408 21665",
- "23456 23456 23456 6435 59408 21665",
- 6, 0, NOT_ALL_PRIVATE, 21665, 1, 23456 },
- },
- { /* 22 */
- "reconcile_start_trans4",
- "seq(1842,41591,51793) seq(6435,59408,21665)",
- { 0x2,0x3, 0x07,0x32, 0xa2,0x77, 0xca,0x51,
- 0x2,0x3, 0x19,0x23, 0xe8,0x10, 0x54,0xa1, },
- 16,
- { "1842 41591 51793 6435 59408 21665",
- "1842 41591 51793 6435 59408 21665",
- 6, 0, NOT_ALL_PRIVATE, 41591, 1, 1842 },
- },
- { /* 23 */
- "reconcile_start_trans_error",
- "seq(23456,23456,23456) seq(6435,59408)",
- { 0x2,0x3, 0x5b,0xa0, 0x5b,0xa0, 0x5b,0xa0,
- 0x2,0x2, 0x19,0x23, 0xe8,0x10, },
- 14,
- { "23456 23456 23456 6435 59408",
- "23456 23456 23456 6435 59408",
- 5, 0, NOT_ALL_PRIVATE, 59408, 1, 23456 },
- },
- { /* 24 */
- "redundantset2",
- "seq(8466,3,52737,4096,3456) set(7099,8153,8153,8153,7099)",
- { 0x2,0x5, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x0d,0x80,
- 0x1,0x5, 0x1b,0xbb, 0x1f,0xd9, 0x1f,0xd9, 0x1f,0xd9, 0x1b,0xbb,},
- 24,
- {
- /* We should weed out duplicate set members. */
- "8466 3 52737 4096 3456 {7099,8153}",
- "8466 3 52737 4096 3456 {7099,8153}",
- 6, 0, NOT_ALL_PRIVATE, 4096, 4, 8466 },
- },
- { /* 25 */
- "zero-size overflow",
- "#ASNs = 0, data = seq(8466 3 52737 4096 3456)",
- { 0x2,0x0, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x0d,0x80 },
- 12,
- { NULL, NULL,
- 0, 0, 0, 0, 0, 0 },
- },
- { /* 26 */
- "zero-size overflow + valid segment",
- "seq(#AS=0:8466 3 52737),seq(4096 3456)",
- { 0x2,0x0, 0x21,0x12, 0x00,0x03, 0xce,0x01,
- 0x2,0x2, 0x10,0x00, 0x0d,0x80 },
- 14
- ,
- { NULL, NULL,
- 0, 0, 0, 0, 0, 0 },
- },
- { /* 27 */
- "invalid segment type",
- "type=8(4096 3456)",
- { 0x8,0x2, 0x10,0x00, 0x0d,0x80 },
- 14
- ,
- { NULL, NULL,
- 0, 0, 0, 0, 0, 0 },
- }, { NULL, NULL, {0}, 0, { NULL, 0, 0 } }
-};
+ const char *name;
+ const char *desc;
+ const u_char asdata[1024];
+ int len;
+ struct test_spec sp;
+} test_segments[] = {
+ {
+ /* 0 */
+ "seq1",
+ "seq(8466,3,52737,4096)",
+ {0x2, 0x4, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00},
+ 10,
+ {"8466 3 52737 4096", "8466 3 52737 4096", 4, 0,
+ NOT_ALL_PRIVATE, 4096, 4, 8466},
+ },
+ {
+ /* 1 */
+ "seq2",
+ "seq(8722) seq(4)",
+ {0x2, 0x1, 0x22, 0x12, 0x2, 0x1, 0x00, 0x04},
+ 8,
+ {
+ "8722 4", "8722 4", 2, 0, NOT_ALL_PRIVATE, 4, 5, 8722,
+ },
+ },
+ {
+ /* 2 */
+ "seq3",
+ "seq(8466,3,52737,4096,8722,4)",
+ {0x2, 0x6, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x22,
+ 0x12, 0x00, 0x04},
+ 14,
+ {"8466 3 52737 4096 8722 4", "8466 3 52737 4096 8722 4", 6, 0,
+ NOT_ALL_PRIVATE, 3, 5, 8466},
+ },
+ {
+ /* 3 */
+ "seqset",
+ "seq(8482,51457) set(5204)",
+ {0x2, 0x2, 0x21, 0x22, 0xc9, 0x01, 0x1, 0x1, 0x14, 0x54},
+ 10,
+ {"8482 51457 {5204}", "8482 51457 {5204}", 3, 0,
+ NOT_ALL_PRIVATE, 5204, 51456, 8482},
+ },
+ {
+ /* 4 */
+ "seqset2",
+ "seq(8467, 59649) set(4196,48658) set(17322,30745)",
+ {0x2, 0x2, 0x21, 0x13, 0xe9, 0x01, 0x1, 0x2, 0x10, 0x64, 0xbe,
+ 0x12, 0x1, 0x2, 0x43, 0xaa, 0x78, 0x19},
+ 18,
+ {"8467 59649 {4196,48658} {17322,30745}",
+ "8467 59649 {4196,48658} {17322,30745}", 4, 0, NOT_ALL_PRIVATE,
+ 48658, 1, 8467},
+ },
+ {
+ /* 5 */
+ "multi",
+ "seq(6435,59408,21665) set(2457,61697,4369), seq(1842,41590,51793)",
+ {0x2, 0x3, 0x19, 0x23, 0xe8, 0x10, 0x54, 0xa1,
+ 0x1, 0x3, 0x09, 0x99, 0xf1, 0x01, 0x11, 0x11,
+ 0x2, 0x3, 0x07, 0x32, 0xa2, 0x76, 0xca, 0x51},
+ 24,
+ {"6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
+ "6435 59408 21665 {2457,4369,61697} 1842 41590 51793", 7, 0,
+ NOT_ALL_PRIVATE, 51793, 1, 6435},
+ },
+ {
+ /* 6 */
+ "confed",
+ "confseq(123,456,789)",
+ {0x3, 0x3, 0x00, 0x7b, 0x01, 0xc8, 0x03, 0x15},
+ 8,
+ {"(123 456 789)", "", 0, 3, NOT_ALL_PRIVATE, 789, 1, NULL_ASN},
+ },
+ {
+ /* 7 */
+ "confed2",
+ "confseq(123,456,789) confseq(111,222)",
+ {0x3, 0x3, 0x00, 0x7b, 0x01, 0xc8, 0x03, 0x15, 0x3, 0x2, 0x00,
+ 0x6f, 0x00, 0xde},
+ 14,
+ {"(123 456 789) (111 222)", "", 0, 5, NOT_ALL_PRIVATE, 111, 1,
+ NULL_ASN},
+ },
+ {
+ /* 8 */
+ "confset",
+ "confset(456,123,789)",
+ {0x4, 0x3, 0x01, 0xc8, 0x00, 0x7b, 0x03, 0x15},
+ 8,
+ {"[123,456,789]", "", 0, 1, NOT_ALL_PRIVATE, 123, 1, NULL_ASN},
+ },
+ {
+ /* 9 */
+ "confmulti",
+ "confseq(123,456,789) confset(222,111) seq(8722) set(4196,48658)",
+ {0x3, 0x3, 0x00, 0x7b, 0x01, 0xc8, 0x03, 0x15,
+ 0x4, 0x2, 0x00, 0xde, 0x00, 0x6f, 0x2, 0x1,
+ 0x22, 0x12, 0x1, 0x2, 0x10, 0x64, 0xbe, 0x12},
+ 24,
+ {"(123 456 789) [111,222] 8722 {4196,48658}",
+ "8722 {4196,48658}", 2, 4, NOT_ALL_PRIVATE, 123, 1, NULL_ASN},
+ },
+ {
+ /* 10 */
+ "seq4",
+ "seq(8466,2,52737,4096,8722,4)",
+ {0x2, 0x6, 0x21, 0x12, 0x00, 0x02, 0xce, 0x01, 0x10, 0x00, 0x22,
+ 0x12, 0x00, 0x04},
+ 14,
+ {"8466 2 52737 4096 8722 4", "8466 2 52737 4096 8722 4", 6, 0,
+ NOT_ALL_PRIVATE, 4096, 1, 8466},
+ },
+ {
+ /* 11 */
+ "tripleseq1",
+ "seq(8466,2,52737) seq(4096,8722,4) seq(8722)",
+ {0x2, 0x3, 0x21, 0x12, 0x00, 0x02, 0xce, 0x01, 0x2, 0x3,
+ 0x10, 0x00, 0x22, 0x12, 0x00, 0x04, 0x2, 0x1, 0x22, 0x12},
+ 20,
+ {"8466 2 52737 4096 8722 4 8722",
+ "8466 2 52737 4096 8722 4 8722", 7, 0, NOT_ALL_PRIVATE, 4096,
+ 1, 8466},
+ },
+ {
+ /* 12 */
+ "someprivate",
+ "seq(8466,64512,52737,65535)",
+ {0x2, 0x4, 0x21, 0x12, 0xfc, 0x00, 0xce, 0x01, 0xff, 0xff},
+ 10,
+ {"8466 64512 52737 65535", "8466 64512 52737 65535", 4, 0,
+ NOT_ALL_PRIVATE, 65535, 4, 8466},
+ },
+ {
+ /* 13 */
+ "allprivate",
+ "seq(65534,64512,64513,65535)",
+ {0x2, 0x4, 0xff, 0xfe, 0xfc, 0x00, 0xfc, 0x01, 0xff, 0xff},
+ 10,
+ {"65534 64512 64513 65535", "65534 64512 64513 65535", 4, 0,
+ ALL_PRIVATE, 65534, 4, 65534},
+ },
+ {
+ /* 14 */
+ "long",
+ "seq(8466,3,52737,4096,34285,<repeated 49 more times>)",
+ {
+ 0x2, 0xfa, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
+ 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
+ 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
+ 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
+ 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
+ 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
+ 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
+ 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
+ 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
+ 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
+ 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
+ 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
+ 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
+ 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
+ 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
+ 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
+ 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
+ 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
+ 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
+ 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
+ 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
+ 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
+ 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
+ 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
+ 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
+ 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
+ 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
+ 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
+ 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
+ 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
+ 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
+ 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
+ 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
+ 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
+ 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
+ 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
+ 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
+ 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
+ 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
+ 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
+ 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
+ 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
+ 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
+ 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
+ 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
+ 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12,
+ 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21,
+ 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
+ 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x85,
+ 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00,
+ 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10,
+ 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
+ 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03, 0xce,
+ 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00, 0x03,
+ 0xce, 0x01, 0x10, 0x00, 0x85, 0xed, 0x21, 0x12, 0x00,
+ 0x03, 0xce, 0x01, 0x10, 0x00, 0x85, 0xed,
+ },
+ 502,
+ {"8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285",
-#define COMMON_ATTRS \
- BGP_ATTR_FLAG_TRANS, \
- BGP_ATTR_ORIGIN, \
- 1, \
- BGP_ORIGIN_EGP, \
- BGP_ATTR_FLAG_TRANS, \
- BGP_ATTR_NEXT_HOP, \
- 4, 192, 0, 2, 0
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285",
+ 250, 0, NOT_ALL_PRIVATE, 4096, 4, 8466},
+ },
+ {
+ /* 15 */
+ "seq1extra",
+ "seq(8466,3,52737,4096,3456)",
+ {0x2, 0x5, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x0d,
+ 0x80},
+ 12,
+ {"8466 3 52737 4096 3456", "8466 3 52737 4096 3456", 5, 0,
+ NOT_ALL_PRIVATE, 4096, 4, 8466},
+ },
+ {
+ /* 16 */
+ "empty",
+ "<empty>",
+ {},
+ 0,
+ {"", "", 0, 0, 0, 0, 0, 0},
+ },
+ {
+ /* 17 */
+ "redundantset",
+ "seq(8466,3,52737,4096,3456) set(7099,8153,8153,8153)",
+ {0x2, 0x5, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
+ 0x10, 0x00, 0x0d, 0x80, 0x1, 0x4, 0x1b, 0xbb,
+ 0x1f, 0xd9, 0x1f, 0xd9, 0x1f, 0xd9},
+ 22,
+ {/* We shouldn't ever /generate/ such paths. However, we should
+ * cope with them fine.
+ */
+ "8466 3 52737 4096 3456 {7099,8153}",
+ "8466 3 52737 4096 3456 {7099,8153}", 6, 0, NOT_ALL_PRIVATE,
+ 4096, 4, 8466},
+ },
+ {
+ /* 18 */
+ "reconcile_lead_asp",
+ "seq(6435,59408,21665) set(23456,23456,23456), seq(23456,23456,23456)",
+ {0x2, 0x3, 0x19, 0x23, 0xe8, 0x10, 0x54, 0xa1,
+ 0x1, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0,
+ 0x2, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0},
+ 24,
+ {"6435 59408 21665 {23456} 23456 23456 23456",
+ "6435 59408 21665 {23456} 23456 23456 23456", 7, 0,
+ NOT_ALL_PRIVATE, 23456, 1, 6435},
+ },
+ {
+ /* 19 */
+ "reconcile_new_asp",
+ "set(2457,61697,4369), seq(1842,41591,51793)",
+ {0x1, 0x3, 0x09, 0x99, 0xf1, 0x01, 0x11, 0x11, 0x2, 0x3, 0x07,
+ 0x32, 0xa2, 0x77, 0xca, 0x51},
+ 16,
+ {"{2457,4369,61697} 1842 41591 51793",
+ "{2457,4369,61697} 1842 41591 51793", 4, 0, NOT_ALL_PRIVATE,
+ 51793, 1, 2457},
+ },
+ {
+ /* 20 */
+ "reconcile_confed",
+ "confseq(123,456,789) confset(456,124,788) seq(6435,59408,21665)"
+ " set(23456,23456,23456), seq(23456,23456,23456)",
+ {0x3, 0x3, 0x00, 0x7b, 0x01, 0xc8, 0x03, 0x15, 0x4, 0x3,
+ 0x01, 0xc8, 0x00, 0x7c, 0x03, 0x14, 0x2, 0x3, 0x19, 0x23,
+ 0xe8, 0x10, 0x54, 0xa1, 0x1, 0x3, 0x5b, 0xa0, 0x5b, 0xa0,
+ 0x5b, 0xa0, 0x2, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0},
+ 40,
+ {"(123 456 789) [124,456,788] 6435 59408 21665"
+ " {23456} 23456 23456 23456",
+ "6435 59408 21665 {23456} 23456 23456 23456", 7, 4,
+ NOT_ALL_PRIVATE, 23456, 1, 6435},
+ },
+ {
+ /* 21 */
+ "reconcile_start_trans",
+ "seq(23456,23456,23456) seq(6435,59408,21665)",
+ {
+ 0x2, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0, 0x2, 0x3,
+ 0x19, 0x23, 0xe8, 0x10, 0x54, 0xa1,
+ },
+ 16,
+ {"23456 23456 23456 6435 59408 21665",
+ "23456 23456 23456 6435 59408 21665", 6, 0, NOT_ALL_PRIVATE,
+ 21665, 1, 23456},
+ },
+ {
+ /* 22 */
+ "reconcile_start_trans4",
+ "seq(1842,41591,51793) seq(6435,59408,21665)",
+ {
+ 0x2, 0x3, 0x07, 0x32, 0xa2, 0x77, 0xca, 0x51, 0x2, 0x3,
+ 0x19, 0x23, 0xe8, 0x10, 0x54, 0xa1,
+ },
+ 16,
+ {"1842 41591 51793 6435 59408 21665",
+ "1842 41591 51793 6435 59408 21665", 6, 0, NOT_ALL_PRIVATE,
+ 41591, 1, 1842},
+ },
+ {
+ /* 23 */
+ "reconcile_start_trans_error",
+ "seq(23456,23456,23456) seq(6435,59408)",
+ {
+ 0x2, 0x3, 0x5b, 0xa0, 0x5b, 0xa0, 0x5b, 0xa0, 0x2, 0x2,
+ 0x19, 0x23, 0xe8, 0x10,
+ },
+ 14,
+ {"23456 23456 23456 6435 59408", "23456 23456 23456 6435 59408",
+ 5, 0, NOT_ALL_PRIVATE, 59408, 1, 23456},
+ },
+ {
+ /* 24 */
+ "redundantset2",
+ "seq(8466,3,52737,4096,3456) set(7099,8153,8153,8153,7099)",
+ {
+ 0x2, 0x5, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01,
+ 0x10, 0x00, 0x0d, 0x80, 0x1, 0x5, 0x1b, 0xbb,
+ 0x1f, 0xd9, 0x1f, 0xd9, 0x1f, 0xd9, 0x1b, 0xbb,
+ },
+ 24,
+ {/* We should weed out duplicate set members. */
+ "8466 3 52737 4096 3456 {7099,8153}",
+ "8466 3 52737 4096 3456 {7099,8153}", 6, 0, NOT_ALL_PRIVATE,
+ 4096, 4, 8466},
+ },
+ {
+ /* 25 */
+ "zero-size overflow",
+ "#ASNs = 0, data = seq(8466 3 52737 4096 3456)",
+ {0x2, 0x0, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x10, 0x00, 0x0d,
+ 0x80},
+ 12,
+ {NULL, NULL, 0, 0, 0, 0, 0, 0},
+ },
+ {
+ /* 26 */
+ "zero-size overflow + valid segment",
+ "seq(#AS=0:8466 3 52737),seq(4096 3456)",
+ {0x2, 0x0, 0x21, 0x12, 0x00, 0x03, 0xce, 0x01, 0x2, 0x2, 0x10,
+ 0x00, 0x0d, 0x80},
+ 14,
+ {NULL, NULL, 0, 0, 0, 0, 0, 0},
+ },
+ {
+ /* 27 */
+ "invalid segment type",
+ "type=8(4096 3456)",
+ {0x8, 0x2, 0x10, 0x00, 0x0d, 0x80},
+ 14,
+ {NULL, NULL, 0, 0, 0, 0, 0, 0},
+ },
+ {NULL, NULL, {0}, 0, {NULL, 0, 0}}};
+
+#define COMMON_ATTRS \
+ BGP_ATTR_FLAG_TRANS, BGP_ATTR_ORIGIN, 1, BGP_ORIGIN_EGP, \
+ BGP_ATTR_FLAG_TRANS, BGP_ATTR_NEXT_HOP, 4, 192, 0, 2, 0
#define COMMON_ATTR_SIZE 11
/* */
static struct aspath_tests {
- const char *desc;
- const struct test_segment *segment;
- const char *shouldbe; /* String it should evaluate to */
- const enum as4 { AS4_DATA, AS2_DATA }
- as4; /* whether data should be as4 or not (ie as2) */
- const int result; /* expected result for bgp_attr_parse */
- const int cap; /* capabilities to set for peer */
- const char attrheader [1024];
- size_t len;
- const struct test_segment *old_segment;
-} aspath_tests [] =
-{
- /* 0 */
- {
- "basic test",
- &test_segments[0],
- "8466 3 52737 4096",
- AS2_DATA, 0,
- 0,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS,
- BGP_ATTR_AS_PATH,
- 10,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 1 */
- {
- "length too short",
- &test_segments[0],
- "8466 3 52737 4096",
- AS2_DATA, -1,
- 0,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS,
- BGP_ATTR_AS_PATH,
- 8,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 2 */
- {
- "length too long",
- &test_segments[0],
- "8466 3 52737 4096",
- AS2_DATA, -1,
- 0,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS,
- BGP_ATTR_AS_PATH,
- 12,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 3 */
- {
- "incorrect flag",
- &test_segments[0],
- "8466 3 52737 4096",
- AS2_DATA, -1,
- 0,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
- BGP_ATTR_AS_PATH,
- 10,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 4 */
- {
- "as4_path, with as2 format data",
- &test_segments[0],
- "8466 3 52737 4096",
- AS2_DATA, -1,
- 0,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
- BGP_ATTR_AS4_PATH,
- 10,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 5 */
- {
- "as4, with incorrect attr length",
- &test_segments[0],
- "8466 3 52737 4096",
- AS4_DATA, -1,
- PEER_CAP_AS4_RCV,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
- BGP_ATTR_AS4_PATH,
- 10,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 6 */
- {
- "basic 4-byte as-path",
- &test_segments[0],
- "8466 3 52737 4096",
- AS4_DATA, 0,
- PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS,
- BGP_ATTR_AS_PATH,
- 18,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 7 */
- {
- "4b AS_PATH: too short",
- &test_segments[0],
- "8466 3 52737 4096",
- AS4_DATA, -1,
- PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS,
- BGP_ATTR_AS_PATH,
- 16,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 8 */
- {
- "4b AS_PATH: too long",
- &test_segments[0],
- "8466 3 52737 4096",
- AS4_DATA, -1,
- PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS,
- BGP_ATTR_AS_PATH,
- 20,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 9 */
- {
- "4b AS_PATH: too long2",
- &test_segments[0],
- "8466 3 52737 4096",
- AS4_DATA, -1,
- PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS,
- BGP_ATTR_AS_PATH,
- 22,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 10 */
- {
- "4b AS_PATH: bad flags",
- &test_segments[0],
- "8466 3 52737 4096",
- AS4_DATA, -1,
- PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
- BGP_ATTR_AS_PATH,
- 18,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 11 */
- {
- "4b AS4_PATH w/o AS_PATH",
- &test_segments[6],
- NULL,
- AS4_DATA, -1,
- PEER_CAP_AS4_ADV,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
- BGP_ATTR_AS4_PATH,
- 14,
- },
- COMMON_ATTR_SIZE + 3,
- },
- /* 12 */
- {
- "4b AS4_PATH: confed",
- &test_segments[6],
- "8466 3 52737 4096 (123 456 789)",
- AS4_DATA, 0,
- PEER_CAP_AS4_ADV,
- { COMMON_ATTRS,
- BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL,
- BGP_ATTR_AS4_PATH,
- 14,
- },
- COMMON_ATTR_SIZE + 3,
- &test_segments[0],
- },
- { NULL, NULL, NULL, 0, 0, 0, { 0 }, 0 },
+ const char *desc;
+ const struct test_segment *segment;
+ const char *shouldbe; /* String it should evaluate to */
+ const enum as4 {
+ AS4_DATA,
+ AS2_DATA
+ } as4; /* whether data should be as4 or not (ie as2) */
+ const int result; /* expected result for bgp_attr_parse */
+ const int cap; /* capabilities to set for peer */
+ const char attrheader[1024];
+ size_t len;
+ const struct test_segment *old_segment;
+} aspath_tests[] = {
+ /* 0 */
+ {
+ "basic test",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS2_DATA,
+ 0,
+ 0,
+ {
+ COMMON_ATTRS, BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH, 10,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 1 */
+ {
+ "length too short",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS2_DATA,
+ -1,
+ 0,
+ {
+ COMMON_ATTRS, BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH, 8,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 2 */
+ {
+ "length too long",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS2_DATA,
+ -1,
+ 0,
+ {
+ COMMON_ATTRS, BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH, 12,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 3 */
+ {
+ "incorrect flag",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS2_DATA,
+ -1,
+ 0,
+ {
+ COMMON_ATTRS,
+ BGP_ATTR_FLAG_TRANS | BGP_ATTR_FLAG_OPTIONAL,
+ BGP_ATTR_AS_PATH, 10,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 4 */
+ {
+ "as4_path, with as2 format data",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS2_DATA,
+ -1,
+ 0,
+ {
+ COMMON_ATTRS,
+ BGP_ATTR_FLAG_TRANS | BGP_ATTR_FLAG_OPTIONAL,
+ BGP_ATTR_AS4_PATH, 10,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 5 */
+ {
+ "as4, with incorrect attr length",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS4_DATA,
+ -1,
+ PEER_CAP_AS4_RCV,
+ {
+ COMMON_ATTRS,
+ BGP_ATTR_FLAG_TRANS | BGP_ATTR_FLAG_OPTIONAL,
+ BGP_ATTR_AS4_PATH, 10,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 6 */
+ {
+ "basic 4-byte as-path",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS4_DATA,
+ 0,
+ PEER_CAP_AS4_RCV | PEER_CAP_AS4_ADV,
+ {
+ COMMON_ATTRS, BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH, 18,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 7 */
+ {
+ "4b AS_PATH: too short",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS4_DATA,
+ -1,
+ PEER_CAP_AS4_RCV | PEER_CAP_AS4_ADV,
+ {
+ COMMON_ATTRS, BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH, 16,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 8 */
+ {
+ "4b AS_PATH: too long",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS4_DATA,
+ -1,
+ PEER_CAP_AS4_RCV | PEER_CAP_AS4_ADV,
+ {
+ COMMON_ATTRS, BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH, 20,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 9 */
+ {
+ "4b AS_PATH: too long2",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS4_DATA,
+ -1,
+ PEER_CAP_AS4_RCV | PEER_CAP_AS4_ADV,
+ {
+ COMMON_ATTRS, BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH, 22,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 10 */
+ {
+ "4b AS_PATH: bad flags",
+ &test_segments[0],
+ "8466 3 52737 4096",
+ AS4_DATA,
+ -1,
+ PEER_CAP_AS4_RCV | PEER_CAP_AS4_ADV,
+ {
+ COMMON_ATTRS,
+ BGP_ATTR_FLAG_TRANS | BGP_ATTR_FLAG_OPTIONAL,
+ BGP_ATTR_AS_PATH, 18,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 11 */
+ {
+ "4b AS4_PATH w/o AS_PATH",
+ &test_segments[6],
+ NULL,
+ AS4_DATA,
+ -1,
+ PEER_CAP_AS4_ADV,
+ {
+ COMMON_ATTRS,
+ BGP_ATTR_FLAG_TRANS | BGP_ATTR_FLAG_OPTIONAL,
+ BGP_ATTR_AS4_PATH, 14,
+ },
+ COMMON_ATTR_SIZE + 3,
+ },
+ /* 12 */
+ {
+ "4b AS4_PATH: confed",
+ &test_segments[6],
+ "8466 3 52737 4096 (123 456 789)",
+ AS4_DATA,
+ 0,
+ PEER_CAP_AS4_ADV,
+ {
+ COMMON_ATTRS,
+ BGP_ATTR_FLAG_TRANS | BGP_ATTR_FLAG_OPTIONAL,
+ BGP_ATTR_AS4_PATH, 14,
+ },
+ COMMON_ATTR_SIZE + 3,
+ &test_segments[0],
+ },
+ {NULL, NULL, NULL, 0, 0, 0, {0}, 0},
};
/* prepending tests */
static struct tests {
- const struct test_segment *test1;
- const struct test_segment *test2;
- struct test_spec sp;
-} prepend_tests[] =
-{
- /* 0 */
- { &test_segments[0], &test_segments[1],
- { "8466 3 52737 4096 8722 4",
- "8466 3 52737 4096 8722 4",
- 6, 0, NOT_ALL_PRIVATE, 4096, 1, 8466 },
- },
- /* 1 */
- { &test_segments[1], &test_segments[3],
- { "8722 4 8482 51457 {5204}",
- "8722 4 8482 51457 {5204}",
- 5, 0, NOT_ALL_PRIVATE, 5204, 1, 8722 }
- },
- /* 2 */
- { &test_segments[3], &test_segments[4],
- { "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",
- "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",
- 7, 0, NOT_ALL_PRIVATE, 5204, 1, 8482 },
- },
- /* 3 */
- { &test_segments[4], &test_segments[5],
- { "8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
- " {2457,4369,61697} 1842 41590 51793",
- "8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
- " {2457,4369,61697} 1842 41590 51793",
- 11, 0, NOT_ALL_PRIVATE, 61697, 1, 8467 }
- },
- /* 4 */
- { &test_segments[5], &test_segments[6],
- { "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
- "6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
- 7, 0, NOT_ALL_PRIVATE, 1842, 1, 6435 },
- },
- /* 5 */
- { &test_segments[6], &test_segments[7],
- { "(123 456 789) (123 456 789) (111 222)",
- "",
- 0, 8, NOT_ALL_PRIVATE, 111, 1, 0 }
- },
- { &test_segments[7], &test_segments[8],
- { "(123 456 789) (111 222) [123,456,789]",
- "",
- 0, 6, NOT_ALL_PRIVATE, 111, 1, 0 }
- },
- { &test_segments[8], &test_segments[9],
- { "[123,456,789] (123 456 789) [111,222] 8722 {4196,48658}",
- "8722 {4196,48658}",
- 2, 5, NOT_ALL_PRIVATE, 456, 1, NULL_ASN },
- },
- { &test_segments[9], &test_segments[8],
- { "(123 456 789) [111,222] 8722 {4196,48658} [123,456,789]",
- "8722 {4196,48658}",
- 2, 5, NOT_ALL_PRIVATE, 48658, 1, NULL_ASN },
- },
- { &test_segments[14], &test_segments[11],
- { "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 2 52737 4096 8722 4 8722",
-
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
- "8466 2 52737 4096 8722 4 8722",
- 257, 0, NOT_ALL_PRIVATE, 4096, 1000, 8466 },
- },
- { NULL, NULL, { NULL, 0, 0, 0, 0, 0, 0, } },
+ const struct test_segment *test1;
+ const struct test_segment *test2;
+ struct test_spec sp;
+} prepend_tests[] = {
+ /* 0 */
+ {
+ &test_segments[0],
+ &test_segments[1],
+ {"8466 3 52737 4096 8722 4", "8466 3 52737 4096 8722 4", 6, 0,
+ NOT_ALL_PRIVATE, 4096, 1, 8466},
+ },
+ /* 1 */
+ {&test_segments[1],
+ &test_segments[3],
+ {"8722 4 8482 51457 {5204}", "8722 4 8482 51457 {5204}", 5, 0,
+ NOT_ALL_PRIVATE, 5204, 1, 8722}},
+ /* 2 */
+ {
+ &test_segments[3],
+ &test_segments[4],
+ {"8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",
+ "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}", 7,
+ 0, NOT_ALL_PRIVATE, 5204, 1, 8482},
+ },
+ /* 3 */
+ {&test_segments[4],
+ &test_segments[5],
+ {"8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
+ " {2457,4369,61697} 1842 41590 51793",
+ "8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"
+ " {2457,4369,61697} 1842 41590 51793",
+ 11, 0, NOT_ALL_PRIVATE, 61697, 1, 8467}},
+ /* 4 */
+ {
+ &test_segments[5],
+ &test_segments[6],
+ {"6435 59408 21665 {2457,4369,61697} 1842 41590 51793",
+ "6435 59408 21665 {2457,4369,61697} 1842 41590 51793", 7, 0,
+ NOT_ALL_PRIVATE, 1842, 1, 6435},
+ },
+ /* 5 */
+ {&test_segments[6],
+ &test_segments[7],
+ {"(123 456 789) (123 456 789) (111 222)", "", 0, 8, NOT_ALL_PRIVATE,
+ 111, 1, 0}},
+ {&test_segments[7],
+ &test_segments[8],
+ {"(123 456 789) (111 222) [123,456,789]", "", 0, 6, NOT_ALL_PRIVATE,
+ 111, 1, 0}},
+ {
+ &test_segments[8],
+ &test_segments[9],
+ {"[123,456,789] (123 456 789) [111,222] 8722 {4196,48658}",
+ "8722 {4196,48658}", 2, 5, NOT_ALL_PRIVATE, 456, 1, NULL_ASN},
+ },
+ {
+ &test_segments[9],
+ &test_segments[8],
+ {"(123 456 789) [111,222] 8722 {4196,48658} [123,456,789]",
+ "8722 {4196,48658}", 2, 5, NOT_ALL_PRIVATE, 48658, 1,
+ NULL_ASN},
+ },
+ {
+ &test_segments[14],
+ &test_segments[11],
+ {"8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 2 52737 4096 8722 4 8722",
+
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 3 52737 4096 34285 8466 3 52737 4096 34285 "
+ "8466 2 52737 4096 8722 4 8722",
+ 257, 0, NOT_ALL_PRIVATE, 4096, 1000, 8466},
+ },
+ {NULL,
+ NULL,
+ {
+ NULL, 0, 0, 0, 0, 0, 0,
+ }},
};
-struct tests reconcile_tests[] =
-{
- { &test_segments[18], &test_segments[19],
- { "6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
- "6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
- 7, 0, NOT_ALL_PRIVATE, 51793, 1, 6435 },
- },
- { &test_segments[19], &test_segments[18],
- /* AS_PATH (19) has more hops than NEW_AS_PATH,
- * so just AS_PATH should be used (though, this practice
- * is bad imho).
- */
- { "{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
- "{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
- 11, 0, NOT_ALL_PRIVATE, 51793, 1, 6435 },
- },
- { &test_segments[20], &test_segments[19],
- { "(123 456 789) [124,456,788] 6435 59408 21665"
- " {2457,4369,61697} 1842 41591 51793",
- "6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
- 7, 4, NOT_ALL_PRIVATE, 51793, 1, 6435 },
- },
- { &test_segments[21], &test_segments[22],
- { "1842 41591 51793 6435 59408 21665",
- "1842 41591 51793 6435 59408 21665",
- 6, 0, NOT_ALL_PRIVATE, 51793, 1, 1842 },
- },
- { &test_segments[23], &test_segments[22],
- { "23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
- "23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
- 11, 0, NOT_ALL_PRIVATE, 51793, 1, 1842 },
- },
- { NULL, NULL, { NULL, 0, 0, 0, 0, 0, 0, } },
+struct tests reconcile_tests[] = {
+ {
+ &test_segments[18],
+ &test_segments[19],
+ {"6435 59408 21665 {2457,4369,61697} 1842 41591 51793",
+ "6435 59408 21665 {2457,4369,61697} 1842 41591 51793", 7, 0,
+ NOT_ALL_PRIVATE, 51793, 1, 6435},
+ },
+ {
+ &test_segments[19],
+ &test_segments[18],
+ /* AS_PATH (19) has more hops than NEW_AS_PATH,
+ * so just AS_PATH should be used (though, this practice
+ * is bad imho).
+ */
+ {"{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
+ "{2457,4369,61697} 1842 41591 51793 6435 59408 21665 {23456} 23456 23456 23456",
+ 11, 0, NOT_ALL_PRIVATE, 51793, 1, 6435},
+ },
+ {
+ &test_segments[20],
+ &test_segments[19],
+ {"(123 456 789) [124,456,788] 6435 59408 21665"
+ " {2457,4369,61697} 1842 41591 51793",
+ "6435 59408 21665 {2457,4369,61697} 1842 41591 51793", 7, 4,
+ NOT_ALL_PRIVATE, 51793, 1, 6435},
+ },
+ {
+ &test_segments[21],
+ &test_segments[22],
+ {"1842 41591 51793 6435 59408 21665",
+ "1842 41591 51793 6435 59408 21665", 6, 0, NOT_ALL_PRIVATE,
+ 51793, 1, 1842},
+ },
+ {
+ &test_segments[23],
+ &test_segments[22],
+ {"23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
+ "23456 23456 23456 6435 59408 1842 41591 51793 6435 59408 21665",
+ 11, 0, NOT_ALL_PRIVATE, 51793, 1, 1842},
+ },
+ {NULL,
+ NULL,
+ {
+ NULL, 0, 0, 0, 0, 0, 0,
+ }},
};
-
-struct tests aggregate_tests[] =
-{
- { &test_segments[0], &test_segments[2],
- { "8466 3 52737 4096 {4,8722}",
- "8466 3 52737 4096 {4,8722}",
- 5, 0, NOT_ALL_PRIVATE, 4, 1, 8466 },
- },
- { &test_segments[2], &test_segments[0],
- { "8466 3 52737 4096 {4,8722}",
- "8466 3 52737 4096 {4,8722}",
- 5, 0, NOT_ALL_PRIVATE, 8722, 1, 8466 },
- },
- { &test_segments[2], &test_segments[10],
- { "8466 {2,3,4,4096,8722,52737}",
- "8466 {2,3,4,4096,8722,52737}",
- 2, 0, NOT_ALL_PRIVATE, 8722, 5, 8466 },
- },
- { &test_segments[10], &test_segments[2],
- { "8466 {2,3,4,4096,8722,52737}",
- "8466 {2,3,4,4096,8722,52737}",
- 2, 0, NOT_ALL_PRIVATE, 2, 20000, 8466 },
- },
-
- { &test_segments[5], &test_segments[18],
- { "6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}",
- "6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}",
- 4, 0, NOT_ALL_PRIVATE, 41590, 1, 6435 },
- },
-
- { NULL, NULL, { NULL, 0, 0} },
+
+struct tests aggregate_tests[] = {
+ {
+ &test_segments[0],
+ &test_segments[2],
+ {"8466 3 52737 4096 {4,8722}", "8466 3 52737 4096 {4,8722}", 5,
+ 0, NOT_ALL_PRIVATE, 4, 1, 8466},
+ },
+ {
+ &test_segments[2],
+ &test_segments[0],
+ {"8466 3 52737 4096 {4,8722}", "8466 3 52737 4096 {4,8722}", 5,
+ 0, NOT_ALL_PRIVATE, 8722, 1, 8466},
+ },
+ {
+ &test_segments[2],
+ &test_segments[10],
+ {"8466 {2,3,4,4096,8722,52737}", "8466 {2,3,4,4096,8722,52737}",
+ 2, 0, NOT_ALL_PRIVATE, 8722, 5, 8466},
+ },
+ {
+ &test_segments[10],
+ &test_segments[2],
+ {"8466 {2,3,4,4096,8722,52737}", "8466 {2,3,4,4096,8722,52737}",
+ 2, 0, NOT_ALL_PRIVATE, 2, 20000, 8466},
+ },
+
+ {
+ &test_segments[5],
+ &test_segments[18],
+ {"6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}",
+ "6435 59408 21665 {1842,2457,4369,23456,41590,51793,61697}", 4,
+ 0, NOT_ALL_PRIVATE, 41590, 1, 6435},
+ },
+
+ {NULL, NULL, {NULL, 0, 0}},
};
-struct compare_tests
-{
- int test_index1;
- int test_index2;
+struct compare_tests {
+ int test_index1;
+ int test_index2;
#define CMP_RES_YES 1
#define CMP_RES_NO 0
- char shouldbe_cmp;
- char shouldbe_confed;
-} left_compare [] =
-{
- { 0, 1, CMP_RES_NO, CMP_RES_NO },
- { 0, 2, CMP_RES_YES, CMP_RES_NO },
- { 0, 11, CMP_RES_YES, CMP_RES_NO },
- { 0, 15, CMP_RES_YES, CMP_RES_NO },
- { 0, 16, CMP_RES_NO, CMP_RES_NO },
- { 1, 11, CMP_RES_NO, CMP_RES_NO },
- { 6, 7, CMP_RES_NO, CMP_RES_YES },
- { 6, 8, CMP_RES_NO, CMP_RES_NO },
- { 7, 8, CMP_RES_NO, CMP_RES_NO },
- { 1, 9, CMP_RES_YES, CMP_RES_NO },
- { 0, 9, CMP_RES_NO, CMP_RES_NO },
- { 3, 9, CMP_RES_NO, CMP_RES_NO },
- { 0, 6, CMP_RES_NO, CMP_RES_NO },
- { 1, 6, CMP_RES_NO, CMP_RES_NO },
- { 0, 8, CMP_RES_NO, CMP_RES_NO },
- { 1, 8, CMP_RES_NO, CMP_RES_NO },
- { 11, 6, CMP_RES_NO, CMP_RES_NO },
- { 11, 7, CMP_RES_NO, CMP_RES_NO },
- { 11, 8, CMP_RES_NO, CMP_RES_NO },
- { 9, 6, CMP_RES_NO, CMP_RES_YES },
- { 9, 7, CMP_RES_NO, CMP_RES_YES },
- { 9, 8, CMP_RES_NO, CMP_RES_NO },
+ char shouldbe_cmp;
+ char shouldbe_confed;
+} left_compare[] = {
+ {0, 1, CMP_RES_NO, CMP_RES_NO}, {0, 2, CMP_RES_YES, CMP_RES_NO},
+ {0, 11, CMP_RES_YES, CMP_RES_NO}, {0, 15, CMP_RES_YES, CMP_RES_NO},
+ {0, 16, CMP_RES_NO, CMP_RES_NO}, {1, 11, CMP_RES_NO, CMP_RES_NO},
+ {6, 7, CMP_RES_NO, CMP_RES_YES}, {6, 8, CMP_RES_NO, CMP_RES_NO},
+ {7, 8, CMP_RES_NO, CMP_RES_NO}, {1, 9, CMP_RES_YES, CMP_RES_NO},
+ {0, 9, CMP_RES_NO, CMP_RES_NO}, {3, 9, CMP_RES_NO, CMP_RES_NO},
+ {0, 6, CMP_RES_NO, CMP_RES_NO}, {1, 6, CMP_RES_NO, CMP_RES_NO},
+ {0, 8, CMP_RES_NO, CMP_RES_NO}, {1, 8, CMP_RES_NO, CMP_RES_NO},
+ {11, 6, CMP_RES_NO, CMP_RES_NO}, {11, 7, CMP_RES_NO, CMP_RES_NO},
+ {11, 8, CMP_RES_NO, CMP_RES_NO}, {9, 6, CMP_RES_NO, CMP_RES_YES},
+ {9, 7, CMP_RES_NO, CMP_RES_YES}, {9, 8, CMP_RES_NO, CMP_RES_NO},
};
/* make an aspath from a data stream */
-static struct aspath *
-make_aspath (const u_char *data, size_t len, int use32bit)
+static struct aspath *make_aspath(const u_char *data, size_t len, int use32bit)
{
- struct stream *s = NULL;
- struct aspath *as;
-
- if (len)
- {
- s = stream_new (len);
- stream_put (s, data, len);
- }
- as = aspath_parse (s, len, use32bit);
-
- if (s)
- stream_free (s);
-
- return as;
+ struct stream *s = NULL;
+ struct aspath *as;
+
+ if (len) {
+ s = stream_new(len);
+ stream_put(s, data, len);
+ }
+ as = aspath_parse(s, len, use32bit);
+
+ if (s)
+ stream_free(s);
+
+ return as;
}
-static void
-printbytes (const u_char *bytes, int len)
+static void printbytes(const u_char *bytes, int len)
{
- int i = 0;
- while (i < len)
- {
- if (i % 2)
- printf ("%02hhx%s", bytes[i], " ");
- else
- printf ("0x%02hhx", bytes[i]);
- i++;
- }
- printf ("\n");
-}
+ int i = 0;
+ while (i < len) {
+ if (i % 2)
+ printf("%02hhx%s", bytes[i], " ");
+ else
+ printf("0x%02hhx", bytes[i]);
+ i++;
+ }
+ printf("\n");
+}
/* validate the given aspath */
-static int
-validate (struct aspath *as, const struct test_spec *sp)
+static int validate(struct aspath *as, const struct test_spec *sp)
{
- size_t bytes, bytes4;
- int fails = 0;
- const u_char *out;
- static struct stream *s;
- struct aspath *asinout, *asconfeddel, *asstr, *as4;
-
- if (as == NULL && sp->shouldbe == NULL)
- {
- printf ("Correctly failed to parse\n");
- return fails;
- }
-
- out = aspath_snmp_pathseg (as, &bytes);
- asinout = make_aspath (out, bytes, 0);
-
- /* Excercise AS4 parsing a bit, with a dogfood test */
- if (!s)
- s = stream_new (4096);
- bytes4 = aspath_put (s, as, 1);
- as4 = make_aspath (STREAM_DATA(s), bytes4, 1);
-
- asstr = aspath_str2aspath (sp->shouldbe);
-
- asconfeddel = aspath_delete_confed_seq (aspath_dup (asinout));
-
- printf ("got: %s\n", aspath_print(as));
-
- /* the parsed path should match the specified 'shouldbe' string.
- * We should pass the "eat our own dog food" test, be able to output
- * this path and then input it again. Ie the path resulting from:
- *
- * aspath_parse(aspath_put(as))
- *
- * should:
- *
- * - also match the specified 'shouldbe' value
- * - hash to same value as original path
- * - have same hops and confed counts as original, and as the
- * the specified counts
- *
- * aspath_str2aspath() and shouldbe should match
- *
- * We do the same for:
- *
- * aspath_parse(aspath_put(as,USE32BIT))
- *
- * Confederation related tests:
- * - aspath_delete_confed_seq(aspath) should match shouldbe_confed
- * - aspath_delete_confed_seq should be idempotent.
- */
- if (strcmp(aspath_print (as), sp->shouldbe)
- /* hash validation */
- || (aspath_key_make (as) != aspath_key_make (asinout))
- /* by string */
- || strcmp(aspath_print (asinout), sp->shouldbe)
- /* By 4-byte parsing */
- || strcmp(aspath_print (as4), sp->shouldbe)
- /* by various path counts */
- || (aspath_count_hops (as) != sp->hops)
- || (aspath_count_confeds (as) != sp->confeds)
- || (aspath_count_hops (asinout) != sp->hops)
- || (aspath_count_confeds (asinout) != sp->confeds))
- {
- failed++;
- fails++;
- printf ("shouldbe:\n%s\n", sp->shouldbe);
- printf ("as4:\n%s\n", aspath_print (as4));
- printf ("hash keys: in: %d out->in: %d\n",
- aspath_key_make (as), aspath_key_make (asinout));
- printf ("hops: %d, counted %d %d\n", sp->hops,
- aspath_count_hops (as),
- aspath_count_hops (asinout) );
- printf ("confeds: %d, counted %d %d\n", sp->confeds,
- aspath_count_confeds (as),
- aspath_count_confeds (asinout));
- printf ("out->in:\n%s\nbytes: ", aspath_print(asinout));
- printbytes (out, bytes);
- }
- /* basic confed related tests */
- if ((aspath_print (asconfeddel) == NULL
- && sp->shouldbe_delete_confed != NULL)
- || (aspath_print (asconfeddel) != NULL
- && sp->shouldbe_delete_confed == NULL)
- || strcmp(aspath_print (asconfeddel), sp->shouldbe_delete_confed)
- /* delete_confed_seq should be idempotent */
- || (aspath_key_make (asconfeddel)
- != aspath_key_make (aspath_delete_confed_seq (asconfeddel))))
- {
- failed++;
- fails++;
- printf ("as-path minus confeds is: %s\n", aspath_print (asconfeddel));
- printf ("as-path minus confeds should be: %s\n", sp->shouldbe_delete_confed);
- }
- /* aspath_str2aspath test */
- if ((aspath_print (asstr) == NULL && sp->shouldbe != NULL)
- || (aspath_print (asstr) != NULL && sp->shouldbe == NULL)
- || strcmp(aspath_print (asstr), sp->shouldbe))
- {
- failed++;
- fails++;
- printf ("asstr: %s\n", aspath_print (asstr));
- }
-
- /* loop, private and first as checks */
- if ((sp->does_loop && aspath_loop_check (as, sp->does_loop) == 0)
- || (sp->doesnt_loop && aspath_loop_check (as, sp->doesnt_loop) != 0)
- || (aspath_private_as_check (as) != sp->private_as)
- || (aspath_firstas_check (as,sp->first)
- && sp->first == 0))
- {
- failed++;
- fails++;
- printf ("firstas: %d, got %d\n", sp->first,
- aspath_firstas_check (as,sp->first));
- printf ("loop does: %d %d, doesnt: %d %d\n",
- sp->does_loop, aspath_loop_check (as, sp->does_loop),
- sp->doesnt_loop, aspath_loop_check (as, sp->doesnt_loop));
- printf ("private check: %d %d\n", sp->private_as,
- aspath_private_as_check (as));
- }
- aspath_unintern (&asinout);
- aspath_unintern (&as4);
-
- aspath_free (asconfeddel);
- aspath_free (asstr);
- stream_reset (s);
-
- return fails;
+ size_t bytes, bytes4;
+ int fails = 0;
+ const u_char *out;
+ static struct stream *s;
+ struct aspath *asinout, *asconfeddel, *asstr, *as4;
+
+ if (as == NULL && sp->shouldbe == NULL) {
+ printf("Correctly failed to parse\n");
+ return fails;
+ }
+
+ out = aspath_snmp_pathseg(as, &bytes);
+ asinout = make_aspath(out, bytes, 0);
+
+ /* Excercise AS4 parsing a bit, with a dogfood test */
+ if (!s)
+ s = stream_new(4096);
+ bytes4 = aspath_put(s, as, 1);
+ as4 = make_aspath(STREAM_DATA(s), bytes4, 1);
+
+ asstr = aspath_str2aspath(sp->shouldbe);
+
+ asconfeddel = aspath_delete_confed_seq(aspath_dup(asinout));
+
+ printf("got: %s\n", aspath_print(as));
+
+ /* the parsed path should match the specified 'shouldbe' string.
+ * We should pass the "eat our own dog food" test, be able to output
+ * this path and then input it again. Ie the path resulting from:
+ *
+ * aspath_parse(aspath_put(as))
+ *
+ * should:
+ *
+ * - also match the specified 'shouldbe' value
+ * - hash to same value as original path
+ * - have same hops and confed counts as original, and as the
+ * the specified counts
+ *
+ * aspath_str2aspath() and shouldbe should match
+ *
+ * We do the same for:
+ *
+ * aspath_parse(aspath_put(as,USE32BIT))
+ *
+ * Confederation related tests:
+ * - aspath_delete_confed_seq(aspath) should match shouldbe_confed
+ * - aspath_delete_confed_seq should be idempotent.
+ */
+ if (strcmp(aspath_print(as), sp->shouldbe)
+ /* hash validation */
+ || (aspath_key_make(as) != aspath_key_make(asinout))
+ /* by string */
+ || strcmp(aspath_print(asinout), sp->shouldbe)
+ /* By 4-byte parsing */
+ || strcmp(aspath_print(as4), sp->shouldbe)
+ /* by various path counts */
+ || (aspath_count_hops(as) != sp->hops)
+ || (aspath_count_confeds(as) != sp->confeds)
+ || (aspath_count_hops(asinout) != sp->hops)
+ || (aspath_count_confeds(asinout) != sp->confeds)) {
+ failed++;
+ fails++;
+ printf("shouldbe:\n%s\n", sp->shouldbe);
+ printf("as4:\n%s\n", aspath_print(as4));
+ printf("hash keys: in: %d out->in: %d\n", aspath_key_make(as),
+ aspath_key_make(asinout));
+ printf("hops: %d, counted %d %d\n", sp->hops,
+ aspath_count_hops(as), aspath_count_hops(asinout));
+ printf("confeds: %d, counted %d %d\n", sp->confeds,
+ aspath_count_confeds(as), aspath_count_confeds(asinout));
+ printf("out->in:\n%s\nbytes: ", aspath_print(asinout));
+ printbytes(out, bytes);
+ }
+ /* basic confed related tests */
+ if ((aspath_print(asconfeddel) == NULL
+ && sp->shouldbe_delete_confed != NULL)
+ || (aspath_print(asconfeddel) != NULL
+ && sp->shouldbe_delete_confed == NULL)
+ || strcmp(aspath_print(asconfeddel), sp->shouldbe_delete_confed)
+ /* delete_confed_seq should be idempotent */
+ || (aspath_key_make(asconfeddel)
+ != aspath_key_make(aspath_delete_confed_seq(asconfeddel)))) {
+ failed++;
+ fails++;
+ printf("as-path minus confeds is: %s\n",
+ aspath_print(asconfeddel));
+ printf("as-path minus confeds should be: %s\n",
+ sp->shouldbe_delete_confed);
+ }
+ /* aspath_str2aspath test */
+ if ((aspath_print(asstr) == NULL && sp->shouldbe != NULL)
+ || (aspath_print(asstr) != NULL && sp->shouldbe == NULL)
+ || strcmp(aspath_print(asstr), sp->shouldbe)) {
+ failed++;
+ fails++;
+ printf("asstr: %s\n", aspath_print(asstr));
+ }
+
+ /* loop, private and first as checks */
+ if ((sp->does_loop && aspath_loop_check(as, sp->does_loop) == 0)
+ || (sp->doesnt_loop && aspath_loop_check(as, sp->doesnt_loop) != 0)
+ || (aspath_private_as_check(as) != sp->private_as)
+ || (aspath_firstas_check(as, sp->first) && sp->first == 0)) {
+ failed++;
+ fails++;
+ printf("firstas: %d, got %d\n", sp->first,
+ aspath_firstas_check(as, sp->first));
+ printf("loop does: %d %d, doesnt: %d %d\n", sp->does_loop,
+ aspath_loop_check(as, sp->does_loop), sp->doesnt_loop,
+ aspath_loop_check(as, sp->doesnt_loop));
+ printf("private check: %d %d\n", sp->private_as,
+ aspath_private_as_check(as));
+ }
+ aspath_unintern(&asinout);
+ aspath_unintern(&as4);
+
+ aspath_free(asconfeddel);
+ aspath_free(asstr);
+ stream_reset(s);
+
+ return fails;
}
-static void
-empty_get_test ()
+static void empty_get_test()
{
- struct aspath *as = aspath_empty_get ();
- struct test_spec sp = { "", "", 0, 0, 0, 0, 0, 0 };
-
- printf ("empty_get_test, as: %s\n",aspath_print (as));
- if (!validate (as, &sp))
- printf ("%s\n", OK);
- else
- printf ("%s!\n", FAILED);
-
- printf ("\n");
-
- aspath_free (as);
+ struct aspath *as = aspath_empty_get();
+ struct test_spec sp = {"", "", 0, 0, 0, 0, 0, 0};
+
+ printf("empty_get_test, as: %s\n", aspath_print(as));
+ if (!validate(as, &sp))
+ printf("%s\n", OK);
+ else
+ printf("%s!\n", FAILED);
+
+ printf("\n");
+
+ aspath_free(as);
}
/* basic parsing test */
-static void
-parse_test (struct test_segment *t)
+static void parse_test(struct test_segment *t)
{
- struct aspath *asp;
-
- printf ("%s: %s\n", t->name, t->desc);
-
- asp = make_aspath (t->asdata, t->len, 0);
-
- printf ("aspath: %s\nvalidating...:\n", aspath_print (asp));
-
- if (!validate (asp, &t->sp))
- printf (OK "\n");
- else
- printf (FAILED "\n");
-
- printf ("\n");
-
- if (asp)
- aspath_unintern (&asp);
+ struct aspath *asp;
+
+ printf("%s: %s\n", t->name, t->desc);
+
+ asp = make_aspath(t->asdata, t->len, 0);
+
+ printf("aspath: %s\nvalidating...:\n", aspath_print(asp));
+
+ if (!validate(asp, &t->sp))
+ printf(OK "\n");
+ else
+ printf(FAILED "\n");
+
+ printf("\n");
+
+ if (asp)
+ aspath_unintern(&asp);
}
/* prepend testing */
-static void
-prepend_test (struct tests *t)
+static void prepend_test(struct tests *t)
{
- struct aspath *asp1, *asp2, *ascratch;
-
- printf ("prepend %s: %s\n", t->test1->name, t->test1->desc);
- printf ("to %s: %s\n", t->test2->name, t->test2->desc);
-
- asp1 = make_aspath (t->test1->asdata, t->test1->len, 0);
- asp2 = make_aspath (t->test2->asdata, t->test2->len, 0);
-
- ascratch = aspath_dup (asp2);
- aspath_unintern (&asp2);
-
- asp2 = aspath_prepend (asp1, ascratch);
-
- printf ("aspath: %s\n", aspath_print (asp2));
-
- if (!validate (asp2, &t->sp))
- printf ("%s\n", OK);
- else
- printf ("%s!\n", FAILED);
-
- printf ("\n");
- aspath_unintern (&asp1);
- aspath_free (asp2);
+ struct aspath *asp1, *asp2, *ascratch;
+
+ printf("prepend %s: %s\n", t->test1->name, t->test1->desc);
+ printf("to %s: %s\n", t->test2->name, t->test2->desc);
+
+ asp1 = make_aspath(t->test1->asdata, t->test1->len, 0);
+ asp2 = make_aspath(t->test2->asdata, t->test2->len, 0);
+
+ ascratch = aspath_dup(asp2);
+ aspath_unintern(&asp2);
+
+ asp2 = aspath_prepend(asp1, ascratch);
+
+ printf("aspath: %s\n", aspath_print(asp2));
+
+ if (!validate(asp2, &t->sp))
+ printf("%s\n", OK);
+ else
+ printf("%s!\n", FAILED);
+
+ printf("\n");
+ aspath_unintern(&asp1);
+ aspath_free(asp2);
}
/* empty-prepend testing */
-static void
-empty_prepend_test (struct test_segment *t)
+static void empty_prepend_test(struct test_segment *t)
{
- struct aspath *asp1, *asp2, *ascratch;
-
- printf ("empty prepend %s: %s\n", t->name, t->desc);
-
- asp1 = make_aspath (t->asdata, t->len, 0);
- asp2 = aspath_empty ();
-
- ascratch = aspath_dup (asp2);
- aspath_unintern (&asp2);
-
- asp2 = aspath_prepend (asp1, ascratch);
-
- printf ("aspath: %s\n", aspath_print (asp2));
-
- if (!validate (asp2, &t->sp))
- printf (OK "\n");
- else
- printf (FAILED "!\n");
-
- printf ("\n");
- if (asp1)
- aspath_unintern (&asp1);
- aspath_free (asp2);
+ struct aspath *asp1, *asp2, *ascratch;
+
+ printf("empty prepend %s: %s\n", t->name, t->desc);
+
+ asp1 = make_aspath(t->asdata, t->len, 0);
+ asp2 = aspath_empty();
+
+ ascratch = aspath_dup(asp2);
+ aspath_unintern(&asp2);
+
+ asp2 = aspath_prepend(asp1, ascratch);
+
+ printf("aspath: %s\n", aspath_print(asp2));
+
+ if (!validate(asp2, &t->sp))
+ printf(OK "\n");
+ else
+ printf(FAILED "!\n");
+
+ printf("\n");
+ if (asp1)
+ aspath_unintern(&asp1);
+ aspath_free(asp2);
}
/* as2+as4 reconciliation testing */
-static void
-as4_reconcile_test (struct tests *t)
+static void as4_reconcile_test(struct tests *t)
{
- struct aspath *asp1, *asp2, *ascratch;
-
- printf ("reconciling %s:\n %s\n", t->test1->name, t->test1->desc);
- printf ("with %s:\n %s\n", t->test2->name, t->test2->desc);
-
- asp1 = make_aspath (t->test1->asdata, t->test1->len, 0);
- asp2 = make_aspath (t->test2->asdata, t->test2->len, 0);
-
- ascratch = aspath_reconcile_as4 (asp1, asp2);
-
- if (!validate (ascratch, &t->sp))
- printf (OK "\n");
- else
- printf (FAILED "!\n");
-
- printf ("\n");
- aspath_unintern (&asp1);
- aspath_unintern (&asp2);
- aspath_free (ascratch);
+ struct aspath *asp1, *asp2, *ascratch;
+
+ printf("reconciling %s:\n %s\n", t->test1->name, t->test1->desc);
+ printf("with %s:\n %s\n", t->test2->name, t->test2->desc);
+
+ asp1 = make_aspath(t->test1->asdata, t->test1->len, 0);
+ asp2 = make_aspath(t->test2->asdata, t->test2->len, 0);
+
+ ascratch = aspath_reconcile_as4(asp1, asp2);
+
+ if (!validate(ascratch, &t->sp))
+ printf(OK "\n");
+ else
+ printf(FAILED "!\n");
+
+ printf("\n");
+ aspath_unintern(&asp1);
+ aspath_unintern(&asp2);
+ aspath_free(ascratch);
}
/* aggregation testing */
-static void
-aggregate_test (struct tests *t)
+static void aggregate_test(struct tests *t)
{
- struct aspath *asp1, *asp2, *ascratch;
-
- printf ("aggregate %s: %s\n", t->test1->name, t->test1->desc);
- printf ("with %s: %s\n", t->test2->name, t->test2->desc);
-
- asp1 = make_aspath (t->test1->asdata, t->test1->len, 0);
- asp2 = make_aspath (t->test2->asdata, t->test2->len, 0);
-
- ascratch = aspath_aggregate (asp1, asp2);
-
- if (!validate (ascratch, &t->sp))
- printf (OK "\n");
- else
- printf (FAILED "!\n");
-
- printf ("\n");
- aspath_unintern (&asp1);
- aspath_unintern (&asp2);
- aspath_free (ascratch);
-/* aspath_unintern (ascratch);*/
+ struct aspath *asp1, *asp2, *ascratch;
+
+ printf("aggregate %s: %s\n", t->test1->name, t->test1->desc);
+ printf("with %s: %s\n", t->test2->name, t->test2->desc);
+
+ asp1 = make_aspath(t->test1->asdata, t->test1->len, 0);
+ asp2 = make_aspath(t->test2->asdata, t->test2->len, 0);
+
+ ascratch = aspath_aggregate(asp1, asp2);
+
+ if (!validate(ascratch, &t->sp))
+ printf(OK "\n");
+ else
+ printf(FAILED "!\n");
+
+ printf("\n");
+ aspath_unintern(&asp1);
+ aspath_unintern(&asp2);
+ aspath_free(ascratch);
+ /* aspath_unintern (ascratch);*/
}
/* cmp_left tests */
-static void
-cmp_test ()
+static void cmp_test()
{
- unsigned int i;
-#define CMP_TESTS_MAX \
- (sizeof(left_compare) / sizeof (struct compare_tests))
-
- for (i = 0; i < CMP_TESTS_MAX; i++)
- {
- struct test_segment *t1 = &test_segments[left_compare[i].test_index1];
- struct test_segment *t2 = &test_segments[left_compare[i].test_index2];
- struct aspath *asp1, *asp2;
-
- printf ("left cmp %s: %s\n", t1->name, t1->desc);
- printf ("and %s: %s\n", t2->name, t2->desc);
-
- asp1 = make_aspath (t1->asdata, t1->len, 0);
- asp2 = make_aspath (t2->asdata, t2->len, 0);
-
- if (aspath_cmp_left (asp1, asp2) != left_compare[i].shouldbe_cmp
- || aspath_cmp_left (asp2, asp1) != left_compare[i].shouldbe_cmp
- || aspath_cmp_left_confed (asp1, asp2)
- != left_compare[i].shouldbe_confed
- || aspath_cmp_left_confed (asp2, asp1)
- != left_compare[i].shouldbe_confed)
- {
- failed++;
- printf (FAILED "\n");
- printf ("result should be: cmp: %d, confed: %d\n",
- left_compare[i].shouldbe_cmp,
- left_compare[i].shouldbe_confed);
- printf ("got: cmp %d, cmp_confed: %d\n",
- aspath_cmp_left (asp1, asp2),
- aspath_cmp_left_confed (asp1, asp2));
- printf("path1: %s\npath2: %s\n", aspath_print (asp1),
- aspath_print (asp2));
- }
- else
- printf (OK "\n");
-
- printf ("\n");
- aspath_unintern (&asp1);
- aspath_unintern (&asp2);
- }
+ unsigned int i;
+#define CMP_TESTS_MAX (sizeof(left_compare) / sizeof(struct compare_tests))
+
+ for (i = 0; i < CMP_TESTS_MAX; i++) {
+ struct test_segment *t1 =
+ &test_segments[left_compare[i].test_index1];
+ struct test_segment *t2 =
+ &test_segments[left_compare[i].test_index2];
+ struct aspath *asp1, *asp2;
+
+ printf("left cmp %s: %s\n", t1->name, t1->desc);
+ printf("and %s: %s\n", t2->name, t2->desc);
+
+ asp1 = make_aspath(t1->asdata, t1->len, 0);
+ asp2 = make_aspath(t2->asdata, t2->len, 0);
+
+ if (aspath_cmp_left(asp1, asp2) != left_compare[i].shouldbe_cmp
+ || aspath_cmp_left(asp2, asp1)
+ != left_compare[i].shouldbe_cmp
+ || aspath_cmp_left_confed(asp1, asp2)
+ != left_compare[i].shouldbe_confed
+ || aspath_cmp_left_confed(asp2, asp1)
+ != left_compare[i].shouldbe_confed) {
+ failed++;
+ printf(FAILED "\n");
+ printf("result should be: cmp: %d, confed: %d\n",
+ left_compare[i].shouldbe_cmp,
+ left_compare[i].shouldbe_confed);
+ printf("got: cmp %d, cmp_confed: %d\n",
+ aspath_cmp_left(asp1, asp2),
+ aspath_cmp_left_confed(asp1, asp2));
+ printf("path1: %s\npath2: %s\n", aspath_print(asp1),
+ aspath_print(asp2));
+ } else
+ printf(OK "\n");
+
+ printf("\n");
+ aspath_unintern(&asp1);
+ aspath_unintern(&asp2);
+ }
}
-static int
-handle_attr_test (struct aspath_tests *t)
+static int handle_attr_test(struct aspath_tests *t)
{
- struct bgp bgp = { 0 };
- struct peer peer = { 0 };
- struct attr attr = { 0 };
- int ret;
- int initfail = failed;
- struct aspath *asp;
- size_t datalen;
-
- asp = make_aspath (t->segment->asdata, t->segment->len, 0);
-
- peer.ibuf = stream_new (BGP_MAX_PACKET_SIZE);
- peer.obuf = stream_fifo_new ();
- peer.bgp = &bgp;
- peer.host = (char *)"none";
- peer.fd = -1;
- peer.cap = t->cap;
-
- stream_write (peer.ibuf, t->attrheader, t->len);
- datalen = aspath_put (peer.ibuf, asp, t->as4 == AS4_DATA);
- if (t->old_segment)
- {
- char dummyaspath[] = { BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH,
- t->old_segment->len };
- stream_write (peer.ibuf, dummyaspath, sizeof (dummyaspath));
- stream_write (peer.ibuf, t->old_segment->asdata, t->old_segment->len);
- datalen += sizeof (dummyaspath) + t->old_segment->len;
- }
-
- ret = bgp_attr_parse (&peer, &attr, t->len + datalen, NULL, NULL);
-
- if (ret != t->result)
- {
- printf ("bgp_attr_parse returned %d, expected %d\n", ret, t->result);
- printf ("datalen %zd\n", datalen);
- failed++;
- }
- if (ret != 0)
- goto out;
-
- if (t->shouldbe && attr.aspath == NULL)
- {
- printf ("aspath is NULL, but should be: %s\n", t->shouldbe);
- failed++;
- }
- if (t->shouldbe && attr.aspath && strcmp (attr.aspath->str, t->shouldbe))
- {
- printf ("attr str and 'shouldbe' mismatched!\n"
- "attr str: %s\n"
- "shouldbe: %s\n",
- attr.aspath->str, t->shouldbe);
- failed++;
- }
- if (!t->shouldbe && attr.aspath)
- {
- printf ("aspath should be NULL, but is: %s\n", attr.aspath->str);
- failed++;
- }
+ struct bgp bgp = {0};
+ struct peer peer = {0};
+ struct attr attr = {0};
+ int ret;
+ int initfail = failed;
+ struct aspath *asp;
+ size_t datalen;
+
+ asp = make_aspath(t->segment->asdata, t->segment->len, 0);
+
+ peer.ibuf = stream_new(BGP_MAX_PACKET_SIZE);
+ peer.obuf = stream_fifo_new();
+ peer.bgp = &bgp;
+ peer.host = (char *)"none";
+ peer.fd = -1;
+ peer.cap = t->cap;
+
+ stream_write(peer.ibuf, t->attrheader, t->len);
+ datalen = aspath_put(peer.ibuf, asp, t->as4 == AS4_DATA);
+ if (t->old_segment) {
+ char dummyaspath[] = {BGP_ATTR_FLAG_TRANS, BGP_ATTR_AS_PATH,
+ t->old_segment->len};
+ stream_write(peer.ibuf, dummyaspath, sizeof(dummyaspath));
+ stream_write(peer.ibuf, t->old_segment->asdata,
+ t->old_segment->len);
+ datalen += sizeof(dummyaspath) + t->old_segment->len;
+ }
+
+ ret = bgp_attr_parse(&peer, &attr, t->len + datalen, NULL, NULL);
+
+ if (ret != t->result) {
+ printf("bgp_attr_parse returned %d, expected %d\n", ret,
+ t->result);
+ printf("datalen %zd\n", datalen);
+ failed++;
+ }
+ if (ret != 0)
+ goto out;
+
+ if (t->shouldbe && attr.aspath == NULL) {
+ printf("aspath is NULL, but should be: %s\n", t->shouldbe);
+ failed++;
+ }
+ if (t->shouldbe && attr.aspath
+ && strcmp(attr.aspath->str, t->shouldbe)) {
+ printf("attr str and 'shouldbe' mismatched!\n"
+ "attr str: %s\n"
+ "shouldbe: %s\n",
+ attr.aspath->str, t->shouldbe);
+ failed++;
+ }
+ if (!t->shouldbe && attr.aspath) {
+ printf("aspath should be NULL, but is: %s\n", attr.aspath->str);
+ failed++;
+ }
out:
- if (attr.aspath)
- aspath_unintern (&attr.aspath);
- if (asp)
- aspath_unintern (&asp);
- return failed - initfail;
+ if (attr.aspath)
+ aspath_unintern(&attr.aspath);
+ if (asp)
+ aspath_unintern(&asp);
+ return failed - initfail;
}
-static void
-attr_test (struct aspath_tests *t)
+static void attr_test(struct aspath_tests *t)
{
- printf ("%s\n", t->desc);
- printf ("%s\n\n", handle_attr_test (t) ? FAILED : OK);
+ printf("%s\n", t->desc);
+ printf("%s\n\n", handle_attr_test(t) ? FAILED : OK);
}
-int
-main (void)
+int main(void)
{
- int i = 0;
- qobj_init ();
- bgp_master_init (thread_master_create ());
- master = bm->master;
- bgp_option_set (BGP_OPT_NO_LISTEN);
- bgp_attr_init ();
-
- while (test_segments[i].name)
- {
- printf ("test %u\n", i);
- parse_test (&test_segments[i]);
- empty_prepend_test (&test_segments[i++]);
- }
-
- i = 0;
- while (prepend_tests[i].test1)
- {
- printf ("prepend test %u\n", i);
- prepend_test (&prepend_tests[i++]);
- }
-
- i = 0;
- while (aggregate_tests[i].test1)
- {
- printf ("aggregate test %u\n", i);
- aggregate_test (&aggregate_tests[i++]);
- }
-
- i = 0;
-
- while (reconcile_tests[i].test1)
- {
- printf ("reconcile test %u\n", i);
- as4_reconcile_test (&reconcile_tests[i++]);
- }
-
- i = 0;
-
- cmp_test();
-
- i = 0;
-
- empty_get_test();
-
- i = 0;
-
- while (aspath_tests[i].desc)
- {
- printf ("aspath_attr test %d\n", i);
- attr_test (&aspath_tests[i++]);
- }
-
- printf ("failures: %d\n", failed);
- printf ("aspath count: %ld\n", aspath_count());
-
- return (failed + aspath_count());
+ int i = 0;
+ qobj_init();
+ bgp_master_init(thread_master_create());
+ master = bm->master;
+ bgp_option_set(BGP_OPT_NO_LISTEN);
+ bgp_attr_init();
+
+ while (test_segments[i].name) {
+ printf("test %u\n", i);
+ parse_test(&test_segments[i]);
+ empty_prepend_test(&test_segments[i++]);
+ }
+
+ i = 0;
+ while (prepend_tests[i].test1) {
+ printf("prepend test %u\n", i);
+ prepend_test(&prepend_tests[i++]);
+ }
+
+ i = 0;
+ while (aggregate_tests[i].test1) {
+ printf("aggregate test %u\n", i);
+ aggregate_test(&aggregate_tests[i++]);
+ }
+
+ i = 0;
+
+ while (reconcile_tests[i].test1) {
+ printf("reconcile test %u\n", i);
+ as4_reconcile_test(&reconcile_tests[i++]);
+ }
+
+ i = 0;
+
+ cmp_test();
+
+ i = 0;
+
+ empty_get_test();
+
+ i = 0;
+
+ while (aspath_tests[i].desc) {
+ printf("aspath_attr test %d\n", i);
+ attr_test(&aspath_tests[i++]);
+ }
+
+ printf("failures: %d\n", failed);
+ printf("aspath count: %ld\n", aspath_count());
+
+ return (failed + aspath_count());
}
diff --git a/tests/bgpd/test_capability.c b/tests/bgpd/test_capability.c
index c3de6a16e..1c0b72cfa 100644
--- a/tests/bgpd/test_capability.c
+++ b/tests/bgpd/test_capability.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright (C) 2007 Sun Microsystems, Inc.
*
* This file is part of Quagga.
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with Quagga; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -39,7 +39,6 @@
#define VT100_GREEN "\x1b[32m"
#define VT100_YELLOW "\x1b[33m"
-
#define CAPABILITY 0
#define DYNCAP 1
#define OPT_PARAM 2
@@ -53,649 +52,900 @@ static int tty = 0;
/* test segments to parse and validate, and use for other tests */
static struct test_segment {
- const char *name;
- const char *desc;
- const u_char data[1024];
- int len;
+ const char *name;
+ const char *desc;
+ const u_char data[1024];
+ int len;
#define SHOULD_PARSE 0
#define SHOULD_ERR -1
- int parses; /* whether it should parse or not */
- as_t peek_for; /* what peek_for_as4_capability should say */
-
- /* AFI/SAFI validation */
- int validate_afi;
- afi_t afi;
- safi_t safi;
+ int parses; /* whether it should parse or not */
+ as_t peek_for; /* what peek_for_as4_capability should say */
+
+ /* AFI/SAFI validation */
+ int validate_afi;
+ afi_t afi;
+ safi_t safi;
#define VALID_AFI 1
#define INVALID_AFI 0
- int afi_valid;
-} test_segments [] =
-{
- /* 0 */
- { "caphdr",
- "capability header, and no more",
- { CAPABILITY_CODE_REFRESH, 0x0 },
- 2, SHOULD_PARSE,
- },
- /* 1 */
- { "nodata",
- "header, no data but length says there is",
- { 0x1, 0xa },
- 2, SHOULD_ERR,
- },
- /* 2 */
- { "padded",
- "valid, with padding",
- { CAPABILITY_CODE_REFRESH, 0x2, 0x0, 0x0 },
- 4, SHOULD_PARSE,
- },
- /* 3 */
- { "minsize",
- "violates minsize requirement",
- { CAPABILITY_CODE_ORF, 0x2, 0x0, 0x0 },
- 4, SHOULD_ERR,
- },
- { NULL, NULL, {0}, 0, 0},
+ int afi_valid;
+} test_segments[] = {
+ /* 0 */
+ {
+ "caphdr",
+ "capability header, and no more",
+ {CAPABILITY_CODE_REFRESH, 0x0},
+ 2,
+ SHOULD_PARSE,
+ },
+ /* 1 */
+ {
+ "nodata",
+ "header, no data but length says there is",
+ {0x1, 0xa},
+ 2,
+ SHOULD_ERR,
+ },
+ /* 2 */
+ {
+ "padded",
+ "valid, with padding",
+ {CAPABILITY_CODE_REFRESH, 0x2, 0x0, 0x0},
+ 4,
+ SHOULD_PARSE,
+ },
+ /* 3 */
+ {
+ "minsize",
+ "violates minsize requirement",
+ {CAPABILITY_CODE_ORF, 0x2, 0x0, 0x0},
+ 4,
+ SHOULD_ERR,
+ },
+ {NULL, NULL, {0}, 0, 0},
};
-static struct test_segment mp_segments[] =
-{
- { "MP4",
- "MP IP/Uni",
- { 0x1, 0x4, 0x0, 0x1, 0x0, 0x1 },
- 6, SHOULD_PARSE, 0,
- 1, AFI_IP, SAFI_UNICAST, VALID_AFI,
- },
- { "MPv6",
- "MP IPv6/Uni",
- { 0x1, 0x4, 0x0, 0x2, 0x0, 0x1 },
- 6, SHOULD_PARSE, 0,
- 1, AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- /* 5 */
- { "MP2",
- "MP IP/Multicast",
- { CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x2 },
- 6, SHOULD_PARSE, 0,
- 1, AFI_IP, SAFI_MULTICAST, VALID_AFI,
- },
- /* 6 */
- { "MP3",
- "MP IP6/MPLS-labeled VPN",
- { CAPABILITY_CODE_MP, 0x4, 0x0, 0x2, 0x0, 0x80 },
- 6, SHOULD_PARSE, 0,
- 1, AFI_IP6, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- /* 7 */
- { "MP5",
- "MP IP6/MPLS-VPN",
- { CAPABILITY_CODE_MP, 0x4, 0x0, 0x2, 0x0, 0x4 },
- 6, SHOULD_PARSE, 0,
- 1, AFI_IP6, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- /* 8 */
- { "MP6",
- "MP IP4/MPLS-laveled VPN",
- { CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x80 },
- 6, SHOULD_PARSE, 0,
- 1, AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- /* 10 */
- { "MP8",
- "MP unknown AFI/SAFI",
- { CAPABILITY_CODE_MP, 0x4, 0x0, 0xa, 0x0, 0x81 },
- 6, SHOULD_PARSE, 0,
- 1, 0xa, 0x81, INVALID_AFI, /* parses, but unknown */
- },
- /* 11 */
- { "MP-short",
- "MP IP4/Unicast, length too short (< minimum)",
- { CAPABILITY_CODE_MP, 0x2, 0x0, 0x1, 0x0, 0x1 },
- 6, SHOULD_ERR,
- },
- /* 12 */
- { "MP-overflow",
- "MP IP4/Unicast, length too long",
- { CAPABILITY_CODE_MP, 0x6, 0x0, 0x1, 0x0, 0x1 },
- 6, SHOULD_ERR, 0,
- 1, AFI_IP, SAFI_UNICAST, VALID_AFI,
- },
- { NULL, NULL, {0}, 0, 0}
-};
+static struct test_segment mp_segments[] = {
+ {
+ "MP4",
+ "MP IP/Uni",
+ {0x1, 0x4, 0x0, 0x1, 0x0, 0x1},
+ 6,
+ SHOULD_PARSE,
+ 0,
+ 1,
+ AFI_IP,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "MPv6",
+ "MP IPv6/Uni",
+ {0x1, 0x4, 0x0, 0x2, 0x0, 0x1},
+ 6,
+ SHOULD_PARSE,
+ 0,
+ 1,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ /* 5 */
+ {
+ "MP2",
+ "MP IP/Multicast",
+ {CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x2},
+ 6,
+ SHOULD_PARSE,
+ 0,
+ 1,
+ AFI_IP,
+ SAFI_MULTICAST,
+ VALID_AFI,
+ },
+ /* 6 */
+ {
+ "MP3",
+ "MP IP6/MPLS-labeled VPN",
+ {CAPABILITY_CODE_MP, 0x4, 0x0, 0x2, 0x0, 0x80},
+ 6,
+ SHOULD_PARSE,
+ 0,
+ 1,
+ AFI_IP6,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ /* 7 */
+ {
+ "MP5",
+ "MP IP6/MPLS-VPN",
+ {CAPABILITY_CODE_MP, 0x4, 0x0, 0x2, 0x0, 0x4},
+ 6,
+ SHOULD_PARSE,
+ 0,
+ 1,
+ AFI_IP6,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ /* 8 */
+ {
+ "MP6",
+ "MP IP4/MPLS-laveled VPN",
+ {CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x80},
+ 6,
+ SHOULD_PARSE,
+ 0,
+ 1,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ /* 10 */
+ {
+ "MP8",
+ "MP unknown AFI/SAFI",
+ {CAPABILITY_CODE_MP, 0x4, 0x0, 0xa, 0x0, 0x81},
+ 6,
+ SHOULD_PARSE,
+ 0,
+ 1,
+ 0xa,
+ 0x81,
+ INVALID_AFI, /* parses, but unknown */
+ },
+ /* 11 */
+ {
+ "MP-short",
+ "MP IP4/Unicast, length too short (< minimum)",
+ {CAPABILITY_CODE_MP, 0x2, 0x0, 0x1, 0x0, 0x1},
+ 6,
+ SHOULD_ERR,
+ },
+ /* 12 */
+ {
+ "MP-overflow",
+ "MP IP4/Unicast, length too long",
+ {CAPABILITY_CODE_MP, 0x6, 0x0, 0x1, 0x0, 0x1},
+ 6,
+ SHOULD_ERR,
+ 0,
+ 1,
+ AFI_IP,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {NULL, NULL, {0}, 0, 0}};
static struct test_segment misc_segments[] =
-{
- /* 13 */
- { "ORF",
- "ORF, simple, single entry, single tuple",
- { /* hdr */ CAPABILITY_CODE_ORF, 0x7,
- /* mpc */ 0x0, 0x1, 0x0, 0x1,
- /* num */ 0x1,
- /* tuples */ 0x40, 0x3
- },
- 9, SHOULD_PARSE,
- },
- /* 14 */
- { "ORF-many",
- "ORF, multi entry/tuple",
- { /* hdr */ CAPABILITY_CODE_ORF, 0x21,
- /* mpc */ 0x0, 0x1, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, ORF_MODE_BOTH,
- 0x80, ORF_MODE_RECEIVE,
- 0x80, ORF_MODE_SEND,
- /* mpc */ 0x0, 0x2, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, ORF_MODE_BOTH,
- 0x80, ORF_MODE_RECEIVE,
- 0x80, ORF_MODE_SEND,
- /* mpc */ 0x0, 0x2, 0x0, 0x2,
- /* num */ 0x3,
- /* tuples */ 0x40, ORF_MODE_RECEIVE,
- 0x80, ORF_MODE_SEND,
- 0x80, ORF_MODE_BOTH,
- },
- 35, SHOULD_PARSE,
- },
- /* 15 */
- { "ORFlo",
- "ORF, multi entry/tuple, hdr length too short",
- { /* hdr */ CAPABILITY_CODE_ORF, 0x15,
- /* mpc */ 0x0, 0x1, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x1, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x2, 0x0, 0x2,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- },
- 35, SHOULD_ERR, /* It should error on invalid Route-Refresh.. */
- },
- /* 16 */
- { "ORFlu",
- "ORF, multi entry/tuple, length too long",
- { /* hdr */ 0x3, 0x22,
- /* mpc */ 0x0, 0x1, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x2, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x2, 0x0, 0x2,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- },
- 35, SHOULD_ERR
- },
- /* 17 */
- { "ORFnu",
- "ORF, multi entry/tuple, entry number too long",
- { /* hdr */ 0x3, 0x21,
- /* mpc */ 0x0, 0x1, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x2, 0x0, 0x1,
- /* num */ 0x4,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x2, 0x0, 0x2,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- },
- 35, SHOULD_PARSE, /* parses, but last few tuples should be gibberish */
- },
- /* 18 */
- { "ORFno",
- "ORF, multi entry/tuple, entry number too short",
- { /* hdr */ 0x3, 0x21,
- /* mpc */ 0x0, 0x1, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x2, 0x0, 0x1,
- /* num */ 0x1,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x2, 0x0, 0x2,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- },
- 35, SHOULD_PARSE, /* Parses, but should get gibberish afi/safis */
- },
- /* 17 */
- { "ORFpad",
- "ORF, multi entry/tuple, padded to align",
- { /* hdr */ 0x3, 0x22,
- /* mpc */ 0x0, 0x1, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x2, 0x0, 0x1,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- /* mpc */ 0x0, 0x2, 0x0, 0x2,
- /* num */ 0x3,
- /* tuples */ 0x40, 0x3,
- 0x80, 0x1,
- 0x80, 0x2,
- 0x00,
- },
- 36, SHOULD_PARSE,
- },
- /* 19 */
- { "AS4",
- "AS4 capability",
- { 0x41, 0x4, 0xab, 0xcd, 0xef, 0x12 }, /* AS: 2882400018 */
- 6, SHOULD_PARSE, 2882400018,
- },
- { "AS4",
- "AS4 capability: short",
- { 0x41, 0x4, 0xab, 0xcd, 0xef }, /* AS: 2882400018 */
- 5, SHOULD_ERR,
- },
- { "AS4",
- "AS4 capability: long",
- { 0x41, 0x4, 0xab, 0xcd, 0xef, 0x12, 0x12 },
- 7, SHOULD_ERR, 2882400018,
- },
- { "GR",
- "GR capability",
- { /* hdr */ CAPABILITY_CODE_RESTART, 0xe,
- /* R-bit, time */ 0xf1, 0x12,
- /* afi */ 0x0, 0x1,
- /* safi */ 0x1,
- /* flags */ 0xf,
- /* afi */ 0x0, 0x2,
- /* safi */ 0x1,
- /* flags */ 0x0,
- /* afi */ 0x0, 0x2,
- /* safi */ 0x2,
- /* flags */ 0x1,
- },
- 16, SHOULD_PARSE,
- },
- { "GR-short",
- "GR capability, but header length too short",
- { /* hdr */ 0x40, 0xa,
- /* R-bit, time */ 0xf1, 0x12,
- /* afi */ 0x0, 0x1,
- /* safi */ 0x1,
- /* flags */ 0xf,
- /* afi */ 0x0, 0x2,
- /* safi */ 0x1,
- /* flags */ 0x0,
- /* afi */ 0x0, 0x2,
- /* safi */ 0x2,
- /* flags */ 0x1,
- },
- 15 /* array is 16 though */, SHOULD_ERR,
- },
- { "GR-long",
- "GR capability, but header length too long",
- { /* hdr */ 0x40, 0xf,
- /* R-bit, time */ 0xf1, 0x12,
- /* afi */ 0x0, 0x1,
- /* safi */ 0x1,
- /* flags */ 0xf,
- /* afi */ 0x0, 0x2,
- /* safi */ 0x1,
- /* flags */ 0x0,
- /* afi */ 0x0, 0x2,
- /* safi */ 0x2,
- /* flags */ 0x01,
- },
- 16, SHOULD_ERR,
- },
- { "GR-trunc",
- "GR capability, but truncated",
- { /* hdr */ 0x40, 0xf,
- /* R-bit, time */ 0xf1, 0x12,
- /* afi */ 0x0, 0x1,
- /* safi */ 0x1,
- /* flags */ 0xf,
- /* afi */ 0x0, 0x2,
- /* safi */ 0x1,
- /* flags */ 0x0,
- /* afi */ 0x0, 0x2,
- /* safi */ 0x2,
- /* flags */ 0x1,
- },
- 15, SHOULD_ERR,
- },
- { "GR-empty",
- "GR capability, but empty.",
- { /* hdr */ 0x40, 0x0,
- },
- 2, SHOULD_ERR,
- },
- { "MP-empty",
- "MP capability, but empty.",
- { /* hdr */ 0x1, 0x0,
- },
- 2, SHOULD_ERR,
- },
- { "ORF-empty",
- "ORF capability, but empty.",
- { /* hdr */ 0x3, 0x0,
- },
- 2, SHOULD_ERR,
- },
- { "AS4-empty",
- "AS4 capability, but empty.",
- { /* hdr */ 0x41, 0x0,
- },
- 2, SHOULD_ERR,
- },
- { "dyn-empty",
- "Dynamic capability, but empty.",
- { /* hdr */ 0x42, 0x0,
- },
- 2, SHOULD_PARSE,
- },
- { "dyn-old",
- "Dynamic capability (deprecated version)",
- { CAPABILITY_CODE_DYNAMIC, 0x0 },
- 2, SHOULD_PARSE,
- },
- { NULL, NULL, {0}, 0, 0}
-};
+ {
+ /* 13 */
+ {
+ "ORF",
+ "ORF, simple, single entry, single tuple",
+ {/* hdr */ CAPABILITY_CODE_ORF, 0x7,
+ /* mpc */ 0x0, 0x1, 0x0, 0x1,
+ /* num */ 0x1,
+ /* tuples */ 0x40, 0x3},
+ 9,
+ SHOULD_PARSE,
+ },
+ /* 14 */
+ {
+ "ORF-many",
+ "ORF, multi entry/tuple",
+ {
+ /* hdr */ CAPABILITY_CODE_ORF,
+ 0x21,
+ /* mpc */ 0x0,
+ 0x1,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ ORF_MODE_BOTH,
+ 0x80,
+ ORF_MODE_RECEIVE,
+ 0x80,
+ ORF_MODE_SEND,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ ORF_MODE_BOTH,
+ 0x80,
+ ORF_MODE_RECEIVE,
+ 0x80,
+ ORF_MODE_SEND,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x2,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ ORF_MODE_RECEIVE,
+ 0x80,
+ ORF_MODE_SEND,
+ 0x80,
+ ORF_MODE_BOTH,
+ },
+ 35,
+ SHOULD_PARSE,
+ },
+ /* 15 */
+ {
+ "ORFlo",
+ "ORF, multi entry/tuple, hdr length too short",
+ {
+ /* hdr */ CAPABILITY_CODE_ORF,
+ 0x15,
+ /* mpc */ 0x0,
+ 0x1,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x1,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x2,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ },
+ 35,
+ SHOULD_ERR, /* It should error on invalid
+ Route-Refresh.. */
+ },
+ /* 16 */
+ {"ORFlu",
+ "ORF, multi entry/tuple, length too long",
+ {
+ /* hdr */ 0x3,
+ 0x22,
+ /* mpc */ 0x0,
+ 0x1,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x2,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ },
+ 35,
+ SHOULD_ERR},
+ /* 17 */
+ {
+ "ORFnu",
+ "ORF, multi entry/tuple, entry number too long",
+ {
+ /* hdr */ 0x3,
+ 0x21,
+ /* mpc */ 0x0,
+ 0x1,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x1,
+ /* num */ 0x4,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x2,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ },
+ 35,
+ SHOULD_PARSE, /* parses, but last few tuples should be
+ gibberish */
+ },
+ /* 18 */
+ {
+ "ORFno",
+ "ORF, multi entry/tuple, entry number too short",
+ {
+ /* hdr */ 0x3,
+ 0x21,
+ /* mpc */ 0x0,
+ 0x1,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x1,
+ /* num */ 0x1,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x2,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ },
+ 35,
+ SHOULD_PARSE, /* Parses, but should get gibberish
+ afi/safis */
+ },
+ /* 17 */
+ {
+ "ORFpad",
+ "ORF, multi entry/tuple, padded to align",
+ {
+ /* hdr */ 0x3,
+ 0x22,
+ /* mpc */ 0x0,
+ 0x1,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x1,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ /* mpc */ 0x0,
+ 0x2,
+ 0x0,
+ 0x2,
+ /* num */ 0x3,
+ /* tuples */ 0x40,
+ 0x3,
+ 0x80,
+ 0x1,
+ 0x80,
+ 0x2,
+ 0x00,
+ },
+ 36,
+ SHOULD_PARSE,
+ },
+ /* 19 */
+ {
+ "AS4",
+ "AS4 capability",
+ {0x41, 0x4, 0xab, 0xcd, 0xef,
+ 0x12}, /* AS: 2882400018 */
+ 6,
+ SHOULD_PARSE,
+ 2882400018,
+ },
+ {
+ "AS4",
+ "AS4 capability: short",
+ {0x41, 0x4, 0xab, 0xcd, 0xef}, /* AS: 2882400018 */
+ 5,
+ SHOULD_ERR,
+ },
+ {
+ "AS4",
+ "AS4 capability: long",
+ {0x41, 0x4, 0xab, 0xcd, 0xef, 0x12, 0x12},
+ 7,
+ SHOULD_ERR,
+ 2882400018,
+ },
+ {
+ "GR",
+ "GR capability",
+ {
+ /* hdr */ CAPABILITY_CODE_RESTART, 0xe,
+ /* R-bit, time */ 0xf1, 0x12,
+ /* afi */ 0x0, 0x1,
+ /* safi */ 0x1,
+ /* flags */ 0xf,
+ /* afi */ 0x0, 0x2,
+ /* safi */ 0x1,
+ /* flags */ 0x0,
+ /* afi */ 0x0, 0x2,
+ /* safi */ 0x2,
+ /* flags */ 0x1,
+ },
+ 16,
+ SHOULD_PARSE,
+ },
+ {
+ "GR-short",
+ "GR capability, but header length too short",
+ {
+ /* hdr */ 0x40, 0xa,
+ /* R-bit, time */ 0xf1, 0x12,
+ /* afi */ 0x0, 0x1,
+ /* safi */ 0x1,
+ /* flags */ 0xf,
+ /* afi */ 0x0, 0x2,
+ /* safi */ 0x1,
+ /* flags */ 0x0,
+ /* afi */ 0x0, 0x2,
+ /* safi */ 0x2,
+ /* flags */ 0x1,
+ },
+ 15 /* array is 16 though */,
+ SHOULD_ERR,
+ },
+ {
+ "GR-long",
+ "GR capability, but header length too long",
+ {
+ /* hdr */ 0x40, 0xf,
+ /* R-bit, time */ 0xf1, 0x12,
+ /* afi */ 0x0, 0x1,
+ /* safi */ 0x1,
+ /* flags */ 0xf,
+ /* afi */ 0x0, 0x2,
+ /* safi */ 0x1,
+ /* flags */ 0x0,
+ /* afi */ 0x0, 0x2,
+ /* safi */ 0x2,
+ /* flags */ 0x01,
+ },
+ 16,
+ SHOULD_ERR,
+ },
+ {
+ "GR-trunc",
+ "GR capability, but truncated",
+ {
+ /* hdr */ 0x40, 0xf,
+ /* R-bit, time */ 0xf1, 0x12,
+ /* afi */ 0x0, 0x1,
+ /* safi */ 0x1,
+ /* flags */ 0xf,
+ /* afi */ 0x0, 0x2,
+ /* safi */ 0x1,
+ /* flags */ 0x0,
+ /* afi */ 0x0, 0x2,
+ /* safi */ 0x2,
+ /* flags */ 0x1,
+ },
+ 15,
+ SHOULD_ERR,
+ },
+ {
+ "GR-empty",
+ "GR capability, but empty.",
+ {
+ /* hdr */ 0x40, 0x0,
+ },
+ 2,
+ SHOULD_ERR,
+ },
+ {
+ "MP-empty",
+ "MP capability, but empty.",
+ {
+ /* hdr */ 0x1, 0x0,
+ },
+ 2,
+ SHOULD_ERR,
+ },
+ {
+ "ORF-empty",
+ "ORF capability, but empty.",
+ {
+ /* hdr */ 0x3, 0x0,
+ },
+ 2,
+ SHOULD_ERR,
+ },
+ {
+ "AS4-empty",
+ "AS4 capability, but empty.",
+ {
+ /* hdr */ 0x41, 0x0,
+ },
+ 2,
+ SHOULD_ERR,
+ },
+ {
+ "dyn-empty",
+ "Dynamic capability, but empty.",
+ {
+ /* hdr */ 0x42, 0x0,
+ },
+ 2,
+ SHOULD_PARSE,
+ },
+ {
+ "dyn-old",
+ "Dynamic capability (deprecated version)",
+ {CAPABILITY_CODE_DYNAMIC, 0x0},
+ 2,
+ SHOULD_PARSE,
+ },
+ {NULL, NULL, {0}, 0, 0}};
/* DYNAMIC message */
-struct test_segment dynamic_cap_msgs[] =
-{
- { "DynCap",
- "Dynamic Capability Message, IP/Multicast",
- { 0x0, 0x1, 0x4, 0x0, 0x1, 0x0, 0x2 },
- 7, SHOULD_PARSE, /* horrible alignment, just as with ORF */
- },
- { "DynCapLong",
- "Dynamic Capability Message, IP/Multicast, truncated",
- { 0x0, 0x1, 0x4, 0x0, 0x1, 0x0, 0x2 },
- 5, SHOULD_ERR,
- },
- { "DynCapPadded",
- "Dynamic Capability Message, IP/Multicast, padded",
- { 0x0, 0x1, 0x4, 0x0, 0x1, 0x0, 0x2, 0x0 },
- 8, SHOULD_ERR, /* No way to tell padding from data.. */
- },
- { "DynCapMPCpadded",
- "Dynamic Capability Message, IP/Multicast, cap data padded",
- { 0x0, 0x1, 0x5, 0x0, 0x1, 0x0, 0x2, 0x0 },
- 8, SHOULD_PARSE, /* You can though add padding to the capability data */
- },
- { "DynCapMPCoverflow",
- "Dynamic Capability Message, IP/Multicast, cap data != length",
- { 0x0, 0x1, 0x3, 0x0, 0x1, 0x0, 0x2, 0x0 },
- 8, SHOULD_ERR,
- },
- { NULL, NULL, {0}, 0, 0}
-};
+struct test_segment dynamic_cap_msgs[] = {
+ {
+ "DynCap",
+ "Dynamic Capability Message, IP/Multicast",
+ {0x0, 0x1, 0x4, 0x0, 0x1, 0x0, 0x2},
+ 7,
+ SHOULD_PARSE, /* horrible alignment, just as with ORF */
+ },
+ {
+ "DynCapLong",
+ "Dynamic Capability Message, IP/Multicast, truncated",
+ {0x0, 0x1, 0x4, 0x0, 0x1, 0x0, 0x2},
+ 5,
+ SHOULD_ERR,
+ },
+ {
+ "DynCapPadded",
+ "Dynamic Capability Message, IP/Multicast, padded",
+ {0x0, 0x1, 0x4, 0x0, 0x1, 0x0, 0x2, 0x0},
+ 8,
+ SHOULD_ERR, /* No way to tell padding from data.. */
+ },
+ {
+ "DynCapMPCpadded",
+ "Dynamic Capability Message, IP/Multicast, cap data padded",
+ {0x0, 0x1, 0x5, 0x0, 0x1, 0x0, 0x2, 0x0},
+ 8,
+ SHOULD_PARSE, /* You can though add padding to the capability
+ data */
+ },
+ {
+ "DynCapMPCoverflow",
+ "Dynamic Capability Message, IP/Multicast, cap data != length",
+ {0x0, 0x1, 0x3, 0x0, 0x1, 0x0, 0x2, 0x0},
+ 8,
+ SHOULD_ERR,
+ },
+ {NULL, NULL, {0}, 0, 0}};
/* Entire Optional-Parameters block */
-struct test_segment opt_params[] =
-{
- { "Cap-singlets",
- "One capability per Optional-Param",
- { 0x02, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
- 0x02, 0x06, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
- 0x02, 0x02, 0x80, 0x00, /* RR (old) */
- 0x02, 0x02, 0x02, 0x00, /* RR */
- },
- 24, SHOULD_PARSE,
- },
- { "Cap-series",
- "Series of capability, one Optional-Param",
- { 0x02, 0x10,
- 0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
- 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
- 0x80, 0x00, /* RR (old) */
- 0x02, 0x00, /* RR */
- },
- 18, SHOULD_PARSE,
- },
- { "AS4more",
- "AS4 capability after other caps (singlets)",
- { 0x02, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
- 0x02, 0x06, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
- 0x02, 0x02, 0x80, 0x00, /* RR (old) */
- 0x02, 0x02, 0x02, 0x00, /* RR */
- 0x02, 0x06, 0x41, 0x04, 0x00, 0x03, 0x00, 0x06 /* AS4: 1996614 */
- },
- 32, SHOULD_PARSE, 196614,
- },
- { "AS4series",
- "AS4 capability, in series of capabilities",
- { 0x02, 0x16,
- 0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
- 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
- 0x80, 0x00, /* RR (old) */
- 0x02, 0x00, /* RR */
- 0x41, 0x04, 0x00, 0x03, 0x00, 0x06 /* AS4: 1996614 */
- },
- 24, SHOULD_PARSE, 196614,
- },
- { "AS4real",
- "AS4 capability, in series of capabilities",
- {
- 0x02, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x01, /* MP IPv4/uni */
- 0x02, 0x06, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/uni */
- 0x02, 0x02, 0x80, 0x00, /* RR old */
- 0x02, 0x02, 0x02, 0x00, /* RR */
- 0x02, 0x06, 0x41, 0x04, 0x00, 0x03, 0x00, 0x06, /* AS4 */
- },
- 32, SHOULD_PARSE, 196614,
- },
- { "AS4real2",
- "AS4 capability, in series of capabilities",
- {
- 0x02, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x01,
- 0x02, 0x06, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01,
- 0x02, 0x02, 0x80, 0x00,
- 0x02, 0x02, 0x02, 0x00,
- 0x02, 0x06, 0x41, 0x04, 0x00, 0x00, 0xfc, 0x03,
- 0x02, 0x09, 0x82, 0x07, 0x00, 0x01, 0x00, 0x01, 0x01, 0x80, 0x03,
- 0x02, 0x09, 0x03, 0x07, 0x00, 0x01, 0x00, 0x01, 0x01, 0x40, 0x03,
- 0x02, 0x02, 0x42, 0x00,
- },
- 58, SHOULD_PARSE, 64515,
- },
-
- { NULL, NULL, {0}, 0, 0}
-};
+struct test_segment opt_params[] = {
+ {
+ "Cap-singlets",
+ "One capability per Optional-Param",
+ {
+ 0x02, 0x06, 0x01, 0x04,
+ 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
+ 0x02, 0x06, 0x01, 0x04,
+ 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
+ 0x02, 0x02, 0x80, 0x00, /* RR (old) */
+ 0x02, 0x02, 0x02, 0x00, /* RR */
+ },
+ 24,
+ SHOULD_PARSE,
+ },
+ {
+ "Cap-series",
+ "Series of capability, one Optional-Param",
+ {
+ 0x02, 0x10, 0x01, 0x04, 0x00, 0x01, 0x00,
+ 0x01, /* MP IPv4/Uni */
+ 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
+ 0x80, 0x00, /* RR (old) */
+ 0x02, 0x00, /* RR */
+ },
+ 18,
+ SHOULD_PARSE,
+ },
+ {
+ "AS4more",
+ "AS4 capability after other caps (singlets)",
+ {
+ 0x02, 0x06, 0x01, 0x04,
+ 0x00, 0x01, 0x00, 0x01, /* MP IPv4/Uni */
+ 0x02, 0x06, 0x01, 0x04,
+ 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
+ 0x02, 0x02, 0x80, 0x00, /* RR (old) */
+ 0x02, 0x02, 0x02, 0x00, /* RR */
+ 0x02, 0x06, 0x41, 0x04,
+ 0x00, 0x03, 0x00, 0x06 /* AS4: 1996614 */
+ },
+ 32,
+ SHOULD_PARSE,
+ 196614,
+ },
+ {
+ "AS4series",
+ "AS4 capability, in series of capabilities",
+ {
+ 0x02, 0x16, 0x01, 0x04, 0x00, 0x01,
+ 0x00, 0x01, /* MP IPv4/Uni */
+ 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, /* MP IPv6/Uni */
+ 0x80, 0x00, /* RR (old) */
+ 0x02, 0x00, /* RR */
+ 0x41, 0x04, 0x00, 0x03, 0x00, 0x06 /* AS4: 1996614 */
+ },
+ 24,
+ SHOULD_PARSE,
+ 196614,
+ },
+ {
+ "AS4real",
+ "AS4 capability, in series of capabilities",
+ {
+ 0x02, 0x06, 0x01, 0x04,
+ 0x00, 0x01, 0x00, 0x01, /* MP IPv4/uni */
+ 0x02, 0x06, 0x01, 0x04,
+ 0x00, 0x02, 0x00, 0x01, /* MP IPv6/uni */
+ 0x02, 0x02, 0x80, 0x00, /* RR old */
+ 0x02, 0x02, 0x02, 0x00, /* RR */
+ 0x02, 0x06, 0x41, 0x04,
+ 0x00, 0x03, 0x00, 0x06, /* AS4 */
+ },
+ 32,
+ SHOULD_PARSE,
+ 196614,
+ },
+ {
+ "AS4real2",
+ "AS4 capability, in series of capabilities",
+ {
+ 0x02, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02,
+ 0x06, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, 0x02, 0x02,
+ 0x80, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x06, 0x41,
+ 0x04, 0x00, 0x00, 0xfc, 0x03, 0x02, 0x09, 0x82, 0x07,
+ 0x00, 0x01, 0x00, 0x01, 0x01, 0x80, 0x03, 0x02, 0x09,
+ 0x03, 0x07, 0x00, 0x01, 0x00, 0x01, 0x01, 0x40, 0x03,
+ 0x02, 0x02, 0x42, 0x00,
+ },
+ 58,
+ SHOULD_PARSE,
+ 64515,
+ },
+
+ {NULL, NULL, {0}, 0, 0}};
/* basic parsing test */
-static void
-parse_test (struct peer *peer, struct test_segment *t, int type)
+static void parse_test(struct peer *peer, struct test_segment *t, int type)
{
- int ret;
- int capability = 0;
- as_t as4 = 0;
- int oldfailed = failed;
- int len = t->len;
+ int ret;
+ int capability = 0;
+ as_t as4 = 0;
+ int oldfailed = failed;
+ int len = t->len;
#define RANDOM_FUZZ 35
-
- stream_reset (peer->ibuf);
- stream_put (peer->ibuf, NULL, RANDOM_FUZZ);
- stream_set_getp (peer->ibuf, RANDOM_FUZZ);
-
- switch (type)
- {
- case CAPABILITY:
- stream_putc (peer->ibuf, BGP_OPEN_OPT_CAP);
- stream_putc (peer->ibuf, t->len);
- break;
- case DYNCAP:
-/* for (i = 0; i < BGP_MARKER_SIZE; i++)
- stream_putc (peer->, 0xff);
- stream_putw (s, 0);
- stream_putc (s, BGP_MSG_CAPABILITY);*/
- break;
- }
- stream_write (peer->ibuf, t->data, t->len);
-
- printf ("%s: %s\n", t->name, t->desc);
-
- switch (type)
- {
- case CAPABILITY:
- len += 2; /* to cover the OPT-Param header */
- case OPT_PARAM:
- printf ("len: %u\n", len);
- /* peek_for_as4 wants getp at capibility*/
- as4 = peek_for_as4_capability (peer, len);
- printf ("peek_for_as4: as4 is %u\n", as4);
- /* and it should leave getp as it found it */
- assert (stream_get_getp (peer->ibuf) == RANDOM_FUZZ);
-
- ret = bgp_open_option_parse (peer, len, &capability);
- break;
- case DYNCAP:
- ret = bgp_capability_receive (peer, t->len);
- break;
- default:
- printf ("unknown type %u\n", type);
- exit(1);
- }
-
- if (!ret && t->validate_afi)
- {
- afi_t afi;
- safi_t safi;
-
- /* Convert AFI, SAFI to internal values, check. */
- if (bgp_map_afi_safi_iana2int (afi_int2iana(t->afi), t->safi, &afi, &safi))
- {
- if (t->afi_valid == VALID_AFI)
- failed++;
- }
- printf ("MP: %u(%u)/%u(%u): recv %u, nego %u\n",
- t->afi, afi, t->safi, safi,
- peer->afc_recv[afi][safi],
- peer->afc_nego[afi][safi]);
-
- if (t->afi_valid == VALID_AFI)
- {
-
- if (!peer->afc_recv[afi][safi])
- failed++;
- if (!peer->afc_nego[afi][safi])
- failed++;
- }
- }
-
- if (as4 != t->peek_for)
- {
- printf ("as4 %u != %u\n", as4, t->peek_for);
- failed++;
- }
-
- printf ("parsed?: %s\n", ret ? "no" : "yes");
-
- if (ret != t->parses)
- failed++;
-
- if (tty)
- printf ("%s", (failed > oldfailed) ? VT100_RED "failed!" VT100_RESET
- : VT100_GREEN "OK" VT100_RESET);
- else
- printf ("%s", (failed > oldfailed) ? "failed!" : "OK" );
-
- if (failed)
- printf (" (%u)", failed);
-
- printf ("\n\n");
+ stream_reset(peer->ibuf);
+ stream_put(peer->ibuf, NULL, RANDOM_FUZZ);
+ stream_set_getp(peer->ibuf, RANDOM_FUZZ);
+
+ switch (type) {
+ case CAPABILITY:
+ stream_putc(peer->ibuf, BGP_OPEN_OPT_CAP);
+ stream_putc(peer->ibuf, t->len);
+ break;
+ case DYNCAP:
+ /* for (i = 0; i < BGP_MARKER_SIZE; i++)
+ stream_putc (peer->, 0xff);
+ stream_putw (s, 0);
+ stream_putc (s, BGP_MSG_CAPABILITY);*/
+ break;
+ }
+ stream_write(peer->ibuf, t->data, t->len);
+
+ printf("%s: %s\n", t->name, t->desc);
+
+ switch (type) {
+ case CAPABILITY:
+ len += 2; /* to cover the OPT-Param header */
+ case OPT_PARAM:
+ printf("len: %u\n", len);
+ /* peek_for_as4 wants getp at capibility*/
+ as4 = peek_for_as4_capability(peer, len);
+ printf("peek_for_as4: as4 is %u\n", as4);
+ /* and it should leave getp as it found it */
+ assert(stream_get_getp(peer->ibuf) == RANDOM_FUZZ);
+
+ ret = bgp_open_option_parse(peer, len, &capability);
+ break;
+ case DYNCAP:
+ ret = bgp_capability_receive(peer, t->len);
+ break;
+ default:
+ printf("unknown type %u\n", type);
+ exit(1);
+ }
+
+ if (!ret && t->validate_afi) {
+ afi_t afi;
+ safi_t safi;
+
+ /* Convert AFI, SAFI to internal values, check. */
+ if (bgp_map_afi_safi_iana2int(afi_int2iana(t->afi), t->safi,
+ &afi, &safi)) {
+ if (t->afi_valid == VALID_AFI)
+ failed++;
+ }
+ printf("MP: %u(%u)/%u(%u): recv %u, nego %u\n", t->afi, afi,
+ t->safi, safi, peer->afc_recv[afi][safi],
+ peer->afc_nego[afi][safi]);
+
+ if (t->afi_valid == VALID_AFI) {
+
+ if (!peer->afc_recv[afi][safi])
+ failed++;
+ if (!peer->afc_nego[afi][safi])
+ failed++;
+ }
+ }
+
+ if (as4 != t->peek_for) {
+ printf("as4 %u != %u\n", as4, t->peek_for);
+ failed++;
+ }
+
+ printf("parsed?: %s\n", ret ? "no" : "yes");
+
+ if (ret != t->parses)
+ failed++;
+
+ if (tty)
+ printf("%s",
+ (failed > oldfailed) ? VT100_RED "failed!" VT100_RESET
+ : VT100_GREEN "OK" VT100_RESET);
+ else
+ printf("%s", (failed > oldfailed) ? "failed!" : "OK");
+
+ if (failed)
+ printf(" (%u)", failed);
+
+ printf("\n\n");
}
static struct bgp *bgp;
static as_t asn = 100;
-int
-main (void)
+int main(void)
{
- struct peer *peer;
- int i, j;
-
- conf_bgp_debug_neighbor_events = -1UL;
- conf_bgp_debug_packet = -1UL;
- conf_bgp_debug_as4 = -1UL;
- term_bgp_debug_neighbor_events = -1UL;
- term_bgp_debug_packet = -1UL;
- term_bgp_debug_as4 = -1UL;
-
- qobj_init ();
- master = thread_master_create ();
- bgp_master_init (master);
- vrf_init ();
- bgp_option_set (BGP_OPT_NO_LISTEN);
-
- if (fileno (stdout) >= 0)
- tty = isatty (fileno (stdout));
-
- if (bgp_get (&bgp, &asn, NULL, BGP_INSTANCE_TYPE_DEFAULT))
- return -1;
-
- peer = peer_create_accept (bgp);
- peer->host = (char *) "foo";
-
- for (i = AFI_IP; i < AFI_MAX; i++)
- for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
- {
- peer->afc[i][j] = 1;
- peer->afc_adv[i][j] = 1;
- }
-
- i = 0;
- while (mp_segments[i].name)
- parse_test (peer, &mp_segments[i++], CAPABILITY);
-
- /* These tests assume mp_segments tests set at least
- * one of the afc_nego's
- */
- i = 0;
- while (test_segments[i].name)
- parse_test (peer, &test_segments[i++], CAPABILITY);
-
- i = 0;
- while (misc_segments[i].name)
- parse_test (peer, &misc_segments[i++], CAPABILITY);
-
- i = 0;
- while (opt_params[i].name)
- parse_test (peer, &opt_params[i++], OPT_PARAM);
-
- SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV);
- peer->status = Established;
-
- i = 0;
- while (dynamic_cap_msgs[i].name)
- parse_test (peer, &dynamic_cap_msgs[i++], DYNCAP);
-
- printf ("failures: %d\n", failed);
- return failed;
+ struct peer *peer;
+ int i, j;
+
+ conf_bgp_debug_neighbor_events = -1UL;
+ conf_bgp_debug_packet = -1UL;
+ conf_bgp_debug_as4 = -1UL;
+ term_bgp_debug_neighbor_events = -1UL;
+ term_bgp_debug_packet = -1UL;
+ term_bgp_debug_as4 = -1UL;
+
+ qobj_init();
+ master = thread_master_create();
+ bgp_master_init(master);
+ vrf_init();
+ bgp_option_set(BGP_OPT_NO_LISTEN);
+
+ if (fileno(stdout) >= 0)
+ tty = isatty(fileno(stdout));
+
+ if (bgp_get(&bgp, &asn, NULL, BGP_INSTANCE_TYPE_DEFAULT))
+ return -1;
+
+ peer = peer_create_accept(bgp);
+ peer->host = (char *)"foo";
+
+ for (i = AFI_IP; i < AFI_MAX; i++)
+ for (j = SAFI_UNICAST; j < SAFI_MAX; j++) {
+ peer->afc[i][j] = 1;
+ peer->afc_adv[i][j] = 1;
+ }
+
+ i = 0;
+ while (mp_segments[i].name)
+ parse_test(peer, &mp_segments[i++], CAPABILITY);
+
+ /* These tests assume mp_segments tests set at least
+ * one of the afc_nego's
+ */
+ i = 0;
+ while (test_segments[i].name)
+ parse_test(peer, &test_segments[i++], CAPABILITY);
+
+ i = 0;
+ while (misc_segments[i].name)
+ parse_test(peer, &misc_segments[i++], CAPABILITY);
+
+ i = 0;
+ while (opt_params[i].name)
+ parse_test(peer, &opt_params[i++], OPT_PARAM);
+
+ SET_FLAG(peer->cap, PEER_CAP_DYNAMIC_ADV);
+ peer->status = Established;
+
+ i = 0;
+ while (dynamic_cap_msgs[i].name)
+ parse_test(peer, &dynamic_cap_msgs[i++], DYNCAP);
+
+ printf("failures: %d\n", failed);
+ return failed;
}
diff --git a/tests/bgpd/test_ecommunity.c b/tests/bgpd/test_ecommunity.c
index 9174191cb..1d609b494 100644
--- a/tests/bgpd/test_ecommunity.c
+++ b/tests/bgpd/test_ecommunity.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright (C) 2007 Sun Microsystems, Inc.
*
* This file is part of Quagga.
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with Quagga; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -37,127 +37,114 @@ struct thread_master *master = NULL;
static int failed = 0;
/* specification for a test - what the results should be */
-struct test_spec
-{
- const char *shouldbe; /* the string the path should parse to */
+struct test_spec {
+ const char *shouldbe; /* the string the path should parse to */
};
/* test segments to parse and validate, and use for other tests */
static struct test_segment {
- const char *name;
- const char *desc;
- const u_int8_t data[1024];
- int len;
- struct test_spec sp;
-} test_segments [] =
-{
- { /* 0 */
- "ipaddr",
- "rt 1.2.3.4:257",
- { ECOMMUNITY_ENCODE_IP, ECOMMUNITY_ROUTE_TARGET,
- 0x1,0x2,0x3,0x4, 0x1,0x1 },
- 8,
- { "rt 1.2.3.4:257" }
- },
- { /* 1 */
- "ipaddr-so",
- "soo 1.2.3.4:257",
- { ECOMMUNITY_ENCODE_IP, ECOMMUNITY_SITE_ORIGIN,
- 0x1,0x2,0x3,0x4, 0x1,0x1},
- 8,
- { "soo 1.2.3.4:257" }
- },
- { /* 2 */
- "asn",
- "rt 23456:987654321",
- { ECOMMUNITY_ENCODE_AS, ECOMMUNITY_SITE_ORIGIN,
- 0x5b,0xa0, 0x3a,0xde,0x68,0xb1 },
- 8,
- { "soo 23456:987654321" }
- },
- { /* 3 */
- "asn4",
- "rt 168450976:4321",
- { ECOMMUNITY_ENCODE_AS4, ECOMMUNITY_SITE_ORIGIN,
- 0xa,0xa,0x5b,0xa0, 0x10,0xe1 },
- 8,
- { "soo 168450976:4321" }
- },
- { NULL, NULL, {0}, 0, { NULL } }
-};
+ const char *name;
+ const char *desc;
+ const u_int8_t data[1024];
+ int len;
+ struct test_spec sp;
+} test_segments[] = {{/* 0 */
+ "ipaddr",
+ "rt 1.2.3.4:257",
+ {ECOMMUNITY_ENCODE_IP, ECOMMUNITY_ROUTE_TARGET, 0x1, 0x2,
+ 0x3, 0x4, 0x1, 0x1},
+ 8,
+ {"rt 1.2.3.4:257"}},
+ {/* 1 */
+ "ipaddr-so",
+ "soo 1.2.3.4:257",
+ {ECOMMUNITY_ENCODE_IP, ECOMMUNITY_SITE_ORIGIN, 0x1, 0x2,
+ 0x3, 0x4, 0x1, 0x1},
+ 8,
+ {"soo 1.2.3.4:257"}},
+ {/* 2 */
+ "asn",
+ "rt 23456:987654321",
+ {ECOMMUNITY_ENCODE_AS, ECOMMUNITY_SITE_ORIGIN, 0x5b, 0xa0,
+ 0x3a, 0xde, 0x68, 0xb1},
+ 8,
+ {"soo 23456:987654321"}},
+ {/* 3 */
+ "asn4",
+ "rt 168450976:4321",
+ {ECOMMUNITY_ENCODE_AS4, ECOMMUNITY_SITE_ORIGIN, 0xa, 0xa,
+ 0x5b, 0xa0, 0x10, 0xe1},
+ 8,
+ {"soo 168450976:4321"}},
+ {NULL, NULL, {0}, 0, {NULL}}};
/* validate the given aspath */
-static int
-validate (struct ecommunity *ecom, const struct test_spec *sp)
+static int validate(struct ecommunity *ecom, const struct test_spec *sp)
{
- int fails = 0;
- struct ecommunity *etmp;
- char *str1, *str2;
-
- printf ("got:\n %s\n", ecommunity_str (ecom));
- str1 = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_COMMUNITY_LIST, 0);
- etmp = ecommunity_str2com (str1, 0, 1);
- if (etmp)
- str2 = ecommunity_ecom2str (etmp, ECOMMUNITY_FORMAT_COMMUNITY_LIST, 0);
- else
- str2 = NULL;
-
- if (strcmp (sp->shouldbe, str1))
- {
- failed++;
- fails++;
- printf ("shouldbe: %s\n%s\n", str1, sp->shouldbe);
- }
- if (!etmp || strcmp (str1, str2))
- {
- failed++;
- fails++;
- printf ("dogfood: in %s\n"
- " in->out %s\n",
- str1,
- (etmp && str2) ? str2 : "NULL");
- }
- ecommunity_free (&etmp);
- XFREE (MTYPE_ECOMMUNITY_STR, str1);
- XFREE (MTYPE_ECOMMUNITY_STR, str2);
-
- return fails;
+ int fails = 0;
+ struct ecommunity *etmp;
+ char *str1, *str2;
+
+ printf("got:\n %s\n", ecommunity_str(ecom));
+ str1 = ecommunity_ecom2str(ecom, ECOMMUNITY_FORMAT_COMMUNITY_LIST, 0);
+ etmp = ecommunity_str2com(str1, 0, 1);
+ if (etmp)
+ str2 = ecommunity_ecom2str(etmp,
+ ECOMMUNITY_FORMAT_COMMUNITY_LIST, 0);
+ else
+ str2 = NULL;
+
+ if (strcmp(sp->shouldbe, str1)) {
+ failed++;
+ fails++;
+ printf("shouldbe: %s\n%s\n", str1, sp->shouldbe);
+ }
+ if (!etmp || strcmp(str1, str2)) {
+ failed++;
+ fails++;
+ printf("dogfood: in %s\n"
+ " in->out %s\n",
+ str1, (etmp && str2) ? str2 : "NULL");
+ }
+ ecommunity_free(&etmp);
+ XFREE(MTYPE_ECOMMUNITY_STR, str1);
+ XFREE(MTYPE_ECOMMUNITY_STR, str2);
+
+ return fails;
}
/* basic parsing test */
-static void
-parse_test (struct test_segment *t)
+static void parse_test(struct test_segment *t)
{
- struct ecommunity *ecom;
-
- printf ("%s: %s\n", t->name, t->desc);
+ struct ecommunity *ecom;
+
+ printf("%s: %s\n", t->name, t->desc);
+
+ ecom = ecommunity_parse((u_int8_t *)t->data, t->len);
- ecom = ecommunity_parse ((u_int8_t *)t->data, t->len);
+ printf("ecom: %s\nvalidating...:\n", ecommunity_str(ecom));
- printf ("ecom: %s\nvalidating...:\n", ecommunity_str (ecom));
+ if (!validate(ecom, &t->sp))
+ printf("OK\n");
+ else
+ printf("failed\n");
- if (!validate (ecom, &t->sp))
- printf ("OK\n");
- else
- printf ("failed\n");
-
- printf ("\n");
- ecommunity_unintern (&ecom);
+ printf("\n");
+ ecommunity_unintern(&ecom);
}
-
-int
-main (void)
+
+int main(void)
{
- int i = 0;
- ecommunity_init();
- while (test_segments[i].name)
- parse_test (&test_segments[i++]);
-
- printf ("failures: %d\n", failed);
- //printf ("aspath count: %ld\n", aspath_count());
- return failed;
- //return (failed + aspath_count());
+ int i = 0;
+ ecommunity_init();
+ while (test_segments[i].name)
+ parse_test(&test_segments[i++]);
+
+ printf("failures: %d\n", failed);
+ // printf ("aspath count: %ld\n", aspath_count());
+ return failed;
+ // return (failed + aspath_count());
}
diff --git a/tests/bgpd/test_mp_attr.c b/tests/bgpd/test_mp_attr.c
index 6824c11fe..d5e3808a6 100644
--- a/tests/bgpd/test_mp_attr.c
+++ b/tests/bgpd/test_mp_attr.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright (C) 2008 Sun Microsystems, Inc.
*
* This file is part of Quagga.
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with Quagga; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -43,7 +43,6 @@
#define VT100_GREEN "\x1b[32m"
#define VT100_YELLOW "\x1b[33m"
-
#define CAPABILITY 0
#define DYNCAP 1
#define OPT_PARAM 2
@@ -57,729 +56,1080 @@ static int tty = 0;
/* test segments to parse and validate, and use for other tests */
static struct test_segment {
- const char *name;
- const char *desc;
- const u_char data[1024];
- int len;
+ const char *name;
+ const char *desc;
+ const u_char data[1024];
+ int len;
#define SHOULD_PARSE 0
#define SHOULD_ERR -1
- int parses; /* whether it should parse or not */
-
- /* AFI/SAFI validation */
- afi_t afi;
- safi_t safi;
+ int parses; /* whether it should parse or not */
+
+ /* AFI/SAFI validation */
+ afi_t afi;
+ safi_t safi;
#define VALID_AFI 1
#define INVALID_AFI 0
- int afi_valid;
-} mp_reach_segments [] =
-{
- { "IPv6",
- "IPV6 MP Reach, global nexthop, 1 NLRI",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* nexthop bytes */ 16,
- /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2,
- 0xaa, 0xbb, 0xcc, 0xdd,
- 0x3, 0x4, 0x5, 0x6,
- 0xa1, 0xa2, 0xa3, 0xa4,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 32, 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- },
- (4 + 16 + 1 + 5),
- SHOULD_PARSE,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-2",
- "IPV6 MP Reach, global nexthop, 2 NLRIs",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* nexthop bytes */ 16,
- /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* ffee:102:... */
- 0xaa, 0xbb, 0xcc, 0xdd,
- 0x3, 0x4, 0x5, 0x6,
- 0xa1, 0xa2, 0xa3, 0xa4,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 32,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- },
- (4 + 16 + 1 + 5 + 9),
- SHOULD_PARSE,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-default",
- "IPV6 MP Reach, global nexthop, 2 NLRIs + default",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* nexthop bytes */ 16,
- /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2,
- 0xaa, 0xbb, 0xcc, 0xdd,
- 0x3, 0x4, 0x5, 0x6,
- 0xa1, 0xa2, 0xa3, 0xa4,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 32,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- 0x0, /* ::/0 */
- },
- (4 + 16 + 1 + 5 + 9 + 1),
- SHOULD_PARSE,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-lnh",
- "IPV6 MP Reach, global+local nexthops, 2 NLRIs + default",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* nexthop bytes */ 32,
- /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
- 0xaa, 0xbb, 0xcc, 0xdd,
- 0x3, 0x4, 0x5, 0x6,
- 0xa1, 0xa2, 0xa3, 0xa4,
- /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
- 0x0, 0x0, 0x0, 0x0,
- 0x2, 0x10, 0x2, 0xff,
- 0x1, 0x2, 0x3, 0x4,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 32,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- 0x0, /* ::/0 */
- },
- (4 + 32 + 1 + 5 + 9 + 1),
- SHOULD_PARSE,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-nhlen",
- "IPV6 MP Reach, inappropriate nexthop length",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* nexthop bytes */ 4,
- /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
- 0xaa, 0xbb, 0xcc, 0xdd,
- 0x3, 0x4, 0x5, 0x6,
- 0xa1, 0xa2, 0xa3, 0xa4,
- /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
- 0x0, 0x0, 0x0, 0x0,
- 0x2, 0x10, 0x2, 0xff,
- 0x1, 0x2, 0x3, 0x4,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 32,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- 0x0, /* ::/0 */
- },
- (4 + 32 + 1 + 5 + 9 + 1),
- SHOULD_ERR,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-nhlen2",
- "IPV6 MP Reach, invalid nexthop length",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* nexthop bytes */ 5,
- /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
- 0xaa, 0xbb, 0xcc, 0xdd,
- 0x3, 0x4, 0x5, 0x6,
- 0xa1, 0xa2, 0xa3, 0xa4,
- /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
- 0x0, 0x0, 0x0, 0x0,
- 0x2, 0x10, 0x2, 0xff,
- 0x1, 0x2, 0x3, 0x4,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 32,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- 0x0, /* ::/0 */
- },
- (4 + 32 + 1 + 5 + 9 + 1),
- SHOULD_ERR,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-nhlen3",
- "IPV6 MP Reach, nexthop length overflow",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* nexthop bytes */ 32,
- /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
- 0xaa, 0xbb, 0xcc, 0xdd,
- 0x3, 0x4, 0x5, 0x6,
- 0xa1, 0xa2, 0xa3, 0xa4,
- },
- (4 + 16),
- SHOULD_ERR,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-nhlen4",
- "IPV6 MP Reach, nexthop length short",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* nexthop bytes */ 16,
- /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
- 0xaa, 0xbb, 0xcc, 0xdd,
- 0x3, 0x4, 0x5, 0x6,
- 0xa1, 0xa2, 0xa3, 0xa4,
- /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
- 0x0, 0x0, 0x0, 0x0,
- 0x2, 0x10, 0x2, 0xff,
- 0x1, 0x2, 0x3, 0x4,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 32,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- 0x0, /* ::/0 */
- },
- (4 + 32 + 1 + 5 + 9 + 1),
- SHOULD_ERR,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-nlri",
- "IPV6 MP Reach, NLRI bitlen overflow",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* nexthop bytes */ 32,
- /* Nexthop (global) */ 0xff, 0xfe, 0x1, 0x2, /* fffe:102:... */
- 0xaa, 0xbb, 0xcc, 0xdd,
- 0x3, 0x4, 0x5, 0x6,
- 0xa1, 0xa2, 0xa3, 0xa4,
- /* Nexthop (local) */ 0xfe, 0x80, 0x0, 0x0, /* fe80::210:2ff:.. */
- 0x0, 0x0, 0x0, 0x0,
- 0x2, 0x10, 0x2, 0xff,
- 0x1, 0x2, 0x3, 0x4,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 120,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- 0, /* ::/0 */
- },
- (4 + 32 + 1 + 5 + 9 + 1),
- SHOULD_ERR,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv4",
- "IPv4 MP Reach, 2 NLRIs + default",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
- /* nexthop bytes */ 4,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
- 17, 10, 2, 3, /* 10.2.3/17 */
- 0, /* 0/0 */
- },
- (4 + 4 + 1 + 3 + 4 + 1),
- SHOULD_PARSE,
- AFI_IP, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv4-nhlen",
- "IPv4 MP Reach, nexthop lenth overflow",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
- /* nexthop bytes */ 32,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
- 17, 10, 2, 3, /* 10.2.3/17 */
- 0, /* 0/0 */
- },
- (4 + 4 + 1 + 3 + 4 + 1),
- SHOULD_ERR,
- AFI_IP, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv4-nlrilen",
- "IPv4 MP Reach, nlri lenth overflow",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
- /* nexthop bytes */ 4,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
- 30, 10,
- 0, /* 0/0 */
- },
- (4 + 4 + 1 + 3 + 2 + 1),
- SHOULD_ERR,
- AFI_IP, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv4-VPNv4",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_PARSE,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-bogus-plen",
- "IPv4/MPLS-labeled VPN MP Reach, RD, Nexthop, NLRI / bogus p'len",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 1, 2,
- 0, 0xff, 3, 4,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
- 17, 10, 2, 3, /* 10.2.3/17 */
- 0, /* 0/0 */
- },
- (3 + 1 + 3*4 + 1 + 3 + 4 + 1),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-plen1-short",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen short",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 1,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-plen1-long",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen long",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 32,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-plenn-long",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRIs, last plen long",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- 88 + 1, /* bogus */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3) + 1),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-plenn-short",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, last plen short",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 2,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-bogus-rd-type",
- "IPv4/VPNv4 MP Reach, RD, NH, 2 NLRI, unknown RD in 1st (log, but parse)",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0xff, 0, /* Bogus RD */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_PARSE,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { "IPv4-VPNv4-0-nlri",
- "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRI, 3rd 0 bogus",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* nexthop bytes */ 12,
- /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
- 0, 0, 0, 0,
- /* Nexthop */ 192, 168, 0, 1,
- /* SNPA (defunct, MBZ) */ 0x0,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- 0 /* 0/0, bogus for vpnv4 ?? */
- },
- (4 + 12 + 1 + (1+3+8+2) + (1+3+8+3) + 1),
- SHOULD_ERR,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
-
- /* From bug #385 */
- { "IPv6-bug",
- "IPv6, global nexthop, 1 default NLRI",
- {
- /* AFI / SAFI */ 0x0, 0x2, 0x1,
- /* nexthop bytes */ 0x20,
- /* Nexthop (global) */ 0x20, 0x01, 0x04, 0x70,
- 0x00, 0x01, 0x00, 0x06,
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01,
- /* Nexthop (local) */ 0xfe, 0x80, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- 0x02, 0x0c, 0xdb, 0xff,
- 0xfe, 0xfe, 0xeb, 0x00,
- /* SNPA (defunct, MBZ) */ 0,
- /* NLRI tuples */ /* Should have 0 here for ::/0, but dont */
- },
- 37,
- SHOULD_ERR,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
-
- { NULL, NULL, {0}, 0, 0}
-};
+ int afi_valid;
+} mp_reach_segments[] = {
+ {
+ "IPv6",
+ "IPV6 MP Reach, global nexthop, 1 NLRI",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP6,
+ SAFI_UNICAST,
+ /* nexthop bytes */ 16,
+ /* Nexthop (global) */ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2,
+ 0xaa,
+ 0xbb,
+ 0xcc,
+ 0xdd,
+ 0x3,
+ 0x4,
+ 0x5,
+ 0x6,
+ 0xa1,
+ 0xa2,
+ 0xa3,
+ 0xa4,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 32,
+ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102::/32 */
+ },
+ (4 + 16 + 1 + 5),
+ SHOULD_PARSE,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-2",
+ "IPV6 MP Reach, global nexthop, 2 NLRIs",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP6,
+ SAFI_UNICAST,
+ /* nexthop bytes */ 16,
+ /* Nexthop (global) */ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* ffee:102:... */
+ 0xaa,
+ 0xbb,
+ 0xcc,
+ 0xdd,
+ 0x3,
+ 0x4,
+ 0x5,
+ 0x6,
+ 0xa1,
+ 0xa2,
+ 0xa3,
+ 0xa4,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 32,
+ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64,
+ 0xff,
+ 0xfe,
+ 0x0,
+ 0x1, /* fffe:1:2:3::/64 */
+ 0x0,
+ 0x2,
+ 0x0,
+ 0x3,
+ },
+ (4 + 16 + 1 + 5 + 9),
+ SHOULD_PARSE,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-default",
+ "IPV6 MP Reach, global nexthop, 2 NLRIs + default",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP6,
+ SAFI_UNICAST,
+ /* nexthop bytes */ 16,
+ /* Nexthop (global) */ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2,
+ 0xaa,
+ 0xbb,
+ 0xcc,
+ 0xdd,
+ 0x3,
+ 0x4,
+ 0x5,
+ 0x6,
+ 0xa1,
+ 0xa2,
+ 0xa3,
+ 0xa4,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 32,
+ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64,
+ 0xff,
+ 0xfe,
+ 0x0,
+ 0x1, /* fffe:1:2:3::/64 */
+ 0x0,
+ 0x2,
+ 0x0,
+ 0x3,
+ 0x0, /* ::/0 */
+ },
+ (4 + 16 + 1 + 5 + 9 + 1),
+ SHOULD_PARSE,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-lnh",
+ "IPV6 MP Reach, global+local nexthops, 2 NLRIs + default",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP6,
+ SAFI_UNICAST,
+ /* nexthop bytes */ 32,
+ /* Nexthop (global) */ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102:... */
+ 0xaa,
+ 0xbb,
+ 0xcc,
+ 0xdd,
+ 0x3,
+ 0x4,
+ 0x5,
+ 0x6,
+ 0xa1,
+ 0xa2,
+ 0xa3,
+ 0xa4,
+ /* Nexthop (local) */ 0xfe,
+ 0x80,
+ 0x0,
+ 0x0, /* fe80::210:2ff:.. */
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x2,
+ 0x10,
+ 0x2,
+ 0xff,
+ 0x1,
+ 0x2,
+ 0x3,
+ 0x4,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 32,
+ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64,
+ 0xff,
+ 0xfe,
+ 0x0,
+ 0x1, /* fffe:1:2:3::/64 */
+ 0x0,
+ 0x2,
+ 0x0,
+ 0x3,
+ 0x0, /* ::/0 */
+ },
+ (4 + 32 + 1 + 5 + 9 + 1),
+ SHOULD_PARSE,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-nhlen",
+ "IPV6 MP Reach, inappropriate nexthop length",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP6,
+ SAFI_UNICAST,
+ /* nexthop bytes */ 4,
+ /* Nexthop (global) */ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102:... */
+ 0xaa,
+ 0xbb,
+ 0xcc,
+ 0xdd,
+ 0x3,
+ 0x4,
+ 0x5,
+ 0x6,
+ 0xa1,
+ 0xa2,
+ 0xa3,
+ 0xa4,
+ /* Nexthop (local) */ 0xfe,
+ 0x80,
+ 0x0,
+ 0x0, /* fe80::210:2ff:.. */
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x2,
+ 0x10,
+ 0x2,
+ 0xff,
+ 0x1,
+ 0x2,
+ 0x3,
+ 0x4,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 32,
+ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64,
+ 0xff,
+ 0xfe,
+ 0x0,
+ 0x1, /* fffe:1:2:3::/64 */
+ 0x0,
+ 0x2,
+ 0x0,
+ 0x3,
+ 0x0, /* ::/0 */
+ },
+ (4 + 32 + 1 + 5 + 9 + 1),
+ SHOULD_ERR,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-nhlen2",
+ "IPV6 MP Reach, invalid nexthop length",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP6,
+ SAFI_UNICAST,
+ /* nexthop bytes */ 5,
+ /* Nexthop (global) */ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102:... */
+ 0xaa,
+ 0xbb,
+ 0xcc,
+ 0xdd,
+ 0x3,
+ 0x4,
+ 0x5,
+ 0x6,
+ 0xa1,
+ 0xa2,
+ 0xa3,
+ 0xa4,
+ /* Nexthop (local) */ 0xfe,
+ 0x80,
+ 0x0,
+ 0x0, /* fe80::210:2ff:.. */
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x2,
+ 0x10,
+ 0x2,
+ 0xff,
+ 0x1,
+ 0x2,
+ 0x3,
+ 0x4,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 32,
+ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64,
+ 0xff,
+ 0xfe,
+ 0x0,
+ 0x1, /* fffe:1:2:3::/64 */
+ 0x0,
+ 0x2,
+ 0x0,
+ 0x3,
+ 0x0, /* ::/0 */
+ },
+ (4 + 32 + 1 + 5 + 9 + 1),
+ SHOULD_ERR,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-nhlen3",
+ "IPV6 MP Reach, nexthop length overflow",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP6,
+ SAFI_UNICAST,
+ /* nexthop bytes */ 32,
+ /* Nexthop (global) */ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102:... */
+ 0xaa,
+ 0xbb,
+ 0xcc,
+ 0xdd,
+ 0x3,
+ 0x4,
+ 0x5,
+ 0x6,
+ 0xa1,
+ 0xa2,
+ 0xa3,
+ 0xa4,
+ },
+ (4 + 16),
+ SHOULD_ERR,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-nhlen4",
+ "IPV6 MP Reach, nexthop length short",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP6,
+ SAFI_UNICAST,
+ /* nexthop bytes */ 16,
+ /* Nexthop (global) */ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102:... */
+ 0xaa,
+ 0xbb,
+ 0xcc,
+ 0xdd,
+ 0x3,
+ 0x4,
+ 0x5,
+ 0x6,
+ 0xa1,
+ 0xa2,
+ 0xa3,
+ 0xa4,
+ /* Nexthop (local) */ 0xfe,
+ 0x80,
+ 0x0,
+ 0x0, /* fe80::210:2ff:.. */
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x2,
+ 0x10,
+ 0x2,
+ 0xff,
+ 0x1,
+ 0x2,
+ 0x3,
+ 0x4,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 32,
+ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64,
+ 0xff,
+ 0xfe,
+ 0x0,
+ 0x1, /* fffe:1:2:3::/64 */
+ 0x0,
+ 0x2,
+ 0x0,
+ 0x3,
+ 0x0, /* ::/0 */
+ },
+ (4 + 32 + 1 + 5 + 9 + 1),
+ SHOULD_ERR,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-nlri",
+ "IPV6 MP Reach, NLRI bitlen overflow",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP6,
+ SAFI_UNICAST,
+ /* nexthop bytes */ 32,
+ /* Nexthop (global) */ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102:... */
+ 0xaa,
+ 0xbb,
+ 0xcc,
+ 0xdd,
+ 0x3,
+ 0x4,
+ 0x5,
+ 0x6,
+ 0xa1,
+ 0xa2,
+ 0xa3,
+ 0xa4,
+ /* Nexthop (local) */ 0xfe,
+ 0x80,
+ 0x0,
+ 0x0, /* fe80::210:2ff:.. */
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x2,
+ 0x10,
+ 0x2,
+ 0xff,
+ 0x1,
+ 0x2,
+ 0x3,
+ 0x4,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 120,
+ 0xff,
+ 0xfe,
+ 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64,
+ 0xff,
+ 0xfe,
+ 0x0,
+ 0x1, /* fffe:1:2:3::/64 */
+ 0x0,
+ 0x2,
+ 0x0,
+ 0x3,
+ 0, /* ::/0 */
+ },
+ (4 + 32 + 1 + 5 + 9 + 1),
+ SHOULD_ERR,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv4",
+ "IPv4 MP Reach, 2 NLRIs + default",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
+ /* nexthop bytes */ 4,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
+ 17, 10, 2, 3, /* 10.2.3/17 */
+ 0, /* 0/0 */
+ },
+ (4 + 4 + 1 + 3 + 4 + 1),
+ SHOULD_PARSE,
+ AFI_IP,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv4-nhlen",
+ "IPv4 MP Reach, nexthop lenth overflow",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
+ /* nexthop bytes */ 32,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
+ 17, 10, 2, 3, /* 10.2.3/17 */
+ 0, /* 0/0 */
+ },
+ (4 + 4 + 1 + 3 + 4 + 1),
+ SHOULD_ERR,
+ AFI_IP,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv4-nlrilen",
+ "IPv4 MP Reach, nlri lenth overflow",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
+ /* nexthop bytes */ 4,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
+ 30, 10, 0, /* 0/0 */
+ },
+ (4 + 4 + 1 + 3 + 2 + 1),
+ SHOULD_ERR,
+ AFI_IP,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_PARSE,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-bogus-plen",
+ "IPv4/MPLS-labeled VPN MP Reach, RD, Nexthop, NLRI / bogus p'len",
+ {
+ /* AFI / SAFI */ 0x0,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0,
+ 0,
+ 1,
+ 2,
+ 0,
+ 0xff,
+ 3,
+ 4,
+ /* Nexthop */ 192,
+ 168,
+ 0,
+ 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 16,
+ 10,
+ 1, /* 10.1/16 */
+ 17,
+ 10,
+ 2,
+ 3, /* 10.2.3/17 */
+ 0, /* 0/0 */
+ },
+ (3 + 1 + 3 * 4 + 1 + 3 + 4 + 1),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-plen1-short",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen short",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 1, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-plen1-long",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, 1st plen long",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 32, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-plenn-long",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRIs, last plen long",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ 88 + 1, /* bogus */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3) + 1),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-plenn-short",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 2 NLRIs, last plen short",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 2, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-bogus-rd-type",
+ "IPv4/VPNv4 MP Reach, RD, NH, 2 NLRI, unknown RD in 1st (log, but parse)",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0xff, 0, /* Bogus RD */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_PARSE,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {
+ "IPv4-VPNv4-0-nlri",
+ "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRI, 3rd 0 bogus",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* nexthop bytes */ 12,
+ /* RD */ 0, 0, 0, 0, /* RD defined to be 0 */
+ 0, 0, 0, 0,
+ /* Nexthop */ 192, 168, 0, 1,
+ /* SNPA (defunct, MBZ) */ 0x0,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ 0 /* 0/0, bogus for vpnv4 ?? */
+ },
+ (4 + 12 + 1 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3) + 1),
+ SHOULD_ERR,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+
+ /* From bug #385 */
+ {
+ "IPv6-bug",
+ "IPv6, global nexthop, 1 default NLRI",
+ {
+ /* AFI / SAFI */ 0x0,
+ 0x2,
+ 0x1,
+ /* nexthop bytes */ 0x20,
+ /* Nexthop (global) */ 0x20,
+ 0x01,
+ 0x04,
+ 0x70,
+ 0x00,
+ 0x01,
+ 0x00,
+ 0x06,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x01,
+ /* Nexthop (local) */ 0xfe,
+ 0x80,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x02,
+ 0x0c,
+ 0xdb,
+ 0xff,
+ 0xfe,
+ 0xfe,
+ 0xeb,
+ 0x00,
+ /* SNPA (defunct, MBZ) */ 0,
+ /* NLRI tuples */ /* Should have 0 here for ::/0, but
+ dont */
+ },
+ 37,
+ SHOULD_ERR,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+
+ {NULL, NULL, {0}, 0, 0}};
/* MP_UNREACH_NLRI tests */
-static struct test_segment mp_unreach_segments [] =
-{
- { "IPv6-unreach",
- "IPV6 MP Unreach, 1 NLRI",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* NLRI tuples */ 32, 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- },
- (3 + 5),
- SHOULD_PARSE,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-unreach2",
- "IPV6 MP Unreach, 2 NLRIs",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* NLRI tuples */ 32,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- },
- (3 + 5 + 9),
- SHOULD_PARSE,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-unreach-default",
- "IPV6 MP Unreach, 2 NLRIs + default",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* NLRI tuples */ 32,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- 0x0, /* ::/0 */
- },
- (3 + 5 + 9 + 1),
- SHOULD_PARSE,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv6-unreach-nlri",
- "IPV6 MP Unreach, NLRI bitlen overflow",
- {
- /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
- /* NLRI tuples */ 120,
- 0xff, 0xfe, 0x1, 0x2, /* fffe:102::/32 */
- 64,
- 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
- 0x0, 0x2, 0x0, 0x3,
- 0, /* ::/0 */
- },
- (3 + 5 + 9 + 1),
- SHOULD_ERR,
- AFI_IP6, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv4-unreach",
- "IPv4 MP Unreach, 2 NLRIs + default",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
- /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
- 17, 10, 2, 3, /* 10.2.3/17 */
- 0, /* 0/0 */
- },
- (3 + 3 + 4 + 1),
- SHOULD_PARSE,
- AFI_IP, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv4-unreach-nlrilen",
- "IPv4 MP Unreach, nlri length overflow",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
- /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
- 30, 10,
- 0, /* 0/0 */
- },
- (3 + 3 + 2 + 1),
- SHOULD_ERR,
- AFI_IP, SAFI_UNICAST, VALID_AFI,
- },
- { "IPv4-unreach-VPNv4",
- "IPv4/MPLS-labeled VPN MP Unreach, RD, 3 NLRIs",
- {
- /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
- /* NLRI tuples */ 88 + 16,
- 0, 1, 2, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_AS */
- 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
- 10, 1, /* 10.1/16 */
- 88 + 17,
- 0xff, 0, 0, /* tag */
- /* rd, 8 octets */
- 0, 0, /* RD_TYPE_IP */
- 192, 168, 0, 1, /* IPv4 */
- 10, 2, 3, /* 10.2.3/17 */
- },
- (3 + (1+3+8+2) + (1+3+8+3)),
- SHOULD_PARSE,
- AFI_IP, IANA_SAFI_MPLS_VPN, VALID_AFI,
- },
- { NULL, NULL, {0}, 0, 0}
-};
+static struct test_segment mp_unreach_segments[] = {
+ {
+ "IPv6-unreach",
+ "IPV6 MP Unreach, 1 NLRI",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
+ /* NLRI tuples */ 32, 0xff, 0xfe, 0x1,
+ 0x2, /* fffe:102::/32 */
+ },
+ (3 + 5),
+ SHOULD_PARSE,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-unreach2",
+ "IPV6 MP Unreach, 2 NLRIs",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
+ /* NLRI tuples */ 32, 0xff, 0xfe, 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64, 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
+ 0x0, 0x2, 0x0, 0x3,
+ },
+ (3 + 5 + 9),
+ SHOULD_PARSE,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-unreach-default",
+ "IPV6 MP Unreach, 2 NLRIs + default",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
+ /* NLRI tuples */ 32, 0xff, 0xfe, 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64, 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
+ 0x0, 0x2, 0x0, 0x3, 0x0, /* ::/0 */
+ },
+ (3 + 5 + 9 + 1),
+ SHOULD_PARSE,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv6-unreach-nlri",
+ "IPV6 MP Unreach, NLRI bitlen overflow",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP6, SAFI_UNICAST,
+ /* NLRI tuples */ 120, 0xff, 0xfe, 0x1,
+ 0x2, /* fffe:102::/32 */
+ 64, 0xff, 0xfe, 0x0, 0x1, /* fffe:1:2:3::/64 */
+ 0x0, 0x2, 0x0, 0x3, 0, /* ::/0 */
+ },
+ (3 + 5 + 9 + 1),
+ SHOULD_ERR,
+ AFI_IP6,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv4-unreach",
+ "IPv4 MP Unreach, 2 NLRIs + default",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
+ /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
+ 17, 10, 2, 3, /* 10.2.3/17 */
+ 0, /* 0/0 */
+ },
+ (3 + 3 + 4 + 1),
+ SHOULD_PARSE,
+ AFI_IP,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv4-unreach-nlrilen",
+ "IPv4 MP Unreach, nlri length overflow",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, SAFI_UNICAST,
+ /* NLRI tuples */ 16, 10, 1, /* 10.1/16 */
+ 30, 10, 0, /* 0/0 */
+ },
+ (3 + 3 + 2 + 1),
+ SHOULD_ERR,
+ AFI_IP,
+ SAFI_UNICAST,
+ VALID_AFI,
+ },
+ {
+ "IPv4-unreach-VPNv4",
+ "IPv4/MPLS-labeled VPN MP Unreach, RD, 3 NLRIs",
+ {
+ /* AFI / SAFI */ 0x0, AFI_IP, IANA_SAFI_MPLS_VPN,
+ /* NLRI tuples */ 88 + 16, 0, 1, 2, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_AS */
+ 0, 2, 0, 0xff, 3, 4, /* AS(2):val(4) */
+ 10, 1, /* 10.1/16 */
+ 88 + 17, 0xff, 0, 0, /* tag */
+ /* rd, 8 octets */
+ 0, 0, /* RD_TYPE_IP */
+ 192, 168, 0, 1, /* IPv4 */
+ 10, 2, 3, /* 10.2.3/17 */
+ },
+ (3 + (1 + 3 + 8 + 2) + (1 + 3 + 8 + 3)),
+ SHOULD_PARSE,
+ AFI_IP,
+ IANA_SAFI_MPLS_VPN,
+ VALID_AFI,
+ },
+ {NULL, NULL, {0}, 0, 0}};
/* nlri_parse indicates 0 on successful parse, and -1 otherwise.
* attr_parse indicates BGP_ATTR_PARSE_PROCEED/0 on success,
* and BGP_ATTR_PARSE_ERROR/-1 or lower negative ret on err.
*/
-static void
-handle_result (struct peer *peer, struct test_segment *t,
- int parse_ret, int nlri_ret)
+static void handle_result(struct peer *peer, struct test_segment *t,
+ int parse_ret, int nlri_ret)
{
- int oldfailed = failed;
-
- printf ("mp attr parsed?: %s\n", parse_ret ? "no" : "yes");
- if (!parse_ret)
- printf ("nrli parsed?: %s\n", nlri_ret ? "no" : "yes");
- printf ("should parse?: %s\n", t->parses ? "no" : "yes");
-
- if ((parse_ret != 0 || nlri_ret != 0) != (t->parses != 0))
- failed++;
-
-
- if (tty)
- printf ("%s", (failed > oldfailed) ? VT100_RED "failed!" VT100_RESET
- : VT100_GREEN "OK" VT100_RESET);
- else
- printf ("%s", (failed > oldfailed) ? "failed!" : "OK" );
-
- if (failed)
- printf (" (%u)", failed);
-
- printf ("\n\n");
+ int oldfailed = failed;
+
+ printf("mp attr parsed?: %s\n", parse_ret ? "no" : "yes");
+ if (!parse_ret)
+ printf("nrli parsed?: %s\n", nlri_ret ? "no" : "yes");
+ printf("should parse?: %s\n", t->parses ? "no" : "yes");
+
+ if ((parse_ret != 0 || nlri_ret != 0) != (t->parses != 0))
+ failed++;
+
+
+ if (tty)
+ printf("%s",
+ (failed > oldfailed) ? VT100_RED "failed!" VT100_RESET
+ : VT100_GREEN "OK" VT100_RESET);
+ else
+ printf("%s", (failed > oldfailed) ? "failed!" : "OK");
+
+ if (failed)
+ printf(" (%u)", failed);
+
+ printf("\n\n");
}
/* basic parsing test */
-static void
-parse_test (struct peer *peer, struct test_segment *t, int type)
+static void parse_test(struct peer *peer, struct test_segment *t, int type)
{
- int parse_ret = 0, nlri_ret = 0;
- struct attr attr = { };
- struct bgp_nlri nlri = { };
- struct bgp_attr_parser_args attr_args = {
- .peer = peer,
- .length = t->len,
- .total = 1,
- .attr = &attr,
- .type = type,
- .flags = BGP_ATTR_FLAG_OPTIONAL,
- .startp = BGP_INPUT_PNT (peer),
- };
+ int parse_ret = 0, nlri_ret = 0;
+ struct attr attr = {};
+ struct bgp_nlri nlri = {};
+ struct bgp_attr_parser_args attr_args = {
+ .peer = peer,
+ .length = t->len,
+ .total = 1,
+ .attr = &attr,
+ .type = type,
+ .flags = BGP_ATTR_FLAG_OPTIONAL,
+ .startp = BGP_INPUT_PNT(peer),
+ };
#define RANDOM_FUZZ 35
-
- stream_reset (peer->ibuf);
- stream_put (peer->ibuf, NULL, RANDOM_FUZZ);
- stream_set_getp (peer->ibuf, RANDOM_FUZZ);
-
- stream_write (peer->ibuf, t->data, t->len);
-
- printf ("%s: %s\n", t->name, t->desc);
-
- if (type == BGP_ATTR_MP_REACH_NLRI)
- parse_ret = bgp_mp_reach_parse (&attr_args, &nlri);
- else
- parse_ret = bgp_mp_unreach_parse (&attr_args, &nlri);
- if (!parse_ret)
- {
- iana_afi_t pkt_afi;
- safi_t pkt_safi;
-
- /* Convert AFI, SAFI to internal values, check. */
- if (bgp_map_afi_safi_int2iana (nlri.afi, nlri.safi, &pkt_afi, &pkt_safi))
- assert (0);
-
- printf ("MP: %u(%u)/%u(%u): recv %u, nego %u\n",
- nlri.afi , pkt_afi, nlri.safi, pkt_safi,
- peer->afc_recv[nlri.afi][nlri.safi],
- peer->afc_nego[nlri.afi][nlri.safi]);
- }
-
- if (!parse_ret)
- {
- if (type == BGP_ATTR_MP_REACH_NLRI)
- nlri_ret = bgp_nlri_parse (peer, &attr, &nlri, 0);
- else
- nlri_ret = bgp_nlri_parse (peer, &attr, &nlri, 1);
- }
- handle_result (peer, t, parse_ret, nlri_ret);
+ stream_reset(peer->ibuf);
+ stream_put(peer->ibuf, NULL, RANDOM_FUZZ);
+ stream_set_getp(peer->ibuf, RANDOM_FUZZ);
+
+ stream_write(peer->ibuf, t->data, t->len);
+
+ printf("%s: %s\n", t->name, t->desc);
+
+ if (type == BGP_ATTR_MP_REACH_NLRI)
+ parse_ret = bgp_mp_reach_parse(&attr_args, &nlri);
+ else
+ parse_ret = bgp_mp_unreach_parse(&attr_args, &nlri);
+ if (!parse_ret) {
+ iana_afi_t pkt_afi;
+ safi_t pkt_safi;
+
+ /* Convert AFI, SAFI to internal values, check. */
+ if (bgp_map_afi_safi_int2iana(nlri.afi, nlri.safi, &pkt_afi,
+ &pkt_safi))
+ assert(0);
+
+ printf("MP: %u(%u)/%u(%u): recv %u, nego %u\n", nlri.afi,
+ pkt_afi, nlri.safi, pkt_safi,
+ peer->afc_recv[nlri.afi][nlri.safi],
+ peer->afc_nego[nlri.afi][nlri.safi]);
+ }
+
+ if (!parse_ret) {
+ if (type == BGP_ATTR_MP_REACH_NLRI)
+ nlri_ret = bgp_nlri_parse(peer, &attr, &nlri, 0);
+ else
+ nlri_ret = bgp_nlri_parse(peer, &attr, &nlri, 1);
+ }
+ handle_result(peer, t, parse_ret, nlri_ret);
}
static struct bgp *bgp;
static as_t asn = 100;
-int
-main (void)
+int main(void)
{
- struct peer *peer;
- int i, j;
-
- conf_bgp_debug_neighbor_events = -1UL;
- conf_bgp_debug_packet = -1UL;
- conf_bgp_debug_as4 = -1UL;
- term_bgp_debug_neighbor_events = -1UL;
- term_bgp_debug_packet = -1UL;
- term_bgp_debug_as4 = -1UL;
-
- qobj_init ();
- master = thread_master_create ();
- bgp_master_init (master);
- vrf_init ();
- bgp_option_set (BGP_OPT_NO_LISTEN);
- bgp_attr_init ();
-
- if (fileno (stdout) >= 0)
- tty = isatty (fileno (stdout));
-
- if (bgp_get (&bgp, &asn, NULL, BGP_INSTANCE_TYPE_DEFAULT))
- return -1;
-
- peer = peer_create_accept (bgp);
- peer->host = (char *)"foo";
- peer->status = Established;
-
- for (i = AFI_IP; i < AFI_MAX; i++)
- for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
- {
- peer->afc[i][j] = 1;
- peer->afc_adv[i][j] = 1;
- }
-
- i = 0;
- while (mp_reach_segments[i].name)
- parse_test (peer, &mp_reach_segments[i++], BGP_ATTR_MP_REACH_NLRI);
-
- i = 0;
- while (mp_unreach_segments[i].name)
- parse_test (peer, &mp_unreach_segments[i++], BGP_ATTR_MP_UNREACH_NLRI);
-
- printf ("failures: %d\n", failed);
- return failed;
+ struct peer *peer;
+ int i, j;
+
+ conf_bgp_debug_neighbor_events = -1UL;
+ conf_bgp_debug_packet = -1UL;
+ conf_bgp_debug_as4 = -1UL;
+ term_bgp_debug_neighbor_events = -1UL;
+ term_bgp_debug_packet = -1UL;
+ term_bgp_debug_as4 = -1UL;
+
+ qobj_init();
+ master = thread_master_create();
+ bgp_master_init(master);
+ vrf_init();
+ bgp_option_set(BGP_OPT_NO_LISTEN);
+ bgp_attr_init();
+
+ if (fileno(stdout) >= 0)
+ tty = isatty(fileno(stdout));
+
+ if (bgp_get(&bgp, &asn, NULL, BGP_INSTANCE_TYPE_DEFAULT))
+ return -1;
+
+ peer = peer_create_accept(bgp);
+ peer->host = (char *)"foo";
+ peer->status = Established;
+
+ for (i = AFI_IP; i < AFI_MAX; i++)
+ for (j = SAFI_UNICAST; j < SAFI_MAX; j++) {
+ peer->afc[i][j] = 1;
+ peer->afc_adv[i][j] = 1;
+ }
+
+ i = 0;
+ while (mp_reach_segments[i].name)
+ parse_test(peer, &mp_reach_segments[i++],
+ BGP_ATTR_MP_REACH_NLRI);
+
+ i = 0;
+ while (mp_unreach_segments[i].name)
+ parse_test(peer, &mp_unreach_segments[i++],
+ BGP_ATTR_MP_UNREACH_NLRI);
+
+ printf("failures: %d\n", failed);
+ return failed;
}
diff --git a/tests/bgpd/test_mpath.c b/tests/bgpd/test_mpath.c
index a2fd66528..e4dcc42b1 100644
--- a/tests/bgpd/test_mpath.c
+++ b/tests/bgpd/test_mpath.c
@@ -49,13 +49,12 @@
#define TEST_PASSED 0
#define TEST_FAILED -1
-#define EXPECT_TRUE(expr, res) \
- if (!(expr)) \
- { \
- printf ("Test failure in %s line %u: %s\n", \
- __FUNCTION__, __LINE__, #expr); \
- (res) = TEST_FAILED; \
- }
+#define EXPECT_TRUE(expr, res) \
+ if (!(expr)) { \
+ printf("Test failure in %s line %u: %s\n", __FUNCTION__, \
+ __LINE__, #expr); \
+ (res) = TEST_FAILED; \
+ }
typedef struct testcase_t__ testcase_t;
@@ -64,224 +63,227 @@ typedef int (*test_run_func)(testcase_t *);
typedef int (*test_cleanup_func)(testcase_t *);
struct testcase_t__ {
- const char *desc;
- void *test_data;
- void *verify_data;
- void *tmp_data;
- test_setup_func setup;
- test_run_func run;
- test_cleanup_func cleanup;
+ const char *desc;
+ void *test_data;
+ void *verify_data;
+ void *tmp_data;
+ test_setup_func setup;
+ test_run_func run;
+ test_cleanup_func cleanup;
};
/* need these to link in libbgp */
struct thread_master *master = NULL;
struct zclient *zclient;
-struct zebra_privs_t bgpd_privs =
-{
- .user = NULL,
- .group = NULL,
- .vty_group = NULL,
+struct zebra_privs_t bgpd_privs = {
+ .user = NULL,
+ .group = NULL,
+ .vty_group = NULL,
};
static int tty = 0;
/* Create fake bgp instance */
-static struct bgp *
-bgp_create_fake (as_t *as, const char *name)
+static struct bgp *bgp_create_fake(as_t *as, const char *name)
{
- struct bgp *bgp;
- afi_t afi;
- safi_t safi;
-
- if ( (bgp = XCALLOC (MTYPE_BGP, sizeof (struct bgp))) == NULL)
- return NULL;
-
- bgp_lock (bgp);
- //bgp->peer_self = peer_new (bgp);
- //bgp->peer_self->host = XSTRDUP (MTYPE_BGP_PEER_HOST, "Static announcement");
-
- bgp->peer = list_new ();
- //bgp->peer->cmp = (int (*)(void *, void *)) peer_cmp;
-
- bgp->group = list_new ();
- //bgp->group->cmp = (int (*)(void *, void *)) peer_group_cmp;
-
- for (afi = AFI_IP; afi < AFI_MAX; afi++)
- for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
- {
- bgp->route[afi][safi] = bgp_table_init (afi, safi);
- bgp->aggregate[afi][safi] = bgp_table_init (afi, safi);
- bgp->rib[afi][safi] = bgp_table_init (afi, safi);
- bgp->maxpaths[afi][safi].maxpaths_ebgp = MULTIPATH_NUM;
- bgp->maxpaths[afi][safi].maxpaths_ibgp = MULTIPATH_NUM;
- }
-
- bgp_scan_init (bgp);
- bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF;
- bgp->default_holdtime = BGP_DEFAULT_HOLDTIME;
- bgp->default_keepalive = BGP_DEFAULT_KEEPALIVE;
- bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
- bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
-
- bgp->as = *as;
-
- if (name)
- bgp->name = strdup (name);
-
- return bgp;
+ struct bgp *bgp;
+ afi_t afi;
+ safi_t safi;
+
+ if ((bgp = XCALLOC(MTYPE_BGP, sizeof(struct bgp))) == NULL)
+ return NULL;
+
+ bgp_lock(bgp);
+ // bgp->peer_self = peer_new (bgp);
+ // bgp->peer_self->host = XSTRDUP (MTYPE_BGP_PEER_HOST, "Static
+ // announcement");
+
+ bgp->peer = list_new();
+ // bgp->peer->cmp = (int (*)(void *, void *)) peer_cmp;
+
+ bgp->group = list_new();
+ // bgp->group->cmp = (int (*)(void *, void *)) peer_group_cmp;
+
+ for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
+ bgp->route[afi][safi] = bgp_table_init(afi, safi);
+ bgp->aggregate[afi][safi] = bgp_table_init(afi, safi);
+ bgp->rib[afi][safi] = bgp_table_init(afi, safi);
+ bgp->maxpaths[afi][safi].maxpaths_ebgp = MULTIPATH_NUM;
+ bgp->maxpaths[afi][safi].maxpaths_ibgp = MULTIPATH_NUM;
+ }
+
+ bgp_scan_init(bgp);
+ bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF;
+ bgp->default_holdtime = BGP_DEFAULT_HOLDTIME;
+ bgp->default_keepalive = BGP_DEFAULT_KEEPALIVE;
+ bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
+ bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
+
+ bgp->as = *as;
+
+ if (name)
+ bgp->name = strdup(name);
+
+ return bgp;
}
/*=========================================================
* Testcase for maximum-paths configuration
*/
-static int
-setup_bgp_cfg_maximum_paths (testcase_t *t)
+static int setup_bgp_cfg_maximum_paths(testcase_t *t)
{
- as_t asn = 1;
- t->tmp_data = bgp_create_fake (&asn, NULL);
- if (!t->tmp_data)
- return -1;
- return 0;
+ as_t asn = 1;
+ t->tmp_data = bgp_create_fake(&asn, NULL);
+ if (!t->tmp_data)
+ return -1;
+ return 0;
}
-static int
-run_bgp_cfg_maximum_paths (testcase_t *t)
+static int run_bgp_cfg_maximum_paths(testcase_t *t)
{
- afi_t afi;
- safi_t safi;
- struct bgp *bgp;
- int api_result;
- int test_result = TEST_PASSED;
-
- bgp = t->tmp_data;
- for (afi = AFI_IP; afi < AFI_MAX; afi++)
- for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
- {
- /* test bgp_maximum_paths_set */
- api_result = bgp_maximum_paths_set (bgp, afi, safi, BGP_PEER_EBGP, 10, 0);
- EXPECT_TRUE (api_result == 0, test_result);
- api_result = bgp_maximum_paths_set (bgp, afi, safi, BGP_PEER_IBGP, 10, 0);
- EXPECT_TRUE (api_result == 0, test_result);
- EXPECT_TRUE (bgp->maxpaths[afi][safi].maxpaths_ebgp == 10, test_result);
- EXPECT_TRUE (bgp->maxpaths[afi][safi].maxpaths_ibgp == 10, test_result);
-
- /* test bgp_maximum_paths_unset */
- api_result = bgp_maximum_paths_unset (bgp, afi, safi, BGP_PEER_EBGP);
- EXPECT_TRUE (api_result == 0, test_result);
- api_result = bgp_maximum_paths_unset (bgp, afi, safi, BGP_PEER_IBGP);
- EXPECT_TRUE (api_result == 0, test_result);
- EXPECT_TRUE ((bgp->maxpaths[afi][safi].maxpaths_ebgp ==
- MULTIPATH_NUM), test_result);
- EXPECT_TRUE ((bgp->maxpaths[afi][safi].maxpaths_ibgp ==
- MULTIPATH_NUM), test_result);
- }
-
- return test_result;
+ afi_t afi;
+ safi_t safi;
+ struct bgp *bgp;
+ int api_result;
+ int test_result = TEST_PASSED;
+
+ bgp = t->tmp_data;
+ for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
+ /* test bgp_maximum_paths_set */
+ api_result = bgp_maximum_paths_set(
+ bgp, afi, safi, BGP_PEER_EBGP, 10, 0);
+ EXPECT_TRUE(api_result == 0, test_result);
+ api_result = bgp_maximum_paths_set(
+ bgp, afi, safi, BGP_PEER_IBGP, 10, 0);
+ EXPECT_TRUE(api_result == 0, test_result);
+ EXPECT_TRUE(bgp->maxpaths[afi][safi].maxpaths_ebgp
+ == 10,
+ test_result);
+ EXPECT_TRUE(bgp->maxpaths[afi][safi].maxpaths_ibgp
+ == 10,
+ test_result);
+
+ /* test bgp_maximum_paths_unset */
+ api_result = bgp_maximum_paths_unset(bgp, afi, safi,
+ BGP_PEER_EBGP);
+ EXPECT_TRUE(api_result == 0, test_result);
+ api_result = bgp_maximum_paths_unset(bgp, afi, safi,
+ BGP_PEER_IBGP);
+ EXPECT_TRUE(api_result == 0, test_result);
+ EXPECT_TRUE((bgp->maxpaths[afi][safi].maxpaths_ebgp
+ == MULTIPATH_NUM),
+ test_result);
+ EXPECT_TRUE((bgp->maxpaths[afi][safi].maxpaths_ibgp
+ == MULTIPATH_NUM),
+ test_result);
+ }
+
+ return test_result;
}
-static int
-cleanup_bgp_cfg_maximum_paths (testcase_t *t)
+static int cleanup_bgp_cfg_maximum_paths(testcase_t *t)
{
- return bgp_delete ((struct bgp *)t->tmp_data);
+ return bgp_delete((struct bgp *)t->tmp_data);
}
testcase_t test_bgp_cfg_maximum_paths = {
- .desc = "Test bgp maximum-paths config",
- .setup = setup_bgp_cfg_maximum_paths,
- .run = run_bgp_cfg_maximum_paths,
- .cleanup = cleanup_bgp_cfg_maximum_paths,
+ .desc = "Test bgp maximum-paths config",
+ .setup = setup_bgp_cfg_maximum_paths,
+ .run = run_bgp_cfg_maximum_paths,
+ .cleanup = cleanup_bgp_cfg_maximum_paths,
};
/*=========================================================
* Testcase for bgp_mp_list
*/
struct peer test_mp_list_peer[] = {
- { .local_as = 1, .as = 2 },
- { .local_as = 1, .as = 2 },
- { .local_as = 1, .as = 2 },
- { .local_as = 1, .as = 2 },
- { .local_as = 1, .as = 2 },
+ {.local_as = 1, .as = 2}, {.local_as = 1, .as = 2},
+ {.local_as = 1, .as = 2}, {.local_as = 1, .as = 2},
+ {.local_as = 1, .as = 2},
};
-int test_mp_list_peer_count = sizeof (test_mp_list_peer)/ sizeof (struct peer);
+int test_mp_list_peer_count = sizeof(test_mp_list_peer) / sizeof(struct peer);
struct attr test_mp_list_attr[4];
struct bgp_info test_mp_list_info[] = {
- { .peer = &test_mp_list_peer[0], .attr = &test_mp_list_attr[0] },
- { .peer = &test_mp_list_peer[1], .attr = &test_mp_list_attr[1] },
- { .peer = &test_mp_list_peer[2], .attr = &test_mp_list_attr[1] },
- { .peer = &test_mp_list_peer[3], .attr = &test_mp_list_attr[2] },
- { .peer = &test_mp_list_peer[4], .attr = &test_mp_list_attr[3] },
+ {.peer = &test_mp_list_peer[0], .attr = &test_mp_list_attr[0]},
+ {.peer = &test_mp_list_peer[1], .attr = &test_mp_list_attr[1]},
+ {.peer = &test_mp_list_peer[2], .attr = &test_mp_list_attr[1]},
+ {.peer = &test_mp_list_peer[3], .attr = &test_mp_list_attr[2]},
+ {.peer = &test_mp_list_peer[4], .attr = &test_mp_list_attr[3]},
};
int test_mp_list_info_count =
- sizeof (test_mp_list_info)/sizeof (struct bgp_info);
+ sizeof(test_mp_list_info) / sizeof(struct bgp_info);
-static int
-setup_bgp_mp_list (testcase_t *t)
+static int setup_bgp_mp_list(testcase_t *t)
{
- test_mp_list_attr[0].nexthop.s_addr = 0x01010101;
- test_mp_list_attr[1].nexthop.s_addr = 0x02020202;
- test_mp_list_attr[2].nexthop.s_addr = 0x03030303;
- test_mp_list_attr[3].nexthop.s_addr = 0x04040404;
-
- if ((test_mp_list_peer[0].su_remote = sockunion_str2su ("1.1.1.1")) == NULL)
- return -1;
- if ((test_mp_list_peer[1].su_remote = sockunion_str2su ("2.2.2.2")) == NULL)
- return -1;
- if ((test_mp_list_peer[2].su_remote = sockunion_str2su ("3.3.3.3")) == NULL)
- return -1;
- if ((test_mp_list_peer[3].su_remote = sockunion_str2su ("4.4.4.4")) == NULL)
- return -1;
- if ((test_mp_list_peer[4].su_remote = sockunion_str2su ("5.5.5.5")) == NULL)
- return -1;
-
- return 0;
+ test_mp_list_attr[0].nexthop.s_addr = 0x01010101;
+ test_mp_list_attr[1].nexthop.s_addr = 0x02020202;
+ test_mp_list_attr[2].nexthop.s_addr = 0x03030303;
+ test_mp_list_attr[3].nexthop.s_addr = 0x04040404;
+
+ if ((test_mp_list_peer[0].su_remote = sockunion_str2su("1.1.1.1"))
+ == NULL)
+ return -1;
+ if ((test_mp_list_peer[1].su_remote = sockunion_str2su("2.2.2.2"))
+ == NULL)
+ return -1;
+ if ((test_mp_list_peer[2].su_remote = sockunion_str2su("3.3.3.3"))
+ == NULL)
+ return -1;
+ if ((test_mp_list_peer[3].su_remote = sockunion_str2su("4.4.4.4"))
+ == NULL)
+ return -1;
+ if ((test_mp_list_peer[4].su_remote = sockunion_str2su("5.5.5.5"))
+ == NULL)
+ return -1;
+
+ return 0;
}
-static int
-run_bgp_mp_list (testcase_t *t)
+static int run_bgp_mp_list(testcase_t *t)
{
- struct list mp_list;
- struct listnode *mp_node;
- struct bgp_info *info;
- int i;
- int test_result = TEST_PASSED;
- bgp_mp_list_init (&mp_list);
- EXPECT_TRUE (listcount(&mp_list) == 0, test_result);
-
- bgp_mp_list_add (&mp_list, &test_mp_list_info[1]);
- bgp_mp_list_add (&mp_list, &test_mp_list_info[4]);
- bgp_mp_list_add (&mp_list, &test_mp_list_info[2]);
- bgp_mp_list_add (&mp_list, &test_mp_list_info[3]);
- bgp_mp_list_add (&mp_list, &test_mp_list_info[0]);
-
- for (i = 0, mp_node = mp_list.head; i < test_mp_list_info_count;
- i++, mp_node = listnextnode(mp_node))
- {
- info = listgetdata(mp_node);
- EXPECT_TRUE (info == &test_mp_list_info[i], test_result);
- }
-
- bgp_mp_list_clear (&mp_list);
- EXPECT_TRUE (listcount(&mp_list) == 0, test_result);
-
- return test_result;
+ struct list mp_list;
+ struct listnode *mp_node;
+ struct bgp_info *info;
+ int i;
+ int test_result = TEST_PASSED;
+ bgp_mp_list_init(&mp_list);
+ EXPECT_TRUE(listcount(&mp_list) == 0, test_result);
+
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[1]);
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[4]);
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[2]);
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[3]);
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[0]);
+
+ for (i = 0, mp_node = mp_list.head; i < test_mp_list_info_count;
+ i++, mp_node = listnextnode(mp_node)) {
+ info = listgetdata(mp_node);
+ EXPECT_TRUE(info == &test_mp_list_info[i], test_result);
+ }
+
+ bgp_mp_list_clear(&mp_list);
+ EXPECT_TRUE(listcount(&mp_list) == 0, test_result);
+
+ return test_result;
}
-static int
-cleanup_bgp_mp_list (testcase_t *t)
+static int cleanup_bgp_mp_list(testcase_t *t)
{
- int i;
+ int i;
- for (i = 0; i < test_mp_list_peer_count; i++)
- sockunion_free (test_mp_list_peer[i].su_remote);
+ for (i = 0; i < test_mp_list_peer_count; i++)
+ sockunion_free(test_mp_list_peer[i].su_remote);
- return 0;
+ return 0;
}
testcase_t test_bgp_mp_list = {
- .desc = "Test bgp_mp_list",
- .setup = setup_bgp_mp_list,
- .run = run_bgp_mp_list,
- .cleanup = cleanup_bgp_mp_list,
+ .desc = "Test bgp_mp_list",
+ .setup = setup_bgp_mp_list,
+ .run = run_bgp_mp_list,
+ .cleanup = cleanup_bgp_mp_list,
};
/*=========================================================
@@ -290,195 +292,185 @@ testcase_t test_bgp_mp_list = {
struct bgp_node test_rn;
-static int
-setup_bgp_info_mpath_update (testcase_t *t)
+static int setup_bgp_info_mpath_update(testcase_t *t)
{
- int i;
- str2prefix ("42.1.1.0/24", &test_rn.p);
- setup_bgp_mp_list (t);
- for (i = 0; i < test_mp_list_info_count; i++)
- bgp_info_add (&test_rn, &test_mp_list_info[i]);
- return 0;
+ int i;
+ str2prefix("42.1.1.0/24", &test_rn.p);
+ setup_bgp_mp_list(t);
+ for (i = 0; i < test_mp_list_info_count; i++)
+ bgp_info_add(&test_rn, &test_mp_list_info[i]);
+ return 0;
}
-static int
-run_bgp_info_mpath_update (testcase_t *t)
+static int run_bgp_info_mpath_update(testcase_t *t)
{
- struct bgp_info *new_best, *old_best, *mpath;
- struct list mp_list;
- struct bgp_maxpaths_cfg mp_cfg = { 3, 3 };
- int test_result = TEST_PASSED;
- bgp_mp_list_init (&mp_list);
- bgp_mp_list_add (&mp_list, &test_mp_list_info[4]);
- bgp_mp_list_add (&mp_list, &test_mp_list_info[3]);
- bgp_mp_list_add (&mp_list, &test_mp_list_info[0]);
- bgp_mp_list_add (&mp_list, &test_mp_list_info[1]);
- new_best = &test_mp_list_info[3];
- old_best = NULL;
- bgp_info_mpath_update (&test_rn, new_best, old_best, &mp_list, &mp_cfg);
- bgp_mp_list_clear (&mp_list);
- EXPECT_TRUE (bgp_info_mpath_count (new_best) == 2, test_result);
- mpath = bgp_info_mpath_first (new_best);
- EXPECT_TRUE (mpath == &test_mp_list_info[0], test_result);
- EXPECT_TRUE (CHECK_FLAG (mpath->flags, BGP_INFO_MULTIPATH), test_result);
- mpath = bgp_info_mpath_next (mpath);
- EXPECT_TRUE (mpath == &test_mp_list_info[1], test_result);
- EXPECT_TRUE (CHECK_FLAG (mpath->flags, BGP_INFO_MULTIPATH), test_result);
-
- bgp_mp_list_add (&mp_list, &test_mp_list_info[0]);
- bgp_mp_list_add (&mp_list, &test_mp_list_info[1]);
- new_best = &test_mp_list_info[0];
- old_best = &test_mp_list_info[3];
- bgp_info_mpath_update (&test_rn, new_best, old_best, &mp_list, &mp_cfg);
- bgp_mp_list_clear (&mp_list);
- EXPECT_TRUE (bgp_info_mpath_count (new_best) == 1, test_result);
- mpath = bgp_info_mpath_first (new_best);
- EXPECT_TRUE (mpath == &test_mp_list_info[1], test_result);
- EXPECT_TRUE (CHECK_FLAG (mpath->flags, BGP_INFO_MULTIPATH), test_result);
- EXPECT_TRUE (!CHECK_FLAG (test_mp_list_info[0].flags, BGP_INFO_MULTIPATH),
- test_result);
-
- return test_result;
+ struct bgp_info *new_best, *old_best, *mpath;
+ struct list mp_list;
+ struct bgp_maxpaths_cfg mp_cfg = {3, 3};
+ int test_result = TEST_PASSED;
+ bgp_mp_list_init(&mp_list);
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[4]);
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[3]);
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[0]);
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[1]);
+ new_best = &test_mp_list_info[3];
+ old_best = NULL;
+ bgp_info_mpath_update(&test_rn, new_best, old_best, &mp_list, &mp_cfg);
+ bgp_mp_list_clear(&mp_list);
+ EXPECT_TRUE(bgp_info_mpath_count(new_best) == 2, test_result);
+ mpath = bgp_info_mpath_first(new_best);
+ EXPECT_TRUE(mpath == &test_mp_list_info[0], test_result);
+ EXPECT_TRUE(CHECK_FLAG(mpath->flags, BGP_INFO_MULTIPATH), test_result);
+ mpath = bgp_info_mpath_next(mpath);
+ EXPECT_TRUE(mpath == &test_mp_list_info[1], test_result);
+ EXPECT_TRUE(CHECK_FLAG(mpath->flags, BGP_INFO_MULTIPATH), test_result);
+
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[0]);
+ bgp_mp_list_add(&mp_list, &test_mp_list_info[1]);
+ new_best = &test_mp_list_info[0];
+ old_best = &test_mp_list_info[3];
+ bgp_info_mpath_update(&test_rn, new_best, old_best, &mp_list, &mp_cfg);
+ bgp_mp_list_clear(&mp_list);
+ EXPECT_TRUE(bgp_info_mpath_count(new_best) == 1, test_result);
+ mpath = bgp_info_mpath_first(new_best);
+ EXPECT_TRUE(mpath == &test_mp_list_info[1], test_result);
+ EXPECT_TRUE(CHECK_FLAG(mpath->flags, BGP_INFO_MULTIPATH), test_result);
+ EXPECT_TRUE(!CHECK_FLAG(test_mp_list_info[0].flags, BGP_INFO_MULTIPATH),
+ test_result);
+
+ return test_result;
}
-static int
-cleanup_bgp_info_mpath_update (testcase_t *t)
+static int cleanup_bgp_info_mpath_update(testcase_t *t)
{
- int i;
+ int i;
- for (i = 0; i < test_mp_list_peer_count; i++)
- sockunion_free (test_mp_list_peer[i].su_remote);
+ for (i = 0; i < test_mp_list_peer_count; i++)
+ sockunion_free(test_mp_list_peer[i].su_remote);
- return 0;
+ return 0;
}
testcase_t test_bgp_info_mpath_update = {
- .desc = "Test bgp_info_mpath_update",
- .setup = setup_bgp_info_mpath_update,
- .run = run_bgp_info_mpath_update,
- .cleanup = cleanup_bgp_info_mpath_update,
+ .desc = "Test bgp_info_mpath_update",
+ .setup = setup_bgp_info_mpath_update,
+ .run = run_bgp_info_mpath_update,
+ .cleanup = cleanup_bgp_info_mpath_update,
};
/*=========================================================
* Set up testcase vector
*/
testcase_t *all_tests[] = {
- &test_bgp_cfg_maximum_paths,
- &test_bgp_mp_list,
- &test_bgp_info_mpath_update,
+ &test_bgp_cfg_maximum_paths, &test_bgp_mp_list,
+ &test_bgp_info_mpath_update,
};
-int all_tests_count = (sizeof(all_tests)/sizeof(testcase_t *));
+int all_tests_count = (sizeof(all_tests) / sizeof(testcase_t *));
/*=========================================================
* Test Driver Functions
*/
-static int
-global_test_init (void)
+static int global_test_init(void)
{
- qobj_init ();
- master = thread_master_create ();
- zclient = zclient_new(master);
- bgp_master_init (master);
- vrf_init ();
- bgp_option_set (BGP_OPT_NO_LISTEN);
-
- if (fileno (stdout) >= 0)
- tty = isatty (fileno (stdout));
- return 0;
+ qobj_init();
+ master = thread_master_create();
+ zclient = zclient_new(master);
+ bgp_master_init(master);
+ vrf_init();
+ bgp_option_set(BGP_OPT_NO_LISTEN);
+
+ if (fileno(stdout) >= 0)
+ tty = isatty(fileno(stdout));
+ return 0;
}
-static int
-global_test_cleanup (void)
+static int global_test_cleanup(void)
{
- if (zclient != NULL)
- zclient_free (zclient);
- thread_master_free (master);
- return 0;
+ if (zclient != NULL)
+ zclient_free(zclient);
+ thread_master_free(master);
+ return 0;
}
-static void
-display_result (testcase_t *test, int result)
+static void display_result(testcase_t *test, int result)
{
- if (tty)
- printf ("%s: %s\n", test->desc, result == TEST_PASSED ? OK : FAILED);
- else
- printf ("%s: %s\n", test->desc, result == TEST_PASSED ? "OK" : "FAILED");
+ if (tty)
+ printf("%s: %s\n", test->desc,
+ result == TEST_PASSED ? OK : FAILED);
+ else
+ printf("%s: %s\n", test->desc,
+ result == TEST_PASSED ? "OK" : "FAILED");
}
-static int
-setup_test (testcase_t *t)
+static int setup_test(testcase_t *t)
{
- int res = 0;
- if (t->setup)
- res = t->setup (t);
- return res;
+ int res = 0;
+ if (t->setup)
+ res = t->setup(t);
+ return res;
}
-static int
-cleanup_test (testcase_t *t)
+static int cleanup_test(testcase_t *t)
{
- int res = 0;
- if (t->cleanup)
- res = t->cleanup (t);
- return res;
+ int res = 0;
+ if (t->cleanup)
+ res = t->cleanup(t);
+ return res;
}
-static void
-run_tests (testcase_t *tests[], int num_tests, int *pass_count, int *fail_count)
+static void run_tests(testcase_t *tests[], int num_tests, int *pass_count,
+ int *fail_count)
{
- int test_index, result;
- testcase_t *cur_test;
-
- *pass_count = *fail_count = 0;
-
- for (test_index = 0; test_index < num_tests; test_index++)
- {
- cur_test = tests[test_index];
- if (!cur_test->desc)
- {
- printf ("error: test %d has no description!\n", test_index);
- continue;
- }
- if (!cur_test->run)
- {
- printf ("error: test %s has no run function!\n", cur_test->desc);
- continue;
- }
- if (setup_test (cur_test) != 0)
- {
- printf ("error: setup failed for test %s\n", cur_test->desc);
- continue;
- }
- result = cur_test->run (cur_test);
- if (result == TEST_PASSED)
- *pass_count += 1;
- else
- *fail_count += 1;
- display_result (cur_test, result);
- if (cleanup_test (cur_test) != 0)
- {
- printf ("error: cleanup failed for test %s\n", cur_test->desc);
- continue;
- }
- }
+ int test_index, result;
+ testcase_t *cur_test;
+
+ *pass_count = *fail_count = 0;
+
+ for (test_index = 0; test_index < num_tests; test_index++) {
+ cur_test = tests[test_index];
+ if (!cur_test->desc) {
+ printf("error: test %d has no description!\n",
+ test_index);
+ continue;
+ }
+ if (!cur_test->run) {
+ printf("error: test %s has no run function!\n",
+ cur_test->desc);
+ continue;
+ }
+ if (setup_test(cur_test) != 0) {
+ printf("error: setup failed for test %s\n",
+ cur_test->desc);
+ continue;
+ }
+ result = cur_test->run(cur_test);
+ if (result == TEST_PASSED)
+ *pass_count += 1;
+ else
+ *fail_count += 1;
+ display_result(cur_test, result);
+ if (cleanup_test(cur_test) != 0) {
+ printf("error: cleanup failed for test %s\n",
+ cur_test->desc);
+ continue;
+ }
+ }
}
-int
-main (void)
+int main(void)
{
- int pass_count, fail_count;
- time_t cur_time;
-
- time (&cur_time);
- printf("BGP Multipath Tests Run at %s", ctime(&cur_time));
- if (global_test_init () != 0)
- {
- printf("Global init failed. Terminating.\n");
- exit(1);
- }
- run_tests (all_tests, all_tests_count, &pass_count, &fail_count);
- global_test_cleanup ();
- printf("Total pass/fail: %d/%d\n", pass_count, fail_count);
- return fail_count;
+ int pass_count, fail_count;
+ time_t cur_time;
+
+ time(&cur_time);
+ printf("BGP Multipath Tests Run at %s", ctime(&cur_time));
+ if (global_test_init() != 0) {
+ printf("Global init failed. Terminating.\n");
+ exit(1);
+ }
+ run_tests(all_tests, all_tests_count, &pass_count, &fail_count);
+ global_test_cleanup();
+ printf("Total pass/fail: %d/%d\n", pass_count, fail_count);
+ return fail_count;
}
diff --git a/tests/helpers/c/main.c b/tests/helpers/c/main.c
index b3e6e706f..0b3e942b7 100644
--- a/tests/helpers/c/main.c
+++ b/tests/helpers/c/main.c
@@ -33,57 +33,50 @@ extern void test_init();
struct thread_master *master;
-struct option longopts[] =
-{
- { "daemon", no_argument, NULL, 'd'},
- { "config_file", required_argument, NULL, 'f'},
- { "help", no_argument, NULL, 'h'},
- { "vty_addr", required_argument, NULL, 'A'},
- { "vty_port", required_argument, NULL, 'P'},
- { "version", no_argument, NULL, 'v'},
- { 0 }
-};
+struct option longopts[] = {{"daemon", no_argument, NULL, 'd'},
+ {"config_file", required_argument, NULL, 'f'},
+ {"help", no_argument, NULL, 'h'},
+ {"vty_addr", required_argument, NULL, 'A'},
+ {"vty_port", required_argument, NULL, 'P'},
+ {"version", no_argument, NULL, 'v'},
+ {0}};
DEFUN (daemon_exit,
daemon_exit_cmd,
"daemon-exit",
"Make the daemon exit\n")
{
- exit(0);
+ exit(0);
}
static int timer_count;
-static int
-test_timer (struct thread *thread)
+static int test_timer(struct thread *thread)
{
- int *count = THREAD_ARG(thread);
-
- printf ("run %d of timer\n", (*count)++);
- thread_add_timer (master, test_timer, count, 5);
- return 0;
+ int *count = THREAD_ARG(thread);
+
+ printf("run %d of timer\n", (*count)++);
+ thread_add_timer(master, test_timer, count, 5);
+ return 0;
}
-static void
-test_timer_init()
+static void test_timer_init()
{
- thread_add_timer (master, test_timer, &timer_count, 10);
+ thread_add_timer(master, test_timer, &timer_count, 10);
}
-static void
-test_vty_init()
+static void test_vty_init()
{
- install_element (VIEW_NODE, &daemon_exit_cmd);
+ install_element(VIEW_NODE, &daemon_exit_cmd);
}
/* Help information display. */
-static void
-usage (char *progname, int status)
+static void usage(char *progname, int status)
{
- if (status != 0)
- fprintf (stderr, "Try `%s --help' for more information.\n", progname);
- else
- {
- printf ("Usage : %s [OPTION...]\n\
+ if (status != 0)
+ fprintf(stderr, "Try `%s --help' for more information.\n",
+ progname);
+ else {
+ printf("Usage : %s [OPTION...]\n\
Daemon which does 'slow' things.\n\n\
-d, --daemon Runs in daemon mode\n\
-f, --config_file Set configuration file name\n\
@@ -92,110 +85,105 @@ Daemon which does 'slow' things.\n\n\
-v, --version Print program version\n\
-h, --help Display this help and exit\n\
\n\
-Report bugs to %s\n", progname, FRR_BUG_ADDRESS);
- }
- exit (status);
+Report bugs to %s\n",
+ progname, FRR_BUG_ADDRESS);
+ }
+ exit(status);
}
/* main routine. */
-int
-main (int argc, char **argv)
+int main(int argc, char **argv)
{
- char *p;
- char *vty_addr = NULL;
- int vty_port = 4000;
- int daemon_mode = 0;
- char *progname;
- struct thread thread;
- char *config_file = NULL;
-
- /* Set umask before anything for security */
- umask (0027);
-
- /* get program name */
- progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
-
- /* master init. */
- master = thread_master_create ();
-
- while (1)
- {
- int opt;
-
- opt = getopt_long (argc, argv, "dhf:A:P:v", longopts, 0);
-
- if (opt == EOF)
- break;
-
- switch (opt)
- {
- case 0:
- break;
- case 'f':
- config_file = optarg;
- break;
- case 'd':
- daemon_mode = 1;
- break;
- case 'A':
- vty_addr = optarg;
- break;
- case 'P':
- /* Deal with atoi() returning 0 on failure */
- if (strcmp(optarg, "0") == 0)
- {
- vty_port = 0;
- break;
- }
- vty_port = atoi (optarg);
- vty_port = (vty_port ? vty_port : 4000);
- break;
- case 'v':
- print_version (progname);
- exit (0);
- break;
- case 'h':
- usage (progname, 0);
- break;
- default:
- usage (progname, 1);
- break;
+ char *p;
+ char *vty_addr = NULL;
+ int vty_port = 4000;
+ int daemon_mode = 0;
+ char *progname;
+ struct thread thread;
+ char *config_file = NULL;
+
+ /* Set umask before anything for security */
+ umask(0027);
+
+ /* get program name */
+ progname = ((p = strrchr(argv[0], '/')) ? ++p : argv[0]);
+
+ /* master init. */
+ master = thread_master_create();
+
+ while (1) {
+ int opt;
+
+ opt = getopt_long(argc, argv, "dhf:A:P:v", longopts, 0);
+
+ if (opt == EOF)
+ break;
+
+ switch (opt) {
+ case 0:
+ break;
+ case 'f':
+ config_file = optarg;
+ break;
+ case 'd':
+ daemon_mode = 1;
+ break;
+ case 'A':
+ vty_addr = optarg;
+ break;
+ case 'P':
+ /* Deal with atoi() returning 0 on failure */
+ if (strcmp(optarg, "0") == 0) {
+ vty_port = 0;
+ break;
+ }
+ vty_port = atoi(optarg);
+ vty_port = (vty_port ? vty_port : 4000);
+ break;
+ case 'v':
+ print_version(progname);
+ exit(0);
+ break;
+ case 'h':
+ usage(progname, 0);
+ break;
+ default:
+ usage(progname, 1);
+ break;
+ }
}
- }
-
- /* Library inits. */
- cmd_init (1);
- vty_init (master);
- memory_init ();
-
- /* OSPF vty inits. */
- test_vty_init ();
-
- /* Change to the daemon program. */
- if (daemon_mode && daemon (0, 0) < 0)
- {
- fprintf(stderr, "daemon failed: %s", strerror(errno));
- exit (1);
- }
-
- /* Create VTY socket */
- vty_serv_sock (vty_addr, vty_port, "/tmp/.heavy.sock");
-
- /* Configuration file read*/
- if (!config_file)
- usage (progname, 1);
- vty_read_config (config_file, NULL);
-
- test_timer_init();
-
- test_init();
-
- /* Fetch next active thread. */
- while (thread_fetch (master, &thread))
- thread_call (&thread);
-
- /* Not reached. */
- exit (0);
-}
+ /* Library inits. */
+ cmd_init(1);
+ vty_init(master);
+ memory_init();
+
+ /* OSPF vty inits. */
+ test_vty_init();
+
+ /* Change to the daemon program. */
+ if (daemon_mode && daemon(0, 0) < 0) {
+ fprintf(stderr, "daemon failed: %s", strerror(errno));
+ exit(1);
+ }
+
+ /* Create VTY socket */
+ vty_serv_sock(vty_addr, vty_port, "/tmp/.heavy.sock");
+
+ /* Configuration file read*/
+ if (!config_file)
+ usage(progname, 1);
+ vty_read_config(config_file, NULL);
+
+ test_timer_init();
+
+ test_init();
+
+ /* Fetch next active thread. */
+ while (thread_fetch(master, &thread))
+ thread_call(&thread);
+
+ /* Not reached. */
+ exit(0);
+}
diff --git a/tests/helpers/c/prng.c b/tests/helpers/c/prng.c
index bdcfb07af..36e83173d 100644
--- a/tests/helpers/c/prng.c
+++ b/tests/helpers/c/prng.c
@@ -31,102 +31,92 @@
#include "prng.h"
-struct prng
-{
- unsigned long long state1;
- unsigned long long state2;
+struct prng {
+ unsigned long long state1;
+ unsigned long long state2;
};
-static char
-prng_bit(struct prng *prng)
+static char prng_bit(struct prng *prng)
{
- prng->state1 *= 2416;
- prng->state1 += 374441;
- prng->state1 %= 1771875;
-
- if (prng->state1 % 2)
- {
- prng->state2 *= 84589;
- prng->state2 += 45989;
- prng->state2 %= 217728;
- }
-
- return prng->state2 % 2;
+ prng->state1 *= 2416;
+ prng->state1 += 374441;
+ prng->state1 %= 1771875;
+
+ if (prng->state1 % 2) {
+ prng->state2 *= 84589;
+ prng->state2 += 45989;
+ prng->state2 %= 217728;
+ }
+
+ return prng->state2 % 2;
}
-struct prng*
-prng_new(unsigned long long seed)
+struct prng *prng_new(unsigned long long seed)
{
- struct prng *rv = calloc(sizeof(*rv), 1);
- assert(rv);
+ struct prng *rv = calloc(sizeof(*rv), 1);
+ assert(rv);
- rv->state1 = rv->state2 = seed;
+ rv->state1 = rv->state2 = seed;
- return rv;
+ return rv;
}
-unsigned int
-prng_rand(struct prng *prng)
+unsigned int prng_rand(struct prng *prng)
{
- unsigned int i, rv = 0;
-
- for (i = 0; i < 32; i++)
- {
- rv |= prng_bit(prng);
- rv <<= 1;
- }
- return rv;
+ unsigned int i, rv = 0;
+
+ for (i = 0; i < 32; i++) {
+ rv |= prng_bit(prng);
+ rv <<= 1;
+ }
+ return rv;
}
-const char *
-prng_fuzz(struct prng *prng,
- const char *string,
- const char *charset,
- unsigned int operations)
+const char *prng_fuzz(struct prng *prng, const char *string,
+ const char *charset, unsigned int operations)
{
- static char buf[256];
- unsigned int charset_len;
- unsigned int i;
- unsigned int offset;
- unsigned int op;
- unsigned int character;
-
- assert(strlen(string) < sizeof(buf));
-
- strncpy(buf, string, sizeof(buf));
- charset_len = strlen(charset);
-
- for (i = 0; i < operations; i++)
- {
- offset = prng_rand(prng) % strlen(buf);
- op = prng_rand(prng) % 3;
-
- switch (op)
- {
- case 0:
- /* replace */
- character = prng_rand(prng) % charset_len;
- buf[offset] = charset[character];
- break;
- case 1:
- /* remove */
- memmove(buf + offset, buf + offset + 1, strlen(buf) - offset);
- break;
- case 2:
- /* insert */
- assert(strlen(buf) + 1 < sizeof(buf));
-
- memmove(buf + offset + 1, buf + offset, strlen(buf) + 1 - offset);
- character = prng_rand(prng) % charset_len;
- buf[offset] = charset[character];
- break;
- }
- }
- return buf;
+ static char buf[256];
+ unsigned int charset_len;
+ unsigned int i;
+ unsigned int offset;
+ unsigned int op;
+ unsigned int character;
+
+ assert(strlen(string) < sizeof(buf));
+
+ strncpy(buf, string, sizeof(buf));
+ charset_len = strlen(charset);
+
+ for (i = 0; i < operations; i++) {
+ offset = prng_rand(prng) % strlen(buf);
+ op = prng_rand(prng) % 3;
+
+ switch (op) {
+ case 0:
+ /* replace */
+ character = prng_rand(prng) % charset_len;
+ buf[offset] = charset[character];
+ break;
+ case 1:
+ /* remove */
+ memmove(buf + offset, buf + offset + 1,
+ strlen(buf) - offset);
+ break;
+ case 2:
+ /* insert */
+ assert(strlen(buf) + 1 < sizeof(buf));
+
+ memmove(buf + offset + 1, buf + offset,
+ strlen(buf) + 1 - offset);
+ character = prng_rand(prng) % charset_len;
+ buf[offset] = charset[character];
+ break;
+ }
+ }
+ return buf;
}
-void
-prng_free(struct prng *prng)
+void prng_free(struct prng *prng)
{
- free(prng);
+ free(prng);
}
diff --git a/tests/helpers/c/prng.h b/tests/helpers/c/prng.h
index cf0bacc5f..ab4f07170 100644
--- a/tests/helpers/c/prng.h
+++ b/tests/helpers/c/prng.h
@@ -27,12 +27,10 @@
struct prng;
-struct prng* prng_new(unsigned long long seed);
-unsigned int prng_rand(struct prng*);
-const char * prng_fuzz(struct prng*,
- const char *string,
- const char *charset,
- unsigned int operations);
+struct prng *prng_new(unsigned long long seed);
+unsigned int prng_rand(struct prng *);
+const char *prng_fuzz(struct prng *, const char *string, const char *charset,
+ unsigned int operations);
void prng_free(struct prng *);
#endif
diff --git a/tests/helpers/c/tests.h b/tests/helpers/c/tests.h
index a528e55f0..dc6c03e4b 100644
--- a/tests/helpers/c/tests.h
+++ b/tests/helpers/c/tests.h
@@ -25,7 +25,7 @@
#ifndef _QUAGGA_TESTS_H
#define _QUAGGA_TESTS_H
-extern void test_init (void);
-extern void test_init_cmd (void);
+extern void test_init(void);
+extern void test_init_cmd(void);
#endif /* _QUAGGA_TESTS_H */
diff --git a/tests/lib/cli/common_cli.c b/tests/lib/cli/common_cli.c
index 56db46043..93d6382a6 100644
--- a/tests/lib/cli/common_cli.c
+++ b/tests/lib/cli/common_cli.c
@@ -33,65 +33,62 @@
struct thread_master *master;
-int dump_args(struct vty *vty, const char *descr,
- int argc, struct cmd_token *argv[])
+int dump_args(struct vty *vty, const char *descr, int argc,
+ struct cmd_token *argv[])
{
- int i;
- vty_out (vty, "%s with %d args.%s", descr, argc, VTY_NEWLINE);
- for (i = 0; i < argc; i++)
- {
- vty_out (vty, "[%02d]: %s%s", i, argv[i]->arg, VTY_NEWLINE);
- }
-
- return CMD_SUCCESS;
+ int i;
+ vty_out(vty, "%s with %d args.%s", descr, argc, VTY_NEWLINE);
+ for (i = 0; i < argc; i++) {
+ vty_out(vty, "[%02d]: %s%s", i, argv[i]->arg, VTY_NEWLINE);
+ }
+
+ return CMD_SUCCESS;
}
static void vty_do_exit(void)
{
- printf ("\nend.\n");
- cmd_terminate ();
- vty_terminate ();
- thread_master_free (master);
- closezlog ();
-
- log_memstats_stderr ("testcli");
- exit (0);
+ printf("\nend.\n");
+ cmd_terminate();
+ vty_terminate();
+ thread_master_free(master);
+ closezlog();
+
+ log_memstats_stderr("testcli");
+ exit(0);
}
/* main routine. */
-int
-main (int argc, char **argv)
+int main(int argc, char **argv)
{
- struct thread thread;
+ struct thread thread;
- /* Set umask before anything for security */
- umask (0027);
+ /* Set umask before anything for security */
+ umask(0027);
- /* master init. */
- master = thread_master_create ();
+ /* master init. */
+ master = thread_master_create();
- openzlog("common-cli", "NONE", 0, LOG_CONS | LOG_NDELAY | LOG_PID,
- LOG_DAEMON);
- zlog_set_level(ZLOG_DEST_SYSLOG, ZLOG_DISABLED);
- zlog_set_level(ZLOG_DEST_STDOUT, ZLOG_DISABLED);
- zlog_set_level(ZLOG_DEST_MONITOR, LOG_DEBUG);
+ openzlog("common-cli", "NONE", 0, LOG_CONS | LOG_NDELAY | LOG_PID,
+ LOG_DAEMON);
+ zlog_set_level(ZLOG_DEST_SYSLOG, ZLOG_DISABLED);
+ zlog_set_level(ZLOG_DEST_STDOUT, ZLOG_DISABLED);
+ zlog_set_level(ZLOG_DEST_MONITOR, LOG_DEBUG);
- /* Library inits. */
- cmd_init (1);
- cmd_hostname_set ("test");
+ /* Library inits. */
+ cmd_init(1);
+ cmd_hostname_set("test");
- vty_init (master);
- memory_init ();
+ vty_init(master);
+ memory_init();
- test_init (argc, argv);
+ test_init(argc, argv);
- vty_stdio (vty_do_exit);
+ vty_stdio(vty_do_exit);
- /* Fetch next active thread. */
- while (thread_fetch (master, &thread))
- thread_call (&thread);
+ /* Fetch next active thread. */
+ while (thread_fetch(master, &thread))
+ thread_call(&thread);
- /* Not reached. */
- exit (0);
+ /* Not reached. */
+ exit(0);
}
-
diff --git a/tests/lib/cli/common_cli.h b/tests/lib/cli/common_cli.h
index 9e7fe9983..6ca1f1ba8 100644
--- a/tests/lib/cli/common_cli.h
+++ b/tests/lib/cli/common_cli.h
@@ -28,22 +28,24 @@
#include "command.h"
/* function to be implemented by test */
-extern void test_init (int argc, char **argv);
+extern void test_init(int argc, char **argv);
/* functions provided by common cli
* (includes main())
*/
extern struct thread_master *master;
-extern int dump_args(struct vty *vty, const char *descr,
- int argc, struct cmd_token *argv[]);
+extern int dump_args(struct vty *vty, const char *descr, int argc,
+ struct cmd_token *argv[]);
-#define DUMMY_HELPSTR \
- "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n" \
- "10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n" \
- "20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n"
-#define DUMMY_DEFUN(name, cmdstr) \
- DEFUN (name, name ## _cmd, cmdstr, DUMMY_HELPSTR) \
- { return dump_args(vty, #name, argc, argv); }
+#define DUMMY_HELPSTR \
+ "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n" \
+ "10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n" \
+ "20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n"
+#define DUMMY_DEFUN(name, cmdstr) \
+ DEFUN(name, name##_cmd, cmdstr, DUMMY_HELPSTR) \
+ { \
+ return dump_args(vty, #name, argc, argv); \
+ }
#endif /* _COMMON_CLI_H */
diff --git a/tests/lib/cli/test_cli.c b/tests/lib/cli/test_cli.c
index 54b34bc79..c8762362e 100644
--- a/tests/lib/cli/test_cli.c
+++ b/tests/lib/cli/test_cli.c
@@ -24,15 +24,15 @@
#include "common_cli.h"
-DUMMY_DEFUN(cmd0, "arg ipv4 A.B.C.D");
-DUMMY_DEFUN(cmd1, "arg ipv4m A.B.C.D/M");
-DUMMY_DEFUN(cmd2, "arg ipv6 X:X::X:X");
-DUMMY_DEFUN(cmd3, "arg ipv6m X:X::X:X/M");
-DUMMY_DEFUN(cmd4, "arg range (5-15)");
-DUMMY_DEFUN(cmd5, "pat a < a|b>");
-DUMMY_DEFUN(cmd7, "pat c <a | b|c> A.B.C.D");
-DUMMY_DEFUN(cmd8, "pat d { foo A.B.C.D|bar X:X::X:X| baz }");
-DUMMY_DEFUN(cmd9, "pat e [ WORD ]");
+DUMMY_DEFUN(cmd0, "arg ipv4 A.B.C.D");
+DUMMY_DEFUN(cmd1, "arg ipv4m A.B.C.D/M");
+DUMMY_DEFUN(cmd2, "arg ipv6 X:X::X:X");
+DUMMY_DEFUN(cmd3, "arg ipv6m X:X::X:X/M");
+DUMMY_DEFUN(cmd4, "arg range (5-15)");
+DUMMY_DEFUN(cmd5, "pat a < a|b>");
+DUMMY_DEFUN(cmd7, "pat c <a | b|c> A.B.C.D");
+DUMMY_DEFUN(cmd8, "pat d { foo A.B.C.D|bar X:X::X:X| baz }");
+DUMMY_DEFUN(cmd9, "pat e [ WORD ]");
DUMMY_DEFUN(cmd10, "pat f [key]");
DUMMY_DEFUN(cmd11, "alt a WORD");
DUMMY_DEFUN(cmd12, "alt a A.B.C.D");
@@ -40,27 +40,27 @@ DUMMY_DEFUN(cmd13, "alt a X:X::X:X");
void test_init(int argc, char **argv)
{
- size_t repeat = argc > 1 ? strtoul(argv[1], NULL, 0) : 223;
+ size_t repeat = argc > 1 ? strtoul(argv[1], NULL, 0) : 223;
- install_element (ENABLE_NODE, &cmd0_cmd);
- install_element (ENABLE_NODE, &cmd1_cmd);
- install_element (ENABLE_NODE, &cmd2_cmd);
- install_element (ENABLE_NODE, &cmd3_cmd);
- install_element (ENABLE_NODE, &cmd4_cmd);
- install_element (ENABLE_NODE, &cmd5_cmd);
- install_element (ENABLE_NODE, &cmd7_cmd);
- install_element (ENABLE_NODE, &cmd8_cmd);
- install_element (ENABLE_NODE, &cmd9_cmd);
- install_element (ENABLE_NODE, &cmd10_cmd);
- install_element (ENABLE_NODE, &cmd11_cmd);
- install_element (ENABLE_NODE, &cmd12_cmd);
- install_element (ENABLE_NODE, &cmd13_cmd);
- for (size_t i = 0; i < repeat; i++) {
- uninstall_element (ENABLE_NODE, &cmd5_cmd);
- install_element (ENABLE_NODE, &cmd5_cmd);
- }
- for (size_t i = 0; i < repeat; i++) {
- uninstall_element (ENABLE_NODE, &cmd13_cmd);
- install_element (ENABLE_NODE, &cmd13_cmd);
- }
+ install_element(ENABLE_NODE, &cmd0_cmd);
+ install_element(ENABLE_NODE, &cmd1_cmd);
+ install_element(ENABLE_NODE, &cmd2_cmd);
+ install_element(ENABLE_NODE, &cmd3_cmd);
+ install_element(ENABLE_NODE, &cmd4_cmd);
+ install_element(ENABLE_NODE, &cmd5_cmd);
+ install_element(ENABLE_NODE, &cmd7_cmd);
+ install_element(ENABLE_NODE, &cmd8_cmd);
+ install_element(ENABLE_NODE, &cmd9_cmd);
+ install_element(ENABLE_NODE, &cmd10_cmd);
+ install_element(ENABLE_NODE, &cmd11_cmd);
+ install_element(ENABLE_NODE, &cmd12_cmd);
+ install_element(ENABLE_NODE, &cmd13_cmd);
+ for (size_t i = 0; i < repeat; i++) {
+ uninstall_element(ENABLE_NODE, &cmd5_cmd);
+ install_element(ENABLE_NODE, &cmd5_cmd);
+ }
+ for (size_t i = 0; i < repeat; i++) {
+ uninstall_element(ENABLE_NODE, &cmd13_cmd);
+ install_element(ENABLE_NODE, &cmd13_cmd);
+ }
}
diff --git a/tests/lib/cli/test_commands.c b/tests/lib/cli/test_commands.c
index 272e3d12b..4bbddb574 100644
--- a/tests/lib/cli/test_commands.c
+++ b/tests/lib/cli/test_commands.c
@@ -49,360 +49,297 @@ struct thread_master *master; /* dummy for libfrr*/
static vector test_cmds;
static char test_buf[32768];
-static struct cmd_node bgp_node =
-{
- BGP_NODE,
- "%s(config-router)# ",
+static struct cmd_node bgp_node = {
+ BGP_NODE, "%s(config-router)# ",
};
-static struct cmd_node rip_node =
-{
- RIP_NODE,
- "%s(config-router)# ",
+static struct cmd_node rip_node = {
+ RIP_NODE, "%s(config-router)# ",
};
-static struct cmd_node isis_node =
-{
- ISIS_NODE,
- "%s(config-router)# ",
+static struct cmd_node isis_node = {
+ ISIS_NODE, "%s(config-router)# ",
};
-static struct cmd_node interface_node =
-{
- INTERFACE_NODE,
- "%s(config-if)# ",
+static struct cmd_node interface_node = {
+ INTERFACE_NODE, "%s(config-if)# ",
};
-static struct cmd_node rmap_node =
-{
- RMAP_NODE,
- "%s(config-route-map)# "
-};
+static struct cmd_node rmap_node = {RMAP_NODE, "%s(config-route-map)# "};
-static struct cmd_node zebra_node =
-{
- ZEBRA_NODE,
- "%s(config-router)# "
-};
+static struct cmd_node zebra_node = {ZEBRA_NODE, "%s(config-router)# "};
-static struct cmd_node bgp_vpnv4_node =
-{
- BGP_VPNV4_NODE,
- "%s(config-router-af)# "
-};
+static struct cmd_node bgp_vpnv4_node = {BGP_VPNV4_NODE,
+ "%s(config-router-af)# "};
-static struct cmd_node bgp_ipv4_node =
-{
- BGP_IPV4_NODE,
- "%s(config-router-af)# "
-};
+static struct cmd_node bgp_ipv4_node = {BGP_IPV4_NODE,
+ "%s(config-router-af)# "};
-static struct cmd_node bgp_ipv4m_node =
-{
- BGP_IPV4M_NODE,
- "%s(config-router-af)# "
-};
+static struct cmd_node bgp_ipv4m_node = {BGP_IPV4M_NODE,
+ "%s(config-router-af)# "};
-static struct cmd_node bgp_ipv6_node =
-{
- BGP_IPV6_NODE,
- "%s(config-router-af)# "
-};
+static struct cmd_node bgp_ipv6_node = {BGP_IPV6_NODE,
+ "%s(config-router-af)# "};
-static struct cmd_node bgp_ipv6m_node =
-{
- BGP_IPV6M_NODE,
- "%s(config-router-af)# "
-};
+static struct cmd_node bgp_ipv6m_node = {BGP_IPV6M_NODE,
+ "%s(config-router-af)# "};
-static struct cmd_node ospf_node =
-{
- OSPF_NODE,
- "%s(config-router)# "
-};
+static struct cmd_node ospf_node = {OSPF_NODE, "%s(config-router)# "};
-static struct cmd_node ripng_node =
-{
- RIPNG_NODE,
- "%s(config-router)# "
-};
+static struct cmd_node ripng_node = {RIPNG_NODE, "%s(config-router)# "};
-static struct cmd_node ospf6_node =
-{
- OSPF6_NODE,
- "%s(config-ospf6)# "
-};
+static struct cmd_node ospf6_node = {OSPF6_NODE, "%s(config-ospf6)# "};
-static struct cmd_node keychain_node =
-{
- KEYCHAIN_NODE,
- "%s(config-keychain)# "
-};
+static struct cmd_node keychain_node = {KEYCHAIN_NODE, "%s(config-keychain)# "};
-static struct cmd_node keychain_key_node =
-{
- KEYCHAIN_KEY_NODE,
- "%s(config-keychain-key)# "
-};
+static struct cmd_node keychain_key_node = {KEYCHAIN_KEY_NODE,
+ "%s(config-keychain-key)# "};
-static int
-test_callback(const struct cmd_element *cmd, struct vty *vty, int argc, struct cmd_token *argv[])
+static int test_callback(const struct cmd_element *cmd, struct vty *vty,
+ int argc, struct cmd_token *argv[])
{
- int offset;
- int rv;
- int i;
-
- offset = 0;
- rv = snprintf(test_buf, sizeof(test_buf), "'%s'", cmd->string);
- if (rv < 0)
- abort();
-
- offset += rv;
-
- for (i = 0; i < argc; i++)
- {
- rv = snprintf(test_buf + offset, sizeof(test_buf) - offset, "%s'%s'",
- (i == 0) ? ": " : ", ", argv[i]->arg);
- if (rv < 0)
- abort();
- offset += rv;
- }
-
- return CMD_SUCCESS;
+ int offset;
+ int rv;
+ int i;
+
+ offset = 0;
+ rv = snprintf(test_buf, sizeof(test_buf), "'%s'", cmd->string);
+ if (rv < 0)
+ abort();
+
+ offset += rv;
+
+ for (i = 0; i < argc; i++) {
+ rv = snprintf(test_buf + offset, sizeof(test_buf) - offset,
+ "%s'%s'", (i == 0) ? ": " : ", ", argv[i]->arg);
+ if (rv < 0)
+ abort();
+ offset += rv;
+ }
+
+ return CMD_SUCCESS;
}
-static void
-test_load(void)
+static void test_load(void)
{
- char line[4096];
-
- test_cmds = vector_init(VECTOR_MIN_SIZE);
-
- while (fgets(line, sizeof(line), stdin) != NULL)
- {
- if (strlen(line))
- line[strlen(line) - 1] = '\0';
- if (line[0] == '#')
- continue;
- vector_set(test_cmds, XSTRDUP(MTYPE_STRVEC, line));
- }
+ char line[4096];
+
+ test_cmds = vector_init(VECTOR_MIN_SIZE);
+
+ while (fgets(line, sizeof(line), stdin) != NULL) {
+ if (strlen(line))
+ line[strlen(line) - 1] = '\0';
+ if (line[0] == '#')
+ continue;
+ vector_set(test_cmds, XSTRDUP(MTYPE_STRVEC, line));
+ }
}
-static void
-test_init(void)
+static void test_init(void)
{
- unsigned int node;
- unsigned int i;
- struct cmd_node *cnode;
- struct cmd_element *cmd;
-
- cmd_init(1);
-
- install_node (&bgp_node, NULL);
- install_node (&rip_node, NULL);
- install_node (&interface_node, NULL);
- install_node (&rmap_node, NULL);
- install_node (&zebra_node, NULL);
- install_node (&bgp_vpnv4_node, NULL);
- install_node (&bgp_ipv4_node, NULL);
- install_node (&bgp_ipv4m_node, NULL);
- install_node (&bgp_ipv6_node, NULL);
- install_node (&bgp_ipv6m_node, NULL);
- install_node (&ospf_node, NULL);
- install_node (&ripng_node, NULL);
- install_node (&ospf6_node, NULL);
- install_node (&keychain_node, NULL);
- install_node (&keychain_key_node, NULL);
- install_node (&isis_node, NULL);
- install_node (&vty_node, NULL);
-
- test_init_cmd();
-
- for (node = 0; node < vector_active(cmdvec); node++)
- if ((cnode = vector_slot(cmdvec, node)) != NULL)
- for (i = 0; i < vector_active(cnode->cmd_vector); i++)
- if ((cmd = vector_slot(cnode->cmd_vector, i)) != NULL)
- {
- cmd->daemon = 0;
- cmd->func = test_callback;
- }
- test_load();
- vty_init_vtysh();
+ unsigned int node;
+ unsigned int i;
+ struct cmd_node *cnode;
+ struct cmd_element *cmd;
+
+ cmd_init(1);
+
+ install_node(&bgp_node, NULL);
+ install_node(&rip_node, NULL);
+ install_node(&interface_node, NULL);
+ install_node(&rmap_node, NULL);
+ install_node(&zebra_node, NULL);
+ install_node(&bgp_vpnv4_node, NULL);
+ install_node(&bgp_ipv4_node, NULL);
+ install_node(&bgp_ipv4m_node, NULL);
+ install_node(&bgp_ipv6_node, NULL);
+ install_node(&bgp_ipv6m_node, NULL);
+ install_node(&ospf_node, NULL);
+ install_node(&ripng_node, NULL);
+ install_node(&ospf6_node, NULL);
+ install_node(&keychain_node, NULL);
+ install_node(&keychain_key_node, NULL);
+ install_node(&isis_node, NULL);
+ install_node(&vty_node, NULL);
+
+ test_init_cmd();
+
+ for (node = 0; node < vector_active(cmdvec); node++)
+ if ((cnode = vector_slot(cmdvec, node)) != NULL)
+ for (i = 0; i < vector_active(cnode->cmd_vector); i++)
+ if ((cmd = vector_slot(cnode->cmd_vector, i))
+ != NULL) {
+ cmd->daemon = 0;
+ cmd->func = test_callback;
+ }
+ test_load();
+ vty_init_vtysh();
}
-static void
-test_terminate(void)
+static void test_terminate(void)
{
- unsigned int i;
+ unsigned int i;
- vty_terminate();
- for (i = 0; i < vector_active(test_cmds); i++)
- XFREE(MTYPE_STRVEC, vector_slot(test_cmds, i));
- vector_free(test_cmds);
- cmd_terminate();
+ vty_terminate();
+ for (i = 0; i < vector_active(test_cmds); i++)
+ XFREE(MTYPE_STRVEC, vector_slot(test_cmds, i));
+ vector_free(test_cmds);
+ cmd_terminate();
}
-static void
-test_run(struct prng *prng, struct vty *vty, const char *cmd, unsigned int edit_dist, unsigned int node_index, int verbose)
+static void test_run(struct prng *prng, struct vty *vty, const char *cmd,
+ unsigned int edit_dist, unsigned int node_index,
+ int verbose)
{
- const char *test_str;
- vector vline;
- int ret;
- unsigned int i;
- char **completions;
- unsigned int j;
- struct cmd_node *cnode;
- vector descriptions;
- int appended_null;
- int no_match;
-
- test_str = prng_fuzz(prng, cmd, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_:. /", edit_dist);
- vline = cmd_make_strvec(test_str);
-
- if (vline == NULL)
- return;
-
- appended_null = 0;
- for (i = 0; i < vector_active(cmdvec); i++)
- if ((cnode = vector_slot(cmdvec, i)) != NULL)
- {
- if (node_index != (unsigned int)-1 && i != node_index)
- continue;
-
- if (appended_null)
- {
- vector_unset(vline, vector_active(vline) - 1);
- appended_null = 0;
- }
- vty->node = cnode->node;
- test_buf[0] = '\0';
- ret = cmd_execute_command(vline, vty, NULL, 0);
- no_match = (ret == CMD_ERR_NO_MATCH);
- if (verbose || !no_match)
- printf("execute relaxed '%s'@%d: rv==%d%s%s\n",
- test_str,
- cnode->node,
- ret,
- (test_buf[0] != '\0') ? ", " : "",
- test_buf);
-
- vty->node = cnode->node;
- test_buf[0] = '\0';
- ret = cmd_execute_command_strict(vline, vty, NULL);
- if (verbose || !no_match)
- printf("execute strict '%s'@%d: rv==%d%s%s\n",
- test_str,
- cnode->node,
- ret,
- (test_buf[0] != '\0') ? ", " : "",
- test_buf);
-
- if (isspace((int) test_str[strlen(test_str) - 1]))
- {
- vector_set (vline, NULL);
- appended_null = 1;
- }
-
- vty->node = cnode->node;
- completions = cmd_complete_command(vline, vty, &ret);
- if (verbose || !no_match)
- printf("complete '%s'@%d: rv==%d\n",
- test_str,
- cnode->node,
- ret);
- if (completions != NULL)
- {
- for (j = 0; completions[j] != NULL; j++)
- {
- printf(" '%s'\n", completions[j]);
- XFREE(MTYPE_TMP, completions[j]);
- }
- XFREE(MTYPE_TMP, completions);
- }
-
- vty->node = cnode->node;
- descriptions = cmd_describe_command(vline, vty, &ret);
- if (verbose || !no_match)
- printf("describe '%s'@%d: rv==%d\n",
- test_str,
- cnode->node,
- ret);
- if (descriptions != NULL)
- {
- for (j = 0; j < vector_active(descriptions); j++)
- {
- struct cmd_token *cmd = vector_slot(descriptions, j);
- printf(" '%s' '%s'\n", cmd->text, cmd->desc);
- }
- vector_free(descriptions);
- }
- }
- cmd_free_strvec(vline);
+ const char *test_str;
+ vector vline;
+ int ret;
+ unsigned int i;
+ char **completions;
+ unsigned int j;
+ struct cmd_node *cnode;
+ vector descriptions;
+ int appended_null;
+ int no_match;
+
+ test_str = prng_fuzz(
+ prng, cmd,
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_:. /",
+ edit_dist);
+ vline = cmd_make_strvec(test_str);
+
+ if (vline == NULL)
+ return;
+
+ appended_null = 0;
+ for (i = 0; i < vector_active(cmdvec); i++)
+ if ((cnode = vector_slot(cmdvec, i)) != NULL) {
+ if (node_index != (unsigned int)-1 && i != node_index)
+ continue;
+
+ if (appended_null) {
+ vector_unset(vline, vector_active(vline) - 1);
+ appended_null = 0;
+ }
+ vty->node = cnode->node;
+ test_buf[0] = '\0';
+ ret = cmd_execute_command(vline, vty, NULL, 0);
+ no_match = (ret == CMD_ERR_NO_MATCH);
+ if (verbose || !no_match)
+ printf("execute relaxed '%s'@%d: rv==%d%s%s\n",
+ test_str, cnode->node, ret,
+ (test_buf[0] != '\0') ? ", " : "",
+ test_buf);
+
+ vty->node = cnode->node;
+ test_buf[0] = '\0';
+ ret = cmd_execute_command_strict(vline, vty, NULL);
+ if (verbose || !no_match)
+ printf("execute strict '%s'@%d: rv==%d%s%s\n",
+ test_str, cnode->node, ret,
+ (test_buf[0] != '\0') ? ", " : "",
+ test_buf);
+
+ if (isspace((int)test_str[strlen(test_str) - 1])) {
+ vector_set(vline, NULL);
+ appended_null = 1;
+ }
+
+ vty->node = cnode->node;
+ completions = cmd_complete_command(vline, vty, &ret);
+ if (verbose || !no_match)
+ printf("complete '%s'@%d: rv==%d\n", test_str,
+ cnode->node, ret);
+ if (completions != NULL) {
+ for (j = 0; completions[j] != NULL; j++) {
+ printf(" '%s'\n", completions[j]);
+ XFREE(MTYPE_TMP, completions[j]);
+ }
+ XFREE(MTYPE_TMP, completions);
+ }
+
+ vty->node = cnode->node;
+ descriptions = cmd_describe_command(vline, vty, &ret);
+ if (verbose || !no_match)
+ printf("describe '%s'@%d: rv==%d\n", test_str,
+ cnode->node, ret);
+ if (descriptions != NULL) {
+ for (j = 0; j < vector_active(descriptions);
+ j++) {
+ struct cmd_token *cmd =
+ vector_slot(descriptions, j);
+ printf(" '%s' '%s'\n", cmd->text,
+ cmd->desc);
+ }
+ vector_free(descriptions);
+ }
+ }
+ cmd_free_strvec(vline);
}
-int
-main(int argc, char **argv)
+int main(int argc, char **argv)
{
- int opt;
- struct prng *prng;
- struct vty *vty;
- unsigned int edit_distance;
- unsigned int max_edit_distance;
- unsigned int node_index;
- int verbose;
- unsigned int test_cmd;
- unsigned int iteration;
- unsigned int num_iterations;
-
- max_edit_distance = 3;
- node_index = -1;
- verbose = 0;
-
- while ((opt = getopt(argc, argv, "e:n:v")) != -1)
- {
- switch (opt)
- {
- case 'e':
- max_edit_distance = atoi(optarg);
- break;
- case 'n':
- node_index = atoi(optarg);
- break;
- case 'v':
- verbose++;
- break;
- default:
- fprintf(stderr, "Usage: %s [-e <edit_dist>] [-n <node_idx>] [-v]\n", argv[0]);
- exit(1);
- break;
- }
- }
-
- test_init();
- prng = prng_new(0);
-
- vty = vty_new();
- vty->type = VTY_TERM;
-
- fprintf(stderr, "Progress:\n0/%u", vector_active(test_cmds));
- for (test_cmd = 0; test_cmd < vector_active(test_cmds); test_cmd++)
- {
- for (edit_distance = 0;
- edit_distance <= max_edit_distance;
- edit_distance++)
- {
- num_iterations = 1 << edit_distance;
- num_iterations *= num_iterations * num_iterations;
-
- for (iteration = 0; iteration < num_iterations; iteration++)
- test_run(prng, vty, vector_slot(test_cmds, test_cmd), edit_distance, node_index, verbose);
- }
- fprintf(stderr, "\r%u/%u", test_cmd + 1, vector_active(test_cmds));
- }
- fprintf(stderr, "\nDone.\n");
-
- vty_close(vty);
- prng_free(prng);
- test_terminate();
- return 0;
+ int opt;
+ struct prng *prng;
+ struct vty *vty;
+ unsigned int edit_distance;
+ unsigned int max_edit_distance;
+ unsigned int node_index;
+ int verbose;
+ unsigned int test_cmd;
+ unsigned int iteration;
+ unsigned int num_iterations;
+
+ max_edit_distance = 3;
+ node_index = -1;
+ verbose = 0;
+
+ while ((opt = getopt(argc, argv, "e:n:v")) != -1) {
+ switch (opt) {
+ case 'e':
+ max_edit_distance = atoi(optarg);
+ break;
+ case 'n':
+ node_index = atoi(optarg);
+ break;
+ case 'v':
+ verbose++;
+ break;
+ default:
+ fprintf(stderr,
+ "Usage: %s [-e <edit_dist>] [-n <node_idx>] [-v]\n",
+ argv[0]);
+ exit(1);
+ break;
+ }
+ }
+
+ test_init();
+ prng = prng_new(0);
+
+ vty = vty_new();
+ vty->type = VTY_TERM;
+
+ fprintf(stderr, "Progress:\n0/%u", vector_active(test_cmds));
+ for (test_cmd = 0; test_cmd < vector_active(test_cmds); test_cmd++) {
+ for (edit_distance = 0; edit_distance <= max_edit_distance;
+ edit_distance++) {
+ num_iterations = 1 << edit_distance;
+ num_iterations *= num_iterations * num_iterations;
+
+ for (iteration = 0; iteration < num_iterations;
+ iteration++)
+ test_run(prng, vty,
+ vector_slot(test_cmds, test_cmd),
+ edit_distance, node_index, verbose);
+ }
+ fprintf(stderr, "\r%u/%u", test_cmd + 1,
+ vector_active(test_cmds));
+ }
+ fprintf(stderr, "\nDone.\n");
+
+ vty_close(vty);
+ prng_free(prng);
+ test_terminate();
+ return 0;
}
diff --git a/tests/lib/test_buffer.c b/tests/lib/test_buffer.c
index 67e403580..7e124c1f5 100644
--- a/tests/lib/test_buffer.c
+++ b/tests/lib/test_buffer.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright (C) 2004 Paul Jakma
*
* This file is part of Quagga.
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with Quagga; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -26,35 +26,33 @@
struct thread_master *master;
-int
-main(int argc, char **argv)
+int main(int argc, char **argv)
{
- struct buffer *b1, *b2;
- int n;
- char junk[3];
- char c = 'a';
+ struct buffer *b1, *b2;
+ int n;
+ char junk[3];
+ char c = 'a';
- memory_init();
-
- if ((argc != 2) || (sscanf(argv[1], "%d%1s", &n, junk) != 1))
- {
- fprintf(stderr, "Usage: %s <number of chars to simulate>\n", *argv);
- return 1;
- }
+ memory_init();
- b1 = buffer_new(0);
- b2 = buffer_new(1024);
-
- while (n-- > 0)
- {
- buffer_put(b1, &c, 1);
- buffer_put(b2, &c, 1);
- if (c++ == 'z')
- c = 'a';
- buffer_reset(b1);
- buffer_reset(b2);
- }
- buffer_free(b1);
- buffer_free(b2);
- return 0;
+ if ((argc != 2) || (sscanf(argv[1], "%d%1s", &n, junk) != 1)) {
+ fprintf(stderr, "Usage: %s <number of chars to simulate>\n",
+ *argv);
+ return 1;
+ }
+
+ b1 = buffer_new(0);
+ b2 = buffer_new(1024);
+
+ while (n-- > 0) {
+ buffer_put(b1, &c, 1);
+ buffer_put(b2, &c, 1);
+ if (c++ == 'z')
+ c = 'a';
+ buffer_reset(b1);
+ buffer_reset(b2);
+ }
+ buffer_free(b1);
+ buffer_free(b2);
+ return 0;
}
diff --git a/tests/lib/test_checksum.c b/tests/lib/test_checksum.c
index 53ab260e2..6abf5c1f9 100644
--- a/tests/lib/test_checksum.c
+++ b/tests/lib/test_checksum.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright (C) 2008 Sun Microsystems, Inc.
*
* This file is part of Quagga.
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with Quagga; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -28,14 +28,14 @@
struct thread_master *master;
struct acc_vals {
- int c0;
- int c1;
+ int c0;
+ int c1;
};
struct csum_vals {
- struct acc_vals a;
- int x;
- int y;
+ struct acc_vals a;
+ int x;
+ int y;
};
static struct csum_vals ospfd_vals, isisd_vals;
@@ -47,26 +47,26 @@ typedef uint16_t testoff_t;
#define MODX 4102U
/* The final reduction phase.
- * This one should be the original ospfd version
+ * This one should be the original ospfd version
*/
-static u_int16_t
-reduce_ospfd (struct csum_vals *vals, testsz_t len, testoff_t off)
+static u_int16_t reduce_ospfd(struct csum_vals *vals, testsz_t len,
+ testoff_t off)
{
#define x vals->x
#define y vals->y
#define c0 vals->a.c0
#define c1 vals->a.c1
- x = ((len - off - 1) * c0 - c1) % 255;
-
- if (x <= 0)
- x += 255;
- y = 510 - c0 - x;
- if (y > 255)
- y -= 255;
+ x = ((len - off - 1) * c0 - c1) % 255;
- /* take care endian issue. */
- return htons ((x << 8) + y);
+ if (x <= 0)
+ x += 255;
+ y = 510 - c0 - x;
+ if (y > 255)
+ y -= 255;
+
+ /* take care endian issue. */
+ return htons((x << 8) + y);
#undef x
#undef y
#undef c0
@@ -74,23 +74,23 @@ reduce_ospfd (struct csum_vals *vals, testsz_t len, testoff_t off)
}
/* slightly different concatenation */
-static u_int16_t
-reduce_ospfd1 (struct csum_vals *vals, testsz_t len, testoff_t off)
+static u_int16_t reduce_ospfd1(struct csum_vals *vals, testsz_t len,
+ testoff_t off)
{
#define x vals->x
#define y vals->y
#define c0 vals->a.c0
#define c1 vals->a.c1
- x = ((len - off - 1) * c0 - c1) % 255;
- if (x <= 0)
- x += 255;
- y = 510 - c0 - x;
- if (y > 255)
- y -= 255;
+ x = ((len - off - 1) * c0 - c1) % 255;
+ if (x <= 0)
+ x += 255;
+ y = 510 - c0 - x;
+ if (y > 255)
+ y -= 255;
- /* take care endian issue. */
- return htons ((x << 8) | (y & 0xff));
+ /* take care endian issue. */
+ return htons((x << 8) | (y & 0xff));
#undef x
#undef y
#undef c0
@@ -98,33 +98,33 @@ reduce_ospfd1 (struct csum_vals *vals, testsz_t len, testoff_t off)
}
/* original isisd version */
-static u_int16_t
-reduce_isisd (struct csum_vals *vals, testsz_t len, testoff_t off)
+static u_int16_t reduce_isisd(struct csum_vals *vals, testsz_t len,
+ testoff_t off)
{
#define x vals->x
#define y vals->y
#define c0 vals->a.c0
#define c1 vals->a.c1
- u_int32_t mul;
-
- mul = (len - off)*(c0);
- x = mul - c0 - c1;
- y = c1 - mul - 1;
+ u_int32_t mul;
+
+ mul = (len - off) * (c0);
+ x = mul - c0 - c1;
+ y = c1 - mul - 1;
- if (y > 0)
- y++;
- if (x < 0)
- x--;
+ if (y > 0)
+ y++;
+ if (x < 0)
+ x--;
- x %= 255;
- y %= 255;
+ x %= 255;
+ y %= 255;
- if (x == 0)
- x = 255;
- if (y == 0)
- y = 1;
+ if (x == 0)
+ x = 255;
+ if (y == 0)
+ y = 1;
- return htons ((x << 8) | (y & 0xff));
+ return htons((x << 8) | (y & 0xff));
#undef x
#undef y
@@ -133,33 +133,33 @@ reduce_isisd (struct csum_vals *vals, testsz_t len, testoff_t off)
}
/* Is the -1 in y wrong perhaps? */
-static u_int16_t
-reduce_isisd_yfix (struct csum_vals *vals, testsz_t len, testoff_t off)
+static u_int16_t reduce_isisd_yfix(struct csum_vals *vals, testsz_t len,
+ testoff_t off)
{
#define x vals->x
#define y vals->y
#define c0 vals->a.c0
#define c1 vals->a.c1
- u_int32_t mul;
-
- mul = (len - off)*(c0);
- x = mul - c0 - c1;
- y = c1 - mul;
+ u_int32_t mul;
+
+ mul = (len - off) * (c0);
+ x = mul - c0 - c1;
+ y = c1 - mul;
- if (y > 0)
- y++;
- if (x < 0)
- x--;
+ if (y > 0)
+ y++;
+ if (x < 0)
+ x--;
- x %= 255;
- y %= 255;
+ x %= 255;
+ y %= 255;
- if (x == 0)
- x = 255;
- if (y == 0)
- y = 1;
+ if (x == 0)
+ x = 255;
+ if (y == 0)
+ y = 1;
- return htons ((x << 8) | (y & 0xff));
+ return htons((x << 8) | (y & 0xff));
#undef x
#undef y
@@ -168,33 +168,33 @@ reduce_isisd_yfix (struct csum_vals *vals, testsz_t len, testoff_t off)
}
/* Move the mods yp */
-static u_int16_t
-reduce_isisd_mod (struct csum_vals *vals, testsz_t len, testoff_t off)
+static u_int16_t reduce_isisd_mod(struct csum_vals *vals, testsz_t len,
+ testoff_t off)
{
#define x vals->x
#define y vals->y
#define c0 vals->a.c0
#define c1 vals->a.c1
- u_int32_t mul;
-
- mul = (len - off)*(c0);
- x = mul - c1 - c0;
- y = c1 - mul - 1;
+ u_int32_t mul;
- x %= 255;
- y %= 255;
+ mul = (len - off) * (c0);
+ x = mul - c1 - c0;
+ y = c1 - mul - 1;
- if (y > 0)
- y++;
- if (x < 0)
- x--;
+ x %= 255;
+ y %= 255;
- if (x == 0)
- x = 255;
- if (y == 0)
- y = 1;
+ if (y > 0)
+ y++;
+ if (x < 0)
+ x--;
- return htons ((x << 8) | (y & 0xff));
+ if (x == 0)
+ x = 255;
+ if (y == 0)
+ y = 1;
+
+ return htons((x << 8) | (y & 0xff));
#undef x
#undef y
@@ -203,33 +203,33 @@ reduce_isisd_mod (struct csum_vals *vals, testsz_t len, testoff_t off)
}
/* Move the mods up + fix y */
-static u_int16_t
-reduce_isisd_mody (struct csum_vals *vals, testsz_t len, testoff_t off)
+static u_int16_t reduce_isisd_mody(struct csum_vals *vals, testsz_t len,
+ testoff_t off)
{
#define x vals->x
#define y vals->y
#define c0 vals->a.c0
#define c1 vals->a.c1
- u_int32_t mul;
-
- mul = (len - off)*(c0);
- x = mul - c0 - c1;
- y = c1 - mul;
+ u_int32_t mul;
+
+ mul = (len - off) * (c0);
+ x = mul - c0 - c1;
+ y = c1 - mul;
- x %= 255;
- y %= 255;
+ x %= 255;
+ y %= 255;
- if (y > 0)
- y++;
- if (x < 0)
- x--;
+ if (y > 0)
+ y++;
+ if (x < 0)
+ x--;
- if (x == 0)
- x = 255;
- if (y == 0)
- y = 1;
+ if (x == 0)
+ x = 255;
+ if (y == 0)
+ y = 1;
- return htons ((x << 8) | (y & 0xff));
+ return htons((x << 8) | (y & 0xff));
#undef x
#undef y
@@ -238,184 +238,175 @@ reduce_isisd_mody (struct csum_vals *vals, testsz_t len, testoff_t off)
}
struct reductions_t {
- const char *name;
- u_int16_t (*f) (struct csum_vals *, testsz_t, testoff_t);
+ const char *name;
+ u_int16_t (*f)(struct csum_vals *, testsz_t, testoff_t);
} reducts[] = {
- { .name = "ospfd", .f = reduce_ospfd },
- { .name = "ospfd-1", .f = reduce_ospfd1 },
- { .name = "isisd", .f = reduce_isisd },
- { .name = "isisd-yfix", .f = reduce_isisd_yfix },
- { .name = "isisd-mod", .f = reduce_isisd_mod },
- { .name = "isisd-mody", .f = reduce_isisd_mody },
- { NULL, NULL },
+ {.name = "ospfd", .f = reduce_ospfd},
+ {.name = "ospfd-1", .f = reduce_ospfd1},
+ {.name = "isisd", .f = reduce_isisd},
+ {.name = "isisd-yfix", .f = reduce_isisd_yfix},
+ {.name = "isisd-mod", .f = reduce_isisd_mod},
+ {.name = "isisd-mody", .f = reduce_isisd_mody},
+ {NULL, NULL},
};
/* The original ospfd checksum */
-static u_int16_t
-ospfd_checksum (u_char *buffer, testsz_t len, testoff_t off)
+static u_int16_t ospfd_checksum(u_char *buffer, testsz_t len, testoff_t off)
{
- u_char *sp, *ep, *p, *q;
- int c0 = 0, c1 = 0;
- int x, y;
- u_int16_t checksum, *csum;
-
- csum = (u_int16_t *) (buffer + off);
- *(csum) = 0;
-
- sp = buffer;
-
- for (ep = sp + len; sp < ep; sp = q)
- {
- q = sp + MODX;
- if (q > ep)
- q = ep;
- for (p = sp; p < q; p++)
- {
- c0 += *p;
- c1 += c0;
- }
- c0 %= 255;
- c1 %= 255;
- }
-
- ospfd_vals.a.c0 = c0;
- ospfd_vals.a.c1 = c1;
-
- //printf ("%s: len %u, off %u, c0 %d, c1 %d\n",
- // __func__, len, off, c0, c1);
-
- x = ((int)(len - off - 1) * (int)c0 - (int)c1) % 255;
-
- if (x <= 0)
- x += 255;
- y = 510 - c0 - x;
- if (y > 255)
- y -= 255;
-
- ospfd_vals.x = x;
- ospfd_vals.y = y;
-
- buffer[off] = x;
- buffer[off + 1] = y;
-
- /* take care endian issue. */
- checksum = htons ((x << 8) | (y & 0xff));
-
- return (checksum);
+ u_char *sp, *ep, *p, *q;
+ int c0 = 0, c1 = 0;
+ int x, y;
+ u_int16_t checksum, *csum;
+
+ csum = (u_int16_t *)(buffer + off);
+ *(csum) = 0;
+
+ sp = buffer;
+
+ for (ep = sp + len; sp < ep; sp = q) {
+ q = sp + MODX;
+ if (q > ep)
+ q = ep;
+ for (p = sp; p < q; p++) {
+ c0 += *p;
+ c1 += c0;
+ }
+ c0 %= 255;
+ c1 %= 255;
+ }
+
+ ospfd_vals.a.c0 = c0;
+ ospfd_vals.a.c1 = c1;
+
+ // printf ("%s: len %u, off %u, c0 %d, c1 %d\n",
+ // __func__, len, off, c0, c1);
+
+ x = ((int)(len - off - 1) * (int)c0 - (int)c1) % 255;
+
+ if (x <= 0)
+ x += 255;
+ y = 510 - c0 - x;
+ if (y > 255)
+ y -= 255;
+
+ ospfd_vals.x = x;
+ ospfd_vals.y = y;
+
+ buffer[off] = x;
+ buffer[off + 1] = y;
+
+ /* take care endian issue. */
+ checksum = htons((x << 8) | (y & 0xff));
+
+ return (checksum);
}
/* the original, broken isisd checksum */
-static u_int16_t
-iso_csum_create (u_char * buffer, testsz_t len, testoff_t off)
+static u_int16_t iso_csum_create(u_char *buffer, testsz_t len, testoff_t off)
{
- u_int8_t *p;
- int x;
- int y;
- u_int32_t mul;
- u_int32_t c0;
- u_int32_t c1;
- u_int16_t checksum, *csum;
- int i, init_len, partial_len;
-
- checksum = 0;
-
- csum = (u_int16_t *) (buffer + off);
- *(csum) = checksum;
-
- p = buffer;
- c0 = 0;
- c1 = 0;
- init_len = len;
-
- while (len != 0)
- {
- partial_len = MIN(len, MODX);
-
- for (i = 0; i < partial_len; i++)
- {
- c0 = c0 + *(p++);
- c1 += c0;
+ u_int8_t *p;
+ int x;
+ int y;
+ u_int32_t mul;
+ u_int32_t c0;
+ u_int32_t c1;
+ u_int16_t checksum, *csum;
+ int i, init_len, partial_len;
+
+ checksum = 0;
+
+ csum = (u_int16_t *)(buffer + off);
+ *(csum) = checksum;
+
+ p = buffer;
+ c0 = 0;
+ c1 = 0;
+ init_len = len;
+
+ while (len != 0) {
+ partial_len = MIN(len, MODX);
+
+ for (i = 0; i < partial_len; i++) {
+ c0 = c0 + *(p++);
+ c1 += c0;
+ }
+
+ c0 = c0 % 255;
+ c1 = c1 % 255;
+
+ len -= partial_len;
}
- c0 = c0 % 255;
- c1 = c1 % 255;
-
- len -= partial_len;
- }
-
- isisd_vals.a.c0 = c0;
- isisd_vals.a.c1 = c1;
-
- mul = (init_len - off) * c0;
-
- x = mul - c1 - c0;
- y = c1 - mul - 1;
-
- if (y > 0)
- y++;
- if (x < 0)
- x--;
-
- x %= 255;
- y %= 255;
-
- if (x == 0)
- x = 255;
- if (y == 0)
- y = 1;
-
- isisd_vals.x = x;
- isisd_vals.y = y;
-
- checksum = htons((x << 8) | (y & 0xFF));
-
- *(csum) = checksum;
-
- /* return the checksum for user usage */
- return checksum;
+ isisd_vals.a.c0 = c0;
+ isisd_vals.a.c1 = c1;
+
+ mul = (init_len - off) * c0;
+
+ x = mul - c1 - c0;
+ y = c1 - mul - 1;
+
+ if (y > 0)
+ y++;
+ if (x < 0)
+ x--;
+
+ x %= 255;
+ y %= 255;
+
+ if (x == 0)
+ x = 255;
+ if (y == 0)
+ y = 1;
+
+ isisd_vals.x = x;
+ isisd_vals.y = y;
+
+ checksum = htons((x << 8) | (y & 0xFF));
+
+ *(csum) = checksum;
+
+ /* return the checksum for user usage */
+ return checksum;
}
-static int
-verify (u_char * buffer, testsz_t len)
+static int verify(u_char *buffer, testsz_t len)
{
- u_int8_t *p;
- u_int32_t c0;
- u_int32_t c1;
- int i, partial_len;
-
- p = buffer;
-
- c0 = 0;
- c1 = 0;
-
- while (len)
- {
- partial_len = MIN(len, 5803U);
-
- for (i = 0; i < partial_len; i++)
- {
- c0 = c0 + *(p++);
- c1 += c0;
- }
- c0 = c0 % 255;
- c1 = c1 % 255;
-
- len -= partial_len;
- }
-
- if (c0 == 0 && c1 == 0)
- return 0;
-
- return 1;
+ u_int8_t *p;
+ u_int32_t c0;
+ u_int32_t c1;
+ int i, partial_len;
+
+ p = buffer;
+
+ c0 = 0;
+ c1 = 0;
+
+ while (len) {
+ partial_len = MIN(len, 5803U);
+
+ for (i = 0; i < partial_len; i++) {
+ c0 = c0 + *(p++);
+ c1 += c0;
+ }
+ c0 = c0 % 255;
+ c1 = c1 % 255;
+
+ len -= partial_len;
+ }
+
+ if (c0 == 0 && c1 == 0)
+ return 0;
+
+ return 1;
}
-static int /* return checksum in low-order 16 bits */
-in_cksum_optimized(void *parg, int nbytes)
+static int /* return checksum in low-order 16 bits */
+ in_cksum_optimized(void *parg, int nbytes)
{
u_short *ptr = parg;
- register long sum; /* assumes long == 32 bits */
- register u_short answer; /* assumes u_short == 16 bits */
+ register long sum; /* assumes long == 32 bits */
+ register u_short answer; /* assumes u_short == 16 bits */
register int count;
/*
* Our algorithm is simple, using a 32-bit accumulator (sum),
@@ -425,126 +416,129 @@ in_cksum_optimized(void *parg, int nbytes)
sum = 0;
count = nbytes >> 1; /* div by 2 */
- for(ptr--; count; --count)
- sum += *++ptr;
+ for (ptr--; count; --count)
+ sum += *++ptr;
- if (nbytes & 1) /* Odd */
- sum += *(u_char *)(++ptr); /* one byte only */
+ if (nbytes & 1) /* Odd */
+ sum += *(u_char *)(++ptr); /* one byte only */
/*
* Add back carry outs from top 16 bits to low 16 bits.
*/
- sum = (sum >> 16) + (sum & 0xffff); /* add high-16 to low-16 */
- sum += (sum >> 16); /* add carry */
- answer = ~sum; /* ones-complement, then truncate to 16 bits */
- return(answer);
+ sum = (sum >> 16) + (sum & 0xffff); /* add high-16 to low-16 */
+ sum += (sum >> 16); /* add carry */
+ answer = ~sum; /* ones-complement, then truncate to 16 bits */
+ return (answer);
}
static int /* return checksum in low-order 16 bits */
-in_cksum_rfc(void *parg, int count)
+ in_cksum_rfc(void *parg, int count)
/* from RFC 1071 */
{
u_short *addr = parg;
/* Compute Internet Checksum for "count" bytes
* beginning at location "addr".
*/
- register long sum = 0;
+ register long sum = 0;
- while (count > 1) {
- /* This is the inner loop */
- sum += *addr++;
- count -= 2;
+ while (count > 1) {
+ /* This is the inner loop */
+ sum += *addr++;
+ count -= 2;
}
/* Add left-over byte, if any */
if (count > 0) {
- sum += *(u_char *)addr;
+ sum += *(u_char *)addr;
}
/* Fold 32-bit sum to 16 bits */
- while (sum>>16)
- sum = (sum & 0xffff) + (sum >> 16);
+ while (sum >> 16)
+ sum = (sum & 0xffff) + (sum >> 16);
return ~sum;
}
-int
-main(int argc, char **argv)
+int main(int argc, char **argv)
{
/* 60017 65629 702179 */
#define MAXDATALEN 60017
#define BUFSIZE MAXDATALEN + sizeof(u_int16_t)
- u_char buffer[BUFSIZE];
- int exercise = 0;
+ u_char buffer[BUFSIZE];
+ int exercise = 0;
#define EXERCISESTEP 257
-
- srandom (time (NULL));
-
- while (1) {
- u_int16_t ospfd, isisd, lib, in_csum, in_csum_res, in_csum_rfc;
- int i,j;
-
- exercise += EXERCISESTEP;
- exercise %= MAXDATALEN;
-
- for (i = 0; i < exercise; i += sizeof (long int)) {
- long int rand = random ();
-
- for (j = sizeof (long int); j > 0; j--)
- buffer[i + (sizeof (long int) - j)] = (rand >> (j * 8)) & 0xff;
- }
-
- in_csum = in_cksum(buffer, exercise);
- in_csum_res = in_cksum_optimized(buffer, exercise);
- in_csum_rfc = in_cksum_rfc(buffer, exercise);
- if (in_csum_res != in_csum || in_csum != in_csum_rfc)
- printf ("verify: in_chksum failed in_csum:%x, in_csum_res:%x,"
- "in_csum_rfc %x, len:%d\n",
- in_csum, in_csum_res, in_csum_rfc, exercise);
-
- ospfd = ospfd_checksum (buffer, exercise + sizeof(u_int16_t), exercise);
- if (verify (buffer, exercise + sizeof(u_int16_t)))
- printf ("verify: ospfd failed\n");
- isisd = iso_csum_create (buffer, exercise + sizeof(u_int16_t), exercise);
- if (verify (buffer, exercise + sizeof(u_int16_t)))
- printf ("verify: isisd failed\n");
- lib = fletcher_checksum (buffer, exercise + sizeof(u_int16_t), exercise);
- if (verify (buffer, exercise + sizeof(u_int16_t)))
- printf ("verify: lib failed\n");
-
- if (ospfd != lib) {
- printf ("Mismatch in values at size %u\n"
- "ospfd: 0x%04x\tc0: %d\tc1: %d\tx: %d\ty: %d\n"
- "isisd: 0x%04x\tc0: %d\tc1: %d\tx: %d\ty: %d\n"
- "lib: 0x%04x\n",
- exercise,
- ospfd, ospfd_vals.a.c0, ospfd_vals.a.c1, ospfd_vals.x, ospfd_vals.y,
- isisd, isisd_vals.a.c0, isisd_vals.a.c1, isisd_vals.x, isisd_vals.y,
- lib
- );
-
- /* Investigate reduction phase discrepencies */
- if (ospfd_vals.a.c0 == isisd_vals.a.c0
- && ospfd_vals.a.c1 == isisd_vals.a.c1) {
- printf ("\n");
- for (i = 0; reducts[i].name != NULL; i++) {
- ospfd = reducts[i].f (&ospfd_vals,
- exercise + sizeof (u_int16_t),
- exercise);
- printf ("%20s: x: %02x, y %02x, checksum 0x%04x\n",
- reducts[i].name, ospfd_vals.x & 0xff, ospfd_vals.y & 0xff, ospfd);
- }
- }
-
- printf ("\n u_char testdata [] = {\n ");
- for (i = 0; i < exercise; i++) {
- printf ("0x%02x,%s",
- buffer[i],
- (i + 1) % 8 ? " " : "\n ");
- }
- printf ("\n}\n");
- exit (1);
- }
- }
+ srandom(time(NULL));
+
+ while (1) {
+ u_int16_t ospfd, isisd, lib, in_csum, in_csum_res, in_csum_rfc;
+ int i, j;
+
+ exercise += EXERCISESTEP;
+ exercise %= MAXDATALEN;
+
+ for (i = 0; i < exercise; i += sizeof(long int)) {
+ long int rand = random();
+
+ for (j = sizeof(long int); j > 0; j--)
+ buffer[i + (sizeof(long int) - j)] =
+ (rand >> (j * 8)) & 0xff;
+ }
+
+ in_csum = in_cksum(buffer, exercise);
+ in_csum_res = in_cksum_optimized(buffer, exercise);
+ in_csum_rfc = in_cksum_rfc(buffer, exercise);
+ if (in_csum_res != in_csum || in_csum != in_csum_rfc)
+ printf("verify: in_chksum failed in_csum:%x, in_csum_res:%x,"
+ "in_csum_rfc %x, len:%d\n",
+ in_csum, in_csum_res, in_csum_rfc, exercise);
+
+ ospfd = ospfd_checksum(buffer, exercise + sizeof(u_int16_t),
+ exercise);
+ if (verify(buffer, exercise + sizeof(u_int16_t)))
+ printf("verify: ospfd failed\n");
+ isisd = iso_csum_create(buffer, exercise + sizeof(u_int16_t),
+ exercise);
+ if (verify(buffer, exercise + sizeof(u_int16_t)))
+ printf("verify: isisd failed\n");
+ lib = fletcher_checksum(buffer, exercise + sizeof(u_int16_t),
+ exercise);
+ if (verify(buffer, exercise + sizeof(u_int16_t)))
+ printf("verify: lib failed\n");
+
+ if (ospfd != lib) {
+ printf("Mismatch in values at size %u\n"
+ "ospfd: 0x%04x\tc0: %d\tc1: %d\tx: %d\ty: %d\n"
+ "isisd: 0x%04x\tc0: %d\tc1: %d\tx: %d\ty: %d\n"
+ "lib: 0x%04x\n",
+ exercise, ospfd, ospfd_vals.a.c0,
+ ospfd_vals.a.c1, ospfd_vals.x, ospfd_vals.y,
+ isisd, isisd_vals.a.c0, isisd_vals.a.c1,
+ isisd_vals.x, isisd_vals.y, lib);
+
+ /* Investigate reduction phase discrepencies */
+ if (ospfd_vals.a.c0 == isisd_vals.a.c0
+ && ospfd_vals.a.c1 == isisd_vals.a.c1) {
+ printf("\n");
+ for (i = 0; reducts[i].name != NULL; i++) {
+ ospfd = reducts[i].f(
+ &ospfd_vals,
+ exercise + sizeof(u_int16_t),
+ exercise);
+ printf("%20s: x: %02x, y %02x, checksum 0x%04x\n",
+ reducts[i].name,
+ ospfd_vals.x & 0xff,
+ ospfd_vals.y & 0xff, ospfd);
+ }
+ }
+
+ printf("\n u_char testdata [] = {\n ");
+ for (i = 0; i < exercise; i++) {
+ printf("0x%02x,%s", buffer[i],
+ (i + 1) % 8 ? " " : "\n ");
+ }
+ printf("\n}\n");
+ exit(1);
+ }
+ }
}
diff --git a/tests/lib/test_heavy.c b/tests/lib/test_heavy.c
index 6ba8d9aa6..07cf602af 100644
--- a/tests/lib/test_heavy.c
+++ b/tests/lib/test_heavy.c
@@ -38,46 +38,42 @@
#include "tests.h"
-enum
-{
- ITERS_FIRST = 0,
- ITERS_ERR = 100,
- ITERS_LATER = 400,
- ITERS_PRINT = 10,
- ITERS_MAX = 1000,
+enum { ITERS_FIRST = 0,
+ ITERS_ERR = 100,
+ ITERS_LATER = 400,
+ ITERS_PRINT = 10,
+ ITERS_MAX = 1000,
};
-static void
-slow_func (struct vty *vty, const char *str, const int i)
+static void slow_func(struct vty *vty, const char *str, const int i)
{
- double x = 1;
- int j;
-
- for (j = 0; j < 300; j++)
- x += sin(x)*j;
-
- if ((i % ITERS_LATER) == 0)
- printf ("%s: %d, temporary error, save this somehow and do it later..\n",
- __func__, i);
-
- if ((i % ITERS_ERR) == 0)
- printf ("%s: hard error\n", __func__);
-
- if ((i % ITERS_PRINT) == 0)
- printf ("%s did %d, x = %g%s", str, i, x, VTY_NEWLINE);
+ double x = 1;
+ int j;
+
+ for (j = 0; j < 300; j++)
+ x += sin(x) * j;
+
+ if ((i % ITERS_LATER) == 0)
+ printf("%s: %d, temporary error, save this somehow and do it later..\n",
+ __func__, i);
+
+ if ((i % ITERS_ERR) == 0)
+ printf("%s: hard error\n", __func__);
+
+ if ((i % ITERS_PRINT) == 0)
+ printf("%s did %d, x = %g%s", str, i, x, VTY_NEWLINE);
}
-static void
-clear_something (struct vty *vty, const char *str)
+static void clear_something(struct vty *vty, const char *str)
{
- int i;
-
- /* this could be like iterating through 150k of route_table
- * or worse, iterating through a list of peers, to bgp_stop them with
- * each having 150k route tables to process...
- */
- for (i = ITERS_FIRST; i < ITERS_MAX; i++)
- slow_func (vty, str, i);
+ int i;
+
+ /* this could be like iterating through 150k of route_table
+ * or worse, iterating through a list of peers, to bgp_stop them with
+ * each having 150k route tables to process...
+ */
+ for (i = ITERS_FIRST; i < ITERS_MAX; i++)
+ slow_func(vty, str, i);
}
DEFUN (clear_foo,
@@ -86,28 +82,25 @@ DEFUN (clear_foo,
"clear command\n"
"arbitrary string\n")
{
- char *str;
- if (!argc)
- {
- vty_out (vty, "%% string argument required%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
-
- str = argv_concat (argv, argc, 0);
-
- clear_something (vty, str);
- XFREE (MTYPE_TMP, str);
- return CMD_SUCCESS;
+ char *str;
+ if (!argc) {
+ vty_out(vty, "%% string argument required%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ str = argv_concat(argv, argc, 0);
+
+ clear_something(vty, str);
+ XFREE(MTYPE_TMP, str);
+ return CMD_SUCCESS;
}
-static void
-slow_vty_init()
+static void slow_vty_init()
{
- install_element (VIEW_NODE, &clear_foo_cmd);
+ install_element(VIEW_NODE, &clear_foo_cmd);
}
-void
-test_init()
+void test_init()
{
- slow_vty_init();
+ slow_vty_init();
}
diff --git a/tests/lib/test_heavy_thread.c b/tests/lib/test_heavy_thread.c
index c43fa76c0..e7af8dccc 100644
--- a/tests/lib/test_heavy_thread.c
+++ b/tests/lib/test_heavy_thread.c
@@ -41,65 +41,59 @@
extern struct thread_master *master;
-enum
-{
- ITERS_FIRST = 0,
- ITERS_ERR = 100,
- ITERS_LATER = 400,
- ITERS_PRINT = 10,
- ITERS_MAX = 1000,
+enum { ITERS_FIRST = 0,
+ ITERS_ERR = 100,
+ ITERS_LATER = 400,
+ ITERS_PRINT = 10,
+ ITERS_MAX = 1000,
};
struct work_state {
- struct vty *vty;
- char *str;
- int i;
+ struct vty *vty;
+ char *str;
+ int i;
};
-static void
-slow_func (struct vty *vty, const char *str, const int i)
+static void slow_func(struct vty *vty, const char *str, const int i)
{
- double x = 1;
- int j;
-
- for (j = 0; j < 300; j++)
- x += sin(x)*j;
-
- if ((i % ITERS_LATER) == 0)
- printf ("%s: %d, temporary error, save this somehow and do it later..\n",
- __func__, i);
-
- if ((i % ITERS_ERR) == 0)
- printf ("%s: hard error\n", __func__);
-
- if ((i % ITERS_PRINT) == 0)
- printf ("%s did %d, x = %g\n", str, i, x);
+ double x = 1;
+ int j;
+
+ for (j = 0; j < 300; j++)
+ x += sin(x) * j;
+
+ if ((i % ITERS_LATER) == 0)
+ printf("%s: %d, temporary error, save this somehow and do it later..\n",
+ __func__, i);
+
+ if ((i % ITERS_ERR) == 0)
+ printf("%s: hard error\n", __func__);
+
+ if ((i % ITERS_PRINT) == 0)
+ printf("%s did %d, x = %g\n", str, i, x);
}
-static int
-clear_something (struct thread *thread)
+static int clear_something(struct thread *thread)
{
- struct work_state *ws = THREAD_ARG(thread);
-
- /* this could be like iterating through 150k of route_table
- * or worse, iterating through a list of peers, to bgp_stop them with
- * each having 150k route tables to process...
- */
- while (ws->i < ITERS_MAX)
- {
- slow_func(ws->vty, ws->str, ws->i);
- ws->i++;
- if (thread_should_yield(thread))
- {
- thread_add_background(master, clear_something, ws, 0);
- return 0;
- }
- }
-
- /* All done! */
- XFREE (MTYPE_TMP, ws->str);
- XFREE (MTYPE_TMP, ws);
- return 0;
+ struct work_state *ws = THREAD_ARG(thread);
+
+ /* this could be like iterating through 150k of route_table
+ * or worse, iterating through a list of peers, to bgp_stop them with
+ * each having 150k route tables to process...
+ */
+ while (ws->i < ITERS_MAX) {
+ slow_func(ws->vty, ws->str, ws->i);
+ ws->i++;
+ if (thread_should_yield(thread)) {
+ thread_add_background(master, clear_something, ws, 0);
+ return 0;
+ }
+ }
+
+ /* All done! */
+ XFREE(MTYPE_TMP, ws->str);
+ XFREE(MTYPE_TMP, ws);
+ return 0;
}
DEFUN (clear_foo,
@@ -108,40 +102,36 @@ DEFUN (clear_foo,
"clear command\n"
"arbitrary string\n")
{
- char *str;
- struct work_state *ws;
-
- if (!argc)
- {
- vty_out (vty, "%% string argument required%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
-
- str = argv_concat (argv, argc, 0);
-
- if ((ws = XMALLOC(MTYPE_TMP, sizeof(*ws))) == NULL)
- {
- zlog_err ("%s: unable to allocate work_state", __func__);
- return CMD_WARNING;
- }
-
- if (!(ws->str = XSTRDUP (MTYPE_TMP, str)))
- {
- zlog_err ("%s: unable to xstrdup", __func__);
- XFREE (MTYPE_TMP, ws);
- return CMD_WARNING;
- }
-
- ws->vty = vty;
- ws->i = ITERS_FIRST;
-
- thread_add_background(master, clear_something, ws, 0);
-
- return CMD_SUCCESS;
+ char *str;
+ struct work_state *ws;
+
+ if (!argc) {
+ vty_out(vty, "%% string argument required%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ str = argv_concat(argv, argc, 0);
+
+ if ((ws = XMALLOC(MTYPE_TMP, sizeof(*ws))) == NULL) {
+ zlog_err("%s: unable to allocate work_state", __func__);
+ return CMD_WARNING;
+ }
+
+ if (!(ws->str = XSTRDUP(MTYPE_TMP, str))) {
+ zlog_err("%s: unable to xstrdup", __func__);
+ XFREE(MTYPE_TMP, ws);
+ return CMD_WARNING;
+ }
+
+ ws->vty = vty;
+ ws->i = ITERS_FIRST;
+
+ thread_add_background(master, clear_something, ws, 0);
+
+ return CMD_SUCCESS;
}
-void
-test_init()
+void test_init()
{
- install_element (VIEW_NODE, &clear_foo_cmd);
+ install_element(VIEW_NODE, &clear_foo_cmd);
}
diff --git a/tests/lib/test_heavy_wq.c b/tests/lib/test_heavy_wq.c
index 97371face..7ccd1131c 100644
--- a/tests/lib/test_heavy_wq.c
+++ b/tests/lib/test_heavy_wq.c
@@ -45,97 +45,88 @@ DEFINE_MTYPE_STATIC(TEST_HEAVYWQ, WQ_NODE_STR, "heavy_wq_node->str")
extern struct thread_master *master;
static struct work_queue *heavy_wq;
-struct heavy_wq_node
-{
- char *str;
- int i;
+struct heavy_wq_node {
+ char *str;
+ int i;
};
-enum
-{
- ITERS_FIRST = 0,
- ITERS_ERR = 100,
- ITERS_LATER = 400,
- ITERS_PRINT = 10,
- ITERS_MAX = 1000,
+enum { ITERS_FIRST = 0,
+ ITERS_ERR = 100,
+ ITERS_LATER = 400,
+ ITERS_PRINT = 10,
+ ITERS_MAX = 1000,
};
-static void
-heavy_wq_add (struct vty *vty, const char *str, int i)
+static void heavy_wq_add(struct vty *vty, const char *str, int i)
{
- struct heavy_wq_node *hn;
-
- if ((hn = XCALLOC (MTYPE_WQ_NODE, sizeof(struct heavy_wq_node))) == NULL)
- {
- zlog_err ("%s: unable to allocate hn", __func__);
- return;
- }
-
- hn->i = i;
- if (!(hn->str = XSTRDUP (MTYPE_WQ_NODE_STR, str)))
- {
- zlog_err ("%s: unable to xstrdup", __func__);
- XFREE (MTYPE_WQ_NODE, hn);
- return;
- }
-
- work_queue_add (heavy_wq, hn);
-
- return;
+ struct heavy_wq_node *hn;
+
+ if ((hn = XCALLOC(MTYPE_WQ_NODE, sizeof(struct heavy_wq_node)))
+ == NULL) {
+ zlog_err("%s: unable to allocate hn", __func__);
+ return;
+ }
+
+ hn->i = i;
+ if (!(hn->str = XSTRDUP(MTYPE_WQ_NODE_STR, str))) {
+ zlog_err("%s: unable to xstrdup", __func__);
+ XFREE(MTYPE_WQ_NODE, hn);
+ return;
+ }
+
+ work_queue_add(heavy_wq, hn);
+
+ return;
}
-static void
-slow_func_err (struct work_queue *wq, struct work_queue_item *item)
+static void slow_func_err(struct work_queue *wq, struct work_queue_item *item)
{
- printf ("%s: running error function\n", __func__);
+ printf("%s: running error function\n", __func__);
}
-static void
-slow_func_del (struct work_queue *wq, void *data)
+static void slow_func_del(struct work_queue *wq, void *data)
{
- struct heavy_wq_node *hn = data;
- assert (hn && hn->str);
- printf ("%s: %s\n", __func__, hn->str);
- XFREE (MTYPE_WQ_NODE_STR, hn->str);
- hn->str = NULL;
- XFREE(MTYPE_WQ_NODE, hn);
+ struct heavy_wq_node *hn = data;
+ assert(hn && hn->str);
+ printf("%s: %s\n", __func__, hn->str);
+ XFREE(MTYPE_WQ_NODE_STR, hn->str);
+ hn->str = NULL;
+ XFREE(MTYPE_WQ_NODE, hn);
}
-static wq_item_status
-slow_func (struct work_queue *wq, void *data)
+static wq_item_status slow_func(struct work_queue *wq, void *data)
{
- struct heavy_wq_node *hn = data;
- double x = 1;
- int j;
-
- assert (hn && hn->str);
-
- for (j = 0; j < 300; j++)
- x += sin(x)*j;
-
- if ((hn->i % ITERS_LATER) == 0)
- return WQ_RETRY_LATER;
-
- if ((hn->i % ITERS_ERR) == 0)
- return WQ_RETRY_NOW;
-
- if ((hn->i % ITERS_PRINT) == 0)
- printf ("%s did %d, x = %g\n", hn->str, hn->i, x);
-
- return WQ_SUCCESS;
+ struct heavy_wq_node *hn = data;
+ double x = 1;
+ int j;
+
+ assert(hn && hn->str);
+
+ for (j = 0; j < 300; j++)
+ x += sin(x) * j;
+
+ if ((hn->i % ITERS_LATER) == 0)
+ return WQ_RETRY_LATER;
+
+ if ((hn->i % ITERS_ERR) == 0)
+ return WQ_RETRY_NOW;
+
+ if ((hn->i % ITERS_PRINT) == 0)
+ printf("%s did %d, x = %g\n", hn->str, hn->i, x);
+
+ return WQ_SUCCESS;
}
-static void
-clear_something (struct vty *vty, const char *str)
+static void clear_something(struct vty *vty, const char *str)
{
- int i;
-
- /* this could be like iterating through 150k of route_table
- * or worse, iterating through a list of peers, to bgp_stop them with
- * each having 150k route tables to process...
- */
- for (i = ITERS_FIRST; i < ITERS_MAX; i++)
- heavy_wq_add (vty, str, i);
+ int i;
+
+ /* this could be like iterating through 150k of route_table
+ * or worse, iterating through a list of peers, to bgp_stop them with
+ * each having 150k route tables to process...
+ */
+ for (i = ITERS_FIRST; i < ITERS_MAX; i++)
+ heavy_wq_add(vty, str, i);
}
DEFUN (clear_foo,
@@ -144,41 +135,37 @@ DEFUN (clear_foo,
"clear command\n"
"arbitrary string\n")
{
- char *str;
- if (!argc)
- {
- vty_out (vty, "%% string argument required%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
-
- str = argv_concat (argv, argc, 0);
-
- clear_something (vty, str);
- XFREE (MTYPE_TMP, str);
- return CMD_SUCCESS;
+ char *str;
+ if (!argc) {
+ vty_out(vty, "%% string argument required%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ str = argv_concat(argv, argc, 0);
+
+ clear_something(vty, str);
+ XFREE(MTYPE_TMP, str);
+ return CMD_SUCCESS;
}
-static int
-heavy_wq_init ()
+static int heavy_wq_init()
{
- if (! (heavy_wq = work_queue_new (master, "heavy_work_queue")))
- {
- zlog_err ("%s: could not get new work queue!", __func__);
- return -1;
- }
-
- heavy_wq->spec.workfunc = &slow_func;
- heavy_wq->spec.errorfunc = &slow_func_err;
- heavy_wq->spec.del_item_data = &slow_func_del;
- heavy_wq->spec.max_retries = 3;
- heavy_wq->spec.hold = 1000;
-
- return 0;
+ if (!(heavy_wq = work_queue_new(master, "heavy_work_queue"))) {
+ zlog_err("%s: could not get new work queue!", __func__);
+ return -1;
+ }
+
+ heavy_wq->spec.workfunc = &slow_func;
+ heavy_wq->spec.errorfunc = &slow_func_err;
+ heavy_wq->spec.del_item_data = &slow_func_del;
+ heavy_wq->spec.max_retries = 3;
+ heavy_wq->spec.hold = 1000;
+
+ return 0;
}
-void
-test_init()
+void test_init()
{
- install_element (VIEW_NODE, &clear_foo_cmd);
- heavy_wq_init();
+ install_element(VIEW_NODE, &clear_foo_cmd);
+ heavy_wq_init();
}
diff --git a/tests/lib/test_memory.c b/tests/lib/test_memory.c
index 6849b9dce..d1240ab59 100644
--- a/tests/lib/test_memory.c
+++ b/tests/lib/test_memory.c
@@ -1,4 +1,4 @@
-/*
+/*
* This file is part of Quagga.
*
* Quagga is free software; you can redistribute it and/or modify it
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with Quagga; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -45,81 +45,77 @@ struct thread_master *master;
#define TIMES 10
-int
-main(int argc, char **argv)
+int main(int argc, char **argv)
{
- void *a[10];
- int i;
+ void *a[10];
+ int i;
- printf ("malloc x, malloc x, free, malloc x, free free\n\n");
- /* simple case, test cache */
- for (i = 0; i < TIMES; i++)
- {
- a[0] = XMALLOC (MTYPE_TEST, 1024);
- memset (a[0], 1, 1024);
- a[1] = XMALLOC (MTYPE_TEST, 1024);
- memset (a[1], 1, 1024);
- XFREE(MTYPE_TEST, a[0]); /* should go to cache */
- a[0] = XMALLOC (MTYPE_TEST, 1024); /* should be satisfied from cache */
- XFREE(MTYPE_TEST, a[0]);
- XFREE(MTYPE_TEST, a[1]);
- }
-
- printf ("malloc x, malloc y, free x, malloc y, free free\n\n");
- /* cache should go invalid, valid, invalid, etc.. */
- for (i = 0; i < TIMES; i++)
- {
- a[0] = XMALLOC (MTYPE_TEST, 512);
- memset (a[0], 1, 512);
- a[1] = XMALLOC (MTYPE_TEST, 1024); /* invalidate cache */
- memset (a[1], 1, 1024);
- XFREE(MTYPE_TEST, a[0]);
- a[0] = XMALLOC (MTYPE_TEST, 1024);
- XFREE(MTYPE_TEST, a[0]);
- XFREE(MTYPE_TEST, a[1]);
- /* cache should become valid again on next request */
- }
+ printf("malloc x, malloc x, free, malloc x, free free\n\n");
+ /* simple case, test cache */
+ for (i = 0; i < TIMES; i++) {
+ a[0] = XMALLOC(MTYPE_TEST, 1024);
+ memset(a[0], 1, 1024);
+ a[1] = XMALLOC(MTYPE_TEST, 1024);
+ memset(a[1], 1, 1024);
+ XFREE(MTYPE_TEST, a[0]); /* should go to cache */
+ a[0] = XMALLOC(MTYPE_TEST,
+ 1024); /* should be satisfied from cache */
+ XFREE(MTYPE_TEST, a[0]);
+ XFREE(MTYPE_TEST, a[1]);
+ }
- printf ("calloc\n\n");
- /* test calloc */
- for (i = 0; i < TIMES; i++)
- {
- a[0] = XCALLOC (MTYPE_TEST, 1024);
- memset (a[0], 1, 1024);
- a[1] = XCALLOC (MTYPE_TEST, 512); /* invalidate cache */
- memset (a[1], 1, 512);
- XFREE(MTYPE_TEST, a[1]);
- XFREE(MTYPE_TEST, a[0]);
- /* alloc == 0, cache can become valid again on next request */
- }
-
- printf ("calloc and realloc\n\n");
- /* check calloc + realloc */
- for (i = 0; i < TIMES; i++)
- {
- printf ("calloc a0 1024\n");
- a[0] = XCALLOC (MTYPE_TEST, 1024);
- memset (a[0], 1, 1024/2);
-
- printf ("calloc 1 1024\n");
- a[1] = XCALLOC (MTYPE_TEST, 1024);
- memset (a[1], 1, 1024/2);
-
- printf ("realloc 0 1024\n");
- a[3] = XREALLOC (MTYPE_TEST, a[0], 2048); /* invalidate cache */
- if (a[3] != NULL)
- a[0] = a[3];
- memset (a[0], 1, 1024);
-
- printf ("calloc 2 512\n");
- a[2] = XCALLOC (MTYPE_TEST, 512);
- memset (a[2], 1, 512);
-
- printf ("free 1 0 2\n");
- XFREE(MTYPE_TEST, a[1]);
- XFREE(MTYPE_TEST, a[0]);
- XFREE(MTYPE_TEST, a[2]);
- /* alloc == 0, cache valid next request */
- }
- return 0;
+ printf("malloc x, malloc y, free x, malloc y, free free\n\n");
+ /* cache should go invalid, valid, invalid, etc.. */
+ for (i = 0; i < TIMES; i++) {
+ a[0] = XMALLOC(MTYPE_TEST, 512);
+ memset(a[0], 1, 512);
+ a[1] = XMALLOC(MTYPE_TEST, 1024); /* invalidate cache */
+ memset(a[1], 1, 1024);
+ XFREE(MTYPE_TEST, a[0]);
+ a[0] = XMALLOC(MTYPE_TEST, 1024);
+ XFREE(MTYPE_TEST, a[0]);
+ XFREE(MTYPE_TEST, a[1]);
+ /* cache should become valid again on next request */
+ }
+
+ printf("calloc\n\n");
+ /* test calloc */
+ for (i = 0; i < TIMES; i++) {
+ a[0] = XCALLOC(MTYPE_TEST, 1024);
+ memset(a[0], 1, 1024);
+ a[1] = XCALLOC(MTYPE_TEST, 512); /* invalidate cache */
+ memset(a[1], 1, 512);
+ XFREE(MTYPE_TEST, a[1]);
+ XFREE(MTYPE_TEST, a[0]);
+ /* alloc == 0, cache can become valid again on next request */
+ }
+
+ printf("calloc and realloc\n\n");
+ /* check calloc + realloc */
+ for (i = 0; i < TIMES; i++) {
+ printf("calloc a0 1024\n");
+ a[0] = XCALLOC(MTYPE_TEST, 1024);
+ memset(a[0], 1, 1024 / 2);
+
+ printf("calloc 1 1024\n");
+ a[1] = XCALLOC(MTYPE_TEST, 1024);
+ memset(a[1], 1, 1024 / 2);
+
+ printf("realloc 0 1024\n");
+ a[3] = XREALLOC(MTYPE_TEST, a[0], 2048); /* invalidate cache */
+ if (a[3] != NULL)
+ a[0] = a[3];
+ memset(a[0], 1, 1024);
+
+ printf("calloc 2 512\n");
+ a[2] = XCALLOC(MTYPE_TEST, 512);
+ memset(a[2], 1, 512);
+
+ printf("free 1 0 2\n");
+ XFREE(MTYPE_TEST, a[1]);
+ XFREE(MTYPE_TEST, a[0]);
+ XFREE(MTYPE_TEST, a[2]);
+ /* alloc == 0, cache valid next request */
+ }
+ return 0;
}
diff --git a/tests/lib/test_nexthop_iter.c b/tests/lib/test_nexthop_iter.c
index 250379329..8d3e3c509 100644
--- a/tests/lib/test_nexthop_iter.c
+++ b/tests/lib/test_nexthop_iter.c
@@ -30,139 +30,119 @@
struct thread_master *master;
static int verbose;
-static void
-str_append(char **buf, const char *repr)
+static void str_append(char **buf, const char *repr)
{
- if (*buf)
- {
- *buf = realloc(*buf, strlen(*buf) + strlen(repr) + 1);
- assert(*buf);
- strncpy((*buf) + strlen(*buf), repr, strlen(repr) + 1);
- }
- else
- {
- *buf = strdup(repr);
- assert(*buf);
- }
+ if (*buf) {
+ *buf = realloc(*buf, strlen(*buf) + strlen(repr) + 1);
+ assert(*buf);
+ strncpy((*buf) + strlen(*buf), repr, strlen(repr) + 1);
+ } else {
+ *buf = strdup(repr);
+ assert(*buf);
+ }
}
-static void
-str_appendf(char **buf, const char *format, ...)
+static void str_appendf(char **buf, const char *format, ...)
{
- va_list ap;
- int rv;
- char *pbuf;
+ va_list ap;
+ int rv;
+ char *pbuf;
- va_start(ap, format);
- rv = vasprintf(&pbuf, format, ap);
- va_end(ap);
- assert(rv >= 0);
+ va_start(ap, format);
+ rv = vasprintf(&pbuf, format, ap);
+ va_end(ap);
+ assert(rv >= 0);
- str_append(buf, pbuf);
- free(pbuf);
+ str_append(buf, pbuf);
+ free(pbuf);
}
/* This structure contains a nexthop chain
* and its expected representation */
-struct nexthop_chain
-{
- /* Head of the chain */
- struct nexthop *head;
- /* Last nexthop in top chain */
- struct nexthop *current_top;
- /* Last nexthop in current recursive chain */
- struct nexthop *current_recursive;
- /* Expected string representation. */
- char *repr;
+struct nexthop_chain {
+ /* Head of the chain */
+ struct nexthop *head;
+ /* Last nexthop in top chain */
+ struct nexthop *current_top;
+ /* Last nexthop in current recursive chain */
+ struct nexthop *current_recursive;
+ /* Expected string representation. */
+ char *repr;
};
-static struct nexthop_chain*
-nexthop_chain_new(void)
+static struct nexthop_chain *nexthop_chain_new(void)
{
- struct nexthop_chain *rv;
+ struct nexthop_chain *rv;
- rv = calloc(sizeof(*rv), 1);
- assert(rv);
- return rv;
+ rv = calloc(sizeof(*rv), 1);
+ assert(rv);
+ return rv;
}
-static void
-nexthop_chain_add_top(struct nexthop_chain *nc)
+static void nexthop_chain_add_top(struct nexthop_chain *nc)
{
- struct nexthop *nh;
-
- nh = calloc(sizeof(*nh), 1);
- assert(nh);
-
- if (nc->head)
- {
- nc->current_top->next = nh;
- nh->prev = nc->current_top;
- nc->current_top = nh;
- }
- else
- {
- nc->head = nc->current_top = nh;
- }
- nc->current_recursive = NULL;
- str_appendf(&nc->repr, "%p\n", nh);
+ struct nexthop *nh;
+
+ nh = calloc(sizeof(*nh), 1);
+ assert(nh);
+
+ if (nc->head) {
+ nc->current_top->next = nh;
+ nh->prev = nc->current_top;
+ nc->current_top = nh;
+ } else {
+ nc->head = nc->current_top = nh;
+ }
+ nc->current_recursive = NULL;
+ str_appendf(&nc->repr, "%p\n", nh);
}
-static void
-nexthop_chain_add_recursive(struct nexthop_chain *nc)
+static void nexthop_chain_add_recursive(struct nexthop_chain *nc)
{
- struct nexthop *nh;
-
- nh = calloc(sizeof(*nh), 1);
- assert(nh);
-
- assert(nc->current_top);
- if (nc->current_recursive)
- {
- nc->current_recursive->next = nh;
- nh->prev = nc->current_recursive;
- nc->current_recursive = nh;
- }
- else
- {
- SET_FLAG(nc->current_top->flags, NEXTHOP_FLAG_RECURSIVE);
- nc->current_top->resolved = nh;
- nc->current_recursive = nh;
- }
- str_appendf(&nc->repr, " %p\n", nh);
+ struct nexthop *nh;
+
+ nh = calloc(sizeof(*nh), 1);
+ assert(nh);
+
+ assert(nc->current_top);
+ if (nc->current_recursive) {
+ nc->current_recursive->next = nh;
+ nh->prev = nc->current_recursive;
+ nc->current_recursive = nh;
+ } else {
+ SET_FLAG(nc->current_top->flags, NEXTHOP_FLAG_RECURSIVE);
+ nc->current_top->resolved = nh;
+ nc->current_recursive = nh;
+ }
+ str_appendf(&nc->repr, " %p\n", nh);
}
-static void
-nexthop_chain_clear(struct nexthop_chain *nc)
+static void nexthop_chain_clear(struct nexthop_chain *nc)
{
- struct nexthop *tcur, *tnext;
-
- for (tcur = nc->head; tcur; tcur = tnext)
- {
- tnext = tcur->next;
- if (CHECK_FLAG(tcur->flags, NEXTHOP_FLAG_RECURSIVE))
- {
- struct nexthop *rcur, *rnext;
- for (rcur = tcur->resolved; rcur; rcur = rnext)
- {
- rnext = rcur->next;
- free(rcur);
- }
- }
- free(tcur);
- }
- nc->head = nc->current_top = nc->current_recursive = NULL;
- free(nc->repr);
- nc->repr = NULL;
+ struct nexthop *tcur, *tnext;
+
+ for (tcur = nc->head; tcur; tcur = tnext) {
+ tnext = tcur->next;
+ if (CHECK_FLAG(tcur->flags, NEXTHOP_FLAG_RECURSIVE)) {
+ struct nexthop *rcur, *rnext;
+ for (rcur = tcur->resolved; rcur; rcur = rnext) {
+ rnext = rcur->next;
+ free(rcur);
+ }
+ }
+ free(tcur);
+ }
+ nc->head = nc->current_top = nc->current_recursive = NULL;
+ free(nc->repr);
+ nc->repr = NULL;
}
-static void
-nexthop_chain_free(struct nexthop_chain *nc)
+static void nexthop_chain_free(struct nexthop_chain *nc)
{
- if (!nc)
- return;
- nexthop_chain_clear(nc);
- free(nc);
+ if (!nc)
+ return;
+ nexthop_chain_clear(nc);
+ free(nc);
}
/* This function builds a string representation of
@@ -171,25 +151,24 @@ nexthop_chain_free(struct nexthop_chain *nc)
* correctly over the nexthop chain by comparing the
* generated representation with the expected representation.
*/
-static void
-nexthop_chain_verify_iter(struct nexthop_chain *nc)
+static void nexthop_chain_verify_iter(struct nexthop_chain *nc)
{
- struct nexthop *nh, *tnh;
- int recursing;
- char *repr = NULL;
-
- for (ALL_NEXTHOPS_RO(nc->head, nh, tnh, recursing))
- {
- if (recursing)
- str_appendf(&repr, " %p\n", nh);
- else
- str_appendf(&repr, "%p\n", nh);
- }
-
- if (repr && verbose)
- printf("===\n%s", repr);
- assert((!repr && !nc->repr) || (repr && nc->repr && !strcmp(repr, nc->repr)));
- free(repr);
+ struct nexthop *nh, *tnh;
+ int recursing;
+ char *repr = NULL;
+
+ for (ALL_NEXTHOPS_RO(nc->head, nh, tnh, recursing)) {
+ if (recursing)
+ str_appendf(&repr, " %p\n", nh);
+ else
+ str_appendf(&repr, "%p\n", nh);
+ }
+
+ if (repr && verbose)
+ printf("===\n%s", repr);
+ assert((!repr && !nc->repr)
+ || (repr && nc->repr && !strcmp(repr, nc->repr)));
+ free(repr);
}
/* This test run builds a simple nexthop chain
@@ -197,95 +176,91 @@ nexthop_chain_verify_iter(struct nexthop_chain *nc)
* the iterator works correctly in each stage along
* the way.
*/
-static void
-test_run_first(void)
+static void test_run_first(void)
{
- struct nexthop_chain *nc;
+ struct nexthop_chain *nc;
- nc = nexthop_chain_new();
- nexthop_chain_verify_iter(nc);
+ nc = nexthop_chain_new();
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_top(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_top(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_top(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_top(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_recursive(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_recursive(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_recursive(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_recursive(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_top(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_top(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_top(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_top(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_top(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_top(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_recursive(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_recursive(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_recursive(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_recursive(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_add_recursive(nc);
- nexthop_chain_verify_iter(nc);
+ nexthop_chain_add_recursive(nc);
+ nexthop_chain_verify_iter(nc);
- nexthop_chain_free(nc);
+ nexthop_chain_free(nc);
}
/* This test run builds numerous random
* nexthop chain configurations and verifies
* that the iterator correctly progresses
* through each. */
-static void
-test_run_prng(void)
+static void test_run_prng(void)
{
- struct nexthop_chain *nc;
- struct prng *prng;
- int i;
-
- nc = nexthop_chain_new();
- prng = prng_new(0);
-
- for (i = 0; i < 1000000; i++)
- {
- switch (prng_rand(prng) % 10)
- {
- case 0:
- nexthop_chain_clear(nc);
- break;
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- nexthop_chain_add_top(nc);
- break;
- case 6:
- case 7:
- case 8:
- case 9:
- if (nc->current_top)
- nexthop_chain_add_recursive(nc);
- break;
- }
- nexthop_chain_verify_iter(nc);
- }
- nexthop_chain_free(nc);
- prng_free(prng);
+ struct nexthop_chain *nc;
+ struct prng *prng;
+ int i;
+
+ nc = nexthop_chain_new();
+ prng = prng_new(0);
+
+ for (i = 0; i < 1000000; i++) {
+ switch (prng_rand(prng) % 10) {
+ case 0:
+ nexthop_chain_clear(nc);
+ break;
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ nexthop_chain_add_top(nc);
+ break;
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ if (nc->current_top)
+ nexthop_chain_add_recursive(nc);
+ break;
+ }
+ nexthop_chain_verify_iter(nc);
+ }
+ nexthop_chain_free(nc);
+ prng_free(prng);
}
int main(int argc, char **argv)
{
- if (argc >= 2 && !strcmp("-v", argv[1]))
- verbose = 1;
- test_run_first();
- printf("Simple test passed.\n");
- test_run_prng();
- printf("PRNG test passed.\n");
+ if (argc >= 2 && !strcmp("-v", argv[1]))
+ verbose = 1;
+ test_run_first();
+ printf("Simple test passed.\n");
+ test_run_prng();
+ printf("PRNG test passed.\n");
}
diff --git a/tests/lib/test_privs.c b/tests/lib/test_privs.c
index c6ccc28e7..57b5593eb 100644
--- a/tests/lib/test_privs.c
+++ b/tests/lib/test_privs.c
@@ -27,127 +27,115 @@
#include "memory.h"
#include "memory_vty.h"
-zebra_capabilities_t _caps_p [] =
-{
- ZCAP_NET_RAW,
- ZCAP_BIND,
- ZCAP_NET_ADMIN,
- ZCAP_DAC_OVERRIDE,
+zebra_capabilities_t _caps_p[] = {
+ ZCAP_NET_RAW, ZCAP_BIND, ZCAP_NET_ADMIN, ZCAP_DAC_OVERRIDE,
};
-struct zebra_privs_t test_privs =
-{
+struct zebra_privs_t test_privs = {
#if defined(FRR_USER) && defined(FRR_GROUP)
- .user = FRR_USER,
- .group = FRR_GROUP,
+ .user = FRR_USER,
+ .group = FRR_GROUP,
#endif
#if defined(VTY_GROUP)
- .vty_group = VTY_GROUP,
+ .vty_group = VTY_GROUP,
#endif
- .caps_p = _caps_p,
- .cap_num_p = sizeof(_caps_p)/sizeof(_caps_p[0]),
- .cap_num_i = 0
-};
+ .caps_p = _caps_p,
+ .cap_num_p = sizeof(_caps_p) / sizeof(_caps_p[0]),
+ .cap_num_i = 0};
-struct option longopts[] =
-{
- { "help", no_argument, NULL, 'h'},
- { "user", required_argument, NULL, 'u'},
- { "group", required_argument, NULL, 'g'},
- { 0 }
-};
+struct option longopts[] = {{"help", no_argument, NULL, 'h'},
+ {"user", required_argument, NULL, 'u'},
+ {"group", required_argument, NULL, 'g'},
+ {0}};
/* Help information display. */
-static void
-usage (char *progname, int status)
+static void usage(char *progname, int status)
{
- if (status != 0)
- fprintf (stderr, "Try `%s --help' for more information.\n", progname);
- else
- {
- printf ("Usage : %s [OPTION...]\n\
+ if (status != 0)
+ fprintf(stderr, "Try `%s --help' for more information.\n",
+ progname);
+ else {
+ printf("Usage : %s [OPTION...]\n\
Daemon which does 'slow' things.\n\n\
-u, --user User to run as\n\
-g, --group Group to run as\n\
-h, --help Display this help and exit\n\
\n\
-Report bugs to %s\n", progname, FRR_BUG_ADDRESS);
- }
- exit (status);
+Report bugs to %s\n",
+ progname, FRR_BUG_ADDRESS);
+ }
+ exit(status);
}
struct thread_master *master;
/* main routine. */
-int
-main (int argc, char **argv)
+int main(int argc, char **argv)
{
- char *p;
- char *progname;
- struct zprivs_ids_t ids;
-
- /* Set umask before anything for security */
- umask (0027);
-
- /* get program name */
- progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
-
- while (1)
- {
- int opt;
-
- opt = getopt_long (argc, argv, "hu:g:", longopts, 0);
-
- if (opt == EOF)
- break;
-
- switch (opt)
- {
- case 0:
- break;
- case 'u':
- test_privs.user = optarg;
- break;
- case 'g':
- test_privs.group = optarg;
- break;
- case 'h':
- usage (progname, 0);
- break;
- default:
- usage (progname, 1);
- break;
+ char *p;
+ char *progname;
+ struct zprivs_ids_t ids;
+
+ /* Set umask before anything for security */
+ umask(0027);
+
+ /* get program name */
+ progname = ((p = strrchr(argv[0], '/')) ? ++p : argv[0]);
+
+ while (1) {
+ int opt;
+
+ opt = getopt_long(argc, argv, "hu:g:", longopts, 0);
+
+ if (opt == EOF)
+ break;
+
+ switch (opt) {
+ case 0:
+ break;
+ case 'u':
+ test_privs.user = optarg;
+ break;
+ case 'g':
+ test_privs.group = optarg;
+ break;
+ case 'h':
+ usage(progname, 0);
+ break;
+ default:
+ usage(progname, 1);
+ break;
+ }
}
- }
-
- /* Library inits. */
- memory_init ();
- zprivs_init (&test_privs);
-
-#define PRIV_STATE() \
- ((test_privs.current_state() == ZPRIVS_RAISED) ? "Raised" : "Lowered")
-
- printf ("%s\n", PRIV_STATE());
- test_privs.change(ZPRIVS_RAISE);
-
- printf ("%s\n", PRIV_STATE());
- test_privs.change(ZPRIVS_LOWER);
-
- printf ("%s\n", PRIV_STATE());
- zprivs_get_ids (&ids);
-
- /* terminate privileges */
- zprivs_terminate(&test_privs);
-
- /* but these should continue to work... */
- printf ("%s\n", PRIV_STATE());
- test_privs.change(ZPRIVS_RAISE);
-
- printf ("%s\n", PRIV_STATE());
- test_privs.change(ZPRIVS_LOWER);
-
- printf ("%s\n", PRIV_STATE());
- zprivs_get_ids (&ids);
-
- printf ("terminating\n");
- return 0;
+
+ /* Library inits. */
+ memory_init();
+ zprivs_init(&test_privs);
+
+#define PRIV_STATE() \
+ ((test_privs.current_state() == ZPRIVS_RAISED) ? "Raised" : "Lowered")
+
+ printf("%s\n", PRIV_STATE());
+ test_privs.change(ZPRIVS_RAISE);
+
+ printf("%s\n", PRIV_STATE());
+ test_privs.change(ZPRIVS_LOWER);
+
+ printf("%s\n", PRIV_STATE());
+ zprivs_get_ids(&ids);
+
+ /* terminate privileges */
+ zprivs_terminate(&test_privs);
+
+ /* but these should continue to work... */
+ printf("%s\n", PRIV_STATE());
+ test_privs.change(ZPRIVS_RAISE);
+
+ printf("%s\n", PRIV_STATE());
+ test_privs.change(ZPRIVS_LOWER);
+
+ printf("%s\n", PRIV_STATE());
+ zprivs_get_ids(&ids);
+
+ printf("terminating\n");
+ return 0;
}
diff --git a/tests/lib/test_segv.c b/tests/lib/test_segv.c
index dfc9d5f48..76e0361c7 100644
--- a/tests/lib/test_segv.c
+++ b/tests/lib/test_segv.c
@@ -29,32 +29,29 @@
#include "lib/log.h"
#include "lib/memory.h"
-struct quagga_signal_t sigs[] =
-{
-};
+struct quagga_signal_t sigs[] = {};
struct thread_master *master;
-static int
-threadfunc (struct thread *thread)
+static int threadfunc(struct thread *thread)
{
- int *null = NULL;
- *null += 1;
- return 0;
+ int *null = NULL;
+ *null += 1;
+ return 0;
}
-int
-main (void)
+int main(void)
{
- master = thread_master_create ();
- signal_init (master, array_size(sigs), sigs);
+ master = thread_master_create();
+ signal_init(master, array_size(sigs), sigs);
- openzlog("testsegv", "NONE", 0, LOG_CONS | LOG_NDELAY | LOG_PID, LOG_DAEMON);
- zlog_set_level(ZLOG_DEST_SYSLOG, ZLOG_DISABLED);
- zlog_set_level(ZLOG_DEST_STDOUT, LOG_DEBUG);
- zlog_set_level(ZLOG_DEST_MONITOR, ZLOG_DISABLED);
+ openzlog("testsegv", "NONE", 0, LOG_CONS | LOG_NDELAY | LOG_PID,
+ LOG_DAEMON);
+ zlog_set_level(ZLOG_DEST_SYSLOG, ZLOG_DISABLED);
+ zlog_set_level(ZLOG_DEST_STDOUT, LOG_DEBUG);
+ zlog_set_level(ZLOG_DEST_MONITOR, ZLOG_DISABLED);
- thread_execute (master, threadfunc, 0, 0);
+ thread_execute(master, threadfunc, 0, 0);
- exit (0);
+ exit(0);
}
diff --git a/tests/lib/test_sig.c b/tests/lib/test_sig.c
index 10bce2303..f8749c140 100644
--- a/tests/lib/test_sig.c
+++ b/tests/lib/test_sig.c
@@ -1,4 +1,4 @@
-/*
+/*
* This file is part of Quagga.
*
* Quagga is free software; you can redistribute it and/or modify it
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with Quagga; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -22,56 +22,50 @@
#include "lib/log.h"
#include "lib/memory.h"
-static void
-sighup (void)
+static void sighup(void)
{
- printf ("processed hup\n");
+ printf("processed hup\n");
}
-static void
-sigusr1 (void)
+static void sigusr1(void)
{
- printf ("processed usr1\n");
+ printf("processed usr1\n");
}
-static void
-sigusr2 (void)
+static void sigusr2(void)
{
- printf ("processed usr2\n");
+ printf("processed usr2\n");
}
-struct quagga_signal_t sigs[] =
-{
- {
- .signal = SIGHUP,
- .handler = &sighup,
- },
- {
- .signal = SIGUSR1,
- .handler = &sigusr1,
- },
- {
- .signal = SIGUSR2,
- .handler = &sigusr2,
- }
-};
+struct quagga_signal_t sigs[] = {{
+ .signal = SIGHUP,
+ .handler = &sighup,
+ },
+ {
+ .signal = SIGUSR1,
+ .handler = &sigusr1,
+ },
+ {
+ .signal = SIGUSR2,
+ .handler = &sigusr2,
+ }};
struct thread_master *master;
struct thread t;
-int
-main (void)
+int main(void)
{
- master = thread_master_create ();
- signal_init (master, array_size(sigs), sigs);
+ master = thread_master_create();
+ signal_init(master, array_size(sigs), sigs);
- openzlog("testsig", "NONE", 0, LOG_CONS | LOG_NDELAY | LOG_PID, LOG_DAEMON);
- zlog_set_level(ZLOG_DEST_SYSLOG, ZLOG_DISABLED);
- zlog_set_level(ZLOG_DEST_STDOUT, LOG_DEBUG);
- zlog_set_level(ZLOG_DEST_MONITOR, ZLOG_DISABLED);
+ openzlog("testsig", "NONE", 0, LOG_CONS | LOG_NDELAY | LOG_PID,
+ LOG_DAEMON);
+ zlog_set_level(ZLOG_DEST_SYSLOG, ZLOG_DISABLED);
+ zlog_set_level(ZLOG_DEST_STDOUT, LOG_DEBUG);
+ zlog_set_level(ZLOG_DEST_MONITOR, ZLOG_DISABLED);
- while (thread_fetch (master, &t))
- thread_call (&t);
+ while (thread_fetch(master, &t))
+ thread_call(&t);
- exit (0);
+ exit(0);
}
diff --git a/tests/lib/test_srcdest_table.c b/tests/lib/test_srcdest_table.c
index cfc2deb8d..6c9c0c725 100644
--- a/tests/lib/test_srcdest_table.c
+++ b/tests/lib/test_srcdest_table.c
@@ -48,410 +48,391 @@ struct thread_master *master;
/* This structure is copied from lib/srcdest_table.c to which it is
* private as far as other parts of Quagga are concerned.
*/
-struct srcdest_rnode
-{
- /* must be first in structure for casting to/from route_node */
- ROUTE_NODE_FIELDS;
+struct srcdest_rnode {
+ /* must be first in structure for casting to/from route_node */
+ ROUTE_NODE_FIELDS;
- struct route_table *src_table;
+ struct route_table *src_table;
};
-struct test_state
-{
- struct route_table *table;
- struct hash *log;
+struct test_state {
+ struct route_table *table;
+ struct hash *log;
};
-static char *
-format_srcdest(const struct prefix_ipv6 *dst_p,
- const struct prefix_ipv6 *src_p)
+static char *format_srcdest(const struct prefix_ipv6 *dst_p,
+ const struct prefix_ipv6 *src_p)
{
- char dst_str[BUFSIZ];
- char src_str[BUFSIZ];
- char *rv;
- int ec;
-
- prefix2str((const struct prefix*)dst_p, dst_str, sizeof(dst_str));
- if (src_p && src_p->prefixlen)
- prefix2str((const struct prefix*)src_p, src_str, sizeof(src_str));
- else
- src_str[0] = '\0';
-
- ec = asprintf(&rv, "%s%s%s", dst_str,
- (src_str[0] != '\0') ? " from " : "",
- src_str);
-
- assert(ec > 0);
- return rv;
+ char dst_str[BUFSIZ];
+ char src_str[BUFSIZ];
+ char *rv;
+ int ec;
+
+ prefix2str((const struct prefix *)dst_p, dst_str, sizeof(dst_str));
+ if (src_p && src_p->prefixlen)
+ prefix2str((const struct prefix *)src_p, src_str,
+ sizeof(src_str));
+ else
+ src_str[0] = '\0';
+
+ ec = asprintf(&rv, "%s%s%s", dst_str,
+ (src_str[0] != '\0') ? " from " : "", src_str);
+
+ assert(ec > 0);
+ return rv;
}
static unsigned int log_key(void *data)
{
- struct prefix *hash_entry = data;
- struct prefix_ipv6 *dst_p = (struct prefix_ipv6*) &hash_entry[0];
- struct prefix_ipv6 *src_p = (struct prefix_ipv6*) &hash_entry[1];
- unsigned int hash = 0;
- unsigned int i;
-
- hash = (hash * 33) ^ (unsigned int)dst_p->prefixlen;
- for (i = 0; i < 4; i++)
- hash = (hash * 33) ^ (unsigned int)dst_p->prefix.s6_addr32[i];
-
- hash = (hash * 33) ^ (unsigned int)src_p->prefixlen;
- if (src_p->prefixlen)
- for (i = 0; i < 4; i++)
- hash = (hash * 33) ^ (unsigned int)src_p->prefix.s6_addr32[i];
-
- return hash;
+ struct prefix *hash_entry = data;
+ struct prefix_ipv6 *dst_p = (struct prefix_ipv6 *)&hash_entry[0];
+ struct prefix_ipv6 *src_p = (struct prefix_ipv6 *)&hash_entry[1];
+ unsigned int hash = 0;
+ unsigned int i;
+
+ hash = (hash * 33) ^ (unsigned int)dst_p->prefixlen;
+ for (i = 0; i < 4; i++)
+ hash = (hash * 33) ^ (unsigned int)dst_p->prefix.s6_addr32[i];
+
+ hash = (hash * 33) ^ (unsigned int)src_p->prefixlen;
+ if (src_p->prefixlen)
+ for (i = 0; i < 4; i++)
+ hash = (hash * 33)
+ ^ (unsigned int)src_p->prefix.s6_addr32[i];
+
+ return hash;
}
-static int
-log_cmp(const void *a, const void *b)
+static int log_cmp(const void *a, const void *b)
{
- if (a == NULL && b != NULL)
- return 0;
- if (b == NULL && a != NULL)
- return 0;
+ if (a == NULL && b != NULL)
+ return 0;
+ if (b == NULL && a != NULL)
+ return 0;
- return !memcmp(a, b, 2 * sizeof(struct prefix));
+ return !memcmp(a, b, 2 * sizeof(struct prefix));
}
-static void
-log_free(void *data)
+static void log_free(void *data)
{
- XFREE(MTYPE_TMP, data);
+ XFREE(MTYPE_TMP, data);
}
-static void *
-log_alloc(void *data)
+static void *log_alloc(void *data)
{
- void *rv = XMALLOC(MTYPE_TMP, 2 * sizeof(struct prefix));
- memcpy(rv, data, 2 * sizeof(struct prefix));
- return rv;
+ void *rv = XMALLOC(MTYPE_TMP, 2 * sizeof(struct prefix));
+ memcpy(rv, data, 2 * sizeof(struct prefix));
+ return rv;
}
-static struct test_state *
-test_state_new(void)
+static struct test_state *test_state_new(void)
{
- struct test_state *rv;
+ struct test_state *rv;
- rv = XCALLOC(MTYPE_TMP, sizeof(*rv));
- assert(rv);
+ rv = XCALLOC(MTYPE_TMP, sizeof(*rv));
+ assert(rv);
- rv->table = srcdest_table_init();
- assert(rv->table);
+ rv->table = srcdest_table_init();
+ assert(rv->table);
- rv->log = hash_create(log_key, log_cmp);
- return rv;
+ rv->log = hash_create(log_key, log_cmp);
+ return rv;
}
-static void
-test_state_free(struct test_state *test)
+static void test_state_free(struct test_state *test)
{
- route_table_finish(test->table);
- hash_clean(test->log, log_free);
- hash_free(test->log);
- XFREE(MTYPE_TMP, test);
+ route_table_finish(test->table);
+ hash_clean(test->log, log_free);
+ hash_free(test->log);
+ XFREE(MTYPE_TMP, test);
}
-static void
-test_state_add_route(struct test_state *test,
- struct prefix_ipv6 *dst_p,
- struct prefix_ipv6 *src_p)
+static void test_state_add_route(struct test_state *test,
+ struct prefix_ipv6 *dst_p,
+ struct prefix_ipv6 *src_p)
{
- struct route_node *rn = srcdest_rnode_get(
- test->table, (struct prefix*)dst_p, src_p
- );
- struct prefix hash_entry[2];
-
- memset(hash_entry, 0, sizeof(hash_entry));
- memcpy(&hash_entry[0], dst_p, sizeof(*dst_p));
- memcpy(&hash_entry[1], src_p, sizeof(*src_p));
-
- if (rn->info) {
- route_unlock_node(rn);
- assert(hash_lookup(test->log, hash_entry) != NULL);
- return;
- } else {
- assert(hash_lookup(test->log, hash_entry) == NULL);
- }
-
- rn->info = (void*) 0xdeadbeef;
- hash_get(test->log, hash_entry, log_alloc);
+ struct route_node *rn =
+ srcdest_rnode_get(test->table, (struct prefix *)dst_p, src_p);
+ struct prefix hash_entry[2];
+
+ memset(hash_entry, 0, sizeof(hash_entry));
+ memcpy(&hash_entry[0], dst_p, sizeof(*dst_p));
+ memcpy(&hash_entry[1], src_p, sizeof(*src_p));
+
+ if (rn->info) {
+ route_unlock_node(rn);
+ assert(hash_lookup(test->log, hash_entry) != NULL);
+ return;
+ } else {
+ assert(hash_lookup(test->log, hash_entry) == NULL);
+ }
+
+ rn->info = (void *)0xdeadbeef;
+ hash_get(test->log, hash_entry, log_alloc);
};
-static void
-test_state_del_route(struct test_state *test,
- struct prefix_ipv6 *dst_p,
- struct prefix_ipv6 *src_p)
+static void test_state_del_route(struct test_state *test,
+ struct prefix_ipv6 *dst_p,
+ struct prefix_ipv6 *src_p)
{
- struct route_node *rn = srcdest_rnode_lookup(
- test->table, (struct prefix*)dst_p, src_p
- );
- struct prefix hash_entry[2];
-
- memset(hash_entry, 0, sizeof(hash_entry));
- memcpy(&hash_entry[0], dst_p, sizeof(*dst_p));
- memcpy(&hash_entry[1], src_p, sizeof(*src_p));
-
- if (!rn) {
- assert(!hash_lookup(test->log, hash_entry));
- return;
- }
-
- assert(rn->info == (void*)0xdeadbeef);
- rn->info = NULL;
- route_unlock_node(rn);
- route_unlock_node(rn);
-
- struct prefix *hash_entry_intern = hash_release(test->log, hash_entry);
- assert(hash_entry_intern != NULL);
- XFREE(MTYPE_TMP, hash_entry_intern);
+ struct route_node *rn = srcdest_rnode_lookup(
+ test->table, (struct prefix *)dst_p, src_p);
+ struct prefix hash_entry[2];
+
+ memset(hash_entry, 0, sizeof(hash_entry));
+ memcpy(&hash_entry[0], dst_p, sizeof(*dst_p));
+ memcpy(&hash_entry[1], src_p, sizeof(*src_p));
+
+ if (!rn) {
+ assert(!hash_lookup(test->log, hash_entry));
+ return;
+ }
+
+ assert(rn->info == (void *)0xdeadbeef);
+ rn->info = NULL;
+ route_unlock_node(rn);
+ route_unlock_node(rn);
+
+ struct prefix *hash_entry_intern = hash_release(test->log, hash_entry);
+ assert(hash_entry_intern != NULL);
+ XFREE(MTYPE_TMP, hash_entry_intern);
}
-static void
-verify_log(struct hash_backet* backet, void *arg)
+static void verify_log(struct hash_backet *backet, void *arg)
{
- struct test_state *test = arg;
- struct prefix *hash_entry = backet->data;
- struct prefix *dst_p = &hash_entry[0];
- struct prefix_ipv6 *src_p = (struct prefix_ipv6*)&hash_entry[1];
- struct route_node *rn = srcdest_rnode_lookup(test->table, dst_p, src_p);
+ struct test_state *test = arg;
+ struct prefix *hash_entry = backet->data;
+ struct prefix *dst_p = &hash_entry[0];
+ struct prefix_ipv6 *src_p = (struct prefix_ipv6 *)&hash_entry[1];
+ struct route_node *rn = srcdest_rnode_lookup(test->table, dst_p, src_p);
- assert(rn);
- assert(rn->info == (void*)0xdeadbeef);
+ assert(rn);
+ assert(rn->info == (void *)0xdeadbeef);
- route_unlock_node(rn);
+ route_unlock_node(rn);
}
-static void
-dump_log(struct hash_backet* backet, void *arg)
+static void dump_log(struct hash_backet *backet, void *arg)
{
- struct prefix *hash_entry = backet->data;
- struct prefix_ipv6 *dst_p = (struct prefix_ipv6*)&hash_entry[0];
- struct prefix_ipv6 *src_p = (struct prefix_ipv6*)&hash_entry[1];
- char *route_id = format_srcdest(dst_p, src_p);
+ struct prefix *hash_entry = backet->data;
+ struct prefix_ipv6 *dst_p = (struct prefix_ipv6 *)&hash_entry[0];
+ struct prefix_ipv6 *src_p = (struct prefix_ipv6 *)&hash_entry[1];
+ char *route_id = format_srcdest(dst_p, src_p);
- fprintf(stderr, " %s\n", route_id);
- free(route_id);
+ fprintf(stderr, " %s\n", route_id);
+ free(route_id);
}
-static void
-test_dump(struct test_state *test)
+static void test_dump(struct test_state *test)
{
- fprintf(stderr, "Contents of hash table:\n");
- hash_iterate(test->log, dump_log, test);
- fprintf(stderr, "\n");
+ fprintf(stderr, "Contents of hash table:\n");
+ hash_iterate(test->log, dump_log, test);
+ fprintf(stderr, "\n");
}
-static void
-test_failed(struct test_state *test, const char *message,
- struct prefix_ipv6 *dst_p, struct prefix_ipv6 *src_p)
+static void test_failed(struct test_state *test, const char *message,
+ struct prefix_ipv6 *dst_p, struct prefix_ipv6 *src_p)
{
- char *route_id = format_srcdest(dst_p, src_p);
+ char *route_id = format_srcdest(dst_p, src_p);
- fprintf(stderr, "Test failed. Error: %s\n", message);
- fprintf(stderr, "Route in question: %s\n", route_id);
- free(route_id);
+ fprintf(stderr, "Test failed. Error: %s\n", message);
+ fprintf(stderr, "Route in question: %s\n", route_id);
+ free(route_id);
- test_dump(test);
- assert(3 == 4);
+ test_dump(test);
+ assert(3 == 4);
}
-static void
-test_state_verify(struct test_state *test)
+static void test_state_verify(struct test_state *test)
{
- struct route_node *rn;
- struct prefix hash_entry[2];
-
- memset(hash_entry, 0, sizeof(hash_entry));
-
- /* Verify that there are no elements in the table which have never
- * been added */
- for (rn = route_top(test->table); rn; rn = srcdest_route_next(rn))
- {
- struct prefix_ipv6 *dst_p, *src_p;
-
- /* While we are iterating, we hold a lock on the current route_node,
- * so all the lock counts we check for take that into account; in idle
- * state all the numbers will be exactly one less.
- *
- * Also this makes quite some assumptions based on the current
- * implementation details of route_table and srcdest_table - another
- * valid implementation might trigger assertions here.
- */
-
- if (rnode_is_dstnode(rn))
- {
- struct srcdest_rnode *srn = (struct srcdest_rnode *)rn;
- unsigned int expected_lock = 1; /* We are in the loop */
-
- if (rn->info != NULL) /* The route node is not internal */
- expected_lock++;
- if (srn->src_table != NULL) /* There's a source table associated with rn */
- expected_lock++;
-
- if (rn->lock != expected_lock)
- test_failed(test, "Dest rnode lock count doesn't match expected count!",
- (struct prefix_ipv6*)&rn->p, NULL);
- }
- else
- {
- unsigned int expected_lock = 1; /* We are in the loop */
-
- if (rn->info != NULL) /* The route node is not internal */
- expected_lock++;
-
- if (rn->lock != expected_lock)
- {
- struct prefix_ipv6 *dst_p, *src_p;
- srcdest_rnode_prefixes(rn, (struct prefix**)&dst_p,
- (struct prefix**)&src_p);
-
- test_failed(test, "Src rnode lock count doesn't match expected count!",
- dst_p, src_p);
- }
- }
-
- if (!rn->info)
- continue;
-
- assert(rn->info == (void*)0xdeadbeef);
-
- srcdest_rnode_prefixes(rn, (struct prefix**)&dst_p, (struct prefix**)&src_p);
- memcpy(&hash_entry[0], dst_p, sizeof(*dst_p));
- if (src_p)
- memcpy(&hash_entry[1], src_p, sizeof(*src_p));
- else
- memset(&hash_entry[1], 0, sizeof(hash_entry[1]));
-
- if (hash_lookup(test->log, hash_entry) == NULL)
- test_failed(test, "Route is missing in hash", dst_p, src_p);
- }
-
- /* Verify that all added elements are still in the table */
- hash_iterate(test->log, verify_log, test);
+ struct route_node *rn;
+ struct prefix hash_entry[2];
+
+ memset(hash_entry, 0, sizeof(hash_entry));
+
+ /* Verify that there are no elements in the table which have never
+ * been added */
+ for (rn = route_top(test->table); rn; rn = srcdest_route_next(rn)) {
+ struct prefix_ipv6 *dst_p, *src_p;
+
+ /* While we are iterating, we hold a lock on the current
+ * route_node,
+ * so all the lock counts we check for take that into account;
+ * in idle
+ * state all the numbers will be exactly one less.
+ *
+ * Also this makes quite some assumptions based on the current
+ * implementation details of route_table and srcdest_table -
+ * another
+ * valid implementation might trigger assertions here.
+ */
+
+ if (rnode_is_dstnode(rn)) {
+ struct srcdest_rnode *srn = (struct srcdest_rnode *)rn;
+ unsigned int expected_lock = 1; /* We are in the loop */
+
+ if (rn->info
+ != NULL) /* The route node is not internal */
+ expected_lock++;
+ if (srn->src_table != NULL) /* There's a source table
+ associated with rn */
+ expected_lock++;
+
+ if (rn->lock != expected_lock)
+ test_failed(
+ test,
+ "Dest rnode lock count doesn't match expected count!",
+ (struct prefix_ipv6 *)&rn->p, NULL);
+ } else {
+ unsigned int expected_lock = 1; /* We are in the loop */
+
+ if (rn->info
+ != NULL) /* The route node is not internal */
+ expected_lock++;
+
+ if (rn->lock != expected_lock) {
+ struct prefix_ipv6 *dst_p, *src_p;
+ srcdest_rnode_prefixes(
+ rn, (struct prefix **)&dst_p,
+ (struct prefix **)&src_p);
+
+ test_failed(
+ test,
+ "Src rnode lock count doesn't match expected count!",
+ dst_p, src_p);
+ }
+ }
+
+ if (!rn->info)
+ continue;
+
+ assert(rn->info == (void *)0xdeadbeef);
+
+ srcdest_rnode_prefixes(rn, (struct prefix **)&dst_p,
+ (struct prefix **)&src_p);
+ memcpy(&hash_entry[0], dst_p, sizeof(*dst_p));
+ if (src_p)
+ memcpy(&hash_entry[1], src_p, sizeof(*src_p));
+ else
+ memset(&hash_entry[1], 0, sizeof(hash_entry[1]));
+
+ if (hash_lookup(test->log, hash_entry) == NULL)
+ test_failed(test, "Route is missing in hash", dst_p,
+ src_p);
+ }
+
+ /* Verify that all added elements are still in the table */
+ hash_iterate(test->log, verify_log, test);
}
-static void
-get_rand_prefix(struct prng *prng, struct prefix_ipv6 *p)
+static void get_rand_prefix(struct prng *prng, struct prefix_ipv6 *p)
{
- int i;
+ int i;
- memset(p, 0, sizeof(*p));
+ memset(p, 0, sizeof(*p));
- for (i = 0; i < 4; i++)
- p->prefix.s6_addr32[i] = prng_rand(prng);
- p->prefixlen = prng_rand(prng) % 129;
- p->family = AF_INET6;
+ for (i = 0; i < 4; i++)
+ p->prefix.s6_addr32[i] = prng_rand(prng);
+ p->prefixlen = prng_rand(prng) % 129;
+ p->family = AF_INET6;
- apply_mask((struct prefix*)p);
+ apply_mask((struct prefix *)p);
}
-static void
-get_rand_prefix_pair(struct prng *prng, struct prefix_ipv6 *dst_p,
- struct prefix_ipv6 *src_p)
+static void get_rand_prefix_pair(struct prng *prng, struct prefix_ipv6 *dst_p,
+ struct prefix_ipv6 *src_p)
{
- get_rand_prefix(prng, dst_p);
- if ((prng_rand(prng) % 4) == 0)
- {
- get_rand_prefix(prng, src_p);
- if (src_p->prefixlen)
- return;
- }
-
- memset(src_p, 0, sizeof(*src_p));
+ get_rand_prefix(prng, dst_p);
+ if ((prng_rand(prng) % 4) == 0) {
+ get_rand_prefix(prng, src_p);
+ if (src_p->prefixlen)
+ return;
+ }
+
+ memset(src_p, 0, sizeof(*src_p));
}
-static void
-test_state_add_rand_route(struct test_state *test,
- struct prng *prng)
+static void test_state_add_rand_route(struct test_state *test,
+ struct prng *prng)
{
- struct prefix_ipv6 dst_p, src_p;
+ struct prefix_ipv6 dst_p, src_p;
- get_rand_prefix_pair(prng, &dst_p, &src_p);
- test_state_add_route(test, &dst_p, &src_p);
+ get_rand_prefix_pair(prng, &dst_p, &src_p);
+ test_state_add_route(test, &dst_p, &src_p);
}
-static void
-test_state_del_rand_route(struct test_state *test,
- struct prng *prng)
+static void test_state_del_rand_route(struct test_state *test,
+ struct prng *prng)
{
- struct prefix_ipv6 dst_p, src_p;
+ struct prefix_ipv6 dst_p, src_p;
- get_rand_prefix_pair(prng, &dst_p, &src_p);
- test_state_del_route(test, &dst_p, &src_p);
+ get_rand_prefix_pair(prng, &dst_p, &src_p);
+ test_state_del_route(test, &dst_p, &src_p);
}
-static void
-test_state_del_one_route(struct test_state *test,
- struct prng *prng)
+static void test_state_del_one_route(struct test_state *test, struct prng *prng)
{
- unsigned int which_route = prng_rand(prng) % test->log->count;
- struct route_node *rn;
- struct prefix *dst_p, *src_p;
- struct prefix_ipv6 dst6_p, src6_p;
-
- for (rn = route_top(test->table); rn; rn = srcdest_route_next(rn))
- {
- if (!rn->info)
- continue;
- if (!which_route) {
- route_unlock_node(rn);
- break;
- }
- which_route--;
- }
-
- assert(rn);
- srcdest_rnode_prefixes(rn, &dst_p, &src_p);
- memcpy(&dst6_p, dst_p, sizeof(dst6_p));
- if (src_p)
- memcpy(&src6_p, src_p, sizeof(src6_p));
- else
- memset(&src6_p, 0, sizeof(src6_p));
-
- test_state_del_route(test, &dst6_p, &src6_p);
+ unsigned int which_route = prng_rand(prng) % test->log->count;
+ struct route_node *rn;
+ struct prefix *dst_p, *src_p;
+ struct prefix_ipv6 dst6_p, src6_p;
+
+ for (rn = route_top(test->table); rn; rn = srcdest_route_next(rn)) {
+ if (!rn->info)
+ continue;
+ if (!which_route) {
+ route_unlock_node(rn);
+ break;
+ }
+ which_route--;
+ }
+
+ assert(rn);
+ srcdest_rnode_prefixes(rn, &dst_p, &src_p);
+ memcpy(&dst6_p, dst_p, sizeof(dst6_p));
+ if (src_p)
+ memcpy(&src6_p, src_p, sizeof(src6_p));
+ else
+ memset(&src6_p, 0, sizeof(src6_p));
+
+ test_state_del_route(test, &dst6_p, &src6_p);
}
-static void
-run_prng_test(void)
+static void run_prng_test(void)
{
- struct test_state *test = test_state_new();
- struct prng *prng = prng_new(0);
- size_t i;
-
- for (i = 0; i < 1000; i++)
- {
- switch (prng_rand(prng) % 10)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- test_state_add_rand_route(test, prng);
- break;
- case 5:
- case 6:
- case 7:
- test_state_del_one_route(test, prng);
- break;
- case 8:
- case 9:
- test_state_del_rand_route(test, prng);
- break;
- }
- test_state_verify(test);
- }
-
- prng_free(prng);
- test_state_free(test);
+ struct test_state *test = test_state_new();
+ struct prng *prng = prng_new(0);
+ size_t i;
+
+ for (i = 0; i < 1000; i++) {
+ switch (prng_rand(prng) % 10) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ test_state_add_rand_route(test, prng);
+ break;
+ case 5:
+ case 6:
+ case 7:
+ test_state_del_one_route(test, prng);
+ break;
+ case 8:
+ case 9:
+ test_state_del_rand_route(test, prng);
+ break;
+ }
+ test_state_verify(test);
+ }
+
+ prng_free(prng);
+ test_state_free(test);
}
int main(int argc, char *argv[])
{
- run_prng_test();
- printf("PRNG Test successful.\n");
- return 0;
+ run_prng_test();
+ printf("PRNG Test successful.\n");
+ return 0;
}
diff --git a/tests/lib/test_stream.c b/tests/lib/test_stream.c
index 3ac45eb20..ad7615696 100644
--- a/tests/lib/test_stream.c
+++ b/tests/lib/test_stream.c
@@ -1,5 +1,5 @@
/* Simple stream test.
- *
+ *
* Copyright (C) 2006 Sun Microsystems, Inc.
*
* This file is part of Quagga.
@@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with Quagga; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -27,50 +27,45 @@
static unsigned long long ham = 0xdeadbeefdeadbeef;
struct thread_master *master;
-static void
-print_stream (struct stream *s)
+static void print_stream(struct stream *s)
{
- size_t getp = stream_get_getp (s);
-
- printf ("endp: %zu, readable: %zu, writeable: %zu\n",
- stream_get_endp (s),
- STREAM_READABLE (s),
- STREAM_WRITEABLE (s));
-
- while (STREAM_READABLE (s))
- {
- printf ("0x%x ", *stream_pnt (s));
- stream_forward_getp (s, 1);
- }
-
- printf ("\n");
-
- /* put getp back to where it was */
- stream_set_getp (s, getp);
+ size_t getp = stream_get_getp(s);
+
+ printf("endp: %zu, readable: %zu, writeable: %zu\n", stream_get_endp(s),
+ STREAM_READABLE(s), STREAM_WRITEABLE(s));
+
+ while (STREAM_READABLE(s)) {
+ printf("0x%x ", *stream_pnt(s));
+ stream_forward_getp(s, 1);
+ }
+
+ printf("\n");
+
+ /* put getp back to where it was */
+ stream_set_getp(s, getp);
}
-int
-main (void)
+int main(void)
{
- struct stream *s;
-
- s = stream_new (1024);
-
- stream_putc (s, ham);
- stream_putw (s, ham);
- stream_putl (s, ham);
- stream_putq (s, ham);
-
- print_stream (s);
-
- stream_resize (s, stream_get_endp (s));
-
- print_stream (s);
-
- printf ("c: 0x%hhx\n", stream_getc (s));
- printf ("w: 0x%hx\n", stream_getw (s));
- printf ("l: 0x%x\n", stream_getl (s));
- printf ("q: 0x%" PRIx64 "\n", stream_getq (s));
-
- return 0;
+ struct stream *s;
+
+ s = stream_new(1024);
+
+ stream_putc(s, ham);
+ stream_putw(s, ham);
+ stream_putl(s, ham);
+ stream_putq(s, ham);
+
+ print_stream(s);
+
+ stream_resize(s, stream_get_endp(s));
+
+ print_stream(s);
+
+ printf("c: 0x%hhx\n", stream_getc(s));
+ printf("w: 0x%hx\n", stream_getw(s));
+ printf("l: 0x%x\n", stream_getl(s));
+ printf("q: 0x%" PRIx64 "\n", stream_getq(s));
+
+ return 0;
}
diff --git a/tests/lib/test_table.c b/tests/lib/test_table.c
index 4042e1aaa..b049542eb 100644
--- a/tests/lib/test_table.c
+++ b/tests/lib/test_table.c
@@ -30,14 +30,13 @@
*
* Information that is kept for each node in the radix tree.
*/
-typedef struct test_node_t_
-{
+typedef struct test_node_t_ {
- /*
- * Human readable representation of the string. Allocated using
- * malloc()/dup().
- */
- char *prefix_str;
+ /*
+ * Human readable representation of the string. Allocated using
+ * malloc()/dup().
+ */
+ char *prefix_str;
} test_node_t;
struct thread_master *master;
@@ -47,32 +46,29 @@ struct thread_master *master;
*
* Add the given prefix (passed in as a string) to the given table.
*/
-static void
-add_node (struct route_table *table, const char *prefix_str)
+static void add_node(struct route_table *table, const char *prefix_str)
{
- struct prefix_ipv4 p;
- test_node_t *node;
- struct route_node *rn;
-
- assert (prefix_str);
-
- if (str2prefix_ipv4 (prefix_str, &p) <= 0)
- {
- assert (0);
- }
-
- rn = route_node_get (table, (struct prefix *) &p);
- if (rn->info)
- {
- assert (0);
- return;
- }
-
- node = malloc (sizeof (test_node_t));
- assert (node);
- node->prefix_str = strdup (prefix_str);
- assert (node->prefix_str);
- rn->info = node;
+ struct prefix_ipv4 p;
+ test_node_t *node;
+ struct route_node *rn;
+
+ assert(prefix_str);
+
+ if (str2prefix_ipv4(prefix_str, &p) <= 0) {
+ assert(0);
+ }
+
+ rn = route_node_get(table, (struct prefix *)&p);
+ if (rn->info) {
+ assert(0);
+ return;
+ }
+
+ node = malloc(sizeof(test_node_t));
+ assert(node);
+ node->prefix_str = strdup(prefix_str);
+ assert(node->prefix_str);
+ rn->info = node;
}
/*
@@ -83,22 +79,20 @@ add_node (struct route_table *table, const char *prefix_str)
* The arguments must be prefixes in string format, with a NULL as the
* last argument.
*/
-static void
-add_nodes (struct route_table *table, ...)
+static void add_nodes(struct route_table *table, ...)
{
- va_list arglist;
- char *prefix;
+ va_list arglist;
+ char *prefix;
- va_start (arglist, table);
+ va_start(arglist, table);
- prefix = va_arg (arglist, char *);
- while (prefix)
- {
- add_node (table, prefix);
- prefix = va_arg (arglist, char *);
- }
+ prefix = va_arg(arglist, char *);
+ while (prefix) {
+ add_node(table, prefix);
+ prefix = va_arg(arglist, char *);
+ }
- va_end (arglist);
+ va_end(arglist);
}
/*
@@ -108,35 +102,31 @@ add_nodes (struct route_table *table, ...)
*
* @see print_table
*/
-static void
-print_subtree (struct route_node *rn, const char *legend, int indent_level)
+static void print_subtree(struct route_node *rn, const char *legend,
+ int indent_level)
{
- char buf[PREFIX2STR_BUFFER];
- int i;
-
- /*
- * Print this node first.
- */
- for (i = 0; i < indent_level; i++)
- {
- printf (" ");
- }
-
- prefix2str (&rn->p, buf, sizeof (buf));
- printf ("%s: %s", legend, buf);
- if (!rn->info)
- {
- printf (" (internal)");
- }
- printf ("\n");
- if (rn->l_left)
- {
- print_subtree (rn->l_left, "Left", indent_level + 1);
- }
- if (rn->l_right)
- {
- print_subtree (rn->l_right, "Right", indent_level + 1);
- }
+ char buf[PREFIX2STR_BUFFER];
+ int i;
+
+ /*
+ * Print this node first.
+ */
+ for (i = 0; i < indent_level; i++) {
+ printf(" ");
+ }
+
+ prefix2str(&rn->p, buf, sizeof(buf));
+ printf("%s: %s", legend, buf);
+ if (!rn->info) {
+ printf(" (internal)");
+ }
+ printf("\n");
+ if (rn->l_left) {
+ print_subtree(rn->l_left, "Left", indent_level + 1);
+ }
+ if (rn->l_right) {
+ print_subtree(rn->l_right, "Right", indent_level + 1);
+ }
}
/*
@@ -144,20 +134,18 @@ print_subtree (struct route_node *rn, const char *legend, int indent_level)
*
* Function that prints out the internal structure of a route table.
*/
-static void
-print_table (struct route_table *table)
+static void print_table(struct route_table *table)
{
- struct route_node *rn;
+ struct route_node *rn;
- rn = table->top;
+ rn = table->top;
- if (!rn)
- {
- printf ("<Empty Table>\n");
- return;
- }
+ if (!rn) {
+ printf("<Empty Table>\n");
+ return;
+ }
- print_subtree (rn, "Top", 0);
+ print_subtree(rn, "Top", 0);
}
/*
@@ -165,31 +153,28 @@ print_table (struct route_table *table)
*
* Remove all nodes from the given table.
*/
-static void
-clear_table (struct route_table *table)
+static void clear_table(struct route_table *table)
{
- route_table_iter_t iter;
- struct route_node *rn;
- test_node_t *node;
-
- route_table_iter_init (&iter, table);
-
- while ((rn = route_table_iter_next (&iter)))
- {
- node = rn->info;
- if (!node)
- {
- continue;
+ route_table_iter_t iter;
+ struct route_node *rn;
+ test_node_t *node;
+
+ route_table_iter_init(&iter, table);
+
+ while ((rn = route_table_iter_next(&iter))) {
+ node = rn->info;
+ if (!node) {
+ continue;
+ }
+ rn->info = NULL;
+ route_unlock_node(rn);
+ free(node->prefix_str);
+ free(node);
}
- rn->info = NULL;
- route_unlock_node (rn);
- free (node->prefix_str);
- free (node);
- }
- route_table_iter_cleanup (&iter);
+ route_table_iter_cleanup(&iter);
- assert (table->top == NULL);
+ assert(table->top == NULL);
}
/*
@@ -199,29 +184,26 @@ clear_table (struct route_table *table)
* target_pfx is the expected one. Note that target_pfx may not be
* present in the tree.
*/
-static void
-verify_next_by_iterating (struct route_table *table,
- struct prefix *target_pfx, struct prefix *next_pfx)
+static void verify_next_by_iterating(struct route_table *table,
+ struct prefix *target_pfx,
+ struct prefix *next_pfx)
{
- route_table_iter_t iter;
- struct route_node *rn;
-
- route_table_iter_init (&iter, table);
- while ((rn = route_table_iter_next (&iter)))
- {
- if (route_table_prefix_iter_cmp (&rn->p, target_pfx) > 0)
- {
- assert (!prefix_cmp (&rn->p, next_pfx));
- break;
+ route_table_iter_t iter;
+ struct route_node *rn;
+
+ route_table_iter_init(&iter, table);
+ while ((rn = route_table_iter_next(&iter))) {
+ if (route_table_prefix_iter_cmp(&rn->p, target_pfx) > 0) {
+ assert(!prefix_cmp(&rn->p, next_pfx));
+ break;
+ }
}
- }
- if (!rn)
- {
- assert (!next_pfx);
- }
+ if (!rn) {
+ assert(!next_pfx);
+ }
- route_table_iter_cleanup (&iter);
+ route_table_iter_cleanup(&iter);
}
/*
@@ -230,200 +212,190 @@ verify_next_by_iterating (struct route_table *table,
* Verifies that route_table_get_next() returns the expected result
* (result) for the prefix string 'target'.
*/
-static void
-verify_next (struct route_table *table, const char *target, const char *next)
+static void verify_next(struct route_table *table, const char *target,
+ const char *next)
{
- struct prefix_ipv4 target_pfx, next_pfx;
- struct route_node *rn;
- char result_buf[PREFIX2STR_BUFFER];
-
- if (str2prefix_ipv4 (target, &target_pfx) <= 0)
- {
- assert (0);
- }
-
- rn = route_table_get_next (table, (struct prefix *) &target_pfx);
- if (rn)
- {
- prefix2str (&rn->p, result_buf, sizeof (result_buf));
- }
- else
- {
- snprintf (result_buf, sizeof (result_buf), "(Null)");
- }
-
- printf ("\n");
- print_table (table);
- printf ("Verifying successor of %s. Expected: %s, Result: %s\n", target,
- next ? next : "(Null)", result_buf);
-
- if (!rn)
- {
- assert (!next);
- verify_next_by_iterating (table, (struct prefix *) &target_pfx, NULL);
- return;
- }
-
- assert (next);
-
- if (str2prefix_ipv4 (next, &next_pfx) <= 0)
- {
- assert (0);
- }
-
- if (prefix_cmp (&rn->p, (struct prefix *) &next_pfx))
- {
- assert (0);
- }
- route_unlock_node (rn);
-
- verify_next_by_iterating (table, (struct prefix *) &target_pfx,
- (struct prefix *) &next_pfx);
+ struct prefix_ipv4 target_pfx, next_pfx;
+ struct route_node *rn;
+ char result_buf[PREFIX2STR_BUFFER];
+
+ if (str2prefix_ipv4(target, &target_pfx) <= 0) {
+ assert(0);
+ }
+
+ rn = route_table_get_next(table, (struct prefix *)&target_pfx);
+ if (rn) {
+ prefix2str(&rn->p, result_buf, sizeof(result_buf));
+ } else {
+ snprintf(result_buf, sizeof(result_buf), "(Null)");
+ }
+
+ printf("\n");
+ print_table(table);
+ printf("Verifying successor of %s. Expected: %s, Result: %s\n", target,
+ next ? next : "(Null)", result_buf);
+
+ if (!rn) {
+ assert(!next);
+ verify_next_by_iterating(table, (struct prefix *)&target_pfx,
+ NULL);
+ return;
+ }
+
+ assert(next);
+
+ if (str2prefix_ipv4(next, &next_pfx) <= 0) {
+ assert(0);
+ }
+
+ if (prefix_cmp(&rn->p, (struct prefix *)&next_pfx)) {
+ assert(0);
+ }
+ route_unlock_node(rn);
+
+ verify_next_by_iterating(table, (struct prefix *)&target_pfx,
+ (struct prefix *)&next_pfx);
}
/*
* test_get_next
*/
-static void
-test_get_next (void)
+static void test_get_next(void)
{
- struct route_table *table;
-
- printf ("\n\nTesting route_table_get_next()\n");
- table = route_table_init ();
-
- /*
- * Target exists in tree, but has no successor.
- */
- add_nodes (table, "1.0.1.0/24", NULL);
- verify_next (table, "1.0.1.0/24", NULL);
- clear_table (table);
-
- /*
- * Target exists in tree, and there is a node in its left subtree.
- */
- add_nodes (table, "1.0.1.0/24", "1.0.1.0/25", NULL);
- verify_next (table, "1.0.1.0/24", "1.0.1.0/25");
- clear_table (table);
-
- /*
- * Target exists in tree, and there is a node in its right subtree.
- */
- add_nodes (table, "1.0.1.0/24", "1.0.1.128/25", NULL);
- verify_next (table, "1.0.1.0/24", "1.0.1.128/25");
- clear_table (table);
-
- /*
- * Target exists in the tree, next node is outside subtree.
- */
- add_nodes (table, "1.0.1.0/24", "1.1.0.0/16", NULL);
- verify_next (table, "1.0.1.0/24", "1.1.0.0/16");
- clear_table (table);
-
- /*
- * The target node does not exist in the tree for all the test cases
- * below this point.
- */
-
- /*
- * There is no successor in the tree.
- */
- add_nodes (table, "1.0.0.0/16", NULL);
- verify_next (table, "1.0.1.0/24", NULL);
- clear_table (table);
-
- /*
- * There exists a node that would be in the target's left subtree.
- */
- add_nodes (table, "1.0.0.0/16", "1.0.1.0/25", NULL);
- verify_next (table, "1.0.1.0/24", "1.0.1.0/25");
- clear_table (table);
-
- /*
- * There exists a node would be in the target's right subtree.
- */
- add_nodes (table, "1.0.0.0/16", "1.0.1.128/25", NULL);
- verify_next (table, "1.0.1.0/24", "1.0.1.128/25");
- clear_table (table);
-
- /*
- * A search for the target reaches a node where there are no child
- * nodes in the direction of the target (left), but the node has a
- * right child.
- */
- add_nodes (table, "1.0.0.0/16", "1.0.128.0/17", NULL);
- verify_next (table, "1.0.0.0/17", "1.0.128.0/17");
- clear_table (table);
-
- /*
- * A search for the target reaches a node with no children. We have
- * to go upwards in the tree to find a successor.
- */
- add_nodes (table, "1.0.0.0/16", "1.0.0.0/24", "1.0.1.0/24",
- "1.0.128.0/17", NULL);
- verify_next (table, "1.0.1.0/25", "1.0.128.0/17");
- clear_table (table);
-
- /*
- * A search for the target reaches a node where neither the node nor
- * the target prefix contain each other.
- *
- * In first case below the node succeeds the target.
- *
- * In the second case, the node comes before the target, so we have
- * to go up the tree looking for a successor.
- */
- add_nodes (table, "1.0.0.0/16", "1.0.1.0/24", NULL);
- verify_next (table, "1.0.0.0/24", "1.0.1.0/24");
- clear_table (table);
-
- add_nodes (table, "1.0.0.0/16", "1.0.0.0/24", "1.0.1.0/25",
- "1.0.128.0/17", NULL);
- verify_next (table, "1.0.1.128/25", "1.0.128.0/17");
- clear_table (table);
-
- route_table_finish (table);
+ struct route_table *table;
+
+ printf("\n\nTesting route_table_get_next()\n");
+ table = route_table_init();
+
+ /*
+ * Target exists in tree, but has no successor.
+ */
+ add_nodes(table, "1.0.1.0/24", NULL);
+ verify_next(table, "1.0.1.0/24", NULL);
+ clear_table(table);
+
+ /*
+ * Target exists in tree, and there is a node in its left subtree.
+ */
+ add_nodes(table, "1.0.1.0/24", "1.0.1.0/25", NULL);
+ verify_next(table, "1.0.1.0/24", "1.0.1.0/25");
+ clear_table(table);
+
+ /*
+ * Target exists in tree, and there is a node in its right subtree.
+ */
+ add_nodes(table, "1.0.1.0/24", "1.0.1.128/25", NULL);
+ verify_next(table, "1.0.1.0/24", "1.0.1.128/25");
+ clear_table(table);
+
+ /*
+ * Target exists in the tree, next node is outside subtree.
+ */
+ add_nodes(table, "1.0.1.0/24", "1.1.0.0/16", NULL);
+ verify_next(table, "1.0.1.0/24", "1.1.0.0/16");
+ clear_table(table);
+
+ /*
+ * The target node does not exist in the tree for all the test cases
+ * below this point.
+ */
+
+ /*
+ * There is no successor in the tree.
+ */
+ add_nodes(table, "1.0.0.0/16", NULL);
+ verify_next(table, "1.0.1.0/24", NULL);
+ clear_table(table);
+
+ /*
+ * There exists a node that would be in the target's left subtree.
+ */
+ add_nodes(table, "1.0.0.0/16", "1.0.1.0/25", NULL);
+ verify_next(table, "1.0.1.0/24", "1.0.1.0/25");
+ clear_table(table);
+
+ /*
+ * There exists a node would be in the target's right subtree.
+ */
+ add_nodes(table, "1.0.0.0/16", "1.0.1.128/25", NULL);
+ verify_next(table, "1.0.1.0/24", "1.0.1.128/25");
+ clear_table(table);
+
+ /*
+ * A search for the target reaches a node where there are no child
+ * nodes in the direction of the target (left), but the node has a
+ * right child.
+ */
+ add_nodes(table, "1.0.0.0/16", "1.0.128.0/17", NULL);
+ verify_next(table, "1.0.0.0/17", "1.0.128.0/17");
+ clear_table(table);
+
+ /*
+ * A search for the target reaches a node with no children. We have
+ * to go upwards in the tree to find a successor.
+ */
+ add_nodes(table, "1.0.0.0/16", "1.0.0.0/24", "1.0.1.0/24",
+ "1.0.128.0/17", NULL);
+ verify_next(table, "1.0.1.0/25", "1.0.128.0/17");
+ clear_table(table);
+
+ /*
+ * A search for the target reaches a node where neither the node nor
+ * the target prefix contain each other.
+ *
+ * In first case below the node succeeds the target.
+ *
+ * In the second case, the node comes before the target, so we have
+ * to go up the tree looking for a successor.
+ */
+ add_nodes(table, "1.0.0.0/16", "1.0.1.0/24", NULL);
+ verify_next(table, "1.0.0.0/24", "1.0.1.0/24");
+ clear_table(table);
+
+ add_nodes(table, "1.0.0.0/16", "1.0.0.0/24", "1.0.1.0/25",
+ "1.0.128.0/17", NULL);
+ verify_next(table, "1.0.1.128/25", "1.0.128.0/17");
+ clear_table(table);
+
+ route_table_finish(table);
}
/*
* verify_prefix_iter_cmp
*/
-static void
-verify_prefix_iter_cmp (const char *p1, const char *p2, int exp_result)
+static void verify_prefix_iter_cmp(const char *p1, const char *p2,
+ int exp_result)
{
- struct prefix_ipv4 p1_pfx, p2_pfx;
- int result;
+ struct prefix_ipv4 p1_pfx, p2_pfx;
+ int result;
- if (str2prefix_ipv4 (p1, &p1_pfx) <= 0)
- {
- assert (0);
- }
+ if (str2prefix_ipv4(p1, &p1_pfx) <= 0) {
+ assert(0);
+ }
- if (str2prefix_ipv4 (p2, &p2_pfx) <= 0)
- {
- assert (0);
- }
+ if (str2prefix_ipv4(p2, &p2_pfx) <= 0) {
+ assert(0);
+ }
- result = route_table_prefix_iter_cmp ((struct prefix *) &p1_pfx,
- (struct prefix *) &p2_pfx);
+ result = route_table_prefix_iter_cmp((struct prefix *)&p1_pfx,
+ (struct prefix *)&p2_pfx);
- printf ("Verifying cmp(%s, %s) returns %d\n", p1, p2, exp_result);
+ printf("Verifying cmp(%s, %s) returns %d\n", p1, p2, exp_result);
- assert (exp_result == result);
+ assert(exp_result == result);
- /*
- * Also check the reverse comparision.
- */
- result = route_table_prefix_iter_cmp ((struct prefix *) &p2_pfx,
- (struct prefix *) &p1_pfx);
+ /*
+ * Also check the reverse comparision.
+ */
+ result = route_table_prefix_iter_cmp((struct prefix *)&p2_pfx,
+ (struct prefix *)&p1_pfx);
- if (exp_result)
- {
- exp_result = -exp_result;
- }
+ if (exp_result) {
+ exp_result = -exp_result;
+ }
- printf ("Verifying cmp(%s, %s) returns %d\n", p1, p2, exp_result);
- assert (result == exp_result);
+ printf("Verifying cmp(%s, %s) returns %d\n", p1, p2, exp_result);
+ assert(result == exp_result);
}
/*
@@ -431,16 +403,15 @@ verify_prefix_iter_cmp (const char *p1, const char *p2, int exp_result)
*
* Tests comparision of prefixes according to order of iteration.
*/
-static void
-test_prefix_iter_cmp ()
+static void test_prefix_iter_cmp()
{
- printf ("\n\nTesting route_table_prefix_iter_cmp()\n");
+ printf("\n\nTesting route_table_prefix_iter_cmp()\n");
- verify_prefix_iter_cmp ("1.0.0.0/8", "1.0.0.0/8", 0);
+ verify_prefix_iter_cmp("1.0.0.0/8", "1.0.0.0/8", 0);
- verify_prefix_iter_cmp ("1.0.0.0/8", "1.0.0.0/16", -1);
+ verify_prefix_iter_cmp("1.0.0.0/8", "1.0.0.0/16", -1);
- verify_prefix_iter_cmp ("1.0.0.0/16", "1.128.0.0/16", -1);
+ verify_prefix_iter_cmp("1.0.0.0/16", "1.128.0.0/16", -1);
}
/*
@@ -450,105 +421,92 @@ test_prefix_iter_cmp ()
* iterator that pauses at each node. Verifies that the two methods
* yield the same results.
*/
-static void
-verify_iter_with_pause (struct route_table *table)
+static void verify_iter_with_pause(struct route_table *table)
{
- unsigned long num_nodes;
- struct route_node *rn, *iter_rn;
- route_table_iter_t iter_space;
- route_table_iter_t *iter = &iter_space;
-
- route_table_iter_init (iter, table);
- num_nodes = 0;
-
- for (rn = route_top (table); rn; rn = route_next (rn))
- {
- num_nodes++;
- route_table_iter_pause (iter);
-
- assert (iter->current == NULL);
- if (route_table_iter_started (iter))
- {
- assert (iter->state == RT_ITER_STATE_PAUSED);
- }
- else
- {
- assert (rn == table->top);
- assert (iter->state == RT_ITER_STATE_INIT);
+ unsigned long num_nodes;
+ struct route_node *rn, *iter_rn;
+ route_table_iter_t iter_space;
+ route_table_iter_t *iter = &iter_space;
+
+ route_table_iter_init(iter, table);
+ num_nodes = 0;
+
+ for (rn = route_top(table); rn; rn = route_next(rn)) {
+ num_nodes++;
+ route_table_iter_pause(iter);
+
+ assert(iter->current == NULL);
+ if (route_table_iter_started(iter)) {
+ assert(iter->state == RT_ITER_STATE_PAUSED);
+ } else {
+ assert(rn == table->top);
+ assert(iter->state == RT_ITER_STATE_INIT);
+ }
+
+ iter_rn = route_table_iter_next(iter);
+
+ /*
+ * Make sure both iterations return the same node.
+ */
+ assert(rn == iter_rn);
}
- iter_rn = route_table_iter_next (iter);
-
- /*
- * Make sure both iterations return the same node.
- */
- assert (rn == iter_rn);
- }
+ assert(num_nodes == route_table_count(table));
- assert (num_nodes == route_table_count (table));
+ route_table_iter_pause(iter);
+ iter_rn = route_table_iter_next(iter);
- route_table_iter_pause (iter);
- iter_rn = route_table_iter_next (iter);
+ assert(iter_rn == NULL);
+ assert(iter->state == RT_ITER_STATE_DONE);
- assert (iter_rn == NULL);
- assert (iter->state == RT_ITER_STATE_DONE);
+ assert(route_table_iter_next(iter) == NULL);
+ assert(iter->state == RT_ITER_STATE_DONE);
- assert (route_table_iter_next (iter) == NULL);
- assert (iter->state == RT_ITER_STATE_DONE);
+ route_table_iter_cleanup(iter);
- route_table_iter_cleanup (iter);
-
- print_table (table);
- printf ("Verified pausing iteration on tree with %lu nodes\n", num_nodes);
+ print_table(table);
+ printf("Verified pausing iteration on tree with %lu nodes\n",
+ num_nodes);
}
/*
* test_iter_pause
*/
-static void
-test_iter_pause (void)
+static void test_iter_pause(void)
{
- struct route_table *table;
- int i, num_prefixes;
- const char *prefixes[] = {
- "1.0.1.0/24",
- "1.0.1.0/25",
- "1.0.1.128/25",
- "1.0.2.0/24",
- "2.0.0.0/8"
- };
-
- num_prefixes = sizeof (prefixes) / sizeof (prefixes[0]);
-
- printf ("\n\nTesting that route_table_iter_pause() works as expected\n");
- table = route_table_init ();
- for (i = 0; i < num_prefixes; i++)
- {
- add_nodes (table, prefixes[i], NULL);
- }
-
- verify_iter_with_pause (table);
-
- clear_table (table);
- route_table_finish (table);
+ struct route_table *table;
+ int i, num_prefixes;
+ const char *prefixes[] = {"1.0.1.0/24", "1.0.1.0/25", "1.0.1.128/25",
+ "1.0.2.0/24", "2.0.0.0/8"};
+
+ num_prefixes = sizeof(prefixes) / sizeof(prefixes[0]);
+
+ printf("\n\nTesting that route_table_iter_pause() works as expected\n");
+ table = route_table_init();
+ for (i = 0; i < num_prefixes; i++) {
+ add_nodes(table, prefixes[i], NULL);
+ }
+
+ verify_iter_with_pause(table);
+
+ clear_table(table);
+ route_table_finish(table);
}
/*
* run_tests
*/
-static void
-run_tests (void)
+static void run_tests(void)
{
- test_prefix_iter_cmp ();
- test_get_next ();
- test_iter_pause ();
+ test_prefix_iter_cmp();
+ test_get_next();
+ test_iter_pause();
}
/*
* main
*/
-int
-main (void)
+int main(void)
{
- run_tests ();
+ run_tests();
}
diff --git a/tests/lib/test_timer_correctness.c b/tests/lib/test_timer_correctness.c
index e523929be..31d936d8a 100644
--- a/tests/lib/test_timer_correctness.c
+++ b/tests/lib/test_timer_correctness.c
@@ -56,142 +56,136 @@ static int timers_pending;
static void terminate_test(void)
{
- int exit_code;
-
- if (strcmp(log_buf, expected_buf))
- {
- fprintf(stderr, "Expected output and received output differ.\n");
- fprintf(stderr, "---Expected output: ---\n%s", expected_buf);
- fprintf(stderr, "---Actual output: ---\n%s", log_buf);
- exit_code = 1;
- }
- else
- {
- printf("Expected output and actual output match.\n");
- exit_code = 0;
- }
-
- thread_master_free(master);
- XFREE(MTYPE_TMP, log_buf);
- XFREE(MTYPE_TMP, expected_buf);
- prng_free(prng);
- XFREE(MTYPE_TMP, timers);
-
- exit(exit_code);
+ int exit_code;
+
+ if (strcmp(log_buf, expected_buf)) {
+ fprintf(stderr,
+ "Expected output and received output differ.\n");
+ fprintf(stderr, "---Expected output: ---\n%s", expected_buf);
+ fprintf(stderr, "---Actual output: ---\n%s", log_buf);
+ exit_code = 1;
+ } else {
+ printf("Expected output and actual output match.\n");
+ exit_code = 0;
+ }
+
+ thread_master_free(master);
+ XFREE(MTYPE_TMP, log_buf);
+ XFREE(MTYPE_TMP, expected_buf);
+ prng_free(prng);
+ XFREE(MTYPE_TMP, timers);
+
+ exit(exit_code);
}
static int timer_func(struct thread *thread)
{
- int rv;
+ int rv;
- rv = snprintf(log_buf + log_buf_pos, log_buf_len - log_buf_pos,
- "%s\n", (char*)thread->arg);
- assert(rv >= 0);
- log_buf_pos += rv;
- assert(log_buf_pos < log_buf_len);
- XFREE(MTYPE_TMP, thread->arg);
+ rv = snprintf(log_buf + log_buf_pos, log_buf_len - log_buf_pos, "%s\n",
+ (char *)thread->arg);
+ assert(rv >= 0);
+ log_buf_pos += rv;
+ assert(log_buf_pos < log_buf_len);
+ XFREE(MTYPE_TMP, thread->arg);
- timers_pending--;
- if (!timers_pending)
- terminate_test();
+ timers_pending--;
+ if (!timers_pending)
+ terminate_test();
- return 0;
+ return 0;
}
-static int cmp_timeval(const void* a, const void *b)
+static int cmp_timeval(const void *a, const void *b)
{
- const struct timeval *ta = *(struct timeval * const *)a;
- const struct timeval *tb = *(struct timeval * const *)b;
-
- if (timercmp(ta, tb, <))
- return -1;
- if (timercmp(ta, tb, >))
- return 1;
- return 0;
+ const struct timeval *ta = *(struct timeval * const *)a;
+ const struct timeval *tb = *(struct timeval * const *)b;
+
+ if (timercmp(ta, tb, <))
+ return -1;
+ if (timercmp(ta, tb, >))
+ return 1;
+ return 0;
}
int main(int argc, char **argv)
{
- int i, j;
- struct thread t;
- struct timeval **alarms;
-
- master = thread_master_create();
-
- log_buf_len = SCHEDULE_TIMERS * (TIMESTR_LEN + 1) + 1;
- log_buf_pos = 0;
- log_buf = XMALLOC(MTYPE_TMP, log_buf_len);
-
- expected_buf_len = SCHEDULE_TIMERS * (TIMESTR_LEN + 1) + 1;
- expected_buf_pos = 0;
- expected_buf = XMALLOC(MTYPE_TMP, expected_buf_len);
-
- prng = prng_new(0);
-
- timers = XMALLOC(MTYPE_TMP, SCHEDULE_TIMERS * sizeof(*timers));
-
- for (i = 0; i < SCHEDULE_TIMERS; i++)
- {
- long interval_msec;
- int ret;
- char *arg;
-
- /* Schedule timers to expire in 0..5 seconds */
- interval_msec = prng_rand(prng) % 5000;
- arg = XMALLOC(MTYPE_TMP, TIMESTR_LEN + 1);
- timers[i] = thread_add_timer_msec(master, timer_func, arg, interval_msec);
- ret = snprintf(arg, TIMESTR_LEN + 1, "%lld.%06lld",
- (long long)timers[i]->u.sands.tv_sec,
- (long long)timers[i]->u.sands.tv_usec);
- assert(ret > 0);
- assert((size_t)ret < TIMESTR_LEN + 1);
- timers_pending++;
- }
-
- for (i = 0; i < REMOVE_TIMERS; i++)
- {
- int index;
-
- index = prng_rand(prng) % SCHEDULE_TIMERS;
- if (!timers[index])
- continue;
-
- XFREE(MTYPE_TMP, timers[index]->arg);
- thread_cancel(timers[index]);
- timers[index] = NULL;
- timers_pending--;
- }
-
- /* We create an array of pointers to the alarm times and sort
- * that array. That sorted array is used to generate a string
- * representing the expected "output" of the timers when they
- * are run. */
- j = 0;
- alarms = XMALLOC(MTYPE_TMP, timers_pending * sizeof(*alarms));
- for (i = 0; i < SCHEDULE_TIMERS; i++)
- {
- if (!timers[i])
- continue;
- alarms[j++] = &timers[i]->u.sands;
- }
- qsort(alarms, j, sizeof(*alarms), cmp_timeval);
- for (i = 0; i < j; i++)
- {
- int ret;
-
- ret = snprintf(expected_buf + expected_buf_pos,
- expected_buf_len - expected_buf_pos,
- "%lld.%06lld\n",
- (long long)alarms[i]->tv_sec,
- (long long)alarms[i]->tv_usec);
- assert(ret > 0);
- expected_buf_pos += ret;
- assert(expected_buf_pos < expected_buf_len);
- }
- XFREE(MTYPE_TMP, alarms);
-
- while (thread_fetch(master, &t))
- thread_call(&t);
-
- return 0;
+ int i, j;
+ struct thread t;
+ struct timeval **alarms;
+
+ master = thread_master_create();
+
+ log_buf_len = SCHEDULE_TIMERS * (TIMESTR_LEN + 1) + 1;
+ log_buf_pos = 0;
+ log_buf = XMALLOC(MTYPE_TMP, log_buf_len);
+
+ expected_buf_len = SCHEDULE_TIMERS * (TIMESTR_LEN + 1) + 1;
+ expected_buf_pos = 0;
+ expected_buf = XMALLOC(MTYPE_TMP, expected_buf_len);
+
+ prng = prng_new(0);
+
+ timers = XMALLOC(MTYPE_TMP, SCHEDULE_TIMERS * sizeof(*timers));
+
+ for (i = 0; i < SCHEDULE_TIMERS; i++) {
+ long interval_msec;
+ int ret;
+ char *arg;
+
+ /* Schedule timers to expire in 0..5 seconds */
+ interval_msec = prng_rand(prng) % 5000;
+ arg = XMALLOC(MTYPE_TMP, TIMESTR_LEN + 1);
+ timers[i] = thread_add_timer_msec(master, timer_func, arg,
+ interval_msec);
+ ret = snprintf(arg, TIMESTR_LEN + 1, "%lld.%06lld",
+ (long long)timers[i]->u.sands.tv_sec,
+ (long long)timers[i]->u.sands.tv_usec);
+ assert(ret > 0);
+ assert((size_t)ret < TIMESTR_LEN + 1);
+ timers_pending++;
+ }
+
+ for (i = 0; i < REMOVE_TIMERS; i++) {
+ int index;
+
+ index = prng_rand(prng) % SCHEDULE_TIMERS;
+ if (!timers[index])
+ continue;
+
+ XFREE(MTYPE_TMP, timers[index]->arg);
+ thread_cancel(timers[index]);
+ timers[index] = NULL;
+ timers_pending--;
+ }
+
+ /* We create an array of pointers to the alarm times and sort
+ * that array. That sorted array is used to generate a string
+ * representing the expected "output" of the timers when they
+ * are run. */
+ j = 0;
+ alarms = XMALLOC(MTYPE_TMP, timers_pending * sizeof(*alarms));
+ for (i = 0; i < SCHEDULE_TIMERS; i++) {
+ if (!timers[i])
+ continue;
+ alarms[j++] = &timers[i]->u.sands;
+ }
+ qsort(alarms, j, sizeof(*alarms), cmp_timeval);
+ for (i = 0; i < j; i++) {
+ int ret;
+
+ ret = snprintf(expected_buf + expected_buf_pos,
+ expected_buf_len - expected_buf_pos,
+ "%lld.%06lld\n", (long long)alarms[i]->tv_sec,
+ (long long)alarms[i]->tv_usec);
+ assert(ret > 0);
+ expected_buf_pos += ret;
+ assert(expected_buf_pos < expected_buf_len);
+ }
+ XFREE(MTYPE_TMP, alarms);
+
+ while (thread_fetch(master, &t))
+ thread_call(&t);
+
+ return 0;
}
diff --git a/tests/lib/test_timer_performance.c b/tests/lib/test_timer_performance.c
index a7d09beec..f3878532c 100644
--- a/tests/lib/test_timer_performance.c
+++ b/tests/lib/test_timer_performance.c
@@ -39,67 +39,65 @@ struct thread_master *master;
static int dummy_func(struct thread *thread)
{
- return 0;
+ return 0;
}
int main(int argc, char **argv)
{
- struct prng *prng;
- int i;
- struct thread **timers;
- struct timeval tv_start, tv_lap, tv_stop;
- unsigned long t_schedule, t_remove;
-
- master = thread_master_create();
- prng = prng_new(0);
- timers = calloc(SCHEDULE_TIMERS, sizeof(*timers));
-
- /* create thread structures so they won't be allocated during the
- * time measurement */
- for (i = 0; i < SCHEDULE_TIMERS; i++)
- timers[i] = thread_add_timer_msec(master, dummy_func, NULL, 0);
- for (i = 0; i < SCHEDULE_TIMERS; i++)
- thread_cancel(timers[i]);
-
- monotime(&tv_start);
-
- for (i = 0; i < SCHEDULE_TIMERS; i++)
- {
- long interval_msec;
-
- interval_msec = prng_rand(prng) % (100 * SCHEDULE_TIMERS);
- timers[i] = thread_add_timer_msec(master, dummy_func,
- NULL, interval_msec);
- }
-
- monotime(&tv_lap);
-
- for (i = 0; i < REMOVE_TIMERS; i++)
- {
- int index;
-
- index = prng_rand(prng) % SCHEDULE_TIMERS;
- if (timers[index])
- thread_cancel(timers[index]);
- timers[index] = NULL;
- }
-
- monotime(&tv_stop);
-
- t_schedule = 1000 * (tv_lap.tv_sec - tv_start.tv_sec);
- t_schedule += (tv_lap.tv_usec - tv_start.tv_usec) / 1000;
-
- t_remove = 1000 * (tv_stop.tv_sec - tv_lap.tv_sec);
- t_remove += (tv_stop.tv_usec - tv_lap.tv_usec) / 1000;
-
- printf("Scheduling %d random timers took %ld.%03ld seconds.\n",
- SCHEDULE_TIMERS, t_schedule/1000, t_schedule%1000);
- printf("Removing %d random timers took %ld.%03ld seconds.\n",
- REMOVE_TIMERS, t_remove/1000, t_remove%1000);
- fflush(stdout);
-
- free(timers);
- thread_master_free(master);
- prng_free(prng);
- return 0;
+ struct prng *prng;
+ int i;
+ struct thread **timers;
+ struct timeval tv_start, tv_lap, tv_stop;
+ unsigned long t_schedule, t_remove;
+
+ master = thread_master_create();
+ prng = prng_new(0);
+ timers = calloc(SCHEDULE_TIMERS, sizeof(*timers));
+
+ /* create thread structures so they won't be allocated during the
+ * time measurement */
+ for (i = 0; i < SCHEDULE_TIMERS; i++)
+ timers[i] = thread_add_timer_msec(master, dummy_func, NULL, 0);
+ for (i = 0; i < SCHEDULE_TIMERS; i++)
+ thread_cancel(timers[i]);
+
+ monotime(&tv_start);
+
+ for (i = 0; i < SCHEDULE_TIMERS; i++) {
+ long interval_msec;
+
+ interval_msec = prng_rand(prng) % (100 * SCHEDULE_TIMERS);
+ timers[i] = thread_add_timer_msec(master, dummy_func, NULL,
+ interval_msec);
+ }
+
+ monotime(&tv_lap);
+
+ for (i = 0; i < REMOVE_TIMERS; i++) {
+ int index;
+
+ index = prng_rand(prng) % SCHEDULE_TIMERS;
+ if (timers[index])
+ thread_cancel(timers[index]);
+ timers[index] = NULL;
+ }
+
+ monotime(&tv_stop);
+
+ t_schedule = 1000 * (tv_lap.tv_sec - tv_start.tv_sec);
+ t_schedule += (tv_lap.tv_usec - tv_start.tv_usec) / 1000;
+
+ t_remove = 1000 * (tv_stop.tv_sec - tv_lap.tv_sec);
+ t_remove += (tv_stop.tv_usec - tv_lap.tv_usec) / 1000;
+
+ printf("Scheduling %d random timers took %ld.%03ld seconds.\n",
+ SCHEDULE_TIMERS, t_schedule / 1000, t_schedule % 1000);
+ printf("Removing %d random timers took %ld.%03ld seconds.\n",
+ REMOVE_TIMERS, t_remove / 1000, t_remove % 1000);
+ fflush(stdout);
+
+ free(timers);
+ thread_master_free(master);
+ prng_free(prng);
+ return 0;
}
diff --git a/tests/test_lblmgr.c b/tests/test_lblmgr.c
index 4a4aaa001..fefc93331 100644
--- a/tests/test_lblmgr.c
+++ b/tests/test_lblmgr.c
@@ -34,117 +34,112 @@ u_short instance = 1;
const char *sequence = "GGRGGGRRG";
-static int zebra_send_get_label_chunk (void);
-static int zebra_send_release_label_chunk (uint32_t start, uint32_t end);
+static int zebra_send_get_label_chunk(void);
+static int zebra_send_release_label_chunk(uint32_t start, uint32_t end);
-static void
-process_next_call (uint32_t start, uint32_t end)
+static void process_next_call(uint32_t start, uint32_t end)
{
- sleep (3);
- if (!*sequence)
- exit (0);
- if (*sequence == 'G')
- zebra_send_get_label_chunk ();
- else if (*sequence == 'R')
- zebra_send_release_label_chunk (start, end);
+ sleep(3);
+ if (!*sequence)
+ exit(0);
+ if (*sequence == 'G')
+ zebra_send_get_label_chunk();
+ else if (*sequence == 'R')
+ zebra_send_release_label_chunk(start, end);
}
/* Connect to Label Manager */
-static int
-zebra_send_label_manager_connect ()
+static int zebra_send_label_manager_connect()
{
- int ret;
+ int ret;
- printf("Connect to Label Manager\n");
+ printf("Connect to Label Manager\n");
- ret = lm_label_manager_connect (zclient);
- printf ("Label Manager connection result: %u \n", ret);
- if (ret != 0 ) {
- fprintf (stderr, "Error %d connecting to Label Manager %s\n", ret,
- strerror(errno));
- exit (1);
- }
+ ret = lm_label_manager_connect(zclient);
+ printf("Label Manager connection result: %u \n", ret);
+ if (ret != 0) {
+ fprintf(stderr, "Error %d connecting to Label Manager %s\n",
+ ret, strerror(errno));
+ exit(1);
+ }
- process_next_call (0, 0);
+ process_next_call(0, 0);
}
/* Get Label Chunk */
-static int
-zebra_send_get_label_chunk ()
+static int zebra_send_get_label_chunk()
{
- uint32_t start;
- uint32_t end;
- int ret;
+ uint32_t start;
+ uint32_t end;
+ int ret;
- printf("Ask for label chunk \n");
+ printf("Ask for label chunk \n");
- ret = lm_get_label_chunk (zclient, KEEP, CHUNK_SIZE, &start, &end);
- if (ret != 0 ) {
- fprintf (stderr, "Error %d requesting label chunk %s\n", ret, strerror(errno));
- exit (1);
- }
+ ret = lm_get_label_chunk(zclient, KEEP, CHUNK_SIZE, &start, &end);
+ if (ret != 0) {
+ fprintf(stderr, "Error %d requesting label chunk %s\n", ret,
+ strerror(errno));
+ exit(1);
+ }
- sequence++;
+ sequence++;
- printf ("Label Chunk assign: %u - %u \n",
- start, end);
+ printf("Label Chunk assign: %u - %u \n", start, end);
- process_next_call (start, end);
+ process_next_call(start, end);
}
/* Release Label Chunk */
-static int
-zebra_send_release_label_chunk (uint32_t start, uint32_t end)
+static int zebra_send_release_label_chunk(uint32_t start, uint32_t end)
{
- struct stream *s;
- int ret;
+ struct stream *s;
+ int ret;
- printf("Release label chunk: %u - %u\n", start, end);
+ printf("Release label chunk: %u - %u\n", start, end);
- ret = lm_release_label_chunk (zclient, start, end);
- if (ret != 0 ) {
- fprintf (stderr, "Error releasing label chunk\n");
- exit (1);
- }
+ ret = lm_release_label_chunk(zclient, start, end);
+ if (ret != 0) {
+ fprintf(stderr, "Error releasing label chunk\n");
+ exit(1);
+ }
- sequence++;
+ sequence++;
- process_next_call (start-CHUNK_SIZE, end-CHUNK_SIZE);
+ process_next_call(start - CHUNK_SIZE, end - CHUNK_SIZE);
}
-void init_zclient (struct thread_master *master, char *lm_zserv_path)
+void init_zclient(struct thread_master *master, char *lm_zserv_path)
{
- if (lm_zserv_path)
- zclient_serv_path_set(lm_zserv_path);
-
- zclient = zclient_new(master);
- /* zclient_init(zclient, ZEBRA_LABEL_MANAGER, 0); */
- zclient->sock = -1;
- zclient->redist_default = ZEBRA_ROUTE_LDP;
- zclient->instance = instance;
- if (zclient_socket_connect (zclient) < 0) {
- printf ("Error connecting synchronous zclient!\n");
- exit (1);
- }
-
+ if (lm_zserv_path)
+ zclient_serv_path_set(lm_zserv_path);
+
+ zclient = zclient_new(master);
+ /* zclient_init(zclient, ZEBRA_LABEL_MANAGER, 0); */
+ zclient->sock = -1;
+ zclient->redist_default = ZEBRA_ROUTE_LDP;
+ zclient->instance = instance;
+ if (zclient_socket_connect(zclient) < 0) {
+ printf("Error connecting synchronous zclient!\n");
+ exit(1);
+ }
}
-int main (int argc, char *argv[])
+int main(int argc, char *argv[])
{
- struct thread_master *master;
- struct thread thread;
- int ret;
+ struct thread_master *master;
+ struct thread thread;
+ int ret;
- printf ("Sequence to be tested: %s\n", sequence);
+ printf("Sequence to be tested: %s\n", sequence);
- master = thread_master_create();
- init_zclient (master, ZSERV_PATH);
+ master = thread_master_create();
+ init_zclient(master, ZSERV_PATH);
- zebra_send_label_manager_connect ();
+ zebra_send_label_manager_connect();
- return 0;
+ return 0;
}