]> git.ipfire.org Git - thirdparty/bird.git/blame - lib/checksum_test.c
Merge remote-tracking branch 'origin/master' into mq-filter-stack
[thirdparty/bird.git] / lib / checksum_test.c
CommitLineData
9b0a0ba9
OZ
1/*
2 * BIRD Library -- IP One-Complement Checksum Tests
3 *
4 * (c) 2015 CZ.NIC z.s.p.o.
5 *
6 * Can be freely distributed and used under the terms of the GNU GPL.
7 */
8
9#include <stdio.h>
10
11#include "test/birdtest.h"
12
13#include "lib/checksum.h"
14
15#define MAX_NUM 10000
16
17static u16
18ipsum_calculate_expected(u32 *a)
19{
20 int i;
21 u32 sum = 0;
22
23 for(i = 0; i < MAX_NUM; i++)
24 {
25 sum += a[i] & 0xffff;
26 bt_debug("low) \t0x%08X \n", sum);
27
28 sum += a[i] >> 16;
29 bt_debug("high) \t0x%08X \n", sum);
30
31 u16 carry = sum >> 16;
32 sum = (sum & 0xffff) + carry;
33 bt_debug("carry) \t0x%08X \n\n", sum);
34 }
35 bt_debug("sum) \t0x%08X \n", sum);
36
37 sum = sum ^ 0xffff;
38 bt_debug("~sum) \t0x%08X \n", sum);
39
40 return sum;
41}
42
43static int
44t_calculate(void)
45{
46 u32 a[MAX_NUM];
47 int i;
48
49 for (i = 0; i < MAX_NUM; i++)
50 a[i] = bt_random();
51
52 u16 sum_calculated = ipsum_calculate(a, sizeof(a), NULL);
53 u16 sum_calculated_2 = ipsum_calculate(&a[0], sizeof(u32)*(MAX_NUM/2), &a[MAX_NUM/2], sizeof(u32)*(MAX_NUM - MAX_NUM/2), NULL);
54 bt_assert(sum_calculated == sum_calculated_2);
55
56 u16 sum_expected = ipsum_calculate_expected(a);
57
58 bt_debug("sum_calculated: %08X \n", sum_calculated);
59 bt_debug("sum_expected: %08X \n", sum_expected);
60
61 bt_assert(sum_calculated == sum_expected);
62
5e3cd0e5 63 return 1;
9b0a0ba9
OZ
64}
65
66static int
67t_verify(void)
68{
69 u32 a[MAX_NUM+1];
70 int i;
71
72 for (i = 0; i < MAX_NUM; i++)
73 a[i] = bt_random();
74
75 u16 sum = ipsum_calculate_expected(a);
76
77 a[MAX_NUM] = sum;
78
79 bt_assert(ipsum_verify(a, sizeof(a), NULL));
80
5e3cd0e5 81 return 1;
9b0a0ba9
OZ
82}
83
84
85int
86main(int argc, char *argv[])
87{
88 bt_init(argc, argv);
89
90 bt_test_suite(t_calculate, "Checksum of pseudo-random data");
91 bt_test_suite(t_verify, "Verification of pseudo-random data.");
92
93 return bt_exit_value();
94}