diff --git a/include/netlink-private/types.h b/include/netlink-private/types.h index 2642c8dd3..5da8f59de 100644 --- a/include/netlink-private/types.h +++ b/include/netlink-private/types.h @@ -166,7 +166,7 @@ struct rtnl_link uint32_t l_change; uint32_t l_mtu; uint32_t l_link; - uint32_t l_link_netnsid; + int32_t l_link_netnsid; uint32_t l_txqlen; uint32_t l_weight; uint32_t l_master; diff --git a/include/netlink/attr.h b/include/netlink/attr.h index b84b62e45..fd8e299f3 100644 --- a/include/netlink/attr.h +++ b/include/netlink/attr.h @@ -103,6 +103,8 @@ extern uint8_t nla_get_u8(const struct nlattr *); extern int nla_put_u8(struct nl_msg *, int, uint8_t); extern uint16_t nla_get_u16(const struct nlattr *); extern int nla_put_u16(struct nl_msg *, int, uint16_t); +extern int32_t nla_get_s32(const struct nlattr *); +extern int nla_put_s32(struct nl_msg *, int, int32_t); extern uint32_t nla_get_u32(const struct nlattr *); extern int nla_put_u32(struct nl_msg *, int, uint32_t); extern uint64_t nla_get_u64(const struct nlattr *); @@ -182,6 +184,15 @@ extern int nla_is_nested(const struct nlattr *); #define NLA_PUT_U16(msg, attrtype, value) \ NLA_PUT_TYPE(msg, uint16_t, attrtype, value) +/** + * Add 32 bit integer attribute to netlink message. + * @arg msg Netlink message. + * @arg attrtype Attribute type. + * @arg value Numeric value. + */ +#define NLA_PUT_S32(msg, attrtype, value) \ + NLA_PUT_TYPE(msg, int32_t, attrtype, value) + /** * Add 32 bit integer attribute to netlink message. * @arg msg Netlink message. diff --git a/include/netlink/route/link.h b/include/netlink/route/link.h index d8d4e82fc..f7303f2ff 100644 --- a/include/netlink/route/link.h +++ b/include/netlink/route/link.h @@ -202,8 +202,8 @@ extern uint8_t rtnl_link_get_operstate(struct rtnl_link *); extern void rtnl_link_set_linkmode(struct rtnl_link *, uint8_t); extern uint8_t rtnl_link_get_linkmode(struct rtnl_link *); -int rtnl_link_set_link_netnsid(struct rtnl_link *link, uint32_t link_netnsid); -int rtnl_link_get_link_netnsid(const struct rtnl_link *link, uint32_t *out_link_netnsid); +int rtnl_link_set_link_netnsid(struct rtnl_link *link, int32_t link_netnsid); +int rtnl_link_get_link_netnsid(const struct rtnl_link *link, int32_t *out_link_netnsid); extern const char * rtnl_link_get_ifalias(struct rtnl_link *); extern void rtnl_link_set_ifalias(struct rtnl_link *, const char *); diff --git a/lib/attr.c b/lib/attr.c index 838d0a94b..86284ee10 100644 --- a/lib/attr.c +++ b/lib/attr.c @@ -601,6 +601,31 @@ uint16_t nla_get_u16(const struct nlattr *nla) return *(const uint16_t *) nla_data(nla); } +/** + * Add 32 bit integer attribute to netlink message. + * @arg msg Netlink message. + * @arg attrtype Attribute type. + * @arg value Numeric value to store as payload. + * + * @see nla_put + * @return 0 on success or a negative error code. + */ +int nla_put_s32(struct nl_msg *msg, int attrtype, int32_t value) +{ + return nla_put(msg, attrtype, sizeof(int32_t), &value); +} + +/** + * Return payload of 32 bit integer attribute. + * @arg nla 32 bit integer attribute. + * + * @return Payload as 32 bit integer. + */ +int32_t nla_get_s32(const struct nlattr *nla) +{ + return *(const int32_t *) nla_data(nla); +} + /** * Add 32 bit integer attribute to netlink message. * @arg msg Netlink message. diff --git a/lib/route/link.c b/lib/route/link.c index 550a071c3..81917d31f 100644 --- a/lib/route/link.c +++ b/lib/route/link.c @@ -418,7 +418,7 @@ int rtnl_link_info_parse(struct rtnl_link *link, struct nlattr **tb) } if (tb[IFLA_LINK_NETNSID]) { - link->l_link_netnsid = nla_get_u32(tb[IFLA_LINK_NETNSID]); + link->l_link_netnsid = nla_get_s32(tb[IFLA_LINK_NETNSID]); link->ce_mask |= LINK_ATTR_LINK_NETNSID; } @@ -693,7 +693,7 @@ static void link_dump_line(struct nl_object *obj, struct nl_dump_params *p) nl_dump(p, "slave-of %d ", link->l_link); } if (link->ce_mask & LINK_ATTR_LINK_NETNSID) - nl_dump(p, "link-netnsid %u ", link->l_link_netnsid); + nl_dump(p, "link-netnsid %d ", link->l_link_netnsid); if (link->ce_mask & LINK_ATTR_GROUP) nl_dump(p, "group %u ", link->l_group); @@ -1305,7 +1305,7 @@ int rtnl_link_fill_info(struct nl_msg *msg, struct rtnl_link *link) NLA_PUT_U32(msg, IFLA_LINK, link->l_link); if (link->ce_mask & LINK_ATTR_LINK_NETNSID) - NLA_PUT_U32(msg, IFLA_LINK_NETNSID, link->l_link_netnsid); + NLA_PUT_S32(msg, IFLA_LINK_NETNSID, link->l_link_netnsid); if (link->ce_mask & LINK_ATTR_MASTER) NLA_PUT_U32(msg, IFLA_MASTER, link->l_master); @@ -2007,7 +2007,7 @@ int rtnl_link_get_link(struct rtnl_link *link) * Sets the IFLA_LINK_NETNSID attribute of the link * @returns 0 on success */ -int rtnl_link_set_link_netnsid(struct rtnl_link *link, uint32_t link_netnsid) +int rtnl_link_set_link_netnsid(struct rtnl_link *link, int32_t link_netnsid) { link->l_link_netnsid = link_netnsid; link->ce_mask |= LINK_ATTR_LINK_NETNSID; @@ -2024,7 +2024,7 @@ int rtnl_link_set_link_netnsid(struct rtnl_link *link, uint32_t link_netnsid) * * @returns 0 on success */ -int rtnl_link_get_link_netnsid(const struct rtnl_link *link, uint32_t *out_link_netnsid) +int rtnl_link_get_link_netnsid(const struct rtnl_link *link, int32_t *out_link_netnsid) { if (!(link->ce_mask & LINK_ATTR_LINK_NETNSID)) return -NLE_INVAL; diff --git a/libnl-3.sym b/libnl-3.sym index 621bfe05f..a467ab234 100644 --- a/libnl-3.sym +++ b/libnl-3.sym @@ -334,3 +334,9 @@ libnl_3_2_26 { global: nl_socket_set_fd; } libnl_3; + +libnl_3_2_27 { +global: + nla_get_s32; + nla_put_s32; +} libnl_3_2_26;