Commit 21f6986d authored by Jakub Kicinski's avatar Jakub Kicinski

tools: ynl: give up on libmnl for auto-ints

The temporary auto-int helpers are not really correct.
We can't treat signed and unsigned ints the same when
determining whether we need full 8B. I realized this
before sending the patch to add support in libmnl.
Unfortunately, that patch has not been merged,
so time to fix our local helpers. Use the mnl* name
for now, subsequent patches will address that.
Acked-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Reviewed-by: default avatarDonald Hunter <donald.hunter@gmail.com>
Link: https://lore.kernel.org/r/20240227223032.1835527-2-kuba@kernel.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 3bfe9052
......@@ -125,20 +125,47 @@ 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);
#ifndef MNL_HAS_AUTO_SCALARS
static inline uint64_t mnl_attr_get_uint(const struct nlattr *attr)
/* Attribute helpers */
static inline __u64 mnl_attr_get_uint(const struct nlattr *attr)
{
switch (mnl_attr_get_payload_len(attr)) {
case 4:
return mnl_attr_get_u32(attr);
case 8:
return mnl_attr_get_u64(attr);
default:
return 0;
}
}
static inline __s64 mnl_attr_get_sint(const struct nlattr *attr)
{
if (mnl_attr_get_payload_len(attr) == 4)
switch (mnl_attr_get_payload_len(attr)) {
case 4:
return mnl_attr_get_u32(attr);
return mnl_attr_get_u64(attr);
case 8:
return mnl_attr_get_u64(attr);
default:
return 0;
}
}
static inline void
mnl_attr_put_uint(struct nlmsghdr *nlh, uint16_t type, uint64_t data)
mnl_attr_put_uint(struct nlmsghdr *nlh, __u16 type, __u64 data)
{
if ((uint32_t)data == (uint64_t)data)
return mnl_attr_put_u32(nlh, type, data);
return mnl_attr_put_u64(nlh, type, data);
if ((__u32)data == (__u64)data)
mnl_attr_put_u32(nlh, type, data);
else
mnl_attr_put_u64(nlh, type, data);
}
static inline void
mnl_attr_put_sint(struct nlmsghdr *nlh, __u16 type, __s64 data)
{
if ((__s32)data == (__s64)data)
mnl_attr_put_u32(nlh, type, data);
else
mnl_attr_put_u64(nlh, type, data);
}
#endif
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment