diff options
Diffstat (limited to 'libnm-core/nm-libnm-core-intern')
| -rw-r--r-- | libnm-core/nm-libnm-core-intern/nm-auth-subject.c | 614 | ||||
| -rw-r--r-- | libnm-core/nm-libnm-core-intern/nm-auth-subject.h | 61 | ||||
| -rw-r--r-- | libnm-core/nm-libnm-core-intern/nm-common-macros.h | 82 | ||||
| -rw-r--r-- | libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c | 452 | ||||
| -rw-r--r-- | libnm-core/nm-libnm-core-intern/nm-ethtool-utils.h | 237 | ||||
| -rw-r--r-- | libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c | 476 | ||||
| -rw-r--r-- | libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h | 133 |
7 files changed, 1090 insertions, 965 deletions
diff --git a/libnm-core/nm-libnm-core-intern/nm-auth-subject.c b/libnm-core/nm-libnm-core-intern/nm-auth-subject.c index 15c2d652..49cd4f12 100644 --- a/libnm-core/nm-libnm-core-intern/nm-auth-subject.c +++ b/libnm-core/nm-libnm-core-intern/nm-auth-subject.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ /* * Copyright (C) 2013 - 2014 Red Hat, Inc. */ @@ -18,148 +18,153 @@ #include <stdlib.h> enum { - PROP_0, - PROP_SUBJECT_TYPE, - PROP_UNIX_PROCESS_DBUS_SENDER, - PROP_UNIX_PROCESS_PID, - PROP_UNIX_PROCESS_UID, - PROP_UNIX_SESSION_ID, - - PROP_LAST, + PROP_0, + PROP_SUBJECT_TYPE, + PROP_UNIX_PROCESS_DBUS_SENDER, + PROP_UNIX_PROCESS_PID, + PROP_UNIX_PROCESS_UID, + PROP_UNIX_SESSION_ID, + + PROP_LAST, }; typedef struct { - NMAuthSubjectType subject_type; - struct { - gulong pid; - gulong uid; - guint64 start_time; - char *dbus_sender; - } unix_process; - - struct { - char *id; - } unix_session; + NMAuthSubjectType subject_type; + struct { + gulong pid; + gulong uid; + guint64 start_time; + char * dbus_sender; + } unix_process; + + struct { + char *id; + } unix_session; } NMAuthSubjectPrivate; struct _NMAuthSubject { - GObject parent; - NMAuthSubjectPrivate _priv; + GObject parent; + NMAuthSubjectPrivate _priv; }; struct _NMAuthSubjectClass { - GObjectClass parent; + GObjectClass parent; }; -G_DEFINE_TYPE (NMAuthSubject, nm_auth_subject, G_TYPE_OBJECT) +G_DEFINE_TYPE(NMAuthSubject, nm_auth_subject, G_TYPE_OBJECT) #define NM_AUTH_SUBJECT_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMAuthSubject, NM_IS_AUTH_SUBJECT) /*****************************************************************************/ -#define CHECK_SUBJECT(self, error_value) \ - NMAuthSubjectPrivate *priv; \ - g_return_val_if_fail (NM_IS_AUTH_SUBJECT (self), error_value); \ - priv = NM_AUTH_SUBJECT_GET_PRIVATE (self); \ +#define CHECK_SUBJECT(self, error_value) \ + NMAuthSubjectPrivate *priv; \ + g_return_val_if_fail(NM_IS_AUTH_SUBJECT(self), error_value); \ + priv = NM_AUTH_SUBJECT_GET_PRIVATE(self); #define CHECK_SUBJECT_TYPED(self, expected_subject_type, error_value) \ - CHECK_SUBJECT (self, error_value); \ - g_return_val_if_fail (priv->subject_type == (expected_subject_type), error_value); + CHECK_SUBJECT(self, error_value); \ + g_return_val_if_fail(priv->subject_type == (expected_subject_type), error_value); const char * -nm_auth_subject_to_string (NMAuthSubject *self, char *buf, gsize buf_len) +nm_auth_subject_to_string(NMAuthSubject *self, char *buf, gsize buf_len) { - CHECK_SUBJECT (self, NULL); - - switch (priv->subject_type) { - case NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS: - g_snprintf (buf, buf_len, "unix-process[pid=%lu, uid=%lu, start=%llu]", - (unsigned long) priv->unix_process.pid, - (unsigned long) priv->unix_process.uid, - (unsigned long long) priv->unix_process.start_time); - break; - case NM_AUTH_SUBJECT_TYPE_INTERNAL: - g_strlcpy (buf, "internal", buf_len); - break; - case NM_AUTH_SUBJECT_TYPE_UNIX_SESSION: - g_snprintf (buf, buf_len, "unix-session[id=%s]", - priv->unix_session.id); - break; - default: - g_strlcpy (buf, "invalid", buf_len); - break; - } - return buf; + CHECK_SUBJECT(self, NULL); + + switch (priv->subject_type) { + case NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS: + g_snprintf(buf, + buf_len, + "unix-process[pid=%lu, uid=%lu, start=%llu]", + (unsigned long) priv->unix_process.pid, + (unsigned long) priv->unix_process.uid, + (unsigned long long) priv->unix_process.start_time); + break; + case NM_AUTH_SUBJECT_TYPE_INTERNAL: + g_strlcpy(buf, "internal", buf_len); + break; + case NM_AUTH_SUBJECT_TYPE_UNIX_SESSION: + g_snprintf(buf, buf_len, "unix-session[id=%s]", priv->unix_session.id); + break; + default: + g_strlcpy(buf, "invalid", buf_len); + break; + } + return buf; } /* returns a floating variant */ GVariant * -nm_auth_subject_unix_to_polkit_gvariant (NMAuthSubject *self) +nm_auth_subject_unix_to_polkit_gvariant(NMAuthSubject *self) { - GVariantBuilder builder; - CHECK_SUBJECT (self, NULL); - - switch (priv->subject_type) { - - case NM_AUTH_SUBJECT_TYPE_UNIX_SESSION: - g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); - g_variant_builder_add (&builder, "{sv}", "session-id", - g_variant_new_string (priv->unix_session.id)); - return g_variant_new ("(sa{sv})", "unix-session", &builder); - - case NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS: - g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); - g_variant_builder_add (&builder, "{sv}", "pid", - g_variant_new_uint32 (priv->unix_process.pid)); - g_variant_builder_add (&builder, "{sv}", "start-time", - g_variant_new_uint64 (priv->unix_process.start_time)); - g_variant_builder_add (&builder, "{sv}", "uid", - g_variant_new_int32 (priv->unix_process.uid)); - return g_variant_new ("(sa{sv})", "unix-process", &builder); - - default: - g_return_val_if_reached (NULL); - } + GVariantBuilder builder; + CHECK_SUBJECT(self, NULL); + + switch (priv->subject_type) { + case NM_AUTH_SUBJECT_TYPE_UNIX_SESSION: + g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(&builder, + "{sv}", + "session-id", + g_variant_new_string(priv->unix_session.id)); + return g_variant_new("(sa{sv})", "unix-session", &builder); + + case NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS: + g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(&builder, + "{sv}", + "pid", + g_variant_new_uint32(priv->unix_process.pid)); + g_variant_builder_add(&builder, + "{sv}", + "start-time", + g_variant_new_uint64(priv->unix_process.start_time)); + g_variant_builder_add(&builder, "{sv}", "uid", g_variant_new_int32(priv->unix_process.uid)); + return g_variant_new("(sa{sv})", "unix-process", &builder); + + default: + g_return_val_if_reached(NULL); + } } NMAuthSubjectType -nm_auth_subject_get_subject_type (NMAuthSubject *subject) +nm_auth_subject_get_subject_type(NMAuthSubject *subject) { - CHECK_SUBJECT (subject, NM_AUTH_SUBJECT_TYPE_INVALID); + CHECK_SUBJECT(subject, NM_AUTH_SUBJECT_TYPE_INVALID); - return priv->subject_type; + return priv->subject_type; } gulong -nm_auth_subject_get_unix_process_pid (NMAuthSubject *subject) +nm_auth_subject_get_unix_process_pid(NMAuthSubject *subject) { - CHECK_SUBJECT_TYPED (subject, NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, G_MAXULONG); + CHECK_SUBJECT_TYPED(subject, NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, G_MAXULONG); - return priv->unix_process.pid; + return priv->unix_process.pid; } gulong -nm_auth_subject_get_unix_process_uid (NMAuthSubject *subject) +nm_auth_subject_get_unix_process_uid(NMAuthSubject *subject) { - CHECK_SUBJECT_TYPED (subject, NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, G_MAXULONG); + CHECK_SUBJECT_TYPED(subject, NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, G_MAXULONG); - return priv->unix_process.uid; + return priv->unix_process.uid; } const char * -nm_auth_subject_get_unix_process_dbus_sender (NMAuthSubject *subject) +nm_auth_subject_get_unix_process_dbus_sender(NMAuthSubject *subject) { - CHECK_SUBJECT_TYPED (subject, NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, NULL); + CHECK_SUBJECT_TYPED(subject, NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, NULL); - return priv->unix_process.dbus_sender; + return priv->unix_process.dbus_sender; } const char * -nm_auth_subject_get_unix_session_id (NMAuthSubject *subject) +nm_auth_subject_get_unix_session_id(NMAuthSubject *subject) { - CHECK_SUBJECT_TYPED (subject, NM_AUTH_SUBJECT_TYPE_UNIX_SESSION, NULL); + CHECK_SUBJECT_TYPED(subject, NM_AUTH_SUBJECT_TYPE_UNIX_SESSION, NULL); - return priv->unix_session.id; + return priv->unix_session.id; } /*****************************************************************************/ @@ -172,11 +177,12 @@ nm_auth_subject_get_unix_session_id (NMAuthSubject *subject) * Returns: the new #NMAuthSubject */ NMAuthSubject * -nm_auth_subject_new_internal (void) +nm_auth_subject_new_internal(void) { - return NM_AUTH_SUBJECT (g_object_new (NM_TYPE_AUTH_SUBJECT, - NM_AUTH_SUBJECT_SUBJECT_TYPE, (int) NM_AUTH_SUBJECT_TYPE_INTERNAL, - NULL)); + return NM_AUTH_SUBJECT(g_object_new(NM_TYPE_AUTH_SUBJECT, + NM_AUTH_SUBJECT_SUBJECT_TYPE, + (int) NM_AUTH_SUBJECT_TYPE_INTERNAL, + NULL)); } /** @@ -187,12 +193,14 @@ nm_auth_subject_new_internal (void) * Returns: the new #NMAuthSubject */ NMAuthSubject * -nm_auth_subject_new_unix_session (const char *session_id) +nm_auth_subject_new_unix_session(const char *session_id) { - return NM_AUTH_SUBJECT (g_object_new (NM_TYPE_AUTH_SUBJECT, - NM_AUTH_SUBJECT_SUBJECT_TYPE, (int) NM_AUTH_SUBJECT_TYPE_UNIX_SESSION, - NM_AUTH_SUBJECT_UNIX_SESSION_ID, session_id, - NULL)); + return NM_AUTH_SUBJECT(g_object_new(NM_TYPE_AUTH_SUBJECT, + NM_AUTH_SUBJECT_SUBJECT_TYPE, + (int) NM_AUTH_SUBJECT_TYPE_UNIX_SESSION, + NM_AUTH_SUBJECT_UNIX_SESSION_ID, + session_id, + NULL)); } /** @@ -203,14 +211,18 @@ nm_auth_subject_new_unix_session (const char *session_id) * Returns: the new #NMAuthSubject */ NMAuthSubject * -nm_auth_subject_new_unix_process (const char *dbus_sender, gulong pid, gulong uid) +nm_auth_subject_new_unix_process(const char *dbus_sender, gulong pid, gulong uid) { - return NM_AUTH_SUBJECT (g_object_new (NM_TYPE_AUTH_SUBJECT, - NM_AUTH_SUBJECT_SUBJECT_TYPE, (int) NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, - NM_AUTH_SUBJECT_UNIX_PROCESS_DBUS_SENDER, dbus_sender, - NM_AUTH_SUBJECT_UNIX_PROCESS_PID, pid, - NM_AUTH_SUBJECT_UNIX_PROCESS_UID, uid, - NULL)); + return NM_AUTH_SUBJECT(g_object_new(NM_TYPE_AUTH_SUBJECT, + NM_AUTH_SUBJECT_SUBJECT_TYPE, + (int) NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, + NM_AUTH_SUBJECT_UNIX_PROCESS_DBUS_SENDER, + dbus_sender, + NM_AUTH_SUBJECT_UNIX_PROCESS_PID, + pid, + NM_AUTH_SUBJECT_UNIX_PROCESS_UID, + uid, + NULL)); } /** @@ -221,226 +233,236 @@ nm_auth_subject_new_unix_process (const char *dbus_sender, gulong pid, gulong ui * Returns: the new #NMAuthSubject */ NMAuthSubject * -nm_auth_subject_new_unix_process_self (void) +nm_auth_subject_new_unix_process_self(void) { - return nm_auth_subject_new_unix_process (NULL, getpid(), getuid()); + return nm_auth_subject_new_unix_process(NULL, getpid(), getuid()); } /*****************************************************************************/ static void -get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - NMAuthSubjectPrivate *priv = NM_AUTH_SUBJECT_GET_PRIVATE (object); - - switch (prop_id) { - case PROP_SUBJECT_TYPE: - g_value_set_int (value, priv->subject_type); - break; - case PROP_UNIX_PROCESS_DBUS_SENDER: - g_value_set_string (value, priv->unix_process.dbus_sender); - break; - case PROP_UNIX_PROCESS_PID: - g_value_set_ulong (value, priv->unix_process.pid); - break; - case PROP_UNIX_PROCESS_UID: - g_value_set_ulong (value, priv->unix_process.uid); - break; - case PROP_UNIX_SESSION_ID: - g_value_set_string (value, priv->unix_session.id); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + NMAuthSubjectPrivate *priv = NM_AUTH_SUBJECT_GET_PRIVATE(object); + + switch (prop_id) { + case PROP_SUBJECT_TYPE: + g_value_set_int(value, priv->subject_type); + break; + case PROP_UNIX_PROCESS_DBUS_SENDER: + g_value_set_string(value, priv->unix_process.dbus_sender); + break; + case PROP_UNIX_PROCESS_PID: + g_value_set_ulong(value, priv->unix_process.pid); + break; + case PROP_UNIX_PROCESS_UID: + g_value_set_ulong(value, priv->unix_process.uid); + break; + case PROP_UNIX_SESSION_ID: + g_value_set_string(value, priv->unix_session.id); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } } static void -set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { - NMAuthSubjectPrivate *priv = NM_AUTH_SUBJECT_GET_PRIVATE (object); - NMAuthSubjectType subject_type; - int i; - const char *str; - gulong id; - - switch (prop_id) { - case PROP_SUBJECT_TYPE: - /* construct-only */ - i = g_value_get_int (value); - g_return_if_fail (NM_IN_SET (i, - (int) NM_AUTH_SUBJECT_TYPE_INTERNAL, - (int) NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, - (int) NM_AUTH_SUBJECT_TYPE_UNIX_SESSION)); - subject_type = i; - priv->subject_type |= subject_type; - g_return_if_fail (priv->subject_type == subject_type); - break; - case PROP_UNIX_PROCESS_DBUS_SENDER: - /* construct-only */ - if ((str = g_value_get_string (value))) { - priv->subject_type |= NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS; - g_return_if_fail (priv->subject_type == NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS); - priv->unix_process.dbus_sender = g_strdup (str); - } - break; - case PROP_UNIX_PROCESS_PID: - /* construct-only */ - if ((id = g_value_get_ulong (value)) != G_MAXULONG) { - priv->subject_type |= NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS; - g_return_if_fail (priv->subject_type == NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS); - priv->unix_process.pid = id; - } - break; - case PROP_UNIX_PROCESS_UID: - /* construct-only */ - if ((id = g_value_get_ulong (value)) != G_MAXULONG) { - priv->subject_type |= NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS; - g_return_if_fail (priv->subject_type == NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS); - priv->unix_process.uid = id; - } - break; - case PROP_UNIX_SESSION_ID: - /* construct-only */ - if ((str = g_value_get_string (value))) { - priv->subject_type |= NM_AUTH_SUBJECT_TYPE_UNIX_SESSION; - g_return_if_fail (priv->subject_type == NM_AUTH_SUBJECT_TYPE_UNIX_SESSION); - priv->unix_session.id = g_strdup (str); - } - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + NMAuthSubjectPrivate *priv = NM_AUTH_SUBJECT_GET_PRIVATE(object); + NMAuthSubjectType subject_type; + int i; + const char * str; + gulong id; + + switch (prop_id) { + case PROP_SUBJECT_TYPE: + /* construct-only */ + i = g_value_get_int(value); + g_return_if_fail(NM_IN_SET(i, + (int) NM_AUTH_SUBJECT_TYPE_INTERNAL, + (int) NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS, + (int) NM_AUTH_SUBJECT_TYPE_UNIX_SESSION)); + subject_type = i; + priv->subject_type |= subject_type; + g_return_if_fail(priv->subject_type == subject_type); + break; + case PROP_UNIX_PROCESS_DBUS_SENDER: + /* construct-only */ + if ((str = g_value_get_string(value))) { + priv->subject_type |= NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS; + g_return_if_fail(priv->subject_type == NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS); + priv->unix_process.dbus_sender = g_strdup(str); + } + break; + case PROP_UNIX_PROCESS_PID: + /* construct-only */ + if ((id = g_value_get_ulong(value)) != G_MAXULONG) { + priv->subject_type |= NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS; + g_return_if_fail(priv->subject_type == NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS); + priv->unix_process.pid = id; + } + break; + case PROP_UNIX_PROCESS_UID: + /* construct-only */ + if ((id = g_value_get_ulong(value)) != G_MAXULONG) { + priv->subject_type |= NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS; + g_return_if_fail(priv->subject_type == NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS); + priv->unix_process.uid = id; + } + break; + case PROP_UNIX_SESSION_ID: + /* construct-only */ + if ((str = g_value_get_string(value))) { + priv->subject_type |= NM_AUTH_SUBJECT_TYPE_UNIX_SESSION; + g_return_if_fail(priv->subject_type == NM_AUTH_SUBJECT_TYPE_UNIX_SESSION); + priv->unix_session.id = g_strdup(str); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } } static void -_clear_private (NMAuthSubject *self) +_clear_private(NMAuthSubject *self) { - NMAuthSubjectPrivate *priv = NM_AUTH_SUBJECT_GET_PRIVATE (self); + NMAuthSubjectPrivate *priv = NM_AUTH_SUBJECT_GET_PRIVATE(self); - priv->subject_type = NM_AUTH_SUBJECT_TYPE_INVALID; - priv->unix_process.pid = G_MAXULONG; - priv->unix_process.uid = G_MAXULONG; - nm_clear_g_free (&priv->unix_process.dbus_sender); + priv->subject_type = NM_AUTH_SUBJECT_TYPE_INVALID; + priv->unix_process.pid = G_MAXULONG; + priv->unix_process.uid = G_MAXULONG; + nm_clear_g_free(&priv->unix_process.dbus_sender); - nm_clear_g_free (&priv->unix_session.id); + nm_clear_g_free(&priv->unix_session.id); } static void -nm_auth_subject_init (NMAuthSubject *self) +nm_auth_subject_init(NMAuthSubject *self) { - _clear_private (self); + _clear_private(self); } static void -constructed (GObject *object) +constructed(GObject *object) { - NMAuthSubject *self = NM_AUTH_SUBJECT (object); - NMAuthSubjectPrivate *priv = NM_AUTH_SUBJECT_GET_PRIVATE (self); - - /* validate that the created instance. */ - - switch (priv->subject_type) { - case NM_AUTH_SUBJECT_TYPE_INTERNAL: - priv->unix_process.pid = G_MAXULONG; - priv->unix_process.uid = 0; /* internal uses 'root' user */ - return; - case NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS: - /* Ensure pid and uid to be representable as int32. - * DBUS treats them as uint32, polkit library as int. */ - if (priv->unix_process.pid > MIN (G_MAXINT, G_MAXINT32)) - break; - if (priv->unix_process.uid > MIN (G_MAXINT, G_MAXINT32)) { - /* for uid==-1, libpolkit-gobject-1 detects the user based on the process id. - * Don't bother and require the user id as parameter. */ - break; - } - - priv->unix_process.start_time = nm_utils_get_start_time_for_pid (priv->unix_process.pid, NULL, NULL); - - if (!priv->unix_process.start_time) { - /* Is the process already gone? Then fail creation of the auth subject - * by clearing the type. */ - if (kill (priv->unix_process.pid, 0) != 0) - _clear_private (self); - - /* Otherwise, although we didn't detect a start_time, the process is still around. - * That could be due to procfs mounted with hidepid. So just accept the request. - * - * Polkit on the other side, will accept 0 and try to lookup /proc/$PID/stat - * itself (and if it fails to do so, assume a start-time of 0 and proceed). - * The only combination that would fail here, is when NM is able to read the - * start-time, but polkit is not. */ - } - return; - case NM_AUTH_SUBJECT_TYPE_UNIX_SESSION: - return; - default: - break; - } - - _clear_private (self); - g_return_if_reached (); + NMAuthSubject * self = NM_AUTH_SUBJECT(object); + NMAuthSubjectPrivate *priv = NM_AUTH_SUBJECT_GET_PRIVATE(self); + + /* validate that the created instance. */ + + switch (priv->subject_type) { + case NM_AUTH_SUBJECT_TYPE_INTERNAL: + priv->unix_process.pid = G_MAXULONG; + priv->unix_process.uid = 0; /* internal uses 'root' user */ + return; + case NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS: + /* Ensure pid and uid to be representable as int32. + * DBUS treats them as uint32, polkit library as int. */ + if (priv->unix_process.pid > MIN(G_MAXINT, G_MAXINT32)) + break; + if (priv->unix_process.uid > MIN(G_MAXINT, G_MAXINT32)) { + /* for uid==-1, libpolkit-gobject-1 detects the user based on the process id. + * Don't bother and require the user id as parameter. */ + break; + } + + priv->unix_process.start_time = + nm_utils_get_start_time_for_pid(priv->unix_process.pid, NULL, NULL); + + if (!priv->unix_process.start_time) { + /* Is the process already gone? Then fail creation of the auth subject + * by clearing the type. */ + if (kill(priv->unix_process.pid, 0) != 0) + _clear_private(self); + + /* Otherwise, although we didn't detect a start_time, the process is still around. + * That could be due to procfs mounted with hidepid. So just accept the request. + * + * Polkit on the other side, will accept 0 and try to lookup /proc/$PID/stat + * itself (and if it fails to do so, assume a start-time of 0 and proceed). + * The only combination that would fail here, is when NM is able to read the + * start-time, but polkit is not. */ + } + return; + case NM_AUTH_SUBJECT_TYPE_UNIX_SESSION: + return; + default: + break; + } + + _clear_private(self); + g_return_if_reached(); } static void -finalize (GObject *object) +finalize(GObject *object) { - _clear_private ((NMAuthSubject *) object); + _clear_private((NMAuthSubject *) object); - G_OBJECT_CLASS (nm_auth_subject_parent_class)->finalize (object); + G_OBJECT_CLASS(nm_auth_subject_parent_class)->finalize(object); } static void -nm_auth_subject_class_init (NMAuthSubjectClass *config_class) +nm_auth_subject_class_init(NMAuthSubjectClass *config_class) { - GObjectClass *object_class = G_OBJECT_CLASS (config_class); - - object_class->get_property = get_property; - object_class->set_property = set_property; - object_class->constructed = constructed; - object_class->finalize = finalize; - - g_object_class_install_property - (object_class, PROP_SUBJECT_TYPE, - g_param_spec_int (NM_AUTH_SUBJECT_SUBJECT_TYPE, "", "", - NM_AUTH_SUBJECT_TYPE_INVALID, - NM_AUTH_SUBJECT_TYPE_UNIX_SESSION, - NM_AUTH_SUBJECT_TYPE_INVALID, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property - (object_class, PROP_UNIX_PROCESS_DBUS_SENDER, - g_param_spec_string (NM_AUTH_SUBJECT_UNIX_PROCESS_DBUS_SENDER, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property - (object_class, PROP_UNIX_PROCESS_PID, - g_param_spec_ulong (NM_AUTH_SUBJECT_UNIX_PROCESS_PID, "", "", - 0, G_MAXULONG, G_MAXULONG, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property - (object_class, PROP_UNIX_PROCESS_UID, - g_param_spec_ulong (NM_AUTH_SUBJECT_UNIX_PROCESS_UID, "", "", - 0, G_MAXULONG, G_MAXULONG, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property - (object_class, PROP_UNIX_SESSION_ID, - g_param_spec_string (NM_AUTH_SUBJECT_UNIX_SESSION_ID, "", "", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); + GObjectClass *object_class = G_OBJECT_CLASS(config_class); + + object_class->get_property = get_property; + object_class->set_property = set_property; + object_class->constructed = constructed; + object_class->finalize = finalize; + + g_object_class_install_property( + object_class, + PROP_SUBJECT_TYPE, + g_param_spec_int(NM_AUTH_SUBJECT_SUBJECT_TYPE, + "", + "", + NM_AUTH_SUBJECT_TYPE_INVALID, + NM_AUTH_SUBJECT_TYPE_UNIX_SESSION, + NM_AUTH_SUBJECT_TYPE_INVALID, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property( + object_class, + PROP_UNIX_PROCESS_DBUS_SENDER, + g_param_spec_string(NM_AUTH_SUBJECT_UNIX_PROCESS_DBUS_SENDER, + "", + "", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property( + object_class, + PROP_UNIX_PROCESS_PID, + g_param_spec_ulong(NM_AUTH_SUBJECT_UNIX_PROCESS_PID, + "", + "", + 0, + G_MAXULONG, + G_MAXULONG, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property( + object_class, + PROP_UNIX_PROCESS_UID, + g_param_spec_ulong(NM_AUTH_SUBJECT_UNIX_PROCESS_UID, + "", + "", + 0, + G_MAXULONG, + G_MAXULONG, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property( + object_class, + PROP_UNIX_SESSION_ID, + g_param_spec_string(NM_AUTH_SUBJECT_UNIX_SESSION_ID, + "", + "", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); } diff --git a/libnm-core/nm-libnm-core-intern/nm-auth-subject.h b/libnm-core/nm-libnm-core-intern/nm-auth-subject.h index fc37b8e2..13d380d2 100644 --- a/libnm-core/nm-libnm-core-intern/nm-auth-subject.h +++ b/libnm-core/nm-libnm-core-intern/nm-auth-subject.h @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ /* * Copyright (C) 2013 Red Hat, Inc. */ @@ -6,51 +6,54 @@ #ifndef __NETWORKMANAGER_AUTH_SUBJECT_H__ #define __NETWORKMANAGER_AUTH_SUBJECT_H__ -#define NM_TYPE_AUTH_SUBJECT (nm_auth_subject_get_type ()) -#define NM_AUTH_SUBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_AUTH_SUBJECT, NMAuthSubject)) -#define NM_AUTH_SUBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_AUTH_SUBJECT, NMAuthSubjectClass)) -#define NM_IS_AUTH_SUBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_AUTH_SUBJECT)) -#define NM_IS_AUTH_SUBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_AUTH_SUBJECT)) -#define NM_AUTH_SUBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_AUTH_SUBJECT, NMAuthSubjectClass)) +#define NM_TYPE_AUTH_SUBJECT (nm_auth_subject_get_type()) +#define NM_AUTH_SUBJECT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_AUTH_SUBJECT, NMAuthSubject)) +#define NM_AUTH_SUBJECT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_AUTH_SUBJECT, NMAuthSubjectClass)) +#define NM_IS_AUTH_SUBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_AUTH_SUBJECT)) +#define NM_IS_AUTH_SUBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_AUTH_SUBJECT)) +#define NM_AUTH_SUBJECT_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_AUTH_SUBJECT, NMAuthSubjectClass)) typedef enum { - NM_AUTH_SUBJECT_TYPE_INVALID = 0, - NM_AUTH_SUBJECT_TYPE_INTERNAL = 1, - NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS = 2, - NM_AUTH_SUBJECT_TYPE_UNIX_SESSION = 4, + NM_AUTH_SUBJECT_TYPE_INVALID = 0, + NM_AUTH_SUBJECT_TYPE_INTERNAL = 1, + NM_AUTH_SUBJECT_TYPE_UNIX_PROCESS = 2, + NM_AUTH_SUBJECT_TYPE_UNIX_SESSION = 4, } NMAuthSubjectType; -#define NM_AUTH_SUBJECT_SUBJECT_TYPE "subject-type" -#define NM_AUTH_SUBJECT_UNIX_PROCESS_DBUS_SENDER "unix-process-dbus-sender" -#define NM_AUTH_SUBJECT_UNIX_PROCESS_PID "unix-process-pid" -#define NM_AUTH_SUBJECT_UNIX_PROCESS_UID "unix-process-uid" -#define NM_AUTH_SUBJECT_UNIX_SESSION_ID "unix-session-id" +#define NM_AUTH_SUBJECT_SUBJECT_TYPE "subject-type" +#define NM_AUTH_SUBJECT_UNIX_PROCESS_DBUS_SENDER "unix-process-dbus-sender" +#define NM_AUTH_SUBJECT_UNIX_PROCESS_PID "unix-process-pid" +#define NM_AUTH_SUBJECT_UNIX_PROCESS_UID "unix-process-uid" +#define NM_AUTH_SUBJECT_UNIX_SESSION_ID "unix-session-id" typedef struct _NMAuthSubjectClass NMAuthSubjectClass; -typedef struct _NMAuthSubject NMAuthSubject; +typedef struct _NMAuthSubject NMAuthSubject; -GType nm_auth_subject_get_type (void); +GType nm_auth_subject_get_type(void); -NMAuthSubject *nm_auth_subject_new_internal (void); +NMAuthSubject *nm_auth_subject_new_internal(void); -NMAuthSubject *nm_auth_subject_new_unix_session (const char *session_id); +NMAuthSubject *nm_auth_subject_new_unix_session(const char *session_id); -NMAuthSubject *nm_auth_subject_new_unix_process (const char *dbus_sender, gulong pid, gulong uid); +NMAuthSubject *nm_auth_subject_new_unix_process(const char *dbus_sender, gulong pid, gulong uid); -NMAuthSubject *nm_auth_subject_new_unix_process_self (void); +NMAuthSubject *nm_auth_subject_new_unix_process_self(void); -NMAuthSubjectType nm_auth_subject_get_subject_type (NMAuthSubject *subject); +NMAuthSubjectType nm_auth_subject_get_subject_type(NMAuthSubject *subject); -gulong nm_auth_subject_get_unix_process_pid (NMAuthSubject *subject); +gulong nm_auth_subject_get_unix_process_pid(NMAuthSubject *subject); -const char *nm_auth_subject_get_unix_process_dbus_sender (NMAuthSubject *subject); +const char *nm_auth_subject_get_unix_process_dbus_sender(NMAuthSubject *subject); -gulong nm_auth_subject_get_unix_process_uid (NMAuthSubject *subject); +gulong nm_auth_subject_get_unix_process_uid(NMAuthSubject *subject); -const char *nm_auth_subject_get_unix_session_id (NMAuthSubject *subject); +const char *nm_auth_subject_get_unix_session_id(NMAuthSubject *subject); -const char *nm_auth_subject_to_string (NMAuthSubject *self, char *buf, gsize buf_len); +const char *nm_auth_subject_to_string(NMAuthSubject *self, char *buf, gsize buf_len); -GVariant *nm_auth_subject_unix_to_polkit_gvariant (NMAuthSubject *self); +GVariant *nm_auth_subject_unix_to_polkit_gvariant(NMAuthSubject *self); #endif /* __NETWORKMANAGER_AUTH_SUBJECT_H__ */ diff --git a/libnm-core/nm-libnm-core-intern/nm-common-macros.h b/libnm-core/nm-libnm-core-intern/nm-common-macros.h index fcfe6919..9de3a8fc 100644 --- a/libnm-core/nm-libnm-core-intern/nm-common-macros.h +++ b/libnm-core/nm-libnm-core-intern/nm-common-macros.h @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ /* * Copyright (C) 2016 Red Hat, Inc. */ @@ -8,54 +8,58 @@ /*****************************************************************************/ -#define NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK "org.freedesktop.NetworkManager.enable-disable-network" -#define NM_AUTH_PERMISSION_SLEEP_WAKE "org.freedesktop.NetworkManager.sleep-wake" -#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI "org.freedesktop.NetworkManager.enable-disable-wifi" -#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN "org.freedesktop.NetworkManager.enable-disable-wwan" -#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX "org.freedesktop.NetworkManager.enable-disable-wimax" -#define NM_AUTH_PERMISSION_NETWORK_CONTROL "org.freedesktop.NetworkManager.network-control" -#define NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED "org.freedesktop.NetworkManager.wifi.share.protected" -#define NM_AUTH_PERMISSION_WIFI_SHARE_OPEN "org.freedesktop.NetworkManager.wifi.share.open" -#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM "org.freedesktop.NetworkManager.settings.modify.system" -#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN "org.freedesktop.NetworkManager.settings.modify.own" -#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME "org.freedesktop.NetworkManager.settings.modify.hostname" -#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS "org.freedesktop.NetworkManager.settings.modify.global-dns" -#define NM_AUTH_PERMISSION_RELOAD "org.freedesktop.NetworkManager.reload" -#define NM_AUTH_PERMISSION_CHECKPOINT_ROLLBACK "org.freedesktop.NetworkManager.checkpoint-rollback" -#define NM_AUTH_PERMISSION_ENABLE_DISABLE_STATISTICS "org.freedesktop.NetworkManager.enable-disable-statistics" -#define NM_AUTH_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK "org.freedesktop.NetworkManager.enable-disable-connectivity-check" -#define NM_AUTH_PERMISSION_WIFI_SCAN "org.freedesktop.NetworkManager.wifi.scan" - -#define NM_CLONED_MAC_PRESERVE "preserve" -#define NM_CLONED_MAC_PERMANENT "permanent" -#define NM_CLONED_MAC_RANDOM "random" -#define NM_CLONED_MAC_STABLE "stable" +#define NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK \ + "org.freedesktop.NetworkManager.enable-disable-network" +#define NM_AUTH_PERMISSION_SLEEP_WAKE "org.freedesktop.NetworkManager.sleep-wake" +#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI "org.freedesktop.NetworkManager.enable-disable-wifi" +#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN "org.freedesktop.NetworkManager.enable-disable-wwan" +#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX \ + "org.freedesktop.NetworkManager.enable-disable-wimax" +#define NM_AUTH_PERMISSION_NETWORK_CONTROL "org.freedesktop.NetworkManager.network-control" +#define NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED \ + "org.freedesktop.NetworkManager.wifi.share.protected" +#define NM_AUTH_PERMISSION_WIFI_SHARE_OPEN "org.freedesktop.NetworkManager.wifi.share.open" +#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM \ + "org.freedesktop.NetworkManager.settings.modify.system" +#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN "org.freedesktop.NetworkManager.settings.modify.own" +#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME \ + "org.freedesktop.NetworkManager.settings.modify.hostname" +#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS \ + "org.freedesktop.NetworkManager.settings.modify.global-dns" +#define NM_AUTH_PERMISSION_RELOAD "org.freedesktop.NetworkManager.reload" +#define NM_AUTH_PERMISSION_CHECKPOINT_ROLLBACK "org.freedesktop.NetworkManager.checkpoint-rollback" +#define NM_AUTH_PERMISSION_ENABLE_DISABLE_STATISTICS \ + "org.freedesktop.NetworkManager.enable-disable-statistics" +#define NM_AUTH_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK \ + "org.freedesktop.NetworkManager.enable-disable-connectivity-check" +#define NM_AUTH_PERMISSION_WIFI_SCAN "org.freedesktop.NetworkManager.wifi.scan" + +#define NM_CLONED_MAC_PRESERVE "preserve" +#define NM_CLONED_MAC_PERMANENT "permanent" +#define NM_CLONED_MAC_RANDOM "random" +#define NM_CLONED_MAC_STABLE "stable" static inline gboolean -NM_CLONED_MAC_IS_SPECIAL (const char *str) +NM_CLONED_MAC_IS_SPECIAL(const char *str) { - return NM_IN_STRSET (str, - NM_CLONED_MAC_PRESERVE, - NM_CLONED_MAC_PERMANENT, - NM_CLONED_MAC_RANDOM, - NM_CLONED_MAC_STABLE); + return NM_IN_STRSET(str, + NM_CLONED_MAC_PRESERVE, + NM_CLONED_MAC_PERMANENT, + NM_CLONED_MAC_RANDOM, + NM_CLONED_MAC_STABLE); } -#define NM_IAID_MAC "mac" -#define NM_IAID_PERM_MAC "perm-mac" -#define NM_IAID_IFNAME "ifname" -#define NM_IAID_STABLE "stable" +#define NM_IAID_MAC "mac" +#define NM_IAID_PERM_MAC "perm-mac" +#define NM_IAID_IFNAME "ifname" +#define NM_IAID_STABLE "stable" #define NM_CONNECTION_MUD_URL_NONE "none" static inline gboolean -NM_IAID_IS_SPECIAL (const char *str) +NM_IAID_IS_SPECIAL(const char *str) { - return NM_IN_STRSET (str, - NM_IAID_MAC, - NM_IAID_PERM_MAC, - NM_IAID_IFNAME, - NM_IAID_STABLE); + return NM_IN_STRSET(str, NM_IAID_MAC, NM_IAID_PERM_MAC, NM_IAID_IFNAME, NM_IAID_STABLE); } #endif /* __NM_COMMON_MACROS_H__ */ diff --git a/libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c b/libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c index 3e3c28d3..f3d34fea 100644 --- a/libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c +++ b/libnm-core/nm-libnm-core-intern/nm-ethtool-utils.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ /* * Copyright (C) 2018 Red Hat, Inc. */ @@ -11,266 +11,266 @@ /*****************************************************************************/ -#define ETHT_DATA(xname) \ - [NM_ETHTOOL_ID_##xname] = (&((const NMEthtoolData) { \ - .optname = NM_ETHTOOL_OPTNAME_##xname, \ - .id = NM_ETHTOOL_ID_##xname, \ - })) +#define ETHT_DATA(xname) \ + [NM_ETHTOOL_ID_##xname] = (&((const NMEthtoolData){ \ + .optname = NM_ETHTOOL_OPTNAME_##xname, \ + .id = NM_ETHTOOL_ID_##xname, \ + })) const NMEthtoolData *const nm_ethtool_data[_NM_ETHTOOL_ID_NUM + 1] = { - /* indexed by NMEthtoolID */ - ETHT_DATA (COALESCE_ADAPTIVE_RX), - ETHT_DATA (COALESCE_ADAPTIVE_TX), - ETHT_DATA (COALESCE_PKT_RATE_HIGH), - ETHT_DATA (COALESCE_PKT_RATE_LOW), - ETHT_DATA (COALESCE_RX_FRAMES), - ETHT_DATA (COALESCE_RX_FRAMES_HIGH), - ETHT_DATA (COALESCE_RX_FRAMES_IRQ), - ETHT_DATA (COALESCE_RX_FRAMES_LOW), - ETHT_DATA (COALESCE_RX_USECS), - ETHT_DATA (COALESCE_RX_USECS_HIGH), - ETHT_DATA (COALESCE_RX_USECS_IRQ), - ETHT_DATA (COALESCE_RX_USECS_LOW), - ETHT_DATA (COALESCE_SAMPLE_INTERVAL), - ETHT_DATA (COALESCE_STATS_BLOCK_USECS), - ETHT_DATA (COALESCE_TX_FRAMES), - ETHT_DATA (COALESCE_TX_FRAMES_HIGH), - ETHT_DATA (COALESCE_TX_FRAMES_IRQ), - ETHT_DATA (COALESCE_TX_FRAMES_LOW), - ETHT_DATA (COALESCE_TX_USECS), - ETHT_DATA (COALESCE_TX_USECS_HIGH), - ETHT_DATA (COALESCE_TX_USECS_IRQ), - ETHT_DATA (COALESCE_TX_USECS_LOW), - ETHT_DATA (FEATURE_ESP_HW_OFFLOAD), - ETHT_DATA (FEATURE_ESP_TX_CSUM_HW_OFFLOAD), - ETHT_DATA (FEATURE_FCOE_MTU), - ETHT_DATA (FEATURE_GRO), - ETHT_DATA (FEATURE_GSO), - ETHT_DATA (FEATURE_HIGHDMA), - ETHT_DATA (FEATURE_HW_TC_OFFLOAD), - ETHT_DATA (FEATURE_L2_FWD_OFFLOAD), - ETHT_DATA (FEATURE_LOOPBACK), - ETHT_DATA (FEATURE_LRO), - ETHT_DATA (FEATURE_NTUPLE), - ETHT_DATA (FEATURE_RX), - ETHT_DATA (FEATURE_RXHASH), - ETHT_DATA (FEATURE_RXVLAN), - ETHT_DATA (FEATURE_RX_ALL), - ETHT_DATA (FEATURE_RX_FCS), - ETHT_DATA (FEATURE_RX_GRO_HW), - ETHT_DATA (FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD), - ETHT_DATA (FEATURE_RX_VLAN_FILTER), - ETHT_DATA (FEATURE_RX_VLAN_STAG_FILTER), - ETHT_DATA (FEATURE_RX_VLAN_STAG_HW_PARSE), - ETHT_DATA (FEATURE_SG), - ETHT_DATA (FEATURE_TLS_HW_RECORD), - ETHT_DATA (FEATURE_TLS_HW_TX_OFFLOAD), - ETHT_DATA (FEATURE_TSO), - ETHT_DATA (FEATURE_TX), - ETHT_DATA (FEATURE_TXVLAN), - ETHT_DATA (FEATURE_TX_CHECKSUM_FCOE_CRC), - ETHT_DATA (FEATURE_TX_CHECKSUM_IPV4), - ETHT_DATA (FEATURE_TX_CHECKSUM_IPV6), - ETHT_DATA (FEATURE_TX_CHECKSUM_IP_GENERIC), - ETHT_DATA (FEATURE_TX_CHECKSUM_SCTP), - ETHT_DATA (FEATURE_TX_ESP_SEGMENTATION), - ETHT_DATA (FEATURE_TX_FCOE_SEGMENTATION), - ETHT_DATA (FEATURE_TX_GRE_CSUM_SEGMENTATION), - ETHT_DATA (FEATURE_TX_GRE_SEGMENTATION), - ETHT_DATA (FEATURE_TX_GSO_PARTIAL), - ETHT_DATA (FEATURE_TX_GSO_ROBUST), - ETHT_DATA (FEATURE_TX_IPXIP4_SEGMENTATION), - ETHT_DATA (FEATURE_TX_IPXIP6_SEGMENTATION), - ETHT_DATA (FEATURE_TX_NOCACHE_COPY), - ETHT_DATA (FEATURE_TX_SCATTER_GATHER), - ETHT_DATA (FEATURE_TX_SCATTER_GATHER_FRAGLIST), - ETHT_DATA (FEATURE_TX_SCTP_SEGMENTATION), - ETHT_DATA (FEATURE_TX_TCP6_SEGMENTATION), - ETHT_DATA (FEATURE_TX_TCP_ECN_SEGMENTATION), - ETHT_DATA (FEATURE_TX_TCP_MANGLEID_SEGMENTATION), - ETHT_DATA (FEATURE_TX_TCP_SEGMENTATION), - ETHT_DATA (FEATURE_TX_UDP_SEGMENTATION), - ETHT_DATA (FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION), - ETHT_DATA (FEATURE_TX_UDP_TNL_SEGMENTATION), - ETHT_DATA (FEATURE_TX_VLAN_STAG_HW_INSERT), - ETHT_DATA (RING_RX), - ETHT_DATA (RING_RX_JUMBO), - ETHT_DATA (RING_RX_MINI), - ETHT_DATA (RING_TX), - [_NM_ETHTOOL_ID_NUM] = NULL, + /* indexed by NMEthtoolID */ + ETHT_DATA(COALESCE_ADAPTIVE_RX), + ETHT_DATA(COALESCE_ADAPTIVE_TX), + ETHT_DATA(COALESCE_PKT_RATE_HIGH), + ETHT_DATA(COALESCE_PKT_RATE_LOW), + ETHT_DATA(COALESCE_RX_FRAMES), + ETHT_DATA(COALESCE_RX_FRAMES_HIGH), + ETHT_DATA(COALESCE_RX_FRAMES_IRQ), + ETHT_DATA(COALESCE_RX_FRAMES_LOW), + ETHT_DATA(COALESCE_RX_USECS), + ETHT_DATA(COALESCE_RX_USECS_HIGH), + ETHT_DATA(COALESCE_RX_USECS_IRQ), + ETHT_DATA(COALESCE_RX_USECS_LOW), + ETHT_DATA(COALESCE_SAMPLE_INTERVAL), + ETHT_DATA(COALESCE_STATS_BLOCK_USECS), + ETHT_DATA(COALESCE_TX_FRAMES), + ETHT_DATA(COALESCE_TX_FRAMES_HIGH), + ETHT_DATA(COALESCE_TX_FRAMES_IRQ), + ETHT_DATA(COALESCE_TX_FRAMES_LOW), + ETHT_DATA(COALESCE_TX_USECS), + ETHT_DATA(COALESCE_TX_USECS_HIGH), + ETHT_DATA(COALESCE_TX_USECS_IRQ), + ETHT_DATA(COALESCE_TX_USECS_LOW), + ETHT_DATA(FEATURE_ESP_HW_OFFLOAD), + ETHT_DATA(FEATURE_ESP_TX_CSUM_HW_OFFLOAD), + ETHT_DATA(FEATURE_FCOE_MTU), + ETHT_DATA(FEATURE_GRO), + ETHT_DATA(FEATURE_GSO), + ETHT_DATA(FEATURE_HIGHDMA), + ETHT_DATA(FEATURE_HW_TC_OFFLOAD), + ETHT_DATA(FEATURE_L2_FWD_OFFLOAD), + ETHT_DATA(FEATURE_LOOPBACK), + ETHT_DATA(FEATURE_LRO), + ETHT_DATA(FEATURE_NTUPLE), + ETHT_DATA(FEATURE_RX), + ETHT_DATA(FEATURE_RXHASH), + ETHT_DATA(FEATURE_RXVLAN), + ETHT_DATA(FEATURE_RX_ALL), + ETHT_DATA(FEATURE_RX_FCS), + ETHT_DATA(FEATURE_RX_GRO_HW), + ETHT_DATA(FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD), + ETHT_DATA(FEATURE_RX_VLAN_FILTER), + ETHT_DATA(FEATURE_RX_VLAN_STAG_FILTER), + ETHT_DATA(FEATURE_RX_VLAN_STAG_HW_PARSE), + ETHT_DATA(FEATURE_SG), + ETHT_DATA(FEATURE_TLS_HW_RECORD), + ETHT_DATA(FEATURE_TLS_HW_TX_OFFLOAD), + ETHT_DATA(FEATURE_TSO), + ETHT_DATA(FEATURE_TX), + ETHT_DATA(FEATURE_TXVLAN), + ETHT_DATA(FEATURE_TX_CHECKSUM_FCOE_CRC), + ETHT_DATA(FEATURE_TX_CHECKSUM_IPV4), + ETHT_DATA(FEATURE_TX_CHECKSUM_IPV6), + ETHT_DATA(FEATURE_TX_CHECKSUM_IP_GENERIC), + ETHT_DATA(FEATURE_TX_CHECKSUM_SCTP), + ETHT_DATA(FEATURE_TX_ESP_SEGMENTATION), + ETHT_DATA(FEATURE_TX_FCOE_SEGMENTATION), + ETHT_DATA(FEATURE_TX_GRE_CSUM_SEGMENTATION), + ETHT_DATA(FEATURE_TX_GRE_SEGMENTATION), + ETHT_DATA(FEATURE_TX_GSO_PARTIAL), + ETHT_DATA(FEATURE_TX_GSO_ROBUST), + ETHT_DATA(FEATURE_TX_IPXIP4_SEGMENTATION), + ETHT_DATA(FEATURE_TX_IPXIP6_SEGMENTATION), + ETHT_DATA(FEATURE_TX_NOCACHE_COPY), + ETHT_DATA(FEATURE_TX_SCATTER_GATHER), + ETHT_DATA(FEATURE_TX_SCATTER_GATHER_FRAGLIST), + ETHT_DATA(FEATURE_TX_SCTP_SEGMENTATION), + ETHT_DATA(FEATURE_TX_TCP6_SEGMENTATION), + ETHT_DATA(FEATURE_TX_TCP_ECN_SEGMENTATION), + ETHT_DATA(FEATURE_TX_TCP_MANGLEID_SEGMENTATION), + ETHT_DATA(FEATURE_TX_TCP_SEGMENTATION), + ETHT_DATA(FEATURE_TX_UDP_SEGMENTATION), + ETHT_DATA(FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION), + ETHT_DATA(FEATURE_TX_UDP_TNL_SEGMENTATION), + ETHT_DATA(FEATURE_TX_VLAN_STAG_HW_INSERT), + ETHT_DATA(RING_RX), + ETHT_DATA(RING_RX_JUMBO), + ETHT_DATA(RING_RX_MINI), + ETHT_DATA(RING_TX), + [_NM_ETHTOOL_ID_NUM] = NULL, }; static const guint8 _by_name[_NM_ETHTOOL_ID_NUM] = { - /* sorted by optname. */ - NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX, - NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX, - NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH, - NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW, - NM_ETHTOOL_ID_COALESCE_RX_FRAMES, - NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH, - NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ, - NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW, - NM_ETHTOOL_ID_COALESCE_RX_USECS, - NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH, - NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ, - NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW, - NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL, - NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS, - NM_ETHTOOL_ID_COALESCE_TX_FRAMES, - NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH, - NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ, - NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW, - NM_ETHTOOL_ID_COALESCE_TX_USECS, - NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH, - NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ, - NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW, - NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_FCOE_MTU, - NM_ETHTOOL_ID_FEATURE_GRO, - NM_ETHTOOL_ID_FEATURE_GSO, - NM_ETHTOOL_ID_FEATURE_HIGHDMA, - NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_LOOPBACK, - NM_ETHTOOL_ID_FEATURE_LRO, - NM_ETHTOOL_ID_FEATURE_NTUPLE, - NM_ETHTOOL_ID_FEATURE_RX, - NM_ETHTOOL_ID_FEATURE_RX_ALL, - NM_ETHTOOL_ID_FEATURE_RX_FCS, - NM_ETHTOOL_ID_FEATURE_RX_GRO_HW, - NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER, - NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER, - NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE, - NM_ETHTOOL_ID_FEATURE_RXHASH, - NM_ETHTOOL_ID_FEATURE_RXVLAN, - NM_ETHTOOL_ID_FEATURE_SG, - NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD, - NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_TSO, - NM_ETHTOOL_ID_FEATURE_TX, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP, - NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL, - NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST, - NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY, - NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER, - NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST, - NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, - NM_ETHTOOL_ID_FEATURE_TXVLAN, - NM_ETHTOOL_ID_RING_RX, - NM_ETHTOOL_ID_RING_RX_JUMBO, - NM_ETHTOOL_ID_RING_RX_MINI, - NM_ETHTOOL_ID_RING_TX, + /* sorted by optname. */ + NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX, + NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX, + NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH, + NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW, + NM_ETHTOOL_ID_COALESCE_RX_USECS, + NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH, + NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ, + NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW, + NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL, + NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW, + NM_ETHTOOL_ID_COALESCE_TX_USECS, + NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH, + NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ, + NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW, + NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_FCOE_MTU, + NM_ETHTOOL_ID_FEATURE_GRO, + NM_ETHTOOL_ID_FEATURE_GSO, + NM_ETHTOOL_ID_FEATURE_HIGHDMA, + NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_LOOPBACK, + NM_ETHTOOL_ID_FEATURE_LRO, + NM_ETHTOOL_ID_FEATURE_NTUPLE, + NM_ETHTOOL_ID_FEATURE_RX, + NM_ETHTOOL_ID_FEATURE_RX_ALL, + NM_ETHTOOL_ID_FEATURE_RX_FCS, + NM_ETHTOOL_ID_FEATURE_RX_GRO_HW, + NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE, + NM_ETHTOOL_ID_FEATURE_RXHASH, + NM_ETHTOOL_ID_FEATURE_RXVLAN, + NM_ETHTOOL_ID_FEATURE_SG, + NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD, + NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_TSO, + NM_ETHTOOL_ID_FEATURE_TX, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP, + NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL, + NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST, + NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY, + NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER, + NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST, + NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, + NM_ETHTOOL_ID_FEATURE_TXVLAN, + NM_ETHTOOL_ID_RING_RX, + NM_ETHTOOL_ID_RING_RX_JUMBO, + NM_ETHTOOL_ID_RING_RX_MINI, + NM_ETHTOOL_ID_RING_TX, }; /*****************************************************************************/ static void -_ASSERT_data (void) +_ASSERT_data(void) { - int i; + int i; - if (!NM_MORE_ASSERT_ONCE (10)) - return; + if (!NM_MORE_ASSERT_ONCE(10)) + return; - G_STATIC_ASSERT_EXPR (_NM_ETHTOOL_ID_FIRST == 0); - G_STATIC_ASSERT_EXPR (_NM_ETHTOOL_ID_LAST == _NM_ETHTOOL_ID_NUM - 1); - G_STATIC_ASSERT_EXPR (_NM_ETHTOOL_ID_NUM > 0); + G_STATIC_ASSERT_EXPR(_NM_ETHTOOL_ID_FIRST == 0); + G_STATIC_ASSERT_EXPR(_NM_ETHTOOL_ID_LAST == _NM_ETHTOOL_ID_NUM - 1); + G_STATIC_ASSERT_EXPR(_NM_ETHTOOL_ID_NUM > 0); - nm_assert (NM_PTRARRAY_LEN (nm_ethtool_data) == _NM_ETHTOOL_ID_NUM); - nm_assert (G_N_ELEMENTS (_by_name) == _NM_ETHTOOL_ID_NUM); - nm_assert (G_N_ELEMENTS (nm_ethtool_data) == _NM_ETHTOOL_ID_NUM + 1); + nm_assert(NM_PTRARRAY_LEN(nm_ethtool_data) == _NM_ETHTOOL_ID_NUM); + nm_assert(G_N_ELEMENTS(_by_name) == _NM_ETHTOOL_ID_NUM); + nm_assert(G_N_ELEMENTS(nm_ethtool_data) == _NM_ETHTOOL_ID_NUM + 1); - for (i = 0; i < _NM_ETHTOOL_ID_NUM; i++) { - const NMEthtoolData *d = nm_ethtool_data[i]; + for (i = 0; i < _NM_ETHTOOL_ID_NUM; i++) { + const NMEthtoolData *d = nm_ethtool_data[i]; - nm_assert (d); - nm_assert (d->id == (NMEthtoolID) i); - nm_assert (d->optname && d->optname[0]); - } + nm_assert(d); + nm_assert(d->id == (NMEthtoolID) i); + nm_assert(d->optname && d->optname[0]); + } - for (i = 0; i < _NM_ETHTOOL_ID_NUM; i++) { - NMEthtoolID id = _by_name[i]; - const NMEthtoolData *d; + for (i = 0; i < _NM_ETHTOOL_ID_NUM; i++) { + NMEthtoolID id = _by_name[i]; + const NMEthtoolData *d; - nm_assert (id >= 0); - nm_assert (id < _NM_ETHTOOL_ID_NUM); + nm_assert(id >= 0); + nm_assert(id < _NM_ETHTOOL_ID_NUM); - d = nm_ethtool_data[id]; - if (i > 0) { - /* since we assert that all optnames are sorted strictly monotonically increasing, - * it also follows that there are no duplicates in the _by_name. - * It also follows, that all names in nm_ethtool_data are unique. */ - if (strcmp (nm_ethtool_data[_by_name[i - 1]]->optname, d->optname) >= 0) { - g_error ("nm_ethtool_data is not sorted asciibetically: %u/%s should be after %u/%s", - i - 1, nm_ethtool_data[_by_name[i - 1]]->optname, - i, d->optname); - } - } - } + d = nm_ethtool_data[id]; + if (i > 0) { + /* since we assert that all optnames are sorted strictly monotonically increasing, + * it also follows that there are no duplicates in the _by_name. + * It also follows, that all names in nm_ethtool_data are unique. */ + if (strcmp(nm_ethtool_data[_by_name[i - 1]]->optname, d->optname) >= 0) { + g_error("nm_ethtool_data is not sorted asciibetically: %u/%s should be after %u/%s", + i - 1, + nm_ethtool_data[_by_name[i - 1]]->optname, + i, + d->optname); + } + } + } } static int -_by_name_cmp (gconstpointer a, - gconstpointer b, - gpointer user_data) +_by_name_cmp(gconstpointer a, gconstpointer b, gpointer user_data) { - const guint8 *p_id = a; - const char *optname = b; + const guint8 *p_id = a; + const char * optname = b; - nm_assert (p_id && p_id >= _by_name && p_id <= &_by_name[_NM_ETHTOOL_ID_NUM]); - nm_assert (*p_id < _NM_ETHTOOL_ID_NUM); + nm_assert(p_id && p_id >= _by_name && p_id <= &_by_name[_NM_ETHTOOL_ID_NUM]); + nm_assert(*p_id < _NM_ETHTOOL_ID_NUM); - return strcmp (nm_ethtool_data[*p_id]->optname, optname); + return strcmp(nm_ethtool_data[*p_id]->optname, optname); } const NMEthtoolData * -nm_ethtool_data_get_by_optname (const char *optname) +nm_ethtool_data_get_by_optname(const char *optname) { - gssize idx; + gssize idx; - if (!optname) - return NULL; + if (!optname) + return NULL; - _ASSERT_data (); + _ASSERT_data(); - idx = nm_utils_array_find_binary_search ((gconstpointer *) _by_name, - sizeof (_by_name[0]), - _NM_ETHTOOL_ID_NUM, - optname, - _by_name_cmp, - NULL); - return (idx < 0) ? NULL : nm_ethtool_data[_by_name[idx]]; + idx = nm_utils_array_find_binary_search((gconstpointer *) _by_name, + sizeof(_by_name[0]), + _NM_ETHTOOL_ID_NUM, + optname, + _by_name_cmp, + NULL); + return (idx < 0) ? NULL : nm_ethtool_data[_by_name[idx]]; } NMEthtoolType -nm_ethtool_id_to_type (NMEthtoolID id) +nm_ethtool_id_to_type(NMEthtoolID id) { - if (nm_ethtool_id_is_coalesce (id)) - return NM_ETHTOOL_TYPE_COALESCE; - if (nm_ethtool_id_is_feature (id)) - return NM_ETHTOOL_TYPE_FEATURE; - if (nm_ethtool_id_is_ring (id)) - return NM_ETHTOOL_TYPE_RING; + if (nm_ethtool_id_is_coalesce(id)) + return NM_ETHTOOL_TYPE_COALESCE; + if (nm_ethtool_id_is_feature(id)) + return NM_ETHTOOL_TYPE_FEATURE; + if (nm_ethtool_id_is_ring(id)) + return NM_ETHTOOL_TYPE_RING; - return NM_ETHTOOL_TYPE_UNKNOWN; + return NM_ETHTOOL_TYPE_UNKNOWN; } diff --git a/libnm-core/nm-libnm-core-intern/nm-ethtool-utils.h b/libnm-core/nm-libnm-core-intern/nm-ethtool-utils.h index cf971edb..a11177e8 100644 --- a/libnm-core/nm-libnm-core-intern/nm-ethtool-utils.h +++ b/libnm-core/nm-libnm-core-intern/nm-ethtool-utils.h @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ /* * Copyright (C) 2018 Red Hat, Inc. */ @@ -9,153 +9,154 @@ /*****************************************************************************/ typedef enum { - NM_ETHTOOL_ID_UNKNOWN = -1, - - _NM_ETHTOOL_ID_FIRST = 0, - - _NM_ETHTOOL_ID_COALESCE_FIRST = _NM_ETHTOOL_ID_FIRST, - NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX = _NM_ETHTOOL_ID_COALESCE_FIRST, - NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX, - NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH, - NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW, - NM_ETHTOOL_ID_COALESCE_RX_FRAMES, - NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH, - NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ, - NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW, - NM_ETHTOOL_ID_COALESCE_RX_USECS, - NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH, - NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ, - NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW, - NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL, - NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS, - NM_ETHTOOL_ID_COALESCE_TX_FRAMES, - NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH, - NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ, - NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW, - NM_ETHTOOL_ID_COALESCE_TX_USECS, - NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH, - NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ, - NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW, - _NM_ETHTOOL_ID_COALESCE_LAST = NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW, - - _NM_ETHTOOL_ID_FEATURE_FIRST = _NM_ETHTOOL_ID_COALESCE_LAST + 1, - NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD = _NM_ETHTOOL_ID_FEATURE_FIRST, - NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_FCOE_MTU, - NM_ETHTOOL_ID_FEATURE_GRO, - NM_ETHTOOL_ID_FEATURE_GSO, - NM_ETHTOOL_ID_FEATURE_HIGHDMA, - NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_LOOPBACK, - NM_ETHTOOL_ID_FEATURE_LRO, - NM_ETHTOOL_ID_FEATURE_NTUPLE, - NM_ETHTOOL_ID_FEATURE_RX, - NM_ETHTOOL_ID_FEATURE_RXHASH, - NM_ETHTOOL_ID_FEATURE_RXVLAN, - NM_ETHTOOL_ID_FEATURE_RX_ALL, - NM_ETHTOOL_ID_FEATURE_RX_FCS, - NM_ETHTOOL_ID_FEATURE_RX_GRO_HW, - NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER, - NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER, - NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE, - NM_ETHTOOL_ID_FEATURE_SG, - NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD, - NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD, - NM_ETHTOOL_ID_FEATURE_TSO, - NM_ETHTOOL_ID_FEATURE_TX, - NM_ETHTOOL_ID_FEATURE_TXVLAN, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC, - NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP, - NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL, - NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST, - NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY, - NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER, - NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST, - NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION, - NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, - _NM_ETHTOOL_ID_FEATURE_LAST = NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, - - _NM_ETHTOOL_ID_RING_FIRST = _NM_ETHTOOL_ID_FEATURE_LAST + 1, - NM_ETHTOOL_ID_RING_RX = _NM_ETHTOOL_ID_RING_FIRST, - NM_ETHTOOL_ID_RING_RX_JUMBO, - NM_ETHTOOL_ID_RING_RX_MINI, - NM_ETHTOOL_ID_RING_TX, - _NM_ETHTOOL_ID_RING_LAST = NM_ETHTOOL_ID_RING_TX, - - _NM_ETHTOOL_ID_LAST = _NM_ETHTOOL_ID_RING_LAST, - - _NM_ETHTOOL_ID_COALESCE_NUM = (_NM_ETHTOOL_ID_COALESCE_LAST - _NM_ETHTOOL_ID_COALESCE_FIRST + 1), - _NM_ETHTOOL_ID_FEATURE_NUM = (_NM_ETHTOOL_ID_FEATURE_LAST - _NM_ETHTOOL_ID_FEATURE_FIRST + 1), - _NM_ETHTOOL_ID_RING_NUM = (_NM_ETHTOOL_ID_RING_LAST - _NM_ETHTOOL_ID_RING_FIRST + 1), - _NM_ETHTOOL_ID_NUM = (_NM_ETHTOOL_ID_LAST - _NM_ETHTOOL_ID_FIRST + 1), + NM_ETHTOOL_ID_UNKNOWN = -1, + + _NM_ETHTOOL_ID_FIRST = 0, + + _NM_ETHTOOL_ID_COALESCE_FIRST = _NM_ETHTOOL_ID_FIRST, + NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX = _NM_ETHTOOL_ID_COALESCE_FIRST, + NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX, + NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH, + NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ, + NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW, + NM_ETHTOOL_ID_COALESCE_RX_USECS, + NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH, + NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ, + NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW, + NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL, + NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ, + NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW, + NM_ETHTOOL_ID_COALESCE_TX_USECS, + NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH, + NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ, + NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW, + _NM_ETHTOOL_ID_COALESCE_LAST = NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW, + + _NM_ETHTOOL_ID_FEATURE_FIRST = _NM_ETHTOOL_ID_COALESCE_LAST + 1, + NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD = _NM_ETHTOOL_ID_FEATURE_FIRST, + NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_FCOE_MTU, + NM_ETHTOOL_ID_FEATURE_GRO, + NM_ETHTOOL_ID_FEATURE_GSO, + NM_ETHTOOL_ID_FEATURE_HIGHDMA, + NM_ETHTOOL_ID_FEATURE_HW_TC_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_L2_FWD_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_LOOPBACK, + NM_ETHTOOL_ID_FEATURE_LRO, + NM_ETHTOOL_ID_FEATURE_NTUPLE, + NM_ETHTOOL_ID_FEATURE_RX, + NM_ETHTOOL_ID_FEATURE_RXHASH, + NM_ETHTOOL_ID_FEATURE_RXVLAN, + NM_ETHTOOL_ID_FEATURE_RX_ALL, + NM_ETHTOOL_ID_FEATURE_RX_FCS, + NM_ETHTOOL_ID_FEATURE_RX_GRO_HW, + NM_ETHTOOL_ID_FEATURE_RX_UDP_TUNNEL_PORT_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_FILTER, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_FILTER, + NM_ETHTOOL_ID_FEATURE_RX_VLAN_STAG_HW_PARSE, + NM_ETHTOOL_ID_FEATURE_SG, + NM_ETHTOOL_ID_FEATURE_TLS_HW_RECORD, + NM_ETHTOOL_ID_FEATURE_TLS_HW_TX_OFFLOAD, + NM_ETHTOOL_ID_FEATURE_TSO, + NM_ETHTOOL_ID_FEATURE_TX, + NM_ETHTOOL_ID_FEATURE_TXVLAN, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_FCOE_CRC, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV4, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IPV6, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_IP_GENERIC, + NM_ETHTOOL_ID_FEATURE_TX_CHECKSUM_SCTP, + NM_ETHTOOL_ID_FEATURE_TX_ESP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_FCOE_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GRE_CSUM_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GRE_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_GSO_PARTIAL, + NM_ETHTOOL_ID_FEATURE_TX_GSO_ROBUST, + NM_ETHTOOL_ID_FEATURE_TX_IPXIP4_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_IPXIP6_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_NOCACHE_COPY, + NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER, + NM_ETHTOOL_ID_FEATURE_TX_SCATTER_GATHER_FRAGLIST, + NM_ETHTOOL_ID_FEATURE_TX_SCTP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_ECN_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_MANGLEID_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_TCP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION, + NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, + _NM_ETHTOOL_ID_FEATURE_LAST = NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT, + + _NM_ETHTOOL_ID_RING_FIRST = _NM_ETHTOOL_ID_FEATURE_LAST + 1, + NM_ETHTOOL_ID_RING_RX = _NM_ETHTOOL_ID_RING_FIRST, + NM_ETHTOOL_ID_RING_RX_JUMBO, + NM_ETHTOOL_ID_RING_RX_MINI, + NM_ETHTOOL_ID_RING_TX, + _NM_ETHTOOL_ID_RING_LAST = NM_ETHTOOL_ID_RING_TX, + + _NM_ETHTOOL_ID_LAST = _NM_ETHTOOL_ID_RING_LAST, + + _NM_ETHTOOL_ID_COALESCE_NUM = + (_NM_ETHTOOL_ID_COALESCE_LAST - _NM_ETHTOOL_ID_COALESCE_FIRST + 1), + _NM_ETHTOOL_ID_FEATURE_NUM = (_NM_ETHTOOL_ID_FEATURE_LAST - _NM_ETHTOOL_ID_FEATURE_FIRST + 1), + _NM_ETHTOOL_ID_RING_NUM = (_NM_ETHTOOL_ID_RING_LAST - _NM_ETHTOOL_ID_RING_FIRST + 1), + _NM_ETHTOOL_ID_NUM = (_NM_ETHTOOL_ID_LAST - _NM_ETHTOOL_ID_FIRST + 1), } NMEthtoolID; -#define _NM_ETHTOOL_ID_FEATURE_AS_IDX(ethtool_id) ((ethtool_id) - _NM_ETHTOOL_ID_FEATURE_FIRST) -#define _NM_ETHTOOL_ID_COALESCE_AS_IDX(ethtool_id) ((ethtool_id) - _NM_ETHTOOL_ID_COALESCE_FIRST) +#define _NM_ETHTOOL_ID_FEATURE_AS_IDX(ethtool_id) ((ethtool_id) -_NM_ETHTOOL_ID_FEATURE_FIRST) +#define _NM_ETHTOOL_ID_COALESCE_AS_IDX(ethtool_id) ((ethtool_id) -_NM_ETHTOOL_ID_COALESCE_FIRST) typedef enum { - NM_ETHTOOL_TYPE_UNKNOWN, - NM_ETHTOOL_TYPE_COALESCE, - NM_ETHTOOL_TYPE_FEATURE, - NM_ETHTOOL_TYPE_RING, + NM_ETHTOOL_TYPE_UNKNOWN, + NM_ETHTOOL_TYPE_COALESCE, + NM_ETHTOOL_TYPE_FEATURE, + NM_ETHTOOL_TYPE_RING, } NMEthtoolType; typedef struct { - const char *optname; - NMEthtoolID id; + const char *optname; + NMEthtoolID id; } NMEthtoolData; extern const NMEthtoolData *const nm_ethtool_data[_NM_ETHTOOL_ID_NUM + 1]; -const NMEthtoolData *nm_ethtool_data_get_by_optname (const char *optname); +const NMEthtoolData *nm_ethtool_data_get_by_optname(const char *optname); -NMEthtoolType nm_ethtool_id_to_type (NMEthtoolID id); +NMEthtoolType nm_ethtool_id_to_type(NMEthtoolID id); /****************************************************************************/ static inline NMEthtoolID -nm_ethtool_id_get_by_name (const char *optname) +nm_ethtool_id_get_by_name(const char *optname) { - const NMEthtoolData *d; + const NMEthtoolData *d; - d = nm_ethtool_data_get_by_optname (optname); - return d ? d->id : NM_ETHTOOL_ID_UNKNOWN; + d = nm_ethtool_data_get_by_optname(optname); + return d ? d->id : NM_ETHTOOL_ID_UNKNOWN; } static inline gboolean -nm_ethtool_id_is_feature (NMEthtoolID id) +nm_ethtool_id_is_feature(NMEthtoolID id) { - return id >= _NM_ETHTOOL_ID_FEATURE_FIRST && id <= _NM_ETHTOOL_ID_FEATURE_LAST; + return id >= _NM_ETHTOOL_ID_FEATURE_FIRST && id <= _NM_ETHTOOL_ID_FEATURE_LAST; } static inline gboolean -nm_ethtool_id_is_coalesce (NMEthtoolID id) +nm_ethtool_id_is_coalesce(NMEthtoolID id) { - return id >= _NM_ETHTOOL_ID_COALESCE_FIRST && id <= _NM_ETHTOOL_ID_COALESCE_LAST; + return id >= _NM_ETHTOOL_ID_COALESCE_FIRST && id <= _NM_ETHTOOL_ID_COALESCE_LAST; } static inline gboolean -nm_ethtool_id_is_ring (NMEthtoolID id) +nm_ethtool_id_is_ring(NMEthtoolID id) { - return id >= _NM_ETHTOOL_ID_RING_FIRST && id <= _NM_ETHTOOL_ID_RING_LAST; + return id >= _NM_ETHTOOL_ID_RING_FIRST && id <= _NM_ETHTOOL_ID_RING_LAST; } /****************************************************************************/ diff --git a/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c b/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c index f2c85cc6..65cd8ba5 100644 --- a/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c +++ b/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c @@ -1,259 +1,345 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ #include "nm-default.h" #include "nm-libnm-core-utils.h" -#include "nm-common-macros.h" - #include <linux/rtnetlink.h> +#include "nm-common-macros.h" +#include "nm-errors.h" + /*****************************************************************************/ const char ** -nm_utils_bond_option_arp_ip_targets_split (const char *arp_ip_target) +nm_utils_bond_option_arp_ip_targets_split(const char *arp_ip_target) { - return nm_utils_strsplit_set_full (arp_ip_target, ",", NM_UTILS_STRSPLIT_SET_FLAGS_STRSTRIP); + return nm_utils_strsplit_set_full(arp_ip_target, ",", NM_UTILS_STRSPLIT_SET_FLAGS_STRSTRIP); } void -_nm_setting_bond_remove_options_miimon (NMSettingBond *s_bond) +_nm_setting_bond_remove_options_miimon(NMSettingBond *s_bond) { - g_return_if_fail (NM_IS_SETTING_BOND (s_bond)); + g_return_if_fail(NM_IS_SETTING_BOND(s_bond)); - nm_setting_bond_remove_option (s_bond, NM_SETTING_BOND_OPTION_MIIMON); - nm_setting_bond_remove_option (s_bond, NM_SETTING_BOND_OPTION_UPDELAY); - nm_setting_bond_remove_option (s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY); + nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_MIIMON); + nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_UPDELAY); + nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY); } void -_nm_setting_bond_remove_options_arp_interval (NMSettingBond *s_bond) +_nm_setting_bond_remove_options_arp_interval(NMSettingBond *s_bond) { - g_return_if_fail (NM_IS_SETTING_BOND (s_bond)); + g_return_if_fail(NM_IS_SETTING_BOND(s_bond)); - nm_setting_bond_remove_option (s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL); - nm_setting_bond_remove_option (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); + nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL); + nm_setting_bond_remove_option(s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); } -NM_UTILS_STRING_TABLE_LOOKUP_DEFINE ( - _nm_setting_bond_mode_from_string, - NMBondMode, - { g_return_val_if_fail (name, NM_BOND_MODE_UNKNOWN); }, - { return NM_BOND_MODE_UNKNOWN; }, - { "0", NM_BOND_MODE_ROUNDROBIN }, - { "1", NM_BOND_MODE_ACTIVEBACKUP }, - { "2", NM_BOND_MODE_XOR }, - { "3", NM_BOND_MODE_BROADCAST }, - { "4", NM_BOND_MODE_8023AD }, - { "5", NM_BOND_MODE_TLB }, - { "6", NM_BOND_MODE_ALB }, - { "802.3ad", NM_BOND_MODE_8023AD }, - { "active-backup", NM_BOND_MODE_ACTIVEBACKUP }, - { "balance-alb", NM_BOND_MODE_ALB }, - { "balance-rr", NM_BOND_MODE_ROUNDROBIN }, - { "balance-tlb", NM_BOND_MODE_TLB }, - { "balance-xor", NM_BOND_MODE_XOR }, - { "broadcast", NM_BOND_MODE_BROADCAST }, -); +NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( + _nm_setting_bond_mode_from_string, + NMBondMode, + { g_return_val_if_fail(name, NM_BOND_MODE_UNKNOWN); }, + { return NM_BOND_MODE_UNKNOWN; }, + {"0", NM_BOND_MODE_ROUNDROBIN}, + {"1", NM_BOND_MODE_ACTIVEBACKUP}, + {"2", NM_BOND_MODE_XOR}, + {"3", NM_BOND_MODE_BROADCAST}, + {"4", NM_BOND_MODE_8023AD}, + {"5", NM_BOND_MODE_TLB}, + {"6", NM_BOND_MODE_ALB}, + {"802.3ad", NM_BOND_MODE_8023AD}, + {"active-backup", NM_BOND_MODE_ACTIVEBACKUP}, + {"balance-alb", NM_BOND_MODE_ALB}, + {"balance-rr", NM_BOND_MODE_ROUNDROBIN}, + {"balance-tlb", NM_BOND_MODE_TLB}, + {"balance-xor", NM_BOND_MODE_XOR}, + {"broadcast", NM_BOND_MODE_BROADCAST}, ); /*****************************************************************************/ gboolean -nm_utils_vlan_priority_map_parse_str (NMVlanPriorityMap map_type, - const char *str, - gboolean allow_wildcard_to, - guint32 *out_from, - guint32 *out_to, - gboolean *out_has_wildcard_to) +nm_utils_vlan_priority_map_parse_str(NMVlanPriorityMap map_type, + const char * str, + gboolean allow_wildcard_to, + guint32 * out_from, + guint32 * out_to, + gboolean * out_has_wildcard_to) { - const char *s2; - gint64 v1, v2; - - nm_assert (str); - - s2 = strchr (str, ':'); - - if (!s2) { - if (!allow_wildcard_to) - return FALSE; - v1 = _nm_utils_ascii_str_to_int64 (str, 10, 0, G_MAXUINT32, -1); - v2 = -1; - } else { - gs_free char *s1_free = NULL; - gsize s1_len = (s2 - str); - - s2 = nm_str_skip_leading_spaces (&s2[1]); - if ( s2[0] == '\0' - || ( s2[0] == '*' - && NM_STRCHAR_ALL (&s2[1], ch, g_ascii_isspace (ch)))) { - if (!allow_wildcard_to) - return FALSE; - v2 = -1; - } else { - v2 = _nm_utils_ascii_str_to_int64 (s2, 10, 0, G_MAXUINT32, -1); - if ( v2 < 0 - || (guint32) v2 > nm_utils_vlan_priority_map_get_max_prio (map_type, FALSE)) - return FALSE; - } - - v1 = _nm_utils_ascii_str_to_int64 (nm_strndup_a (100, str, s1_len, &s1_free), - 10, 0, G_MAXUINT32, -1); - } - - if ( v1 < 0 - || (guint32) v1 > nm_utils_vlan_priority_map_get_max_prio (map_type, TRUE)) - return FALSE; - - NM_SET_OUT (out_from, v1); - NM_SET_OUT (out_to, v2 < 0 - ? 0u - : (guint) v2); - NM_SET_OUT (out_has_wildcard_to, v2 < 0); - return TRUE; + const char *s2; + gint64 v1, v2; + + nm_assert(str); + + s2 = strchr(str, ':'); + + if (!s2) { + if (!allow_wildcard_to) + return FALSE; + v1 = _nm_utils_ascii_str_to_int64(str, 10, 0, G_MAXUINT32, -1); + v2 = -1; + } else { + gs_free char *s1_free = NULL; + gsize s1_len = (s2 - str); + + s2 = nm_str_skip_leading_spaces(&s2[1]); + if (s2[0] == '\0' || (s2[0] == '*' && NM_STRCHAR_ALL(&s2[1], ch, g_ascii_isspace(ch)))) { + if (!allow_wildcard_to) + return FALSE; + v2 = -1; + } else { + v2 = _nm_utils_ascii_str_to_int64(s2, 10, 0, G_MAXUINT32, -1); + if (v2 < 0 || (guint32) v2 > nm_utils_vlan_priority_map_get_max_prio(map_type, FALSE)) + return FALSE; + } + + v1 = _nm_utils_ascii_str_to_int64(nm_strndup_a(100, str, s1_len, &s1_free), + 10, + 0, + G_MAXUINT32, + -1); + } + + if (v1 < 0 || (guint32) v1 > nm_utils_vlan_priority_map_get_max_prio(map_type, TRUE)) + return FALSE; + + NM_SET_OUT(out_from, v1); + NM_SET_OUT(out_to, v2 < 0 ? 0u : (guint) v2); + NM_SET_OUT(out_has_wildcard_to, v2 < 0); + return TRUE; } /*****************************************************************************/ const char *const nm_auth_permission_names_by_idx[NM_CLIENT_PERMISSION_LAST] = { - [NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK - 1] = NM_AUTH_PERMISSION_CHECKPOINT_ROLLBACK, - [NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK, - [NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK, - [NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_STATISTICS, - [NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI, - [NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX, - [NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN, - [NM_CLIENT_PERMISSION_NETWORK_CONTROL - 1] = NM_AUTH_PERMISSION_NETWORK_CONTROL, - [NM_CLIENT_PERMISSION_RELOAD - 1] = NM_AUTH_PERMISSION_RELOAD, - [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS, - [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME, - [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN, - [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM, - [NM_CLIENT_PERMISSION_SLEEP_WAKE - 1] = NM_AUTH_PERMISSION_SLEEP_WAKE, - [NM_CLIENT_PERMISSION_WIFI_SCAN - 1] = NM_AUTH_PERMISSION_WIFI_SCAN, - [NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN - 1] = NM_AUTH_PERMISSION_WIFI_SHARE_OPEN, - [NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED - 1] = NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED, + [NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK - 1] = NM_AUTH_PERMISSION_CHECKPOINT_ROLLBACK, + [NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK - 1] = + NM_AUTH_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK, + [NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK, + [NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS - 1] = + NM_AUTH_PERMISSION_ENABLE_DISABLE_STATISTICS, + [NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI, + [NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX, + [NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN - 1] = NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN, + [NM_CLIENT_PERMISSION_NETWORK_CONTROL - 1] = NM_AUTH_PERMISSION_NETWORK_CONTROL, + [NM_CLIENT_PERMISSION_RELOAD - 1] = NM_AUTH_PERMISSION_RELOAD, + [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS - 1] = + NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS, + [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME - 1] = + NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME, + [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN, + [NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM - 1] = NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM, + [NM_CLIENT_PERMISSION_SLEEP_WAKE - 1] = NM_AUTH_PERMISSION_SLEEP_WAKE, + [NM_CLIENT_PERMISSION_WIFI_SCAN - 1] = NM_AUTH_PERMISSION_WIFI_SCAN, + [NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN - 1] = NM_AUTH_PERMISSION_WIFI_SHARE_OPEN, + [NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED - 1] = NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED, }; const NMClientPermission nm_auth_permission_sorted[NM_CLIENT_PERMISSION_LAST] = { - NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX, - NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN, - NM_CLIENT_PERMISSION_NETWORK_CONTROL, - NM_CLIENT_PERMISSION_RELOAD, - NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS, - NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME, - NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN, - NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM, - NM_CLIENT_PERMISSION_SLEEP_WAKE, - NM_CLIENT_PERMISSION_WIFI_SCAN, - NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN, - NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED, + NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK, + NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK, + NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK, + NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS, + NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI, + NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX, + NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN, + NM_CLIENT_PERMISSION_NETWORK_CONTROL, + NM_CLIENT_PERMISSION_RELOAD, + NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS, + NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME, + NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN, + NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM, + NM_CLIENT_PERMISSION_SLEEP_WAKE, + NM_CLIENT_PERMISSION_WIFI_SCAN, + NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN, + NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED, }; const char * -nm_auth_permission_to_string (NMClientPermission permission) +nm_auth_permission_to_string(NMClientPermission permission) { - if (permission < 1) - return NULL; - if (permission > NM_CLIENT_PERMISSION_LAST) - return NULL; - return nm_auth_permission_names_by_idx[permission - 1]; + if (permission < 1) + return NULL; + if (permission > NM_CLIENT_PERMISSION_LAST) + return NULL; + return nm_auth_permission_names_by_idx[permission - 1]; } #define AUTH_PERMISSION_PREFIX "org.freedesktop.NetworkManager." static int -_nm_auth_permission_from_string_cmp (gconstpointer a, gconstpointer b, gpointer user_data) +_nm_auth_permission_from_string_cmp(gconstpointer a, gconstpointer b, gpointer user_data) { - const NMClientPermission *const p = a; - const char *const needle = b; - const char *ss = nm_auth_permission_names_by_idx[*p - 1]; + const NMClientPermission *const p = a; + const char *const needle = b; + const char * ss = nm_auth_permission_names_by_idx[*p - 1]; - nm_assert (NM_STR_HAS_PREFIX (ss, AUTH_PERMISSION_PREFIX)); - nm_assert (ss[NM_STRLEN (AUTH_PERMISSION_PREFIX)] != '\0'); + nm_assert(NM_STR_HAS_PREFIX(ss, AUTH_PERMISSION_PREFIX)); + nm_assert(ss[NM_STRLEN(AUTH_PERMISSION_PREFIX)] != '\0'); - return strcmp (&ss[NM_STRLEN (AUTH_PERMISSION_PREFIX)], needle); + return strcmp(&ss[NM_STRLEN(AUTH_PERMISSION_PREFIX)], needle); } NMClientPermission -nm_auth_permission_from_string (const char *str) +nm_auth_permission_from_string(const char *str) { - gssize idx; - - if (!str) - return NM_CLIENT_PERMISSION_NONE; - - if (!NM_STR_HAS_PREFIX (str, AUTH_PERMISSION_PREFIX)) - return NM_CLIENT_PERMISSION_NONE; - idx = nm_utils_array_find_binary_search (nm_auth_permission_sorted, - sizeof (nm_auth_permission_sorted[0]), - G_N_ELEMENTS (nm_auth_permission_sorted), - &str[NM_STRLEN (AUTH_PERMISSION_PREFIX)], - _nm_auth_permission_from_string_cmp, - NULL); - if (idx < 0) - return NM_CLIENT_PERMISSION_NONE; - return nm_auth_permission_sorted[idx]; + gssize idx; + + if (!str) + return NM_CLIENT_PERMISSION_NONE; + + if (!NM_STR_HAS_PREFIX(str, AUTH_PERMISSION_PREFIX)) + return NM_CLIENT_PERMISSION_NONE; + idx = nm_utils_array_find_binary_search(nm_auth_permission_sorted, + sizeof(nm_auth_permission_sorted[0]), + G_N_ELEMENTS(nm_auth_permission_sorted), + &str[NM_STRLEN(AUTH_PERMISSION_PREFIX)], + _nm_auth_permission_from_string_cmp, + NULL); + if (idx < 0) + return NM_CLIENT_PERMISSION_NONE; + return nm_auth_permission_sorted[idx]; } /*****************************************************************************/ NMClientPermissionResult -nm_client_permission_result_from_string (const char *nm) +nm_client_permission_result_from_string(const char *nm) { - if (!nm) - return NM_CLIENT_PERMISSION_RESULT_UNKNOWN; - if (nm_streq (nm, "yes")) - return NM_CLIENT_PERMISSION_RESULT_YES; - if (nm_streq (nm, "no")) - return NM_CLIENT_PERMISSION_RESULT_NO; - if (nm_streq (nm, "auth")) - return NM_CLIENT_PERMISSION_RESULT_AUTH; - return NM_CLIENT_PERMISSION_RESULT_UNKNOWN; + if (!nm) + return NM_CLIENT_PERMISSION_RESULT_UNKNOWN; + if (nm_streq(nm, "yes")) + return NM_CLIENT_PERMISSION_RESULT_YES; + if (nm_streq(nm, "no")) + return NM_CLIENT_PERMISSION_RESULT_NO; + if (nm_streq(nm, "auth")) + return NM_CLIENT_PERMISSION_RESULT_AUTH; + return NM_CLIENT_PERMISSION_RESULT_UNKNOWN; } const char * -nm_client_permission_result_to_string (NMClientPermissionResult permission) +nm_client_permission_result_to_string(NMClientPermissionResult permission) +{ + switch (permission) { + case NM_CLIENT_PERMISSION_RESULT_YES: + return "yes"; + case NM_CLIENT_PERMISSION_RESULT_NO: + return "no"; + case NM_CLIENT_PERMISSION_RESULT_AUTH: + return "auth"; + case NM_CLIENT_PERMISSION_RESULT_UNKNOWN: + return "unknown"; + } + nm_assert_not_reached(); + return NULL; +} + +NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( + nm_utils_route_type_by_name, + guint8, + { nm_assert(name); }, + { return RTN_UNSPEC; }, + {"blackhole", RTN_BLACKHOLE}, + {"broadcast", RTN_BROADCAST}, + {"local", RTN_LOCAL}, + {"multicast", RTN_MULTICAST}, + {"nat", RTN_NAT}, + {"prohibit", RTN_PROHIBIT}, + {"throw", RTN_THROW}, + {"unicast", RTN_UNICAST}, + {"unreachable", RTN_UNREACHABLE}, ); + +NM_UTILS_ENUM2STR_DEFINE(nm_utils_route_type2str, + guint8, + NM_UTILS_ENUM2STR(RTN_BLACKHOLE, "blackhole"), + NM_UTILS_ENUM2STR(RTN_BROADCAST, "broadcast"), + NM_UTILS_ENUM2STR(RTN_LOCAL, "local"), + NM_UTILS_ENUM2STR(RTN_MULTICAST, "multicast"), + NM_UTILS_ENUM2STR(RTN_NAT, "nat"), + NM_UTILS_ENUM2STR(RTN_PROHIBIT, "prohibit"), + NM_UTILS_ENUM2STR(RTN_THROW, "throw"), + NM_UTILS_ENUM2STR(RTN_UNICAST, "unicast"), + NM_UTILS_ENUM2STR(RTN_UNREACHABLE, "unreachable"), + NM_UTILS_ENUM2STR(RTN_UNSPEC, "unspecified"), ); + +gboolean +nm_utils_validate_dhcp4_vendor_class_id(const char *vci, GError **error) { - switch (permission) { - case NM_CLIENT_PERMISSION_RESULT_YES: return "yes"; - case NM_CLIENT_PERMISSION_RESULT_NO: return "no"; - case NM_CLIENT_PERMISSION_RESULT_AUTH: return "auth"; - case NM_CLIENT_PERMISSION_RESULT_UNKNOWN: return "unknown"; - } - nm_assert_not_reached (); - return NULL; + const char * bin; + gsize unescaped_len; + gs_free char *to_free = NULL; + + g_return_val_if_fail(!error || !(*error), FALSE); + g_return_val_if_fail(vci, FALSE); + + if (vci[0] == '\0') { + g_set_error_literal(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("property cannot be an empty string")); + g_prefix_error(error, + "%s.%s: ", + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER); + return FALSE; + } + + bin = nm_utils_buf_utf8safe_unescape(vci, + NM_UTILS_STR_UTF8_SAFE_FLAG_NONE, + &unescaped_len, + (gpointer *) &to_free); + /* a DHCP option cannot be longer than 255 bytes */ + if (unescaped_len > 255) { + g_set_error_literal(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("property cannot be longer than 255 bytes")); + g_prefix_error(error, + "%s.%s: ", + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER); + return FALSE; + } + if (strlen(bin) != unescaped_len) { + g_set_error_literal(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("property cannot contain any nul bytes")); + g_prefix_error(error, + "%s.%s: ", + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER); + return FALSE; + } + + return TRUE; } -NM_UTILS_STRING_TABLE_LOOKUP_DEFINE ( - nm_utils_route_type_by_name, - guint8, - { nm_assert (name); }, - { return RTN_UNSPEC; }, - { "blackhole", RTN_BLACKHOLE }, - { "broadcast", RTN_BROADCAST }, - { "local", RTN_LOCAL }, - { "multicast", RTN_MULTICAST }, - { "nat", RTN_NAT }, - { "prohibit", RTN_PROHIBIT }, - { "throw", RTN_THROW }, - { "unicast", RTN_UNICAST }, - { "unreachable", RTN_UNREACHABLE }, -); - -NM_UTILS_ENUM2STR_DEFINE (nm_utils_route_type2str, guint8, - NM_UTILS_ENUM2STR (RTN_BLACKHOLE, "blackhole"), - NM_UTILS_ENUM2STR (RTN_BROADCAST, "broadcast"), - NM_UTILS_ENUM2STR (RTN_LOCAL, "local"), - NM_UTILS_ENUM2STR (RTN_MULTICAST, "multicast"), - NM_UTILS_ENUM2STR (RTN_NAT, "nat"), - NM_UTILS_ENUM2STR (RTN_PROHIBIT, "prohibit"), - NM_UTILS_ENUM2STR (RTN_THROW, "throw"), - NM_UTILS_ENUM2STR (RTN_UNICAST, "unicast"), - NM_UTILS_ENUM2STR (RTN_UNREACHABLE, "unreachable"), - NM_UTILS_ENUM2STR (RTN_UNSPEC, "unspecified"), -); +gboolean +nm_settings_connection_validate_permission_user(const char *item, gssize len) +{ + gsize l; + + if (!item) + return FALSE; + + if (len < 0) { + nm_assert(len == -1); + l = strlen(item); + } else + l = (gsize) len; + + if (l == 0) + return FALSE; + + if (!g_utf8_validate(item, l, NULL)) + return FALSE; + + if (l >= 100) + return FALSE; + + if (memchr(item, ':', l)) + return FALSE; + + return TRUE; +} diff --git a/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h b/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h index bb3fa5fc..5d672fed 100644 --- a/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h +++ b/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ #ifndef __NM_LIBNM_SHARED_UTILS_H__ #define __NM_LIBNM_SHARED_UTILS_H__ @@ -18,89 +18,89 @@ /****************************************************************************/ -#define nm_auto_unref_ip_address nm_auto (_nm_ip_address_unref) -NM_AUTO_DEFINE_FCN0 (NMIPAddress *, _nm_ip_address_unref, nm_ip_address_unref) +#define nm_auto_unref_ip_address nm_auto(_nm_ip_address_unref) +NM_AUTO_DEFINE_FCN0(NMIPAddress *, _nm_ip_address_unref, nm_ip_address_unref); -#define nm_auto_unref_ip_route nm_auto (_nm_auto_unref_ip_route) -NM_AUTO_DEFINE_FCN0 (NMIPRoute *, _nm_auto_unref_ip_route, nm_ip_route_unref) +#define nm_auto_unref_ip_route nm_auto(_nm_auto_unref_ip_route) +NM_AUTO_DEFINE_FCN0(NMIPRoute *, _nm_auto_unref_ip_route, nm_ip_route_unref); #define nm_auto_unref_ip_routing_rule nm_auto(_nm_auto_unref_ip_routing_rule) -NM_AUTO_DEFINE_FCN0 (NMIPRoutingRule *, _nm_auto_unref_ip_routing_rule, nm_ip_routing_rule_unref) +NM_AUTO_DEFINE_FCN0(NMIPRoutingRule *, _nm_auto_unref_ip_routing_rule, nm_ip_routing_rule_unref); -#define nm_auto_unref_sriov_vf nm_auto (_nm_auto_unref_sriov_vf) -NM_AUTO_DEFINE_FCN0 (NMSriovVF *, _nm_auto_unref_sriov_vf, nm_sriov_vf_unref) +#define nm_auto_unref_sriov_vf nm_auto(_nm_auto_unref_sriov_vf) +NM_AUTO_DEFINE_FCN0(NMSriovVF *, _nm_auto_unref_sriov_vf, nm_sriov_vf_unref); -#define nm_auto_unref_tc_qdisc nm_auto (_nm_auto_unref_tc_qdisc) -NM_AUTO_DEFINE_FCN0 (NMTCQdisc *, _nm_auto_unref_tc_qdisc, nm_tc_qdisc_unref) +#define nm_auto_unref_tc_qdisc nm_auto(_nm_auto_unref_tc_qdisc) +NM_AUTO_DEFINE_FCN0(NMTCQdisc *, _nm_auto_unref_tc_qdisc, nm_tc_qdisc_unref); -#define nm_auto_unref_tc_tfilter nm_auto (_nm_auto_unref_tc_tfilter) -NM_AUTO_DEFINE_FCN0 (NMTCTfilter *, _nm_auto_unref_tc_tfilter, nm_tc_tfilter_unref) +#define nm_auto_unref_tc_tfilter nm_auto(_nm_auto_unref_tc_tfilter) +NM_AUTO_DEFINE_FCN0(NMTCTfilter *, _nm_auto_unref_tc_tfilter, nm_tc_tfilter_unref); -#define nm_auto_unref_bridge_vlan nm_auto (_nm_auto_unref_bridge_vlan) -NM_AUTO_DEFINE_FCN0 (NMBridgeVlan *, _nm_auto_unref_bridge_vlan, nm_bridge_vlan_unref) +#define nm_auto_unref_bridge_vlan nm_auto(_nm_auto_unref_bridge_vlan) +NM_AUTO_DEFINE_FCN0(NMBridgeVlan *, _nm_auto_unref_bridge_vlan, nm_bridge_vlan_unref); -#define nm_auto_unref_team_link_watcher nm_auto (_nm_auto_unref_team_link_watcher) -NM_AUTO_DEFINE_FCN0 (NMTeamLinkWatcher *, _nm_auto_unref_team_link_watcher, nm_team_link_watcher_unref) +#define nm_auto_unref_team_link_watcher nm_auto(_nm_auto_unref_team_link_watcher) +NM_AUTO_DEFINE_FCN0(NMTeamLinkWatcher *, + _nm_auto_unref_team_link_watcher, + nm_team_link_watcher_unref); -#define nm_auto_unref_wgpeer nm_auto (_nm_auto_unref_wgpeer) -NM_AUTO_DEFINE_FCN0 (NMWireGuardPeer *, _nm_auto_unref_wgpeer, nm_wireguard_peer_unref) +#define nm_auto_unref_wgpeer nm_auto(_nm_auto_unref_wgpeer) +NM_AUTO_DEFINE_FCN0(NMWireGuardPeer *, _nm_auto_unref_wgpeer, nm_wireguard_peer_unref); /****************************************************************************/ -const char **nm_utils_bond_option_arp_ip_targets_split (const char *arp_ip_target); +const char **nm_utils_bond_option_arp_ip_targets_split(const char *arp_ip_target); -void _nm_setting_bond_remove_options_miimon (NMSettingBond *s_bond); -void _nm_setting_bond_remove_options_arp_interval (NMSettingBond *s_bond); +void _nm_setting_bond_remove_options_miimon(NMSettingBond *s_bond); +void _nm_setting_bond_remove_options_arp_interval(NMSettingBond *s_bond); typedef enum { - NM_BOND_MODE_UNKNOWN = -1, - - /* The numeric values correspond to kernel's numbering of the modes. */ - NM_BOND_MODE_ROUNDROBIN = 0, - NM_BOND_MODE_ACTIVEBACKUP = 1, - NM_BOND_MODE_XOR = 2, - NM_BOND_MODE_BROADCAST = 3, - NM_BOND_MODE_8023AD = 4, - NM_BOND_MODE_TLB = 5, - NM_BOND_MODE_ALB = 6, - _NM_BOND_MODE_NUM, + NM_BOND_MODE_UNKNOWN = -1, + + /* The numeric values correspond to kernel's numbering of the modes. */ + NM_BOND_MODE_ROUNDROBIN = 0, + NM_BOND_MODE_ACTIVEBACKUP = 1, + NM_BOND_MODE_XOR = 2, + NM_BOND_MODE_BROADCAST = 3, + NM_BOND_MODE_8023AD = 4, + NM_BOND_MODE_TLB = 5, + NM_BOND_MODE_ALB = 6, + _NM_BOND_MODE_NUM, } NMBondMode; -NMBondMode _nm_setting_bond_mode_from_string (const char *str); +NMBondMode _nm_setting_bond_mode_from_string(const char *str); /*****************************************************************************/ static inline guint32 -nm_utils_vlan_priority_map_get_max_prio (NMVlanPriorityMap map, gboolean from) +nm_utils_vlan_priority_map_get_max_prio(NMVlanPriorityMap map, gboolean from) { - if (map == NM_VLAN_INGRESS_MAP) { - return from - ? 7u /* MAX_8021P_PRIO */ - : (guint32) G_MAXUINT32 /* MAX_SKB_PRIO */; - } - nm_assert (map == NM_VLAN_EGRESS_MAP); - return from - ? (guint32) G_MAXUINT32 /* MAX_SKB_PRIO */ - : 7u /* MAX_8021P_PRIO */; + if (map == NM_VLAN_INGRESS_MAP) { + return from ? 7u /* MAX_8021P_PRIO */ + : (guint32) G_MAXUINT32 /* MAX_SKB_PRIO */; + } + nm_assert(map == NM_VLAN_EGRESS_MAP); + return from ? (guint32) G_MAXUINT32 /* MAX_SKB_PRIO */ + : 7u /* MAX_8021P_PRIO */; } -gboolean nm_utils_vlan_priority_map_parse_str (NMVlanPriorityMap map_type, - const char *str, - gboolean allow_wildcard_to, - guint32 *out_from, - guint32 *out_to, - gboolean *out_has_wildcard_to); +gboolean nm_utils_vlan_priority_map_parse_str(NMVlanPriorityMap map_type, + const char * str, + gboolean allow_wildcard_to, + guint32 * out_from, + guint32 * out_to, + gboolean * out_has_wildcard_to); /*****************************************************************************/ static inline int -nm_setting_ip_config_get_addr_family (NMSettingIPConfig *s_ip) +nm_setting_ip_config_get_addr_family(NMSettingIPConfig *s_ip) { - if (NM_IS_SETTING_IP4_CONFIG (s_ip)) - return AF_INET; - if (NM_IS_SETTING_IP6_CONFIG (s_ip)) - return AF_INET6; - g_return_val_if_reached (AF_UNSPEC); + if (NM_IS_SETTING_IP4_CONFIG(s_ip)) + return AF_INET; + if (NM_IS_SETTING_IP6_CONFIG(s_ip)) + return AF_INET6; + g_return_val_if_reached(AF_UNSPEC); } /*****************************************************************************/ @@ -125,19 +125,28 @@ nm_setting_ip_config_get_addr_family (NMSettingIPConfig *s_ip) /*****************************************************************************/ -extern const char *const nm_auth_permission_names_by_idx[NM_CLIENT_PERMISSION_LAST]; +extern const char *const nm_auth_permission_names_by_idx[NM_CLIENT_PERMISSION_LAST]; extern const NMClientPermission nm_auth_permission_sorted[NM_CLIENT_PERMISSION_LAST]; -const char *nm_auth_permission_to_string (NMClientPermission permission); -NMClientPermission nm_auth_permission_from_string (const char *str); +const char * nm_auth_permission_to_string(NMClientPermission permission); +NMClientPermission nm_auth_permission_from_string(const char *str); /*****************************************************************************/ -NMClientPermissionResult nm_client_permission_result_from_string (const char *nm); -const char *nm_client_permission_result_to_string (NMClientPermissionResult permission); +NMClientPermissionResult nm_client_permission_result_from_string(const char *nm); +const char * nm_client_permission_result_to_string(NMClientPermissionResult permission); -guint8 nm_utils_route_type_by_name (const char *name); +guint8 nm_utils_route_type_by_name(const char *name); -const char *nm_utils_route_type2str (guint8 val, char *buf, gsize len); +const char *nm_utils_route_type2str(guint8 val, char *buf, gsize len); + +gboolean nm_utils_validate_dhcp4_vendor_class_id(const char *vci, GError **error); + +/*****************************************************************************/ + +#define NM_SETTINGS_CONNECTION_PERMISSION_USER "user" +#define NM_SETTINGS_CONNECTION_PERMISSION_USER_PREFIX "user:" + +gboolean nm_settings_connection_validate_permission_user(const char *item, gssize len); #endif /* __NM_LIBNM_SHARED_UTILS_H__ */ |