Blame lib/idiag/idiag_req_obj.c

Packit 51cea0
/* SPDX-License-Identifier: LGPL-2.1-only */
Packit 51cea0
/*
Packit 51cea0
 * lib/idiag/idiagnl_req_obj.c Inet Diag Request Object
Packit 51cea0
 *
Packit 51cea0
 *	This library is free software; you can redistribute it and/or
Packit 51cea0
 *	modify it under the terms of the GNU Lesser General Public
Packit 51cea0
 *	License as published by the Free Software Foundation version 2.1
Packit 51cea0
 *	of the License.
Packit 51cea0
 *
Packit 51cea0
 * Copyright (c) 2013 Sassano Systems LLC <joe@sassanosystems.com>
Packit 51cea0
 */
Packit 51cea0
Packit 51cea0
#include <netlink-private/netlink.h>
Packit 51cea0
#include <netlink/idiag/req.h>
Packit 51cea0
#include <linux/inet_diag.h>
Packit 51cea0
Packit 51cea0
/**
Packit 51cea0
 * @ingroup idiag
Packit 51cea0
 * @defgroup idiagnl_req Inet Diag Requests
Packit 51cea0
 *
Packit 51cea0
 * @details
Packit 51cea0
 * @idiagnl_doc{idiagnl_req, Inet Diag Request Documentation}
Packit 51cea0
 * @{
Packit 51cea0
 */
Packit 51cea0
struct idiagnl_req *idiagnl_req_alloc(void)
Packit 51cea0
{
Packit 51cea0
	return (struct idiagnl_req *) nl_object_alloc(&idiagnl_req_obj_ops);
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
void idiagnl_req_get(struct idiagnl_req *req)
Packit 51cea0
{
Packit 51cea0
	nl_object_get((struct nl_object *) req);
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
void idiagnl_req_put(struct idiagnl_req *req)
Packit 51cea0
{
Packit 51cea0
	nl_object_put((struct nl_object *) req);
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
/**
Packit 51cea0
 * @name Attributes
Packit 51cea0
 * @{
Packit 51cea0
 */
Packit 51cea0
Packit 51cea0
uint8_t idiagnl_req_get_family(const struct idiagnl_req *req)
Packit 51cea0
{
Packit 51cea0
	return req->idiag_family;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
void idiagnl_req_set_family(struct idiagnl_req *req, uint8_t family)
Packit 51cea0
{
Packit 51cea0
	req->idiag_family = family;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
uint8_t idiagnl_req_get_ext(const struct idiagnl_req *req)
Packit 51cea0
{
Packit 51cea0
	return req->idiag_ext;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
void idiagnl_req_set_ext(struct idiagnl_req *req, uint8_t ext)
Packit 51cea0
{
Packit 51cea0
	req->idiag_ext = ext;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
uint32_t idiagnl_req_get_ifindex(const struct idiagnl_req *req)
Packit 51cea0
{
Packit 51cea0
	return req->idiag_ifindex;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
void idiagnl_req_set_ifindex(struct idiagnl_req *req, uint32_t ifindex)
Packit 51cea0
{
Packit 51cea0
	req->idiag_ifindex = ifindex;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
uint32_t idiagnl_req_get_states(const struct idiagnl_req *req)
Packit 51cea0
{
Packit 51cea0
	return req->idiag_states;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
void idiagnl_req_set_states(struct idiagnl_req *req, uint32_t states)
Packit 51cea0
{
Packit 51cea0
	req->idiag_states = states;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
uint32_t idiagnl_req_get_dbs(const struct idiagnl_req *req)
Packit 51cea0
{
Packit 51cea0
	return req->idiag_dbs;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
void idiagnl_req_set_dbs(struct idiagnl_req *req, uint32_t dbs)
Packit 51cea0
{
Packit 51cea0
	req->idiag_dbs = dbs;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
struct nl_addr *idiagnl_req_get_src(const struct idiagnl_req *req)
Packit 51cea0
{
Packit 51cea0
	return req->idiag_src;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
int idiagnl_req_set_src(struct idiagnl_req *req, struct nl_addr *addr)
Packit 51cea0
{
Packit 51cea0
	if (req->idiag_src)
Packit 51cea0
		nl_addr_put(req->idiag_src);
Packit 51cea0
Packit 51cea0
	nl_addr_get(addr);
Packit 51cea0
	req->idiag_src = addr;
Packit 51cea0
Packit 51cea0
	return 0;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
struct nl_addr *idiagnl_req_get_dst(const struct idiagnl_req *req)
Packit 51cea0
{
Packit 51cea0
	return req->idiag_dst;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
int idiagnl_req_set_dst(struct idiagnl_req *req, struct nl_addr *addr)
Packit 51cea0
{
Packit 51cea0
	if (req->idiag_dst)
Packit 51cea0
		nl_addr_put(req->idiag_dst);
Packit 51cea0
Packit 51cea0
	nl_addr_get(addr);
Packit 51cea0
	req->idiag_dst = addr;
Packit 51cea0
Packit 51cea0
	return 0;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
/** @} */
Packit 51cea0
Packit 51cea0
static void idiag_req_dump_line(struct nl_object *a, struct nl_dump_params *p)
Packit 51cea0
{
Packit 51cea0
	struct idiagnl_req *req = (struct idiagnl_req *) a;
Packit 51cea0
	char buf[64] = { 0 };
Packit 51cea0
Packit 51cea0
	nl_dump_line(p, "%s ", nl_af2str(req->idiag_family, buf, sizeof(buf)));
Packit 51cea0
	nl_dump(p, "src %s ", nl_addr2str(req->idiag_src, buf, sizeof(buf)));
Packit 51cea0
	nl_dump(p, "dst %s ", nl_addr2str(req->idiag_dst, buf, sizeof(buf)));
Packit 51cea0
	nl_dump(p, "iif %d ", req->idiag_ifindex);
Packit 51cea0
	nl_dump(p, "\n");
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
static void idiag_req_dump_details(struct nl_object *a, struct nl_dump_params *p)
Packit 51cea0
{
Packit 51cea0
	struct idiagnl_req *req = (struct idiagnl_req *) a;
Packit 51cea0
	char buf[64];
Packit 51cea0
Packit 51cea0
	nl_dump_line(p, "    ");
Packit 51cea0
	nl_dump(p, "%s ", nl_af2str(req->idiag_family, buf, sizeof(buf)));
Packit 51cea0
	nl_dump(p, "exts %s ",
Packit 51cea0
			idiagnl_exts2str(req->idiag_ext, buf, sizeof(buf)));
Packit 51cea0
	nl_dump(p, "src %s ", nl_addr2str(req->idiag_src, buf, sizeof(buf)));
Packit 51cea0
	nl_dump(p, "dst %s ", nl_addr2str(req->idiag_dst, buf, sizeof(buf)));
Packit 51cea0
	nl_dump(p, "iif %d ", req->idiag_ifindex);
Packit 51cea0
	nl_dump(p, "states %s ", idiagnl_state2str(req->idiag_states, buf,
Packit 51cea0
				sizeof(buf)));
Packit 51cea0
	nl_dump(p, "dbs %d", req->idiag_dbs);
Packit 51cea0
	nl_dump(p, "\n");
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
static void idiag_req_dump_stats(struct nl_object *obj, struct nl_dump_params *p)
Packit 51cea0
{
Packit 51cea0
	idiag_req_dump_details(obj, p);
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
static void idiagnl_req_free(struct nl_object *a)
Packit 51cea0
{
Packit 51cea0
	struct idiagnl_req *req = (struct idiagnl_req *) a;
Packit 51cea0
	if (a == NULL)
Packit 51cea0
		return;
Packit 51cea0
Packit 51cea0
	nl_addr_put(req->idiag_src);
Packit 51cea0
	nl_addr_put(req->idiag_dst);
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
static int idiagnl_req_clone(struct nl_object *_dst, struct nl_object *_src)
Packit 51cea0
{
Packit 51cea0
	struct idiagnl_req *dst = (struct idiagnl_req *) _dst;
Packit 51cea0
	struct idiagnl_req *src = (struct idiagnl_req *) _src;
Packit 51cea0
Packit 51cea0
	if (src->idiag_src)
Packit 51cea0
		if (!(dst->idiag_src = nl_addr_clone(src->idiag_src)))
Packit 51cea0
			return -NLE_NOMEM;
Packit 51cea0
Packit 51cea0
	if (src->idiag_dst)
Packit 51cea0
		if (!(dst->idiag_dst = nl_addr_clone(src->idiag_dst)))
Packit 51cea0
			return -NLE_NOMEM;
Packit 51cea0
Packit 51cea0
	return 0;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
int idiagnl_req_parse(struct nlmsghdr *nlh, struct idiagnl_req **result)
Packit 51cea0
{
Packit 51cea0
	struct idiagnl_req *req = NULL;
Packit 51cea0
	struct inet_diag_req *raw_req = NULL;
Packit 51cea0
	struct nl_addr *src = NULL, *dst = NULL;
Packit 51cea0
	int err = 0;
Packit 51cea0
Packit 51cea0
	req = idiagnl_req_alloc();
Packit 51cea0
	if (!req)
Packit 51cea0
		goto errout_nomem;
Packit 51cea0
Packit 51cea0
	raw_req = nlmsg_data(nlh);
Packit 51cea0
	req->idiag_family = raw_req->idiag_family;
Packit 51cea0
	req->idiag_ext = raw_req->idiag_ext;
Packit 51cea0
	req->idiag_states = raw_req->idiag_states;
Packit 51cea0
	req->idiag_dbs = raw_req->idiag_dbs;
Packit 51cea0
	req->idiag_ifindex = raw_req->id.idiag_if;
Packit 51cea0
Packit 51cea0
	dst = nl_addr_build(raw_req->idiag_family, raw_req->id.idiag_dst,
Packit 51cea0
			sizeof(raw_req->id.idiag_dst));
Packit 51cea0
	if (!dst)
Packit 51cea0
		goto errout_nomem;
Packit 51cea0
Packit 51cea0
	err = idiagnl_req_set_dst(req, dst);
Packit 51cea0
	if (err < 0)
Packit 51cea0
		goto errout;
Packit 51cea0
Packit 51cea0
	nl_addr_put(dst);
Packit 51cea0
Packit 51cea0
	src = nl_addr_build(raw_req->idiag_family, raw_req->id.idiag_src,
Packit 51cea0
			sizeof(raw_req->id.idiag_src));
Packit 51cea0
	if (!src)
Packit 51cea0
		goto errout_nomem;
Packit 51cea0
Packit 51cea0
	err = idiagnl_req_set_src(req, src);
Packit 51cea0
	if (err < 0)
Packit 51cea0
		goto errout;
Packit 51cea0
Packit 51cea0
	nl_addr_put(src);
Packit 51cea0
Packit 51cea0
	*result = req;
Packit 51cea0
	return 0;
Packit 51cea0
Packit 51cea0
errout:
Packit 51cea0
	idiagnl_req_put(req);
Packit 51cea0
	return err;
Packit 51cea0
Packit 51cea0
errout_nomem:
Packit 51cea0
	err = -NLE_NOMEM;
Packit 51cea0
	goto errout;
Packit 51cea0
}
Packit 51cea0
Packit 51cea0
/** @cond SKIP */
Packit 51cea0
struct nl_object_ops idiagnl_req_obj_ops = {
Packit 51cea0
	.oo_name		  = "idiag/idiag_req",
Packit 51cea0
	.oo_size		  = sizeof(struct idiagnl_req),
Packit 51cea0
	.oo_free_data		  = idiagnl_req_free,
Packit 51cea0
	.oo_clone		  = idiagnl_req_clone,
Packit 51cea0
	.oo_dump		  = {
Packit 51cea0
		[NL_DUMP_LINE]	  = idiag_req_dump_line,
Packit 51cea0
		[NL_DUMP_DETAILS] = idiag_req_dump_details,
Packit 51cea0
		[NL_DUMP_STATS]	  = idiag_req_dump_stats,
Packit 51cea0
	},
Packit 51cea0
};
Packit 51cea0
/** @endcond */
Packit 51cea0
Packit 51cea0
/** @} */