sd_netlink_message_append_s32;
sd_netlink_message_append_s64;
sd_netlink_message_append_data;
+ sd_netlink_message_append_container_data;
sd_netlink_message_append_in_addr;
sd_netlink_message_append_in6_addr;
sd_netlink_message_append_sockaddr_in;
return r;
}
-static int add_data(sd_netlink_message *m, uint16_t attr, const void *data, uint32_t dlen) {
- int r;
-
- r = sd_netlink_message_open_container(m, attr);
- if (r < 0)
- return r;
-
- r = sd_netlink_message_append_data(m, NFTA_DATA_VALUE, data, dlen);
- if (r < 0)
- return r;
-
- return sd_netlink_message_close_container(m); /* attr */
-}
-
int sd_nfnl_nft_message_add_setelem(
sd_netlink_message *m,
uint32_t index,
if (r < 0)
return r;
- r = add_data(m, NFTA_SET_ELEM_KEY, key, key_len);
+ r = sd_netlink_message_append_container_data(m, NFTA_SET_ELEM_KEY, NFTA_DATA_VALUE, key, key_len);
if (r < 0)
goto cancel;
if (data) {
- r = add_data(m, NFTA_SET_ELEM_DATA, data, data_len);
+ r = sd_netlink_message_append_container_data(m, NFTA_SET_ELEM_DATA, NFTA_DATA_VALUE, data, data_len);
if (r < 0)
goto cancel;
}
return 0;
}
+_public_ int sd_netlink_message_append_container_data(
+ sd_netlink_message *m,
+ unsigned short container_type,
+ unsigned short type,
+ const void *data,
+ size_t len) {
+
+ int r;
+
+ assert_return(m, -EINVAL);
+ assert_return(!m->sealed, -EPERM);
+
+ r = sd_netlink_message_open_container(m, container_type);
+ if (r < 0)
+ return r;
+
+ r = sd_netlink_message_append_data(m, type, data, len);
+ if (r < 0)
+ return r;
+
+ return sd_netlink_message_close_container(m);
+}
+
int netlink_message_append_in_addr_union(sd_netlink_message *m, unsigned short type, int family, const union in_addr_union *data) {
int r;
return sd_netlink_message_close_container(m); /* NFTA_LIST_ELEM */
}
-static int nfnl_add_expr_data(
- sd_netlink_message *m,
- int attr,
- const void *data,
- uint32_t dlen) {
-
- int r;
-
- assert(m);
- assert(data);
-
- r = sd_netlink_message_open_container(m, attr);
- if (r < 0)
- return r;
-
- r = sd_netlink_message_append_data(m, NFTA_DATA_VALUE, data, dlen);
- if (r < 0)
- return r;
-
- return sd_netlink_message_close_container(m); /* attr */
-}
-
static int nfnl_add_expr_cmp(
sd_netlink_message *m,
enum nft_cmp_ops cmp_op,
if (r < 0)
return r;
- r = nfnl_add_expr_data(m, NFTA_CMP_DATA, data, dlen);
+ r = sd_netlink_message_append_container_data(m, NFTA_CMP_DATA, NFTA_DATA_VALUE, data, dlen);
if (r < 0)
return r;
if (r < 0)
return r;
- r = nfnl_add_expr_data(m, NFTA_BITWISE_MASK, and, len);
+ r = sd_netlink_message_append_container_data(m, NFTA_BITWISE_MASK, NFTA_DATA_VALUE, and, len);
if (r < 0)
return r;
- r = nfnl_add_expr_data(m, NFTA_BITWISE_XOR, xor, len);
+ r = sd_netlink_message_append_container_data(m, NFTA_BITWISE_XOR, NFTA_DATA_VALUE, xor, len);
if (r < 0)
return r;
int sd_netlink_message_append_s32(sd_netlink_message *m, unsigned short type, int32_t data);
int sd_netlink_message_append_s64(sd_netlink_message *m, unsigned short type, int64_t data);
int sd_netlink_message_append_data(sd_netlink_message *m, unsigned short type, const void *data, size_t len);
+int sd_netlink_message_append_container_data(
+ sd_netlink_message *m,
+ unsigned short container_type,
+ unsigned short type,
+ const void *data,
+ size_t len);
int sd_netlink_message_append_in_addr(sd_netlink_message *m, unsigned short type, const struct in_addr *data);
int sd_netlink_message_append_in6_addr(sd_netlink_message *m, unsigned short type, const struct in6_addr *data);
int sd_netlink_message_append_sockaddr_in(sd_netlink_message *m, unsigned short type, const struct sockaddr_in *data);