diff options
Diffstat (limited to 'tools/net/ynl/samples/rt-route.c')
| -rw-r--r-- | tools/net/ynl/samples/rt-route.c | 80 | 
1 files changed, 80 insertions, 0 deletions
diff --git a/tools/net/ynl/samples/rt-route.c b/tools/net/ynl/samples/rt-route.c new file mode 100644 index 000000000000..7427104a96df --- /dev/null +++ b/tools/net/ynl/samples/rt-route.c @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <stdio.h> +#include <string.h> + +#include <ynl.h> + +#include <arpa/inet.h> +#include <net/if.h> + +#include "rt-route-user.h" + +static void rt_route_print(struct rt_route_getroute_rsp *r) +{ +	char ifname[IF_NAMESIZE]; +	char route_str[64]; +	const char *route; +	const char *name; + +	/* Ignore local */ +	if (r->_hdr.rtm_table == RT_TABLE_LOCAL) +		return; + +	if (r->_present.oif) { +		name = if_indextoname(r->oif, ifname); +		if (name) +			printf("oif: %-16s ", name); +	} + +	if (r->_len.dst) { +		route = inet_ntop(r->_hdr.rtm_family, r->dst, +				  route_str, sizeof(route_str)); +		printf("dst: %s/%d", route, r->_hdr.rtm_dst_len); +	} + +	if (r->_len.gateway) { +		route = inet_ntop(r->_hdr.rtm_family, r->gateway, +				  route_str, sizeof(route_str)); +		printf("gateway: %s ", route); +	} + +	printf("\n"); +} + +int main(int argc, char **argv) +{ +	struct rt_route_getroute_req_dump *req; +	struct rt_route_getroute_list *rsp; +	struct ynl_error yerr; +	struct ynl_sock *ys; + +	ys = ynl_sock_create(&ynl_rt_route_family, &yerr); +	if (!ys) { +		fprintf(stderr, "YNL: %s\n", yerr.msg); +		return 1; +	} + +	req = rt_route_getroute_req_dump_alloc(); +	if (!req) +		goto err_destroy; + +	rsp = rt_route_getroute_dump(ys, req); +	rt_route_getroute_req_dump_free(req); +	if (!rsp) +		goto err_close; + +	if (ynl_dump_empty(rsp)) +		fprintf(stderr, "Error: no routeesses reported\n"); +	ynl_dump_foreach(rsp, route) +		rt_route_print(route); +	rt_route_getroute_list_free(rsp); + +	ynl_sock_destroy(ys); +	return 0; + +err_close: +	fprintf(stderr, "YNL: %s\n", ys->err.msg); +err_destroy: +	ynl_sock_destroy(ys); +	return 2; +}  | 
