diff options
author | Thomas Haller <thaller@redhat.com> | 2015-10-26 21:35:18 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-11-02 13:57:01 +0100 |
commit | b296325ccaa66f7c0994a40a377b69cdbfe01605 (patch) | |
tree | 42a5639a57aa183fe55b7c2cad495e6affd65ee7 | |
parent | dae0dbd53361988882158ce9d8af28000eda7645 (diff) | |
download | NetworkManager-b296325ccaa66f7c0994a40a377b69cdbfe01605.tar.gz |
platform: reimplement netlink flags/enum to string conversions
-rw-r--r-- | src/platform/nm-linux-platform.c | 4 | ||||
-rw-r--r-- | src/platform/nm-platform.c | 126 | ||||
-rw-r--r-- | src/platform/nm-platform.h | 5 | ||||
-rw-r--r-- | src/platform/tests/test-general.c | 32 |
4 files changed, 93 insertions, 74 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index b092e080b1..553c981fad 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -3611,7 +3611,7 @@ link_change_flags (NMPlatform *platform, int ifindex, unsigned int flags, gboole _LOGD ("link: change %d: flags %s '%s' (%d)", ifindex, value ? "set" : "unset", - rtnl_link_flags2str (flags, buf, sizeof (buf)), + nm_platform_link_flags2str (flags, buf, sizeof (buf)), flags); return do_change_link (platform, change, FALSE); @@ -3683,7 +3683,7 @@ link_set_user_ipv6ll_enabled (NMPlatform *platform, int ifindex, gboolean enable rtnl_link_inet6_set_addr_gen_mode (nlo, mode); _LOGD ("link: change %d: set IPv6 address generation mode to %s", - ifindex, rtnl_link_inet6_addrgenmode2str (mode, buf, sizeof (buf))); + ifindex, nm_platform_link_inet6_addrgenmode2str (mode, buf, sizeof (buf))); return do_change_link (platform, nlo, TRUE) == NM_PLATFORM_ERROR_SUCCESS; } #endif diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 480b07e18a..11ff1ae041 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -2514,7 +2514,7 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len) if (link->flags) { char str_flags_buf[64]; - rtnl_link_flags2str (link->flags, str_flags_buf, sizeof (str_flags_buf)); + nm_platform_link_flags2str (link->flags, str_flags_buf, sizeof (str_flags_buf)); g_string_append_printf (str_flags, ";%s", str_flags_buf); } @@ -2828,47 +2828,95 @@ nm_platform_ip4_address_to_string (const NMPlatformIP4Address *address, char *bu return buf; } -/** - * nm_platform_addr_flags2str: wrapper for rtnl_addr_flags2str(), - * which might not yet support some recent address flags. - **/ -void -nm_platform_addr_flags2str (int flags, char *buf, size_t size) +const char * +nm_platform_link_flags2str (unsigned flags, char *buf, gsize len) +{ + static const NMUtilsFlags2StrDesc descs[] = { + NM_UTILS_FLAGS2STR (IFF_LOOPBACK, "loopback"), + NM_UTILS_FLAGS2STR (IFF_BROADCAST, "broadcast"), + NM_UTILS_FLAGS2STR (IFF_POINTOPOINT, "pointopoint"), + NM_UTILS_FLAGS2STR (IFF_MULTICAST, "multicast"), + NM_UTILS_FLAGS2STR (IFF_NOARP, "noarp"), + NM_UTILS_FLAGS2STR (IFF_ALLMULTI, "allmulti"), + NM_UTILS_FLAGS2STR (IFF_PROMISC, "promisc"), + NM_UTILS_FLAGS2STR (IFF_MASTER, "master"), + NM_UTILS_FLAGS2STR (IFF_SLAVE, "slave"), + NM_UTILS_FLAGS2STR (IFF_DEBUG, "debug"), + NM_UTILS_FLAGS2STR (IFF_DYNAMIC, "dynamic"), + NM_UTILS_FLAGS2STR (IFF_AUTOMEDIA, "automedia"), + NM_UTILS_FLAGS2STR (IFF_PORTSEL, "portsel"), + NM_UTILS_FLAGS2STR (IFF_NOTRAILERS, "notrailers"), + NM_UTILS_FLAGS2STR (IFF_UP, "up"), + NM_UTILS_FLAGS2STR (IFF_RUNNING, "running"), + NM_UTILS_FLAGS2STR (IFF_LOWER_UP, "lowerup"), + NM_UTILS_FLAGS2STR (IFF_DORMANT, "dormant"), + NM_UTILS_FLAGS2STR (IFF_ECHO, "echo"), + }; + return nm_utils_flags2str (descs, G_N_ELEMENTS (descs), flags, buf, len); +}; + +const char * +nm_platform_link_inet6_addrgenmode2str (guint8 mode, char *buf, gsize len) { - if ( !NM_FLAGS_ANY (flags, IFA_F_MANAGETEMPADDR | IFA_F_NOPREFIXROUTE) - || nm_platform_check_support_libnl_extended_ifa_flags ()) - rtnl_addr_flags2str (flags, buf, size); - else { - /* There are two recent flags IFA_F_MANAGETEMPADDR and IFA_F_NOPREFIXROUTE. - * If libnl does not yet support them, add them by hand. - * These two flags were introduced together with the extended ifa_flags - * so check for nm_platform_check_support_libnl_extended_ifa_flags (). */ - gboolean has_other_unknown_flags = FALSE; - size_t len; - - /* if there are unknown flags to rtnl_addr_flags2str(), libnl appends ',' - * to indicate them. We want to keep this behavior, if there are other - * unknown flags present. */ - - rtnl_addr_flags2str (flags & ~(IFA_F_MANAGETEMPADDR | IFA_F_NOPREFIXROUTE), buf, size); - - len = strlen (buf); - if (len > 0) { - has_other_unknown_flags = (buf[len - 1] == ','); - if (!has_other_unknown_flags) - g_strlcat (buf, ",", size); - } + nm_utils_to_string_buffer_init (&buf, &len); - if (NM_FLAGS_ALL (flags, IFA_F_MANAGETEMPADDR | IFA_F_NOPREFIXROUTE)) - g_strlcat (buf, IFA_F_MANAGETEMPADDR_STR","IFA_F_NOPREFIXROUTE_STR, size); - else if (NM_FLAGS_HAS (flags, IFA_F_MANAGETEMPADDR)) - g_strlcat (buf, IFA_F_MANAGETEMPADDR_STR, size); - else - g_strlcat (buf, IFA_F_NOPREFIXROUTE_STR, size); + switch (mode) { + case NM_IN6_ADDR_GEN_MODE_NONE: + g_snprintf (buf, len, "none"); + break; + case NM_IN6_ADDR_GEN_MODE_EUI64: + g_snprintf (buf, len, "eui64"); + break; + case NM_IN6_ADDR_GEN_MODE_STABLE_PRIVACY: + g_snprintf (buf, len, "stable-privacy"); + break; + default: + g_snprintf (buf, len, "%u", (unsigned) mode); + break; + } + return buf; +} + +const char * +nm_platform_addr_flags2str (unsigned flags, char *buf, gsize len) +{ + static const NMUtilsFlags2StrDesc descs[] = { + NM_UTILS_FLAGS2STR (IFA_F_SECONDARY, "secondary"), + NM_UTILS_FLAGS2STR (IFA_F_NODAD, "nodad"), + NM_UTILS_FLAGS2STR (IFA_F_OPTIMISTIC, "optimistic"), + NM_UTILS_FLAGS2STR (IFA_F_HOMEADDRESS, "homeaddress"), + NM_UTILS_FLAGS2STR (IFA_F_DEPRECATED, "deprecated"), + NM_UTILS_FLAGS2STR (IFA_F_TENTATIVE, "tentative"), + NM_UTILS_FLAGS2STR (IFA_F_PERMANENT, "permanent"), + NM_UTILS_FLAGS2STR (IFA_F_MANAGETEMPADDR, "mngtmpaddr"), + NM_UTILS_FLAGS2STR (IFA_F_NOPREFIXROUTE, "noprefixroute"), + }; + return nm_utils_flags2str (descs, G_N_ELEMENTS (descs), flags, buf, len); +}; + +const char * +nm_platform_route_scope2str (int scope, char *buf, gsize len) +{ + nm_utils_to_string_buffer_init (&buf, &len); - if (has_other_unknown_flags) - g_strlcat (buf, ",", size); + switch (scope) { + case 255: + g_snprintf (buf, len, "nowhere"); + break; + case 254: + g_snprintf (buf, len, "host"); + break; + case 200: + g_snprintf (buf, len, "site"); + break; + case 0: + g_snprintf (buf, len, "global"); + break; + default: + g_snprintf (buf, len, "%d", scope); + break; } + return buf; } /** @@ -2980,7 +3028,7 @@ nm_platform_ip4_route_to_string (const NMPlatformIP4Route *route, char *buf, gsi route->mss, source_to_string (route->source), route->scope_inv ? " scope " : "", - route->scope_inv ? (rtnl_scope2str (nm_platform_route_scope_inv (route->scope_inv), str_scope, sizeof (str_scope))) : "", + route->scope_inv ? (nm_platform_route_scope2str (nm_platform_route_scope_inv (route->scope_inv), str_scope, sizeof (str_scope))) : "", route->pref_src ? " pref-src " : "", route->pref_src ? inet_ntop (AF_INET, &route->pref_src, s_pref_src, sizeof(s_pref_src)) : ""); return buf; diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index 2c6831e32d..4554cefe3c 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -796,7 +796,10 @@ gboolean nm_platform_check_support_libnl_extended_ifa_flags (void); gboolean nm_platform_check_support_kernel_extended_ifa_flags (NMPlatform *self); gboolean nm_platform_check_support_user_ipv6ll (NMPlatform *self); -void nm_platform_addr_flags2str (int flags, char *buf, size_t size); +const char *nm_platform_link_flags2str (unsigned flags, char *buf, gsize len); +const char *nm_platform_link_inet6_addrgenmode2str (guint8 mode, char *buf, gsize len); +const char *nm_platform_addr_flags2str (unsigned flags, char *buf, gsize len); +const char *nm_platform_route_scope2str (int scope, char *buf, gsize len); int nm_platform_ip_address_cmp_expiry (const NMPlatformIPAddress *a, const NMPlatformIPAddress *b); diff --git a/src/platform/tests/test-general.c b/src/platform/tests/test-general.c index 20522b5b85..f342e5653e 100644 --- a/src/platform/tests/test-general.c +++ b/src/platform/tests/test-general.c @@ -53,37 +53,6 @@ test_link_get_all (void) /******************************************************************/ -static void -test_nm_platform_ip6_address_to_string_flags (void) -{ - NMPlatformIP6Address addr = { 0 }; - - g_assert_cmpstr (strstr (nm_platform_ip6_address_to_string (&addr, NULL, 0), " flags "), ==, NULL); - - addr.flags = IFA_F_MANAGETEMPADDR; - nmtst_assert_str_has_substr (nm_platform_ip6_address_to_string (&addr, NULL, 0), " flags mngtmpaddr "); - - addr.flags = IFA_F_NOPREFIXROUTE; - nmtst_assert_str_has_substr (nm_platform_ip6_address_to_string (&addr, NULL, 0), " flags noprefixroute "); - - addr.flags = IFA_F_MANAGETEMPADDR | IFA_F_NOPREFIXROUTE; - nmtst_assert_str_has_substr (nm_platform_ip6_address_to_string (&addr, NULL, 0), " flags mngtmpaddr,noprefixroute "); - - addr.flags = IFA_F_TENTATIVE | IFA_F_NOPREFIXROUTE; - nmtst_assert_str_has_substr (nm_platform_ip6_address_to_string (&addr, NULL, 0), " flags tentative,noprefixroute "); - - addr.flags = IFA_F_TENTATIVE | IFA_F_PERMANENT | IFA_F_MANAGETEMPADDR| IFA_F_NOPREFIXROUTE; - nmtst_assert_str_has_substr (nm_platform_ip6_address_to_string (&addr, NULL, 0), " flags tentative,permanent,mngtmpaddr,noprefixroute "); - - addr.flags = IFA_F_TENTATIVE | IFA_F_PERMANENT | IFA_F_MANAGETEMPADDR| IFA_F_NOPREFIXROUTE | 0x8000; - nmtst_assert_str_has_substr (nm_platform_ip6_address_to_string (&addr, NULL, 0), " flags tentative,permanent,mngtmpaddr,noprefixroute, "); - - addr.flags = IFA_F_TENTATIVE | IFA_F_PERMANENT | IFA_F_MANAGETEMPADDR| IFA_F_NOPREFIXROUTE | ((G_MAXUINT - (G_MAXUINT >> 1)) >> 1); - nmtst_assert_str_has_substr (nm_platform_ip6_address_to_string (&addr, NULL, 0), " flags tentative,permanent,mngtmpaddr,noprefixroute, "); -} - -/******************************************************************/ - NMTST_DEFINE (); int @@ -93,7 +62,6 @@ main (int argc, char **argv) g_test_add_func ("/general/init_linux_platform", test_init_linux_platform); g_test_add_func ("/general/link_get_all", test_link_get_all); - g_test_add_func ("/general/nm_platform_ip6_address_to_string/flags", test_nm_platform_ip6_address_to_string_flags); return g_test_run (); } |