mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 07:50:04 +00:00
tools: ynl: create local nlmsg access helpers
Create helpers for accessing payloads of struct nlmsg. Use them instead of the libmnl ones. Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Link: https://lore.kernel.org/r/20240227223032.1835527-5-kuba@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
66fcdad088
commit
0b3ece4422
@ -125,13 +125,50 @@ int ynl_exec_dump(struct ynl_sock *ys, struct nlmsghdr *req_nlh,
|
||||
void ynl_error_unknown_notification(struct ynl_sock *ys, __u8 cmd);
|
||||
int ynl_error_parse(struct ynl_parse_arg *yarg, const char *msg);
|
||||
|
||||
/* Attribute helpers */
|
||||
/* Netlink message handling helpers */
|
||||
|
||||
static inline struct nlmsghdr *ynl_nlmsg_put_header(void *buf)
|
||||
{
|
||||
struct nlmsghdr *nlh = buf;
|
||||
|
||||
memset(nlh, 0, sizeof(*nlh));
|
||||
nlh->nlmsg_len = NLMSG_HDRLEN;
|
||||
|
||||
return nlh;
|
||||
}
|
||||
|
||||
static inline unsigned int ynl_nlmsg_data_len(const struct nlmsghdr *nlh)
|
||||
{
|
||||
return nlh->nlmsg_len - NLMSG_HDRLEN;
|
||||
}
|
||||
|
||||
static inline void *ynl_nlmsg_data(const struct nlmsghdr *nlh)
|
||||
{
|
||||
return (unsigned char *)nlh + NLMSG_HDRLEN;
|
||||
}
|
||||
|
||||
static inline void *
|
||||
ynl_nlmsg_data_offset(const struct nlmsghdr *nlh, unsigned int offset)
|
||||
{
|
||||
return (unsigned char *)nlh + NLMSG_HDRLEN + offset;
|
||||
}
|
||||
|
||||
static inline void *ynl_nlmsg_end_addr(const struct nlmsghdr *nlh)
|
||||
{
|
||||
return (char *)nlh + nlh->nlmsg_len;
|
||||
}
|
||||
|
||||
static inline void *
|
||||
ynl_nlmsg_put_extra_header(struct nlmsghdr *nlh, unsigned int size)
|
||||
{
|
||||
void *tail = ynl_nlmsg_end_addr(nlh);
|
||||
|
||||
nlh->nlmsg_len += NLMSG_ALIGN(size);
|
||||
return tail;
|
||||
}
|
||||
|
||||
/* Netlink attribute helpers */
|
||||
|
||||
static inline unsigned int ynl_attr_type(const struct nlattr *attr)
|
||||
{
|
||||
return attr->nla_type & NLA_TYPE_MASK;
|
||||
|
@ -190,9 +190,8 @@ ynl_ext_ack_check(struct ynl_sock *ys, const struct nlmsghdr *nlh,
|
||||
n = snprintf(bad_attr, sizeof(bad_attr), "%sbad attribute: ",
|
||||
str ? " (" : "");
|
||||
|
||||
start = mnl_nlmsg_get_payload_offset(ys->nlh,
|
||||
ys->family->hdr_len);
|
||||
end = mnl_nlmsg_get_payload_tail(ys->nlh);
|
||||
start = ynl_nlmsg_data_offset(ys->nlh, ys->family->hdr_len);
|
||||
end = ynl_nlmsg_end_addr(ys->nlh);
|
||||
|
||||
off = ys->err.attr_offs;
|
||||
off -= sizeof(struct nlmsghdr);
|
||||
@ -216,9 +215,8 @@ ynl_ext_ack_check(struct ynl_sock *ys, const struct nlmsghdr *nlh,
|
||||
n = snprintf(miss_attr, sizeof(miss_attr), "%smissing attribute: ",
|
||||
bad_attr[0] ? ", " : (str ? " (" : ""));
|
||||
|
||||
start = mnl_nlmsg_get_payload_offset(ys->nlh,
|
||||
ys->family->hdr_len);
|
||||
end = mnl_nlmsg_get_payload_tail(ys->nlh);
|
||||
start = ynl_nlmsg_data_offset(ys->nlh, ys->family->hdr_len);
|
||||
end = ynl_nlmsg_end_addr(ys->nlh);
|
||||
|
||||
nest_pol = ys->req_policy;
|
||||
if (tb[NLMSGERR_ATTR_MISS_NEST]) {
|
||||
@ -259,7 +257,7 @@ ynl_ext_ack_check(struct ynl_sock *ys, const struct nlmsghdr *nlh,
|
||||
|
||||
static int ynl_cb_error(const struct nlmsghdr *nlh, void *data)
|
||||
{
|
||||
const struct nlmsgerr *err = mnl_nlmsg_get_payload(nlh);
|
||||
const struct nlmsgerr *err = ynl_nlmsg_data(nlh);
|
||||
struct ynl_parse_arg *yarg = data;
|
||||
unsigned int hlen;
|
||||
int code;
|
||||
@ -270,7 +268,7 @@ static int ynl_cb_error(const struct nlmsghdr *nlh, void *data)
|
||||
|
||||
hlen = sizeof(*err);
|
||||
if (!(nlh->nlmsg_flags & NLM_F_CAPPED))
|
||||
hlen += mnl_nlmsg_get_payload_len(&err->msg);
|
||||
hlen += ynl_nlmsg_data_len(&err->msg);
|
||||
|
||||
ynl_ext_ack_check(yarg->ys, nlh, hlen);
|
||||
|
||||
@ -413,7 +411,7 @@ struct nlmsghdr *ynl_msg_start(struct ynl_sock *ys, __u32 id, __u16 flags)
|
||||
|
||||
ynl_err_reset(ys);
|
||||
|
||||
nlh = ys->nlh = mnl_nlmsg_put_header(ys->tx_buf);
|
||||
nlh = ys->nlh = ynl_nlmsg_put_header(ys->tx_buf);
|
||||
nlh->nlmsg_type = id;
|
||||
nlh->nlmsg_flags = flags;
|
||||
nlh->nlmsg_seq = ++ys->seq;
|
||||
@ -435,7 +433,7 @@ ynl_gemsg_start(struct ynl_sock *ys, __u32 id, __u16 flags,
|
||||
gehdr.cmd = cmd;
|
||||
gehdr.version = version;
|
||||
|
||||
data = mnl_nlmsg_put_extra_header(nlh, sizeof(gehdr));
|
||||
data = ynl_nlmsg_put_extra_header(nlh, sizeof(gehdr));
|
||||
memcpy(data, &gehdr, sizeof(gehdr));
|
||||
|
||||
return nlh;
|
||||
@ -718,7 +716,7 @@ static int ynl_ntf_parse(struct ynl_sock *ys, const struct nlmsghdr *nlh)
|
||||
struct genlmsghdr *gehdr;
|
||||
int ret;
|
||||
|
||||
gehdr = mnl_nlmsg_get_payload(nlh);
|
||||
gehdr = ynl_nlmsg_data(nlh);
|
||||
if (gehdr->cmd >= ys->family->ntf_info_size)
|
||||
return MNL_CB_ERROR;
|
||||
info = &ys->family->ntf_info[gehdr->cmd];
|
||||
@ -808,13 +806,13 @@ ynl_check_alien(struct ynl_sock *ys, const struct nlmsghdr *nlh, __u32 rsp_cmd)
|
||||
{
|
||||
struct genlmsghdr *gehdr;
|
||||
|
||||
if (mnl_nlmsg_get_payload_len(nlh) < sizeof(*gehdr)) {
|
||||
if (ynl_nlmsg_data_len(nlh) < sizeof(*gehdr)) {
|
||||
yerr(ys, YNL_ERROR_INV_RESP,
|
||||
"Kernel responded with truncated message");
|
||||
return -1;
|
||||
}
|
||||
|
||||
gehdr = mnl_nlmsg_get_payload(nlh);
|
||||
gehdr = ynl_nlmsg_data(nlh);
|
||||
if (gehdr->cmd != rsp_cmd)
|
||||
return ynl_ntf_parse(ys, nlh);
|
||||
|
||||
|
@ -1650,7 +1650,7 @@ def _multi_parse(ri, struct, init_lines, local_vars):
|
||||
ri.cw.p(f'dst->{arg} = {arg};')
|
||||
|
||||
if ri.fixed_hdr:
|
||||
ri.cw.p('hdr = mnl_nlmsg_get_payload_offset(nlh, sizeof(struct genlmsghdr));')
|
||||
ri.cw.p('hdr = ynl_nlmsg_data_offset(nlh, sizeof(struct genlmsghdr));')
|
||||
ri.cw.p(f"memcpy(&dst->_hdr, hdr, sizeof({ri.fixed_hdr}));")
|
||||
for anest in sorted(all_multi):
|
||||
aspec = struct[anest]
|
||||
@ -1794,7 +1794,7 @@ def print_req(ri):
|
||||
|
||||
if ri.fixed_hdr:
|
||||
ri.cw.p("hdr_len = sizeof(req->_hdr);")
|
||||
ri.cw.p("hdr = mnl_nlmsg_put_extra_header(nlh, hdr_len);")
|
||||
ri.cw.p("hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len);")
|
||||
ri.cw.p("memcpy(hdr, &req->_hdr, hdr_len);")
|
||||
ri.cw.nl()
|
||||
|
||||
@ -1857,7 +1857,7 @@ def print_dump(ri):
|
||||
|
||||
if ri.fixed_hdr:
|
||||
ri.cw.p("hdr_len = sizeof(req->_hdr);")
|
||||
ri.cw.p("hdr = mnl_nlmsg_put_extra_header(nlh, hdr_len);")
|
||||
ri.cw.p("hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len);")
|
||||
ri.cw.p("memcpy(hdr, &req->_hdr, hdr_len);")
|
||||
ri.cw.nl()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user