xref: /linux/tools/net/ynl/tests/ovs.c (revision 91a4855d6c03e770e42f17c798a36a3c46e63de2)
1e0aa0c61SJakub Kicinski // SPDX-License-Identifier: GPL-2.0
2e0aa0c61SJakub Kicinski #include <stdio.h>
3e0aa0c61SJakub Kicinski #include <string.h>
4e0aa0c61SJakub Kicinski 
5e0aa0c61SJakub Kicinski #include <ynl.h>
6e0aa0c61SJakub Kicinski 
7*7e3effbcSJakub Kicinski #include <kselftest_harness.h>
8*7e3effbcSJakub Kicinski 
9e0aa0c61SJakub Kicinski #include "ovs_datapath-user.h"
10e0aa0c61SJakub Kicinski 
11*7e3effbcSJakub Kicinski static void ovs_print_datapath(struct __test_metadata *_metadata,
12*7e3effbcSJakub Kicinski 			       struct ovs_datapath_get_rsp *dp)
13e0aa0c61SJakub Kicinski {
14*7e3effbcSJakub Kicinski 	EXPECT_TRUE((bool)dp->_len.name);
15*7e3effbcSJakub Kicinski 	if (!dp->_len.name)
16*7e3effbcSJakub Kicinski 		return;
17e0aa0c61SJakub Kicinski 
18*7e3effbcSJakub Kicinski 	EXPECT_TRUE((bool)dp->_hdr.dp_ifindex);
19*7e3effbcSJakub Kicinski 	ksft_print_msg("%s(%d): pid:%u cache:%u\n",
20e0aa0c61SJakub Kicinski 		       dp->name, dp->_hdr.dp_ifindex,
21e0aa0c61SJakub Kicinski 		       dp->upcall_pid, dp->masks_cache_size);
22e0aa0c61SJakub Kicinski }
23*7e3effbcSJakub Kicinski 
24*7e3effbcSJakub Kicinski FIXTURE(ovs)
25*7e3effbcSJakub Kicinski {
26*7e3effbcSJakub Kicinski 	struct ynl_sock *ys;
27*7e3effbcSJakub Kicinski 	char *dp_name;
28*7e3effbcSJakub Kicinski };
29*7e3effbcSJakub Kicinski 
30*7e3effbcSJakub Kicinski FIXTURE_SETUP(ovs)
31*7e3effbcSJakub Kicinski {
32*7e3effbcSJakub Kicinski 	self->ys = ynl_sock_create(&ynl_ovs_datapath_family, NULL);
33*7e3effbcSJakub Kicinski 	ASSERT_NE(NULL, self->ys)
34*7e3effbcSJakub Kicinski 		TH_LOG("failed to create OVS datapath socket");
35*7e3effbcSJakub Kicinski }
36*7e3effbcSJakub Kicinski 
37*7e3effbcSJakub Kicinski FIXTURE_TEARDOWN(ovs)
38*7e3effbcSJakub Kicinski {
39*7e3effbcSJakub Kicinski 	if (self->dp_name) {
40*7e3effbcSJakub Kicinski 		struct ovs_datapath_del_req *req;
41*7e3effbcSJakub Kicinski 
42*7e3effbcSJakub Kicinski 		req = ovs_datapath_del_req_alloc();
43*7e3effbcSJakub Kicinski 		if (req) {
44*7e3effbcSJakub Kicinski 			ovs_datapath_del_req_set_name(req, self->dp_name);
45*7e3effbcSJakub Kicinski 			ovs_datapath_del(self->ys, req);
46*7e3effbcSJakub Kicinski 			ovs_datapath_del_req_free(req);
47*7e3effbcSJakub Kicinski 		}
48*7e3effbcSJakub Kicinski 	}
49*7e3effbcSJakub Kicinski 	ynl_sock_destroy(self->ys);
50*7e3effbcSJakub Kicinski }
51*7e3effbcSJakub Kicinski 
52*7e3effbcSJakub Kicinski TEST_F(ovs, crud)
53*7e3effbcSJakub Kicinski {
54*7e3effbcSJakub Kicinski 	struct ovs_datapath_get_req_dump *dreq;
55*7e3effbcSJakub Kicinski 	struct ovs_datapath_new_req *new_req;
56*7e3effbcSJakub Kicinski 	struct ovs_datapath_get_list *dps;
57*7e3effbcSJakub Kicinski 	struct ovs_datapath_get_rsp *dp;
58*7e3effbcSJakub Kicinski 	struct ovs_datapath_get_req *req;
59*7e3effbcSJakub Kicinski 	bool found = false;
60*7e3effbcSJakub Kicinski 	int err;
61*7e3effbcSJakub Kicinski 
62*7e3effbcSJakub Kicinski 	new_req = ovs_datapath_new_req_alloc();
63*7e3effbcSJakub Kicinski 	ASSERT_NE(NULL, new_req);
64*7e3effbcSJakub Kicinski 	ovs_datapath_new_req_set_upcall_pid(new_req, 1);
65*7e3effbcSJakub Kicinski 	ovs_datapath_new_req_set_name(new_req, "ynl-test");
66*7e3effbcSJakub Kicinski 
67*7e3effbcSJakub Kicinski 	err = ovs_datapath_new(self->ys, new_req);
68*7e3effbcSJakub Kicinski 	ovs_datapath_new_req_free(new_req);
69*7e3effbcSJakub Kicinski 	ASSERT_EQ(0, err) {
70*7e3effbcSJakub Kicinski 		TH_LOG("new failed: %s", self->ys->err.msg);
71*7e3effbcSJakub Kicinski 	}
72*7e3effbcSJakub Kicinski 	self->dp_name = "ynl-test";
73*7e3effbcSJakub Kicinski 
74*7e3effbcSJakub Kicinski 	ksft_print_msg("get:\n");
75*7e3effbcSJakub Kicinski 	req = ovs_datapath_get_req_alloc();
76*7e3effbcSJakub Kicinski 	ASSERT_NE(NULL, req);
77*7e3effbcSJakub Kicinski 	ovs_datapath_get_req_set_name(req, "ynl-test");
78*7e3effbcSJakub Kicinski 
79*7e3effbcSJakub Kicinski 	dp = ovs_datapath_get(self->ys, req);
80*7e3effbcSJakub Kicinski 	ovs_datapath_get_req_free(req);
81*7e3effbcSJakub Kicinski 	ASSERT_NE(NULL, dp) {
82*7e3effbcSJakub Kicinski 		TH_LOG("get failed: %s", self->ys->err.msg);
83*7e3effbcSJakub Kicinski 	}
84*7e3effbcSJakub Kicinski 
85*7e3effbcSJakub Kicinski 	ovs_print_datapath(_metadata, dp);
86*7e3effbcSJakub Kicinski 	EXPECT_STREQ("ynl-test", dp->name);
87*7e3effbcSJakub Kicinski 	ovs_datapath_get_rsp_free(dp);
88*7e3effbcSJakub Kicinski 
89*7e3effbcSJakub Kicinski 	ksft_print_msg("dump:\n");
90*7e3effbcSJakub Kicinski 	dreq = ovs_datapath_get_req_dump_alloc();
91*7e3effbcSJakub Kicinski 	ASSERT_NE(NULL, dreq);
92*7e3effbcSJakub Kicinski 
93*7e3effbcSJakub Kicinski 	dps = ovs_datapath_get_dump(self->ys, dreq);
94*7e3effbcSJakub Kicinski 	ovs_datapath_get_req_dump_free(dreq);
95*7e3effbcSJakub Kicinski 	ASSERT_NE(NULL, dps) {
96*7e3effbcSJakub Kicinski 		TH_LOG("dump failed: %s", self->ys->err.msg);
97*7e3effbcSJakub Kicinski 	}
98*7e3effbcSJakub Kicinski 
99*7e3effbcSJakub Kicinski 	ynl_dump_foreach(dps, d) {
100*7e3effbcSJakub Kicinski 		ovs_print_datapath(_metadata, d);
101*7e3effbcSJakub Kicinski 		if (d->name && !strcmp(d->name, "ynl-test"))
102*7e3effbcSJakub Kicinski 			found = true;
103*7e3effbcSJakub Kicinski 	}
104e0aa0c61SJakub Kicinski 	ovs_datapath_get_list_free(dps);
105*7e3effbcSJakub Kicinski 	EXPECT_TRUE(found);
106e0aa0c61SJakub Kicinski }
107e0aa0c61SJakub Kicinski 
108*7e3effbcSJakub Kicinski TEST_HARNESS_MAIN
109