13 #include <netlink-private/netlink.h> 14 #include <netlink/idiag/req.h> 15 #include <linux/inet_diag.h> 25 struct idiagnl_req *idiagnl_req_alloc(
void)
30 void idiagnl_req_get(
struct idiagnl_req *req)
35 void idiagnl_req_put(
struct idiagnl_req *req)
45 uint8_t idiagnl_req_get_family(
const struct idiagnl_req *req)
47 return req->idiag_family;
50 void idiagnl_req_set_family(
struct idiagnl_req *req, uint8_t family)
52 req->idiag_family = family;
55 uint8_t idiagnl_req_get_ext(
const struct idiagnl_req *req)
57 return req->idiag_ext;
60 void idiagnl_req_set_ext(
struct idiagnl_req *req, uint8_t ext)
65 uint32_t idiagnl_req_get_ifindex(
const struct idiagnl_req *req)
67 return req->idiag_ifindex;
70 void idiagnl_req_set_ifindex(
struct idiagnl_req *req, uint32_t ifindex)
72 req->idiag_ifindex = ifindex;
75 uint32_t idiagnl_req_get_states(
const struct idiagnl_req *req)
77 return req->idiag_states;
80 void idiagnl_req_set_states(
struct idiagnl_req *req, uint32_t states)
82 req->idiag_states = states;
85 uint32_t idiagnl_req_get_dbs(
const struct idiagnl_req *req)
87 return req->idiag_dbs;
90 void idiagnl_req_set_dbs(
struct idiagnl_req *req, uint32_t dbs)
95 struct nl_addr *idiagnl_req_get_src(
const struct idiagnl_req *req)
97 return req->idiag_src;
100 int idiagnl_req_set_src(
struct idiagnl_req *req,
struct nl_addr *addr)
106 req->idiag_src = addr;
111 struct nl_addr *idiagnl_req_get_dst(
const struct idiagnl_req *req)
113 return req->idiag_dst;
116 int idiagnl_req_set_dst(
struct idiagnl_req *req,
struct nl_addr *addr)
122 req->idiag_dst = addr;
129 static void idiag_req_dump_line(
struct nl_object *a,
struct nl_dump_params *p)
131 struct idiagnl_req *req = (
struct idiagnl_req *) a;
132 char buf[64] = { 0 };
134 nl_dump_line(p,
"%s ", nl_af2str(req->idiag_family, buf,
sizeof(buf)));
137 nl_dump(p,
"iif %d ", req->idiag_ifindex);
141 static void idiag_req_dump_details(
struct nl_object *a,
struct nl_dump_params *p)
143 struct idiagnl_req *req = (
struct idiagnl_req *) a;
146 nl_dump_line(p,
" ");
147 nl_dump(p,
"%s ", nl_af2str(req->idiag_family, buf,
sizeof(buf)));
152 nl_dump(p,
"iif %d ", req->idiag_ifindex);
155 nl_dump(p,
"dbs %d", req->idiag_dbs);
159 static void idiag_req_dump_stats(
struct nl_object *obj,
struct nl_dump_params *p)
161 idiag_req_dump_details(obj, p);
164 static void idiagnl_req_free(
struct nl_object *a)
166 struct idiagnl_req *req = (
struct idiagnl_req *) a;
174 static int idiagnl_req_clone(
struct nl_object *_dst,
struct nl_object *_src)
176 struct idiagnl_req *dst = (
struct idiagnl_req *) _dst;
177 struct idiagnl_req *src = (
struct idiagnl_req *) _src;
190 int idiagnl_req_parse(
struct nlmsghdr *nlh,
struct idiagnl_req **result)
192 struct idiagnl_req *req = NULL;
193 struct inet_diag_req *raw_req = NULL;
194 struct nl_addr *src = NULL, *dst = NULL;
197 req = idiagnl_req_alloc();
202 req->idiag_family = raw_req->idiag_family;
203 req->idiag_ext = raw_req->idiag_ext;
204 req->idiag_states = raw_req->idiag_states;
205 req->idiag_dbs = raw_req->idiag_dbs;
206 req->idiag_ifindex = raw_req->id.idiag_if;
208 dst =
nl_addr_build(raw_req->idiag_family, raw_req->id.idiag_dst,
209 sizeof(raw_req->id.idiag_dst));
213 err = idiagnl_req_set_dst(req, dst);
219 src =
nl_addr_build(raw_req->idiag_family, raw_req->id.idiag_src,
220 sizeof(raw_req->id.idiag_src));
224 err = idiagnl_req_set_src(req, src);
234 idiagnl_req_put(req);
243 struct nl_object_ops idiagnl_req_obj_ops = {
244 .oo_name =
"idiag/idiag_req",
245 .oo_size =
sizeof(
struct idiagnl_req),
246 .oo_free_data = idiagnl_req_free,
247 .oo_clone = idiagnl_req_clone,
struct nl_addr * nl_addr_clone(const struct nl_addr *addr)
Clone existing abstract address object.
Dump object briefly on one line.
void * nlmsg_data(const struct nlmsghdr *nlh)
Return pointer to message payload.
struct nl_object * nl_object_alloc(struct nl_object_ops *ops)
Allocate a new object of kind specified by the operations handle.
void nl_object_get(struct nl_object *obj)
Acquire a reference on a object.
char * idiagnl_exts2str(uint8_t attrs, char *buf, size_t len)
Convert inet diag extension flags to a string.
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_get(struct nl_addr *addr)
Increase the reference counter of an abstract address.
Dump all attributes but no statistics.
void nl_object_put(struct nl_object *obj)
Release a reference from an object.
void nl_addr_put(struct nl_addr *addr)
Decrease the reference counter of an abstract address.
void nl_dump(struct nl_dump_params *params, const char *fmt,...)
Dump a formatted character string.
char * idiagnl_state2str(int state, char *buf, size_t len)
Convert inet diag socket states to strings.
Dump all attributes including statistics.
char * nl_addr2str(const struct nl_addr *addr, char *buf, size_t size)
Convert abstract address object to character string.