libnm-core: add action support to NMSettingTCConfig

The actions are not too useful my themselves, but it will be possible to
embed them into traffic filters in subsequent commits.

(cherry picked from commit 7c8ce778fb)
This commit is contained in:
Lubomir Rintel 2017-11-25 22:45:32 +01:00
parent f8da7febbc
commit fa8e896f94
3 changed files with 280 additions and 0 deletions

View file

@ -249,6 +249,241 @@ nm_tc_qdisc_get_parent (NMTCQdisc *qdisc)
/*****************************************************************************/
G_DEFINE_BOXED_TYPE (NMTCAction, nm_tc_action, nm_tc_action_dup, nm_tc_action_unref)
struct NMTCAction {
guint refcount;
char *kind;
GHashTable *attributes;
};
/**
* nm_tc_action_new:
* @kind: name of the queueing discipline
* @error: location to store error, or %NULL
*
* Creates a new #NMTCAction object.
*
* Returns: (transfer full): the new #NMTCAction object, or %NULL on error
*
* Since: 1.10.2
**/
NMTCAction *
nm_tc_action_new (const char *kind,
GError **error)
{
NMTCAction *action;
action = g_slice_new0 (NMTCAction);
action->refcount = 1;
action->kind = g_strdup (kind);
return action;
}
/**
* nm_tc_action_ref:
* @action: the #NMTCAction
*
* Increases the reference count of the object.
*
* Since: 1.10.2
**/
void
nm_tc_action_ref (NMTCAction *action)
{
g_return_if_fail (action != NULL);
g_return_if_fail (action->refcount > 0);
action->refcount++;
}
/**
* nm_tc_action_unref:
* @action: the #NMTCAction
*
* Decreases the reference count of the object. If the reference count
* reaches zero, the object will be destroyed.
*
* Since: 1.10.2
**/
void
nm_tc_action_unref (NMTCAction *action)
{
g_return_if_fail (action != NULL);
g_return_if_fail (action->refcount > 0);
action->refcount--;
if (action->refcount == 0) {
g_free (action->kind);
if (action->attributes)
g_hash_table_unref (action->attributes);
g_slice_free (NMTCAction, action);
}
}
/**
* nm_tc_action_equal:
* @action: the #NMTCAction
* @other: the #NMTCAction to compare @action to.
*
* Determines if two #NMTCAction objects contain the same kind, family,
* handle, parent and info.
*
* Returns: %TRUE if the objects contain the same values, %FALSE if they do not.
*
* Since: 1.10.2
**/
gboolean
nm_tc_action_equal (NMTCAction *action, NMTCAction *other)
{
if (action == NULL && other == NULL)
return TRUE;
if (action == NULL || other == NULL)
return FALSE;
g_return_val_if_fail (action->refcount > 0, FALSE);
g_return_val_if_fail (other->refcount > 0, FALSE);
if (g_strcmp0 (action->kind, other->kind) != 0)
return FALSE;
return TRUE;
}
/**
* nm_tc_action_dup:
* @action: the #NMTCAction
*
* Creates a copy of @action
*
* Returns: (transfer full): a copy of @action
*
* Since: 1.10.2
**/
NMTCAction *
nm_tc_action_dup (NMTCAction *action)
{
NMTCAction *copy;
g_return_val_if_fail (action != NULL, NULL);
g_return_val_if_fail (action->refcount > 0, NULL);
copy = nm_tc_action_new (action->kind, NULL);
if (action->attributes) {
GHashTableIter iter;
const char *key;
GVariant *value;
g_hash_table_iter_init (&iter, action->attributes);
while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &value))
nm_tc_action_set_attribute (copy, key, value);
}
return copy;
}
/**
* nm_tc_action_get_kind:
* @action: the #NMTCAction
*
* Returns:
*
* Since: 1.10.2
**/
const char *
nm_tc_action_get_kind (NMTCAction *action)
{
g_return_val_if_fail (action != NULL, NULL);
g_return_val_if_fail (action->refcount > 0, NULL);
return action->kind;
}
/**
* nm_tc_action_get_attribute_names:
* @action: the #NMTCAction
*
* Gets an array of attribute names defined on @action.
*
* Returns: (transfer full): a %NULL-terminated array of attribute names,
**/
char **
nm_tc_action_get_attribute_names (NMTCAction *action)
{
GHashTableIter iter;
const char *key;
GPtrArray *names;
g_return_val_if_fail (action != NULL, NULL);
names = g_ptr_array_new ();
if (action->attributes) {
g_hash_table_iter_init (&iter, action->attributes);
while (g_hash_table_iter_next (&iter, (gpointer *) &key, NULL))
g_ptr_array_add (names, g_strdup (key));
}
g_ptr_array_add (names, NULL);
return (char **) g_ptr_array_free (names, FALSE);
}
/**
* nm_tc_action_get_attribute:
* @action: the #NMTCAction
* @name: the name of an action attribute
*
* Gets the value of the attribute with name @name on @action
*
* Returns: (transfer none): the value of the attribute with name @name on
* @action, or %NULL if @action has no such attribute.
**/
GVariant *
nm_tc_action_get_attribute (NMTCAction *action, const char *name)
{
g_return_val_if_fail (action != NULL, NULL);
g_return_val_if_fail (name != NULL && *name != '\0', NULL);
if (action->attributes)
return g_hash_table_lookup (action->attributes, name);
else
return NULL;
}
/**
* nm_tc_action_set_attribute:
* @action: the #NMTCAction
* @name: the name of an action attribute
* @value: (transfer none) (allow-none): the value
*
* Sets or clears the named attribute on @action to the given value.
**/
void
nm_tc_action_set_attribute (NMTCAction *action, const char *name, GVariant *value)
{
g_return_if_fail (action != NULL);
g_return_if_fail (name != NULL && *name != '\0');
g_return_if_fail (strcmp (name, "kind") != 0);
if (!action->attributes) {
action->attributes = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, (GDestroyNotify) g_variant_unref);
}
if (value)
g_hash_table_insert (action->attributes, g_strdup (name), g_variant_ref_sink (value));
else
g_hash_table_remove (action->attributes, name);
}
/*****************************************************************************/
enum {
PROP_0,
PROP_QDISCS,

View file

@ -61,6 +61,41 @@ void nm_tc_qdisc_set_handle (NMTCQdisc *qdisc,
NM_AVAILABLE_IN_1_10_2
guint32 nm_tc_qdisc_get_parent (NMTCQdisc *qdisc);
NM_AVAILABLE_IN_1_10_2
typedef struct NMTCAction NMTCAction;
NM_AVAILABLE_IN_1_10_2
GType nm_tc_action_get_type (void);
NM_AVAILABLE_IN_1_10_2
NMTCAction *nm_tc_action_new (const char *kind,
GError **error);
NM_AVAILABLE_IN_1_10_2
void nm_tc_action_ref (NMTCAction *action);
NM_AVAILABLE_IN_1_10_2
void nm_tc_action_unref (NMTCAction *action);
NM_AVAILABLE_IN_1_10_2
gboolean nm_tc_action_equal (NMTCAction *action,
NMTCAction *other);
NM_AVAILABLE_IN_1_10_2
NMTCAction *nm_tc_action_dup (NMTCAction *action);
NM_AVAILABLE_IN_1_10_2
const char *nm_tc_action_get_kind (NMTCAction *action);
NM_AVAILABLE_IN_1_10_2
char **nm_tc_action_get_attribute_names (NMTCAction *action);
NM_AVAILABLE_IN_1_10_2
GVariant *nm_tc_action_get_attribute (NMTCAction *action,
const char *name);
NM_AVAILABLE_IN_1_10_2
void nm_tc_action_set_attribute (NMTCAction *action,
const char *name,
GVariant *value);
#define NM_TYPE_SETTING_TC_CONFIG (nm_setting_tc_config_get_type ())
#define NM_SETTING_TC_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_TC_CONFIG, NMSettingTCConfig))
#define NM_SETTING_TC_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_TC_CONFIG, NMSettingTCConfigClass))

View file

@ -1270,6 +1270,16 @@ global:
nm_setting_team_remove_link_watcher_by_value;
nm_setting_team_remove_runner_tx_hash;
nm_setting_team_remove_runner_tx_hash_by_value;
nm_tc_action_dup;
nm_tc_action_equal;
nm_tc_action_get_attribute;
nm_tc_action_get_attribute_names;
nm_tc_action_get_kind;
nm_tc_action_get_type;
nm_tc_action_new;
nm_tc_action_ref;
nm_tc_action_set_attribute;
nm_tc_action_unref;
nm_tc_qdisc_dup;
nm_tc_qdisc_equal;
nm_tc_qdisc_get_handle;