IN_SET(family, AF_INET, AF_INET6), -EINVAL);
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
+ r = message_new(rtnl,
+ ret,
+ nlmsg_type,
+ NLM_F_REQUEST|NLM_F_ACK|(nlmsg_type == RTM_NEWROUTE ? NLM_F_CREATE | NLM_F_APPEND : 0));
if (r < 0)
return r;
- if (nlmsg_type == RTM_NEWROUTE)
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_APPEND;
-
rtm = NLMSG_DATA((*ret)->hdr);
rtm->rtm_family = family;
}
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
+ r = message_new(rtnl,
+ ret,
+ nlmsg_type,
+ NLM_F_REQUEST | NLM_F_ACK | (nlmsg_type == RTM_NEWNEXTHOP ? NLM_F_CREATE | NLM_F_REPLACE : 0));
if (r < 0)
return r;
- if (nlmsg_type == RTM_NEWNEXTHOP)
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE;
-
nhm = NLMSG_DATA((*ret)->hdr);
nhm->nh_family = family;
assert_return(IN_SET(family, AF_UNSPEC, AF_INET, AF_INET6, AF_BRIDGE), -EINVAL);
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
- if (r < 0)
- return r;
-
+ uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
if (nlmsg_type == RTM_NEWNEIGH) {
if (family == AF_BRIDGE)
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_APPEND;
+ flags |= NLM_F_CREATE | NLM_F_APPEND;
else
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE;
+ flags |= NLM_F_CREATE | NLM_F_REPLACE;
}
+ r = message_new(rtnl, ret, nlmsg_type, flags);
+ if (r < 0)
+ return r;
+
ndm = NLMSG_DATA((*ret)->hdr);
ndm->ndm_family = family;
assert_return(rtnl_message_type_is_link(nlmsg_type), -EINVAL);
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
- if (r < 0)
- return r;
-
+ uint16_t flags = NLM_F_REQUEST | NLM_F_ACK;
if (nlmsg_type == RTM_NEWLINK && ifindex == 0)
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
+ flags |= NLM_F_CREATE | NLM_F_EXCL;
else if (nlmsg_type == RTM_NEWLINKPROP)
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL | NLM_F_APPEND;
+ flags |= NLM_F_CREATE | NLM_F_EXCL | NLM_F_APPEND;
+
+ r = message_new(rtnl, ret, nlmsg_type, flags);
+ if (r < 0)
+ return r;
ifi = NLMSG_DATA((*ret)->hdr);
IN_SET(family, AF_INET, AF_INET6), -EINVAL);
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
+ r = message_new(rtnl, ret, nlmsg_type, NLM_F_REQUEST | NLM_F_ACK);
if (r < 0)
return r;
assert_return(rtnl_message_type_is_addrlabel(nlmsg_type), -EINVAL);
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
+ r = message_new(rtnl,
+ ret,
+ nlmsg_type,
+ NLM_F_REQUEST | NLM_F_ACK | (nlmsg_type == RTM_NEWADDRLABEL ? NLM_F_CREATE | NLM_F_REPLACE : 0));
if (r < 0)
return r;
- if (nlmsg_type == RTM_NEWADDRLABEL)
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE;
-
addrlabel = NLMSG_DATA((*ret)->hdr);
addrlabel->ifal_family = family;
assert_return(rtnl_message_type_is_routing_policy_rule(nlmsg_type), -EINVAL);
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
+ r = message_new(rtnl,
+ ret,
+ nlmsg_type,
+ NLM_F_REQUEST | NLM_F_ACK | (nlmsg_type == RTM_NEWRULE ? NLM_F_CREATE | NLM_F_EXCL : 0));
if (r < 0)
return r;
- if (nlmsg_type == RTM_NEWRULE)
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
-
frh = NLMSG_DATA((*ret)->hdr);
frh->family = family;
assert_return(rtnl_message_type_is_traffic_control(nlmsg_type), -EINVAL);
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
+ r = message_new(rtnl,
+ ret,
+ nlmsg_type,
+ NLM_F_REQUEST | NLM_F_ACK | (IN_SET(nlmsg_type, RTM_NEWQDISC, RTM_NEWTCLASS) ? NLM_F_CREATE | NLM_F_REPLACE : 0));
if (r < 0)
return r;
- if (IN_SET(nlmsg_type, RTM_NEWQDISC, RTM_NEWTCLASS))
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE;
-
tcm = NLMSG_DATA((*ret)->hdr);
tcm->tcm_ifindex = ifindex;
tcm->tcm_handle = handle;
assert_return(rtnl_message_type_is_mdb(nlmsg_type), -EINVAL);
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
+ r = message_new(rtnl,
+ ret,
+ nlmsg_type,
+ NLM_F_REQUEST | NLM_F_ACK | (nlmsg_type == RTM_NEWMDB ? NLM_F_CREATE | NLM_F_REPLACE : 0));
if (r < 0)
return r;
- if (nlmsg_type == RTM_NEWMDB)
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE;
-
bpm = NLMSG_DATA((*ret)->hdr);
bpm->family = AF_BRIDGE;
bpm->ifindex = ifindex;
assert_return(rtnl_message_type_is_nsid(nlmsg_type), -EINVAL);
assert_return(ret, -EINVAL);
- r = message_new(rtnl, ret, nlmsg_type);
+ r = message_new(rtnl, ret, nlmsg_type, NLM_F_REQUEST | NLM_F_ACK);
if (r < 0)
return r;
int message_new_full(
sd_netlink *nl,
uint16_t nlmsg_type,
+ uint16_t nlmsg_flags,
const NLAPolicySet *policy_set,
size_t header_size,
sd_netlink_message **ret) {
if (!m->hdr)
return -ENOMEM;
- m->hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
+ m->hdr->nlmsg_flags = nlmsg_flags;
m->hdr->nlmsg_len = size;
m->hdr->nlmsg_type = nlmsg_type;
return 0;
}
-int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type) {
+int message_new(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, uint16_t nlmsg_flags) {
const NLAPolicySet *policy_set;
size_t size;
int r;
assert_return(nl, -EINVAL);
assert_return(ret, -EINVAL);
- r = netlink_get_policy_set_and_header_size(nl, nlmsg_type, &policy_set, &size);
+ r = netlink_get_policy_set_and_header_size(nl, nlmsg_type, nlmsg_flags, &policy_set, &size);
if (r < 0)
return r;
- return message_new_full(nl, nlmsg_type, policy_set, size, ret);
+ return message_new_full(nl, nlmsg_type, nlmsg_flags, policy_set, size, ret);
}
int message_new_synthetic_error(sd_netlink *nl, int error, uint32_t serial, sd_netlink_message **ret) {
assert(error <= 0);
- r = message_new(nl, ret, NLMSG_ERROR);
+ r = message_new(nl, ret, NLMSG_ERROR, 0);
if (r < 0)
return r;
assert(m->hdr);
- r = netlink_get_policy_set_and_header_size(nl, m->hdr->nlmsg_type,
- &m->containers[0].policy_set, &size);
+ r = netlink_get_policy_set_and_header_size(
+ nl,
+ m->hdr->nlmsg_type,
+ m->hdr->nlmsg_flags,
+ &m->containers[0].policy_set,
+ &size);
if (r < 0)
return r;