xref: /linux/tools/net/ynl/samples/rt-route.c (revision 1b98f357dadd6ea613a435fbaef1a5dd7b35fd21)
154d79085SJakub Kicinski // SPDX-License-Identifier: GPL-2.0
254d79085SJakub Kicinski #include <stdio.h>
354d79085SJakub Kicinski #include <string.h>
454d79085SJakub Kicinski 
554d79085SJakub Kicinski #include <ynl.h>
654d79085SJakub Kicinski 
754d79085SJakub Kicinski #include <arpa/inet.h>
854d79085SJakub Kicinski #include <net/if.h>
954d79085SJakub Kicinski 
1054d79085SJakub Kicinski #include "rt-route-user.h"
1154d79085SJakub Kicinski 
1254d79085SJakub Kicinski static void rt_route_print(struct rt_route_getroute_rsp *r)
1354d79085SJakub Kicinski {
1454d79085SJakub Kicinski 	char ifname[IF_NAMESIZE];
1554d79085SJakub Kicinski 	char route_str[64];
1654d79085SJakub Kicinski 	const char *route;
1754d79085SJakub Kicinski 	const char *name;
1854d79085SJakub Kicinski 
1954d79085SJakub Kicinski 	/* Ignore local */
2054d79085SJakub Kicinski 	if (r->_hdr.rtm_table == RT_TABLE_LOCAL)
2154d79085SJakub Kicinski 		return;
2254d79085SJakub Kicinski 
2354d79085SJakub Kicinski 	if (r->_present.oif) {
2454d79085SJakub Kicinski 		name = if_indextoname(r->oif, ifname);
2554d79085SJakub Kicinski 		if (name)
2654d79085SJakub Kicinski 			printf("oif: %-16s ", name);
2754d79085SJakub Kicinski 	}
2854d79085SJakub Kicinski 
29*b8ae9f70SJakub Kicinski 	if (r->_len.dst) {
3054d79085SJakub Kicinski 		route = inet_ntop(r->_hdr.rtm_family, r->dst,
3154d79085SJakub Kicinski 				  route_str, sizeof(route_str));
3254d79085SJakub Kicinski 		printf("dst: %s/%d", route, r->_hdr.rtm_dst_len);
3354d79085SJakub Kicinski 	}
3454d79085SJakub Kicinski 
35*b8ae9f70SJakub Kicinski 	if (r->_len.gateway) {
3654d79085SJakub Kicinski 		route = inet_ntop(r->_hdr.rtm_family, r->gateway,
3754d79085SJakub Kicinski 				  route_str, sizeof(route_str));
3854d79085SJakub Kicinski 		printf("gateway: %s ", route);
3954d79085SJakub Kicinski 	}
4054d79085SJakub Kicinski 
4154d79085SJakub Kicinski 	printf("\n");
4254d79085SJakub Kicinski }
4354d79085SJakub Kicinski 
4454d79085SJakub Kicinski int main(int argc, char **argv)
4554d79085SJakub Kicinski {
4654d79085SJakub Kicinski 	struct rt_route_getroute_req_dump *req;
4754d79085SJakub Kicinski 	struct rt_route_getroute_list *rsp;
4854d79085SJakub Kicinski 	struct ynl_error yerr;
4954d79085SJakub Kicinski 	struct ynl_sock *ys;
5054d79085SJakub Kicinski 
5154d79085SJakub Kicinski 	ys = ynl_sock_create(&ynl_rt_route_family, &yerr);
5254d79085SJakub Kicinski 	if (!ys) {
5354d79085SJakub Kicinski 		fprintf(stderr, "YNL: %s\n", yerr.msg);
5454d79085SJakub Kicinski 		return 1;
5554d79085SJakub Kicinski 	}
5654d79085SJakub Kicinski 
5754d79085SJakub Kicinski 	req = rt_route_getroute_req_dump_alloc();
5854d79085SJakub Kicinski 	if (!req)
5954d79085SJakub Kicinski 		goto err_destroy;
6054d79085SJakub Kicinski 
6154d79085SJakub Kicinski 	rsp = rt_route_getroute_dump(ys, req);
6254d79085SJakub Kicinski 	rt_route_getroute_req_dump_free(req);
6354d79085SJakub Kicinski 	if (!rsp)
6454d79085SJakub Kicinski 		goto err_close;
6554d79085SJakub Kicinski 
6654d79085SJakub Kicinski 	if (ynl_dump_empty(rsp))
6754d79085SJakub Kicinski 		fprintf(stderr, "Error: no routeesses reported\n");
6854d79085SJakub Kicinski 	ynl_dump_foreach(rsp, route)
6954d79085SJakub Kicinski 		rt_route_print(route);
7054d79085SJakub Kicinski 	rt_route_getroute_list_free(rsp);
7154d79085SJakub Kicinski 
7254d79085SJakub Kicinski 	ynl_sock_destroy(ys);
7354d79085SJakub Kicinski 	return 0;
7454d79085SJakub Kicinski 
7554d79085SJakub Kicinski err_close:
7654d79085SJakub Kicinski 	fprintf(stderr, "YNL: %s\n", ys->err.msg);
7754d79085SJakub Kicinski err_destroy:
7854d79085SJakub Kicinski 	ynl_sock_destroy(ys);
7954d79085SJakub Kicinski 	return 2;
8054d79085SJakub Kicinski }
81