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