1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker
3*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
4*4dc78e53SAndroid Build Coastguard Worker
5*4dc78e53SAndroid Build Coastguard Worker #include <check.h>
6*4dc78e53SAndroid Build Coastguard Worker
7*4dc78e53SAndroid Build Coastguard Worker #include <linux/snmp.h>
8*4dc78e53SAndroid Build Coastguard Worker #include <linux/if_bridge.h>
9*4dc78e53SAndroid Build Coastguard Worker
10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link.h>
11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link/bridge.h>
12*4dc78e53SAndroid Build Coastguard Worker
13*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-static-route/nl-priv-static-route.h"
14*4dc78e53SAndroid Build Coastguard Worker #include "nl-aux-core/nl-core.h"
15*4dc78e53SAndroid Build Coastguard Worker
16*4dc78e53SAndroid Build Coastguard Worker #define CASES 5
17*4dc78e53SAndroid Build Coastguard Worker #define MAX_ATTR 7
18*4dc78e53SAndroid Build Coastguard Worker
START_TEST(static_checks)19*4dc78e53SAndroid Build Coastguard Worker START_TEST(static_checks)
20*4dc78e53SAndroid Build Coastguard Worker {
21*4dc78e53SAndroid Build Coastguard Worker int i, j;
22*4dc78e53SAndroid Build Coastguard Worker char strbuf[100];
23*4dc78e53SAndroid Build Coastguard Worker
24*4dc78e53SAndroid Build Coastguard Worker _NL_STATIC_ASSERT(RTNL_LINK_RX_PACKETS == 0);
25*4dc78e53SAndroid Build Coastguard Worker assert(_nltst_map_stat_id_from_IPSTATS_MIB_v2[0] ==
26*4dc78e53SAndroid Build Coastguard Worker RTNL_LINK_RX_PACKETS);
27*4dc78e53SAndroid Build Coastguard Worker for (i = 1; i < __IPSTATS_MIB_MAX; i++) {
28*4dc78e53SAndroid Build Coastguard Worker assert(_nltst_map_stat_id_from_IPSTATS_MIB_v2[i] > 0);
29*4dc78e53SAndroid Build Coastguard Worker assert(_nltst_map_stat_id_from_IPSTATS_MIB_v2[i] <
30*4dc78e53SAndroid Build Coastguard Worker __RTNL_LINK_STATS_MAX);
31*4dc78e53SAndroid Build Coastguard Worker for (j = 1; j < i; j++)
32*4dc78e53SAndroid Build Coastguard Worker assert(_nltst_map_stat_id_from_IPSTATS_MIB_v2[i] !=
33*4dc78e53SAndroid Build Coastguard Worker _nltst_map_stat_id_from_IPSTATS_MIB_v2[j]);
34*4dc78e53SAndroid Build Coastguard Worker }
35*4dc78e53SAndroid Build Coastguard Worker
36*4dc78e53SAndroid Build Coastguard Worker for (i = 0; i <= RTNL_LINK_STATS_MAX + 1; i++) {
37*4dc78e53SAndroid Build Coastguard Worker const char *s;
38*4dc78e53SAndroid Build Coastguard Worker
39*4dc78e53SAndroid Build Coastguard Worker s = rtnl_link_stat2str(i, strbuf, sizeof(strbuf));
40*4dc78e53SAndroid Build Coastguard Worker assert(s);
41*4dc78e53SAndroid Build Coastguard Worker assert(s == strbuf);
42*4dc78e53SAndroid Build Coastguard Worker assert(strlen(s) < sizeof(strbuf));
43*4dc78e53SAndroid Build Coastguard Worker if (strncmp(s, "0x", 2) == 0) {
44*4dc78e53SAndroid Build Coastguard Worker assert(i == RTNL_LINK_STATS_MAX + 1);
45*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(strtoll(&s[2], NULL, 16), i);
46*4dc78e53SAndroid Build Coastguard Worker } else
47*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_le(i, RTNL_LINK_STATS_MAX);
48*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(i, rtnl_link_str2stat(s));
49*4dc78e53SAndroid Build Coastguard Worker }
50*4dc78e53SAndroid Build Coastguard Worker
51*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_str2ip_proto(""), -NLE_OBJ_NOTFOUND);
52*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_str2ip_proto("5"), 5);
53*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_str2ip_proto(" 13 "), -NLE_OBJ_NOTFOUND);
54*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_str2ip_proto("13"), 13);
55*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_str2ip_proto("0x13"), 0x13);
56*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_str2ip_proto("0342"), 0342);
57*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_str2ip_proto("2147483647"), 2147483647);
58*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(nl_str2ip_proto("2147483648"), -NLE_OBJ_NOTFOUND);
59*4dc78e53SAndroid Build Coastguard Worker }
60*4dc78e53SAndroid Build Coastguard Worker END_TEST
61*4dc78e53SAndroid Build Coastguard Worker
set_bitmap_range(u_int32_t start,u_int32_t end,struct rtnl_link_bridge_vlan * vlan_info,int untagged)62*4dc78e53SAndroid Build Coastguard Worker static void set_bitmap_range(u_int32_t start, u_int32_t end,
63*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link_bridge_vlan *vlan_info,
64*4dc78e53SAndroid Build Coastguard Worker int untagged)
65*4dc78e53SAndroid Build Coastguard Worker {
66*4dc78e53SAndroid Build Coastguard Worker for (u_int32_t i = start; i <= end; i++) {
67*4dc78e53SAndroid Build Coastguard Worker vlan_info->vlan_bitmap[i / 32] |= (((uint32_t)1) << (i % 32));
68*4dc78e53SAndroid Build Coastguard Worker if (untagged) {
69*4dc78e53SAndroid Build Coastguard Worker vlan_info->untagged_bitmap[i / 32] |=
70*4dc78e53SAndroid Build Coastguard Worker (((uint32_t)1) << (i % 32));
71*4dc78e53SAndroid Build Coastguard Worker }
72*4dc78e53SAndroid Build Coastguard Worker }
73*4dc78e53SAndroid Build Coastguard Worker }
74*4dc78e53SAndroid Build Coastguard Worker
START_TEST(vlan_attribute_check)75*4dc78e53SAndroid Build Coastguard Worker START_TEST(vlan_attribute_check)
76*4dc78e53SAndroid Build Coastguard Worker {
77*4dc78e53SAndroid Build Coastguard Worker struct nlmsghdr *nlh;
78*4dc78e53SAndroid Build Coastguard Worker struct nlattr *a;
79*4dc78e53SAndroid Build Coastguard Worker int attr_count, rem;
80*4dc78e53SAndroid Build Coastguard Worker struct bridge_vlan_info *vlan_attr;
81*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link_bridge_vlan vlan_info[CASES];
82*4dc78e53SAndroid Build Coastguard Worker struct bridge_vlan_info expected_attr[CASES][MAX_ATTR];
83*4dc78e53SAndroid Build Coastguard Worker
84*4dc78e53SAndroid Build Coastguard Worker for (int i = 0; i < CASES; i++) {
85*4dc78e53SAndroid Build Coastguard Worker memset(&vlan_info[i], 0, sizeof(struct rtnl_link_bridge_vlan));
86*4dc78e53SAndroid Build Coastguard Worker memset(&expected_attr[i], 0,
87*4dc78e53SAndroid Build Coastguard Worker sizeof(struct bridge_vlan_info) * MAX_ATTR);
88*4dc78e53SAndroid Build Coastguard Worker }
89*4dc78e53SAndroid Build Coastguard Worker
90*4dc78e53SAndroid Build Coastguard Worker // Case 1 setting pvid untagged.
91*4dc78e53SAndroid Build Coastguard Worker vlan_info[0].pvid = 1;
92*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(1, 1, &vlan_info[0], 1);
93*4dc78e53SAndroid Build Coastguard Worker expected_attr[0][0].vid = 1;
94*4dc78e53SAndroid Build Coastguard Worker expected_attr[0][0].flags = BRIDGE_VLAN_INFO_PVID |
95*4dc78e53SAndroid Build Coastguard Worker BRIDGE_VLAN_INFO_UNTAGGED;
96*4dc78e53SAndroid Build Coastguard Worker
97*4dc78e53SAndroid Build Coastguard Worker // Case 2 setting vid range.
98*4dc78e53SAndroid Build Coastguard Worker vlan_info[1].pvid = 0;
99*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(1, 4094, &vlan_info[1], 0);
100*4dc78e53SAndroid Build Coastguard Worker expected_attr[1][0].vid = 1;
101*4dc78e53SAndroid Build Coastguard Worker expected_attr[1][0].flags = BRIDGE_VLAN_INFO_RANGE_BEGIN;
102*4dc78e53SAndroid Build Coastguard Worker expected_attr[1][1].vid = 4094;
103*4dc78e53SAndroid Build Coastguard Worker expected_attr[1][1].flags = BRIDGE_VLAN_INFO_RANGE_END;
104*4dc78e53SAndroid Build Coastguard Worker
105*4dc78e53SAndroid Build Coastguard Worker // Case 3 interweaving pvid with vid range.
106*4dc78e53SAndroid Build Coastguard Worker vlan_info[2].pvid = 7;
107*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(1, 27, &vlan_info[2], 0);
108*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(7, 7, &vlan_info[2], 1);
109*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][0].vid = 1;
110*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][0].flags = BRIDGE_VLAN_INFO_RANGE_BEGIN;
111*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][1].vid = 6;
112*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][1].flags = BRIDGE_VLAN_INFO_RANGE_END;
113*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][2].vid = 8;
114*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][2].flags = BRIDGE_VLAN_INFO_RANGE_BEGIN;
115*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][3].vid = 27;
116*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][3].flags = BRIDGE_VLAN_INFO_RANGE_END;
117*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][4].vid = 7;
118*4dc78e53SAndroid Build Coastguard Worker expected_attr[2][4].flags = BRIDGE_VLAN_INFO_PVID |
119*4dc78e53SAndroid Build Coastguard Worker BRIDGE_VLAN_INFO_UNTAGGED;
120*4dc78e53SAndroid Build Coastguard Worker
121*4dc78e53SAndroid Build Coastguard Worker // Case 4 interweaving untagged and tagged vid ranges.
122*4dc78e53SAndroid Build Coastguard Worker vlan_info[3].pvid = 1;
123*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(1, 1, &vlan_info[3], 1);
124*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(1, 25, &vlan_info[3], 0);
125*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(26, 50, &vlan_info[3], 1);
126*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(51, 75, &vlan_info[3], 0);
127*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][0].vid = 2;
128*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][0].flags = BRIDGE_VLAN_INFO_RANGE_BEGIN;
129*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][1].vid = 25;
130*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][1].flags = BRIDGE_VLAN_INFO_RANGE_END;
131*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][2].vid = 26;
132*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][2].flags = BRIDGE_VLAN_INFO_RANGE_BEGIN |
133*4dc78e53SAndroid Build Coastguard Worker BRIDGE_VLAN_INFO_UNTAGGED;
134*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][3].vid = 50;
135*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][3].flags = BRIDGE_VLAN_INFO_RANGE_END |
136*4dc78e53SAndroid Build Coastguard Worker BRIDGE_VLAN_INFO_UNTAGGED;
137*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][4].vid = 51;
138*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][4].flags = BRIDGE_VLAN_INFO_RANGE_BEGIN;
139*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][5].vid = 75;
140*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][5].flags = BRIDGE_VLAN_INFO_RANGE_END;
141*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][6].vid = 1;
142*4dc78e53SAndroid Build Coastguard Worker expected_attr[3][6].flags = BRIDGE_VLAN_INFO_PVID |
143*4dc78e53SAndroid Build Coastguard Worker BRIDGE_VLAN_INFO_UNTAGGED;
144*4dc78e53SAndroid Build Coastguard Worker
145*4dc78e53SAndroid Build Coastguard Worker // Case 5 individual vid.
146*4dc78e53SAndroid Build Coastguard Worker vlan_info[4].pvid = 0;
147*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(5, 5, &vlan_info[4], 0);
148*4dc78e53SAndroid Build Coastguard Worker set_bitmap_range(3067, 3067, &vlan_info[4], 1);
149*4dc78e53SAndroid Build Coastguard Worker expected_attr[4][0].vid = 5;
150*4dc78e53SAndroid Build Coastguard Worker expected_attr[4][0].flags = 0;
151*4dc78e53SAndroid Build Coastguard Worker expected_attr[4][1].vid = 3067;
152*4dc78e53SAndroid Build Coastguard Worker expected_attr[4][1].flags = BRIDGE_VLAN_INFO_UNTAGGED;
153*4dc78e53SAndroid Build Coastguard Worker
154*4dc78e53SAndroid Build Coastguard Worker for (int i = 0; i < CASES; i++) {
155*4dc78e53SAndroid Build Coastguard Worker _nl_auto_nl_msg struct nl_msg *msg = nlmsg_alloc();
156*4dc78e53SAndroid Build Coastguard Worker attr_count = 0;
157*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(msg, "Unable to allocate netlink message");
158*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(0,
159*4dc78e53SAndroid Build Coastguard Worker _nl_bridge_fill_vlan_info(msg, &vlan_info[i]));
160*4dc78e53SAndroid Build Coastguard Worker
161*4dc78e53SAndroid Build Coastguard Worker nlh = nlmsg_hdr(msg);
162*4dc78e53SAndroid Build Coastguard Worker
163*4dc78e53SAndroid Build Coastguard Worker nlmsg_for_each_attr(a, nlh, 0, rem) {
164*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(expected_attr[i][attr_count].vid != 0,
165*4dc78e53SAndroid Build Coastguard Worker "Attribute number %d unexpected",
166*4dc78e53SAndroid Build Coastguard Worker attr_count);
167*4dc78e53SAndroid Build Coastguard Worker ck_assert_msg(
168*4dc78e53SAndroid Build Coastguard Worker nla_type(a) == IFLA_BRIDGE_VLAN_INFO,
169*4dc78e53SAndroid Build Coastguard Worker "Expected attribute IFLA_BRIDGE_VLAN_INFO %d",
170*4dc78e53SAndroid Build Coastguard Worker IFLA_BRIDGE_VLAN_INFO);
171*4dc78e53SAndroid Build Coastguard Worker vlan_attr = (struct bridge_vlan_info *)nla_data(a);
172*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(vlan_attr->vid,
173*4dc78e53SAndroid Build Coastguard Worker expected_attr[i][attr_count].vid);
174*4dc78e53SAndroid Build Coastguard Worker ck_assert_int_eq(vlan_attr->flags,
175*4dc78e53SAndroid Build Coastguard Worker expected_attr[i][attr_count].flags);
176*4dc78e53SAndroid Build Coastguard Worker attr_count++;
177*4dc78e53SAndroid Build Coastguard Worker }
178*4dc78e53SAndroid Build Coastguard Worker }
179*4dc78e53SAndroid Build Coastguard Worker }
180*4dc78e53SAndroid Build Coastguard Worker END_TEST
181*4dc78e53SAndroid Build Coastguard Worker
make_suite(void)182*4dc78e53SAndroid Build Coastguard Worker static Suite *make_suite(void)
183*4dc78e53SAndroid Build Coastguard Worker {
184*4dc78e53SAndroid Build Coastguard Worker Suite *suite = suite_create("Direct");
185*4dc78e53SAndroid Build Coastguard Worker TCase *tc = tcase_create("Core");
186*4dc78e53SAndroid Build Coastguard Worker
187*4dc78e53SAndroid Build Coastguard Worker tcase_add_test(tc, static_checks);
188*4dc78e53SAndroid Build Coastguard Worker tcase_add_test(tc, vlan_attribute_check);
189*4dc78e53SAndroid Build Coastguard Worker suite_add_tcase(suite, tc);
190*4dc78e53SAndroid Build Coastguard Worker return suite;
191*4dc78e53SAndroid Build Coastguard Worker }
192*4dc78e53SAndroid Build Coastguard Worker
main(int argc,char * argv[])193*4dc78e53SAndroid Build Coastguard Worker int main(int argc, char *argv[])
194*4dc78e53SAndroid Build Coastguard Worker {
195*4dc78e53SAndroid Build Coastguard Worker SRunner *runner;
196*4dc78e53SAndroid Build Coastguard Worker int nfailed;
197*4dc78e53SAndroid Build Coastguard Worker
198*4dc78e53SAndroid Build Coastguard Worker runner = srunner_create(suite_create("main"));
199*4dc78e53SAndroid Build Coastguard Worker
200*4dc78e53SAndroid Build Coastguard Worker srunner_add_suite(runner, make_suite());
201*4dc78e53SAndroid Build Coastguard Worker
202*4dc78e53SAndroid Build Coastguard Worker srunner_run_all(runner, CK_ENV);
203*4dc78e53SAndroid Build Coastguard Worker
204*4dc78e53SAndroid Build Coastguard Worker nfailed = srunner_ntests_failed(runner);
205*4dc78e53SAndroid Build Coastguard Worker srunner_free(runner);
206*4dc78e53SAndroid Build Coastguard Worker return nfailed != 0;
207*4dc78e53SAndroid Build Coastguard Worker }
208