]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce route_flags_to_string_alloc()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 12 Nov 2021 05:29:12 +0000 (14:29 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 14 Nov 2021 05:41:37 +0000 (14:41 +0900)
src/network/networkd-route-util.c
src/network/networkd-route-util.h

index 77e8c2bfb9b965d514a48d893f0526f6a16b9994..c1ab437facfd03fff71b82603dd7dfacb5f36de7 100644 (file)
@@ -219,6 +219,32 @@ static const char * const route_protocol_full_table[] = {
 
 DEFINE_STRING_TABLE_LOOKUP_WITH_FALLBACK(route_protocol_full, int, UINT8_MAX);
 
+int route_flags_to_string_alloc(uint32_t flags, char **ret) {
+        _cleanup_free_ char *str = NULL;
+        static const struct {
+                uint32_t flag;
+                const char *name;
+        } map[] = {
+                { RTNH_F_DEAD,       "dead"       }, /* Nexthop is dead (used by multipath) */
+                { RTNH_F_PERVASIVE,  "pervasive"  }, /* Do recursive gateway lookup */
+                { RTNH_F_ONLINK,     "onlink"     }, /* Gateway is forced on link */
+                { RTNH_F_OFFLOAD,    "offload"    }, /* Nexthop is offloaded */
+                { RTNH_F_LINKDOWN,   "linkdown"   }, /* carrier-down on nexthop */
+                { RTNH_F_UNRESOLVED, "unresolved" }, /* The entry is unresolved (ipmr) */
+                { RTNH_F_TRAP,       "trap"       }, /* Nexthop is trapping packets */
+        };
+
+        assert(ret);
+
+        for (size_t i = 0; i < ELEMENTSOF(map); i++)
+                if (flags & map[i].flag &&
+                    !strextend_with_separator(&str, ",", map[i].name))
+                        return -ENOMEM;
+
+        *ret = TAKE_PTR(str);
+        return 0;
+}
+
 static const char * const route_table_table[] = {
         [RT_TABLE_DEFAULT] = "default",
         [RT_TABLE_MAIN]    = "main",
index 4b1f778d9336e64b7b0cab34eefba4f7bff8682f..3dd3d3ace8e6e3f9644e2b0c349d0167a0ac79ef 100644 (file)
@@ -26,6 +26,8 @@ int route_protocol_to_string_alloc(int t, char **ret);
 int route_protocol_full_from_string(const char *s);
 int route_protocol_full_to_string_alloc(int t, char **ret);
 
+int route_flags_to_string_alloc(uint32_t flags, char **ret);
+
 int manager_get_route_table_from_string(const Manager *m, const char *table, uint32_t *ret);
 int manager_get_route_table_to_string(const Manager *m, uint32_t table, char **ret);