8#include <linux/inet_diag.h>
10#include <netlink/idiag/req.h>
11#include <netlink/idiag/idiagnl.h>
12#include <netlink/data.h>
13#include <netlink/addr.h>
14#include <netlink/msg.h>
16#include "nl-priv-dynamic-core/object-api.h"
23 struct nl_addr * idiag_src;
24 struct nl_addr * idiag_dst;
25 uint32_t idiag_ifindex;
26 uint32_t idiag_states;
58uint8_t idiagnl_req_get_family(
const struct idiagnl_req *req)
60 return req->idiag_family;
63void idiagnl_req_set_family(
struct idiagnl_req *req, uint8_t family)
65 req->idiag_family = family;
68uint8_t idiagnl_req_get_ext(
const struct idiagnl_req *req)
70 return req->idiag_ext;
73void idiagnl_req_set_ext(
struct idiagnl_req *req, uint8_t ext)
78uint32_t idiagnl_req_get_ifindex(
const struct idiagnl_req *req)
80 return req->idiag_ifindex;
83void idiagnl_req_set_ifindex(
struct idiagnl_req *req, uint32_t ifindex)
85 req->idiag_ifindex = ifindex;
88uint32_t idiagnl_req_get_states(
const struct idiagnl_req *req)
90 return req->idiag_states;
93void idiagnl_req_set_states(
struct idiagnl_req *req, uint32_t states)
95 req->idiag_states = states;
98uint32_t idiagnl_req_get_dbs(
const struct idiagnl_req *req)
100 return req->idiag_dbs;
103void idiagnl_req_set_dbs(
struct idiagnl_req *req, uint32_t dbs)
105 req->idiag_dbs = dbs;
108struct nl_addr *idiagnl_req_get_src(
const struct idiagnl_req *req)
110 return req->idiag_src;
113int idiagnl_req_set_src(
struct idiagnl_req *req,
struct nl_addr *addr)
119 req->idiag_src = addr;
124struct nl_addr *idiagnl_req_get_dst(
const struct idiagnl_req *req)
126 return req->idiag_dst;
129int idiagnl_req_set_dst(
struct idiagnl_req *req,
struct nl_addr *addr)
135 req->idiag_dst = addr;
142static void idiag_req_dump_line(
struct nl_object *a,
struct nl_dump_params *p)
145 char buf[64] = { 0 };
147 nl_dump_line(p,
"%s ", nl_af2str(req->idiag_family, buf,
sizeof(buf)));
150 nl_dump(p,
"iif %d ", req->idiag_ifindex);
154static void idiag_req_dump_details(
struct nl_object *a,
struct nl_dump_params *p)
159 nl_dump_line(p,
" ");
160 nl_dump(p,
"%s ", nl_af2str(req->idiag_family, buf,
sizeof(buf)));
165 nl_dump(p,
"iif %d ", req->idiag_ifindex);
168 nl_dump(p,
"dbs %d", req->idiag_dbs);
172static void idiag_req_dump_stats(
struct nl_object *obj,
struct nl_dump_params *p)
174 idiag_req_dump_details(obj, p);
177static void idiagnl_req_free(
struct nl_object *a)
187static int idiagnl_req_clone(
struct nl_object *_dst,
struct nl_object *_src)
192 src->idiag_src = NULL;
193 src->idiag_dst = NULL;
206int idiagnl_req_parse(
struct nlmsghdr *nlh,
struct idiagnl_req **result)
209 struct inet_diag_req *raw_req = NULL;
210 struct nl_addr *src = NULL, *dst = NULL;
213 req = idiagnl_req_alloc();
218 req->idiag_family = raw_req->idiag_family;
219 req->idiag_ext = raw_req->idiag_ext;
220 req->idiag_states = raw_req->idiag_states;
221 req->idiag_dbs = raw_req->idiag_dbs;
222 req->idiag_ifindex = raw_req->id.idiag_if;
224 dst =
nl_addr_build(raw_req->idiag_family, raw_req->id.idiag_dst,
225 sizeof(raw_req->id.idiag_dst));
229 err = idiagnl_req_set_dst(req, dst);
235 src =
nl_addr_build(raw_req->idiag_family, raw_req->id.idiag_src,
236 sizeof(raw_req->id.idiag_src));
240 err = idiagnl_req_set_src(req, src);
250 idiagnl_req_put(req);
259struct nl_object_ops idiagnl_req_obj_ops = {
260 .oo_name =
"idiag/idiag_req",
262 .oo_free_data = idiagnl_req_free,
263 .oo_clone = idiagnl_req_clone,
struct nl_addr * nl_addr_get(struct nl_addr *addr)
Increase the reference counter of an abstract address.
struct nl_addr * nl_addr_build(int family, const void *buf, size_t size)
Allocate abstract address based on a binary address.
struct nl_addr * nl_addr_clone(const struct nl_addr *addr)
Clone existing abstract address object.
char * nl_addr2str(const struct nl_addr *addr, char *buf, size_t size)
Convert abstract address object to character string.
void nl_addr_put(struct nl_addr *addr)
Decrease the reference counter of an abstract address.
char * idiagnl_state2str(int state, char *buf, size_t len)
Convert inet diag socket states to strings.
char * idiagnl_exts2str(uint8_t attrs, char *buf, size_t len)
Convert inet diag extension flags to a string.
void * nlmsg_data(const struct nlmsghdr *nlh)
Return pointer to message payload.
void nl_object_put(struct nl_object *obj)
Release a reference from an object.
void nl_object_get(struct nl_object *obj)
Acquire a reference on a object.
struct nl_object * nl_object_alloc(struct nl_object_ops *ops)
Allocate a new object of kind specified by the operations handle.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
@ NL_DUMP_STATS
Dump all attributes including statistics.
@ NL_DUMP_LINE
Dump object briefly on one line.
@ NL_DUMP_DETAILS
Dump all attributes but no statistics.