mirror of
https://github.com/torvalds/linux.git
synced 2025-08-16 06:31:34 +02:00
tools: ynl: generate code for ovs families
Add ovs_flow, ovs_vport and ovs_datapath to the families supported in C. ovs-flow has some circular nesting which is fun to deal with, but the necessary support has been added already in the previous release cycle. Add a sample that proves that dealing with fixed headers does actually work correctly. Reviewed-by: Jiri Pirko <jiri@nvidia.com> Link: https://lore.kernel.org/r/20240202004926.447803-3-kuba@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
8f109e91b8
commit
7c59c9c8f2
3 changed files with 62 additions and 1 deletions
|
@ -14,7 +14,7 @@ YNL_GEN_ARG_ethtool:=--user-header linux/ethtool_netlink.h \
|
||||||
|
|
||||||
TOOL:=../ynl-gen-c.py
|
TOOL:=../ynl-gen-c.py
|
||||||
|
|
||||||
GENS:=ethtool devlink dpll handshake fou mptcp_pm netdev nfsd
|
GENS:=ethtool devlink dpll handshake fou mptcp_pm netdev nfsd ovs_datapath ovs_vport ovs_flow
|
||||||
SRCS=$(patsubst %,%-user.c,${GENS})
|
SRCS=$(patsubst %,%-user.c,${GENS})
|
||||||
HDRS=$(patsubst %,%-user.h,${GENS})
|
HDRS=$(patsubst %,%-user.h,${GENS})
|
||||||
OBJS=$(patsubst %,%-user.o,${GENS})
|
OBJS=$(patsubst %,%-user.o,${GENS})
|
||||||
|
|
1
tools/net/ynl/samples/.gitignore
vendored
1
tools/net/ynl/samples/.gitignore
vendored
|
@ -1,4 +1,5 @@
|
||||||
ethtool
|
ethtool
|
||||||
devlink
|
devlink
|
||||||
netdev
|
netdev
|
||||||
|
ovs
|
||||||
page-pool
|
page-pool
|
60
tools/net/ynl/samples/ovs.c
Normal file
60
tools/net/ynl/samples/ovs.c
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <ynl.h>
|
||||||
|
|
||||||
|
#include "ovs_datapath-user.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct ynl_sock *ys;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
ys = ynl_sock_create(&ynl_ovs_datapath_family, NULL);
|
||||||
|
if (!ys)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
struct ovs_datapath_new_req *req;
|
||||||
|
|
||||||
|
req = ovs_datapath_new_req_alloc();
|
||||||
|
if (!req)
|
||||||
|
goto err_close;
|
||||||
|
|
||||||
|
ovs_datapath_new_req_set_upcall_pid(req, 1);
|
||||||
|
ovs_datapath_new_req_set_name(req, argv[1]);
|
||||||
|
|
||||||
|
err = ovs_datapath_new(ys, req);
|
||||||
|
ovs_datapath_new_req_free(req);
|
||||||
|
if (err)
|
||||||
|
goto err_close;
|
||||||
|
} else {
|
||||||
|
struct ovs_datapath_get_req_dump *req;
|
||||||
|
struct ovs_datapath_get_list *dps;
|
||||||
|
|
||||||
|
printf("Dump:\n");
|
||||||
|
req = ovs_datapath_get_req_dump_alloc();
|
||||||
|
|
||||||
|
dps = ovs_datapath_get_dump(ys, req);
|
||||||
|
ovs_datapath_get_req_dump_free(req);
|
||||||
|
if (!dps)
|
||||||
|
goto err_close;
|
||||||
|
|
||||||
|
ynl_dump_foreach(dps, dp) {
|
||||||
|
printf(" %s(%d): pid:%u cache:%u\n",
|
||||||
|
dp->name, dp->_hdr.dp_ifindex,
|
||||||
|
dp->upcall_pid, dp->masks_cache_size);
|
||||||
|
}
|
||||||
|
ovs_datapath_get_list_free(dps);
|
||||||
|
}
|
||||||
|
|
||||||
|
ynl_sock_destroy(ys);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_close:
|
||||||
|
fprintf(stderr, "YNL (%d): %s\n", ys->err.code, ys->err.msg);
|
||||||
|
ynl_sock_destroy(ys);
|
||||||
|
return 2;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue