]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/routing-policy-rule: read FRA_PROTOCOL afer reading other properties
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 22 Aug 2024 18:44:39 +0000 (03:44 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 23 Aug 2024 14:57:17 +0000 (23:57 +0900)
No functional change, just refactoring.

src/network/networkd-routing-policy-rule.c

index 75019fabef880ff886316a31ae86e3d1e81577ca..d752c427dd5896c939878337c587d452c85dbe78 100644 (file)
@@ -1060,7 +1060,6 @@ static bool routing_policy_rule_is_created_by_kernel(const RoutingPolicyRule *ru
 
 int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Manager *m) {
         _cleanup_(routing_policy_rule_unrefp) RoutingPolicyRule *tmp = NULL;
-        bool adjust_protocol = false, is_new = false;
         RoutingPolicyRule *rule = NULL;
         Request *req = NULL;
         uint16_t type;
@@ -1182,17 +1181,6 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
                 return 0;
         }
 
-        r = sd_netlink_message_read_u8(message, FRA_PROTOCOL, &tmp->protocol);
-        if (r == -ENODATA)
-                /* If FRA_PROTOCOL is supported by kernel, then the attribute is always appended.
-                 * When the received message does not have FRA_PROTOCOL, then we need to adjust the
-                 * protocol of the rule later. */
-                adjust_protocol = true;
-        else if (r < 0) {
-                log_warning_errno(r, "rtnl: could not get FRA_PROTOCOL attribute, ignoring: %m");
-                return 0;
-        }
-
         uint8_t l3mdev = 0;
         r = sd_netlink_message_read_u8(message, FRA_L3MDEV, &l3mdev);
         if (r < 0 && r != -ENODATA) {
@@ -1251,10 +1239,19 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
                 return 0;
         }
 
-        if (adjust_protocol)
+        /* If FRA_PROTOCOL is supported by kernel, then the attribute is always appended. If the received
+         * message does not have FRA_PROTOCOL, then we need to adjust the protocol of the rule. That requires
+         * all properties compared in the routing_policy_rule_compare_func(), hence it must be done after
+         * reading them. */
+        r = sd_netlink_message_read_u8(message, FRA_PROTOCOL, &tmp->protocol);
+        if (r == -ENODATA)
                 /* As .network files does not have setting to specify protocol, we can assume the
                  * protocol of the received rule is RTPROT_KERNEL or RTPROT_STATIC. */
                 tmp->protocol = routing_policy_rule_is_created_by_kernel(tmp) ? RTPROT_KERNEL : RTPROT_STATIC;
+        else if (r < 0) {
+                log_warning_errno(r, "rtnl: could not get FRA_PROTOCOL attribute, ignoring: %m");
+                return 0;
+        }
 
         (void) routing_policy_rule_get(m, tmp, tmp->family, &rule);
         (void) routing_policy_rule_get_request(m, tmp, tmp->family, &req);
@@ -1273,6 +1270,7 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, Man
                 return 0;
         }
 
+        bool is_new = false;
         if (!rule) {
                 if (!req && !m->manage_foreign_rules) {
                         routing_policy_rule_enter_configured(tmp);