return 0;
}
-int sd_rtnl_message_new_qdisc(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int tcm_family, int tcm_ifindex) {
- struct tcmsg *tcm;
- int r;
-
- assert_return(rtnl_message_type_is_qdisc(nlmsg_type), -EINVAL);
- assert_return(ret, -EINVAL);
-
- r = message_new(rtnl, ret, nlmsg_type);
- if (r < 0)
- return r;
-
- if (nlmsg_type == RTM_NEWQDISC)
- (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
-
- tcm = NLMSG_DATA((*ret)->hdr);
- tcm->tcm_family = tcm_family;
- tcm->tcm_ifindex = tcm_ifindex;
+int sd_rtnl_message_new_traffic_control(
+ sd_netlink *rtnl,
+ sd_netlink_message **ret,
+ uint16_t nlmsg_type,
+ int ifindex,
+ uint32_t handle,
+ uint32_t parent) {
- return 0;
-}
-
-int sd_rtnl_message_set_qdisc_parent(sd_netlink_message *m, uint32_t parent) {
- struct tcmsg *tcm;
-
- assert_return(rtnl_message_type_is_qdisc(m->hdr->nlmsg_type), -EINVAL);
-
- tcm = NLMSG_DATA(m->hdr);
- tcm->tcm_parent = parent;
-
- return 0;
-}
-
-int sd_rtnl_message_set_qdisc_handle(sd_netlink_message *m, uint32_t handle) {
- struct tcmsg *tcm;
-
- assert_return(rtnl_message_type_is_qdisc(m->hdr->nlmsg_type), -EINVAL);
-
- tcm = NLMSG_DATA(m->hdr);
- tcm->tcm_handle = handle;
-
- return 0;
-}
-
-int sd_rtnl_message_new_tclass(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int tcm_family, int tcm_ifindex) {
struct tcmsg *tcm;
int r;
- assert_return(rtnl_message_type_is_tclass(nlmsg_type), -EINVAL);
+ assert_return(rtnl_message_type_is_traffic_control(nlmsg_type), -EINVAL);
assert_return(ret, -EINVAL);
r = message_new(rtnl, ret, nlmsg_type);
if (r < 0)
return r;
- if (nlmsg_type == RTM_NEWTCLASS)
+ if (IN_SET(nlmsg_type, RTM_NEWQDISC, RTM_NEWTCLASS))
(*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
tcm = NLMSG_DATA((*ret)->hdr);
- tcm->tcm_family = tcm_family;
- tcm->tcm_ifindex = tcm_ifindex;
-
- return 0;
-}
-
-int sd_rtnl_message_set_tclass_parent(sd_netlink_message *m, uint32_t parent) {
- struct tcmsg *tcm;
-
- assert_return(rtnl_message_type_is_tclass(m->hdr->nlmsg_type), -EINVAL);
-
- tcm = NLMSG_DATA(m->hdr);
- tcm->tcm_parent = parent;
-
- return 0;
-}
-
-int sd_rtnl_message_set_tclass_handle(sd_netlink_message *m, uint32_t handle) {
- struct tcmsg *tcm;
-
- assert_return(rtnl_message_type_is_tclass(m->hdr->nlmsg_type), -EINVAL);
-
- tcm = NLMSG_DATA(m->hdr);
+ tcm->tcm_ifindex = ifindex;
tcm->tcm_handle = handle;
+ tcm->tcm_parent = parent;
return 0;
}
return IN_SET(type, RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE);
}
-static inline bool rtnl_message_type_is_qdisc(uint16_t type) {
- return IN_SET(type, RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC);
-}
-
-static inline bool rtnl_message_type_is_tclass(uint16_t type) {
- return IN_SET(type, RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS);
+static inline bool rtnl_message_type_is_traffic_control(uint16_t type) {
+ return IN_SET(type,
+ RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC,
+ RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS);
}
static inline bool rtnl_message_type_is_mdb(uint16_t type) {
assert(link->manager->rtnl);
assert(link->ifindex > 0);
- r = sd_rtnl_message_new_qdisc(link->manager->rtnl, &req, RTM_NEWQDISC, AF_UNSPEC, link->ifindex);
+ r = sd_rtnl_message_new_traffic_control(link->manager->rtnl, &req, RTM_NEWQDISC,
+ link->ifindex, qdisc->handle, qdisc->parent);
if (r < 0)
return log_link_debug_errno(link, r, "Could not create RTM_NEWQDISC message: %m");
- r = sd_rtnl_message_set_qdisc_parent(req, qdisc->parent);
- if (r < 0)
- return r;
-
- r = sd_rtnl_message_set_qdisc_handle(req, qdisc->handle);
- if (r < 0)
- return r;
-
if (QDISC_VTABLE(qdisc)) {
if (QDISC_VTABLE(qdisc)->fill_tca_kind) {
r = QDISC_VTABLE(qdisc)->fill_tca_kind(link, qdisc, req);
assert(link->manager->rtnl);
assert(link->ifindex > 0);
- r = sd_rtnl_message_new_tclass(link->manager->rtnl, &req, RTM_NEWTCLASS, AF_UNSPEC, link->ifindex);
+ r = sd_rtnl_message_new_traffic_control(link->manager->rtnl, &req, RTM_NEWTCLASS,
+ link->ifindex, tclass->classid, tclass->parent);
if (r < 0)
return log_link_debug_errno(link, r, "Could not create RTM_NEWTCLASS message: %m");
- r = sd_rtnl_message_set_tclass_parent(req, tclass->parent);
- if (r < 0)
- return r;
-
- r = sd_rtnl_message_set_tclass_handle(req, tclass->classid);
- if (r < 0)
- return r;
-
r = sd_netlink_message_append_string(req, TCA_KIND, TCLASS_VTABLE(tclass)->tca_kind);
if (r < 0)
return r;
int sd_rtnl_message_routing_policy_rule_set_flags(sd_netlink_message *m, uint32_t flags);
int sd_rtnl_message_routing_policy_rule_get_flags(sd_netlink_message *m, uint32_t *flags);
-int sd_rtnl_message_new_qdisc(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int tcm_family, int tcm_ifindex);
-int sd_rtnl_message_set_qdisc_parent(sd_netlink_message *m, uint32_t parent);
-int sd_rtnl_message_set_qdisc_handle(sd_netlink_message *m, uint32_t handle);
-
-int sd_rtnl_message_new_tclass(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int tcm_family, int tcm_ifindex);
-int sd_rtnl_message_set_tclass_parent(sd_netlink_message *m, uint32_t parent);
-int sd_rtnl_message_set_tclass_handle(sd_netlink_message *m, uint32_t handle);
+int sd_rtnl_message_new_traffic_control(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type,
+ int ifindex, uint32_t handle, uint32_t parent);
int sd_rtnl_message_new_mdb(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int mdb_ifindex);