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 */
+ static const char* map[] = {
+ [LOG2U(RTNH_F_DEAD)] = "dead", /* Nexthop is dead (used by multipath) */
+ [LOG2U(RTNH_F_PERVASIVE)] = "pervasive", /* Do recursive gateway lookup */
+ [LOG2U(RTNH_F_ONLINK)] = "onlink" , /* Gateway is forced on link */
+ [LOG2U(RTNH_F_OFFLOAD)] = "offload", /* Nexthop is offloaded */
+ [LOG2U(RTNH_F_LINKDOWN)] = "linkdown", /* carrier-down on nexthop */
+ [LOG2U(RTNH_F_UNRESOLVED)] = "unresolved", /* The entry is unresolved (ipmr) */
+ [LOG2U(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;
+ if (FLAGS_SET(flags, 1 << i) && map[i])
+ if (!strextend_with_separator(&str, ",", map[i]))
+ return -ENOMEM;
*ret = TAKE_PTR(str);
return 0;