]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-netlink: unify sd_rtnl_message_new_qdisc() and sd_rtnl_message_new_tclass()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 25 Jan 2022 21:00:55 +0000 (06:00 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 9 Feb 2022 05:35:25 +0000 (14:35 +0900)
As the netlink message header types for both qdisc and tclass are
equivalent.

src/libsystemd/sd-netlink/netlink-message-rtnl.c
src/libsystemd/sd-netlink/netlink-util.h
src/network/tc/qdisc.c
src/network/tc/tclass.c
src/systemd/sd-netlink.h

index d15ca06aa85aa0b5747b853c62647d5c4239b7ad..888d097d9864a80026ca0952d6f0f43059446936 100644 (file)
@@ -1043,88 +1043,31 @@ int sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(sd_netlink_message
         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;
 }
index 9024c00830acb15a717931fae2aa8af12768bb98..097483c4351348b4e9db0cdd9f70634bafab8dde 100644 (file)
@@ -59,12 +59,10 @@ static inline bool rtnl_message_type_is_routing_policy_rule(uint16_t type) {
         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) {
index c7a7bad168654f0bf8a7aa158a4af0d011840cb7..f0e643b9aedba01a6b0bd7655d1f633d0eabcdc2 100644 (file)
@@ -179,18 +179,11 @@ int qdisc_configure(Link *link, QDisc *qdisc) {
         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);
index 4e1386b48ff9893031b345adbfbb4530e7ca4ca8..860d8c997a9fac95d22323f43d9c712245d5a076 100644 (file)
@@ -137,18 +137,11 @@ int tclass_configure(Link *link, TClass *tclass) {
         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;
index c166cc167164b5ced70ac4028191bff412dad872..6b1fcd45219d7ef365fc072c42bfbb3b31c502f4 100644 (file)
@@ -202,13 +202,8 @@ int sd_rtnl_message_routing_policy_rule_get_fib_type(sd_netlink_message *m, uint
 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);