platform: reimplement netlink flags/enum to string conversions

This commit is contained in:
Thomas Haller
2015-10-26 21:35:18 +01:00
parent dae0dbd533
commit b296325cca
4 changed files with 93 additions and 74 deletions

View File

@@ -3611,7 +3611,7 @@ link_change_flags (NMPlatform *platform, int ifindex, unsigned int flags, gboole
_LOGD ("link: change %d: flags %s '%s' (%d)", ifindex, _LOGD ("link: change %d: flags %s '%s' (%d)", ifindex,
value ? "set" : "unset", value ? "set" : "unset",
rtnl_link_flags2str (flags, buf, sizeof (buf)), nm_platform_link_flags2str (flags, buf, sizeof (buf)),
flags); flags);
return do_change_link (platform, change, FALSE); 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); rtnl_link_inet6_set_addr_gen_mode (nlo, mode);
_LOGD ("link: change %d: set IPv6 address generation mode to %s", _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; return do_change_link (platform, nlo, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
} }
#endif #endif

View File

@@ -2514,7 +2514,7 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len)
if (link->flags) { if (link->flags) {
char str_flags_buf[64]; 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); 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; return buf;
} }
/** const char *
* nm_platform_addr_flags2str: wrapper for rtnl_addr_flags2str(), nm_platform_link_flags2str (unsigned flags, char *buf, gsize len)
* which might not yet support some recent address flags.
**/
void
nm_platform_addr_flags2str (int flags, char *buf, size_t size)
{ {
if ( !NM_FLAGS_ANY (flags, IFA_F_MANAGETEMPADDR | IFA_F_NOPREFIXROUTE) static const NMUtilsFlags2StrDesc descs[] = {
|| nm_platform_check_support_libnl_extended_ifa_flags ()) NM_UTILS_FLAGS2STR (IFF_LOOPBACK, "loopback"),
rtnl_addr_flags2str (flags, buf, size); NM_UTILS_FLAGS2STR (IFF_BROADCAST, "broadcast"),
else { NM_UTILS_FLAGS2STR (IFF_POINTOPOINT, "pointopoint"),
/* There are two recent flags IFA_F_MANAGETEMPADDR and IFA_F_NOPREFIXROUTE. NM_UTILS_FLAGS2STR (IFF_MULTICAST, "multicast"),
* If libnl does not yet support them, add them by hand. NM_UTILS_FLAGS2STR (IFF_NOARP, "noarp"),
* These two flags were introduced together with the extended ifa_flags NM_UTILS_FLAGS2STR (IFF_ALLMULTI, "allmulti"),
* so check for nm_platform_check_support_libnl_extended_ifa_flags (). */ NM_UTILS_FLAGS2STR (IFF_PROMISC, "promisc"),
gboolean has_other_unknown_flags = FALSE; NM_UTILS_FLAGS2STR (IFF_MASTER, "master"),
size_t len; 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);
};
/* if there are unknown flags to rtnl_addr_flags2str(), libnl appends ',' const char *
* to indicate them. We want to keep this behavior, if there are other nm_platform_link_inet6_addrgenmode2str (guint8 mode, char *buf, gsize len)
* unknown flags present. */ {
nm_utils_to_string_buffer_init (&buf, &len);
rtnl_addr_flags2str (flags & ~(IFA_F_MANAGETEMPADDR | IFA_F_NOPREFIXROUTE), buf, size); switch (mode) {
case NM_IN6_ADDR_GEN_MODE_NONE:
len = strlen (buf); g_snprintf (buf, len, "none");
if (len > 0) { break;
has_other_unknown_flags = (buf[len - 1] == ','); case NM_IN6_ADDR_GEN_MODE_EUI64:
if (!has_other_unknown_flags) g_snprintf (buf, len, "eui64");
g_strlcat (buf, ",", size); break;
} case NM_IN6_ADDR_GEN_MODE_STABLE_PRIVACY:
g_snprintf (buf, len, "stable-privacy");
if (NM_FLAGS_ALL (flags, IFA_F_MANAGETEMPADDR | IFA_F_NOPREFIXROUTE)) break;
g_strlcat (buf, IFA_F_MANAGETEMPADDR_STR","IFA_F_NOPREFIXROUTE_STR, size); default:
else if (NM_FLAGS_HAS (flags, IFA_F_MANAGETEMPADDR)) g_snprintf (buf, len, "%u", (unsigned) mode);
g_strlcat (buf, IFA_F_MANAGETEMPADDR_STR, size); break;
else
g_strlcat (buf, IFA_F_NOPREFIXROUTE_STR, size);
if (has_other_unknown_flags)
g_strlcat (buf, ",", size);
} }
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);
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, route->mss,
source_to_string (route->source), source_to_string (route->source),
route->scope_inv ? " scope " : "", 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 ? " pref-src " : "",
route->pref_src ? inet_ntop (AF_INET, &route->pref_src, s_pref_src, sizeof(s_pref_src)) : ""); route->pref_src ? inet_ntop (AF_INET, &route->pref_src, s_pref_src, sizeof(s_pref_src)) : "");
return buf; return buf;

View File

@@ -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_kernel_extended_ifa_flags (NMPlatform *self);
gboolean nm_platform_check_support_user_ipv6ll (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); int nm_platform_ip_address_cmp_expiry (const NMPlatformIPAddress *a, const NMPlatformIPAddress *b);

View File

@@ -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 (); NMTST_DEFINE ();
int 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/init_linux_platform", test_init_linux_platform);
g_test_add_func ("/general/link_get_all", test_link_get_all); 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 (); return g_test_run ();
} }