2020-12-23 22:21:36 +01:00
|
|
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
2014-07-24 08:53:33 -04:00
|
|
|
/*
|
2019-10-01 09:20:35 +02:00
|
|
|
* Copyright (C) 2007 - 2013 Red Hat, Inc.
|
|
|
|
|
* Copyright (C) 2007 - 2008 Novell, Inc.
|
|
|
|
|
* Copyright (C) 2009 One Laptop per Child
|
2014-07-24 08:53:33 -04:00
|
|
|
*/
|
|
|
|
|
|
2016-02-19 14:57:48 +01:00
|
|
|
#include "nm-default.h"
|
2014-11-13 10:07:02 -05:00
|
|
|
|
2019-01-11 08:32:54 +01:00
|
|
|
#include "nm-setting-olpc-mesh.h"
|
|
|
|
|
|
2020-12-13 16:08:56 +01:00
|
|
|
#include <linux/if_ether.h>
|
|
|
|
|
|
2014-07-24 08:53:33 -04:00
|
|
|
#include "nm-utils.h"
|
|
|
|
|
#include "nm-utils-private.h"
|
|
|
|
|
#include "nm-setting-private.h"
|
|
|
|
|
|
2015-12-18 11:16:22 +01:00
|
|
|
/**
|
|
|
|
|
* SECTION:nm-setting-olpc-mesh
|
|
|
|
|
* @short_description: Describes connection properties for OLPC-Mesh devices
|
|
|
|
|
*
|
|
|
|
|
* The #NMSettingOlpcMesh object is a #NMSetting subclass that describes properties
|
|
|
|
|
* necessary for connection to OLPC-Mesh devices.
|
|
|
|
|
**/
|
|
|
|
|
|
2019-01-11 08:32:54 +01:00
|
|
|
/*****************************************************************************/
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
NM_GOBJECT_PROPERTIES_DEFINE_BASE(PROP_SSID, PROP_CHANNEL, PROP_DHCP_ANYCAST_ADDRESS, );
|
2014-07-24 08:53:33 -04:00
|
|
|
|
|
|
|
|
typedef struct {
|
2020-09-28 16:03:33 +02:00
|
|
|
GBytes *ssid;
|
|
|
|
|
char * dhcp_anycast_addr;
|
|
|
|
|
guint32 channel;
|
2014-07-24 08:53:33 -04:00
|
|
|
} NMSettingOlpcMeshPrivate;
|
|
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
G_DEFINE_TYPE(NMSettingOlpcMesh, nm_setting_olpc_mesh, NM_TYPE_SETTING)
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
#define NM_SETTING_OLPC_MESH_GET_PRIVATE(o) \
|
|
|
|
|
(G_TYPE_INSTANCE_GET_PRIVATE((o), NM_TYPE_SETTING_OLPC_MESH, NMSettingOlpcMeshPrivate))
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2019-01-11 08:32:54 +01:00
|
|
|
/*****************************************************************************/
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2014-11-13 14:14:11 -05:00
|
|
|
/**
|
|
|
|
|
* nm_setting_olpc_mesh_get_ssid:
|
2016-01-20 11:25:37 -06:00
|
|
|
* @setting: the #NMSettingOlpcMesh
|
2014-11-13 14:14:11 -05:00
|
|
|
*
|
|
|
|
|
* Returns: (transfer none):
|
|
|
|
|
*/
|
2014-06-26 10:42:11 -04:00
|
|
|
GBytes *
|
2020-09-28 16:03:33 +02:00
|
|
|
nm_setting_olpc_mesh_get_ssid(NMSettingOlpcMesh *setting)
|
2014-07-24 08:53:33 -04:00
|
|
|
{
|
2020-09-28 16:03:33 +02:00
|
|
|
g_return_val_if_fail(NM_IS_SETTING_OLPC_MESH(setting), NULL);
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
return NM_SETTING_OLPC_MESH_GET_PRIVATE(setting)->ssid;
|
2014-07-24 08:53:33 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
guint32
|
2020-09-28 16:03:33 +02:00
|
|
|
nm_setting_olpc_mesh_get_channel(NMSettingOlpcMesh *setting)
|
2014-07-24 08:53:33 -04:00
|
|
|
{
|
2020-09-28 16:03:33 +02:00
|
|
|
g_return_val_if_fail(NM_IS_SETTING_OLPC_MESH(setting), 0);
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
return NM_SETTING_OLPC_MESH_GET_PRIVATE(setting)->channel;
|
2014-07-24 08:53:33 -04:00
|
|
|
}
|
|
|
|
|
|
2014-07-30 10:57:45 -04:00
|
|
|
const char *
|
2020-09-28 16:03:33 +02:00
|
|
|
nm_setting_olpc_mesh_get_dhcp_anycast_address(NMSettingOlpcMesh *setting)
|
2014-07-24 08:53:33 -04:00
|
|
|
{
|
2020-09-28 16:03:33 +02:00
|
|
|
g_return_val_if_fail(NM_IS_SETTING_OLPC_MESH(setting), NULL);
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
return NM_SETTING_OLPC_MESH_GET_PRIVATE(setting)->dhcp_anycast_addr;
|
2014-07-24 08:53:33 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
2020-09-28 16:03:33 +02:00
|
|
|
verify(NMSetting *setting, NMConnection *connection, GError **error)
|
2014-07-24 08:53:33 -04:00
|
|
|
{
|
2020-09-28 16:03:33 +02:00
|
|
|
NMSettingOlpcMeshPrivate *priv = NM_SETTING_OLPC_MESH_GET_PRIVATE(setting);
|
|
|
|
|
gsize length;
|
|
|
|
|
|
|
|
|
|
if (!priv->ssid) {
|
|
|
|
|
g_set_error_literal(error,
|
|
|
|
|
NM_CONNECTION_ERROR,
|
|
|
|
|
NM_CONNECTION_ERROR_MISSING_PROPERTY,
|
|
|
|
|
_("property is missing"));
|
|
|
|
|
g_prefix_error(error,
|
|
|
|
|
"%s.%s: ",
|
|
|
|
|
NM_SETTING_OLPC_MESH_SETTING_NAME,
|
|
|
|
|
NM_SETTING_OLPC_MESH_SSID);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
length = g_bytes_get_size(priv->ssid);
|
|
|
|
|
if (length == 0 || length > 32) {
|
|
|
|
|
g_set_error_literal(error,
|
|
|
|
|
NM_CONNECTION_ERROR,
|
|
|
|
|
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
|
|
|
|
_("SSID length is out of range <1-32> bytes"));
|
|
|
|
|
g_prefix_error(error,
|
|
|
|
|
"%s.%s: ",
|
|
|
|
|
NM_SETTING_OLPC_MESH_SETTING_NAME,
|
|
|
|
|
NM_SETTING_OLPC_MESH_SSID);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (priv->channel == 0 || priv->channel > 13) {
|
|
|
|
|
g_set_error(error,
|
|
|
|
|
NM_CONNECTION_ERROR,
|
|
|
|
|
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
|
|
|
|
_("'%d' is not a valid channel"),
|
|
|
|
|
priv->channel);
|
|
|
|
|
g_prefix_error(error,
|
|
|
|
|
"%s.%s: ",
|
|
|
|
|
NM_SETTING_OLPC_MESH_SETTING_NAME,
|
|
|
|
|
NM_SETTING_OLPC_MESH_CHANNEL);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (priv->dhcp_anycast_addr && !nm_utils_hwaddr_valid(priv->dhcp_anycast_addr, ETH_ALEN)) {
|
|
|
|
|
g_set_error_literal(error,
|
|
|
|
|
NM_CONNECTION_ERROR,
|
|
|
|
|
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
|
|
|
|
_("property is invalid"));
|
|
|
|
|
g_prefix_error(error,
|
|
|
|
|
"%s.%s: ",
|
|
|
|
|
NM_SETTING_OLPC_MESH_SETTING_NAME,
|
|
|
|
|
NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
2014-07-24 08:53:33 -04:00
|
|
|
}
|
|
|
|
|
|
2019-01-11 08:32:54 +01:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2014-07-24 08:53:33 -04:00
|
|
|
static void
|
2020-09-28 16:03:33 +02:00
|
|
|
get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
|
2014-07-24 08:53:33 -04:00
|
|
|
{
|
2020-09-28 16:03:33 +02:00
|
|
|
NMSettingOlpcMesh *setting = NM_SETTING_OLPC_MESH(object);
|
|
|
|
|
|
|
|
|
|
switch (prop_id) {
|
|
|
|
|
case PROP_SSID:
|
|
|
|
|
g_value_set_boxed(value, nm_setting_olpc_mesh_get_ssid(setting));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_CHANNEL:
|
|
|
|
|
g_value_set_uint(value, nm_setting_olpc_mesh_get_channel(setting));
|
|
|
|
|
break;
|
|
|
|
|
case PROP_DHCP_ANYCAST_ADDRESS:
|
|
|
|
|
g_value_set_string(value, nm_setting_olpc_mesh_get_dhcp_anycast_address(setting));
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2014-07-24 08:53:33 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2020-09-28 16:03:33 +02:00
|
|
|
set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
|
2014-07-24 08:53:33 -04:00
|
|
|
{
|
2020-09-28 16:03:33 +02:00
|
|
|
NMSettingOlpcMeshPrivate *priv = NM_SETTING_OLPC_MESH_GET_PRIVATE(object);
|
|
|
|
|
|
|
|
|
|
switch (prop_id) {
|
|
|
|
|
case PROP_SSID:
|
|
|
|
|
if (priv->ssid)
|
|
|
|
|
g_bytes_unref(priv->ssid);
|
|
|
|
|
priv->ssid = g_value_dup_boxed(value);
|
|
|
|
|
break;
|
|
|
|
|
case PROP_CHANNEL:
|
|
|
|
|
priv->channel = g_value_get_uint(value);
|
|
|
|
|
break;
|
|
|
|
|
case PROP_DHCP_ANYCAST_ADDRESS:
|
|
|
|
|
g_free(priv->dhcp_anycast_addr);
|
|
|
|
|
priv->dhcp_anycast_addr = g_value_dup_string(value);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2014-07-24 08:53:33 -04:00
|
|
|
}
|
|
|
|
|
|
2019-01-11 08:32:54 +01:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2014-07-24 08:53:33 -04:00
|
|
|
static void
|
2020-09-28 16:03:33 +02:00
|
|
|
nm_setting_olpc_mesh_init(NMSettingOlpcMesh *setting)
|
|
|
|
|
{}
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2019-01-11 08:32:54 +01:00
|
|
|
/**
|
|
|
|
|
* nm_setting_olpc_mesh_new:
|
|
|
|
|
*
|
|
|
|
|
* Creates a new #NMSettingOlpcMesh object with default values.
|
|
|
|
|
*
|
|
|
|
|
* Returns: the new empty #NMSettingOlpcMesh object
|
|
|
|
|
**/
|
2020-09-28 16:03:33 +02:00
|
|
|
NMSetting *
|
|
|
|
|
nm_setting_olpc_mesh_new(void)
|
2019-01-11 08:32:54 +01:00
|
|
|
{
|
2020-11-12 15:57:06 +01:00
|
|
|
return g_object_new(NM_TYPE_SETTING_OLPC_MESH, NULL);
|
2019-01-11 08:32:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2020-09-28 16:03:33 +02:00
|
|
|
finalize(GObject *object)
|
2019-01-11 08:32:54 +01:00
|
|
|
{
|
2020-09-28 16:03:33 +02:00
|
|
|
NMSettingOlpcMeshPrivate *priv = NM_SETTING_OLPC_MESH_GET_PRIVATE(object);
|
2019-01-11 08:32:54 +01:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
if (priv->ssid)
|
|
|
|
|
g_bytes_unref(priv->ssid);
|
|
|
|
|
g_free(priv->dhcp_anycast_addr);
|
2019-01-11 08:32:54 +01:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
G_OBJECT_CLASS(nm_setting_olpc_mesh_parent_class)->finalize(object);
|
2014-07-24 08:53:33 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2020-09-28 16:03:33 +02:00
|
|
|
nm_setting_olpc_mesh_class_init(NMSettingOlpcMeshClass *klass)
|
2014-07-24 08:53:33 -04:00
|
|
|
{
|
2020-09-28 16:03:33 +02:00
|
|
|
GObjectClass * object_class = G_OBJECT_CLASS(klass);
|
|
|
|
|
NMSettingClass *setting_class = NM_SETTING_CLASS(klass);
|
|
|
|
|
GArray * properties_override = _nm_sett_info_property_override_create_array();
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
g_type_class_add_private(klass, sizeof(NMSettingOlpcMeshPrivate));
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
object_class->get_property = get_property;
|
|
|
|
|
object_class->set_property = set_property;
|
|
|
|
|
object_class->finalize = finalize;
|
2014-07-24 08:53:33 -04:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
setting_class->verify = verify;
|
libnm/trivial: cleanup variable names in settings' class-init functions
- Don't use @parent_class name. This local variable (and @object_class) is
the class instance up-cast to the pointer types of the parents. The point
here is not that it is the direct parent. The point is, that it's the
NMSettingClass type.
Also, it can only be used inconsistently, in face of NMSettingIP4Config,
who's parent type is NMSettingIPConfig. Clearly, inside
nm-setting-ip4-config.c we wouldn't want to use the "parent_class"
name. Consistently rename @parent_class to @setting_class.
- Also rename the pointer to the own class to @klass. "setting_class" is also the
wrong name for that, because the right name would be something like
"setting_6lowpan_class".
However, "klass" is preferred over the latter, because we commonly create new
GObject implementations by copying an existing one. Generic names like "klass"
and "self" inside a type implementation make that simpler.
- drop useless comments like
/* virtual functions */
/* Properties */
It's better to logically and visually structure the code, and avoid trival
remarks about that. They only end up being used inconsistently. If you
even need a stronger visual separator, then an 80 char /****/ line
should be preferred.
2018-07-28 10:43:21 +02:00
|
|
|
|
2020-09-28 16:03:33 +02:00
|
|
|
/**
|
2020-09-28 14:50:01 +02:00
|
|
|
* NMSettingOlpcMesh:ssid:
|
|
|
|
|
*
|
|
|
|
|
* SSID of the mesh network to join.
|
|
|
|
|
**/
|
2020-09-28 16:03:33 +02:00
|
|
|
obj_properties[PROP_SSID] = g_param_spec_boxed(NM_SETTING_OLPC_MESH_SSID,
|
|
|
|
|
"",
|
|
|
|
|
"",
|
|
|
|
|
G_TYPE_BYTES,
|
|
|
|
|
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE
|
|
|
|
|
| G_PARAM_STATIC_STRINGS);
|
|
|
|
|
|
|
|
|
|
/**
|
2020-09-28 14:50:01 +02:00
|
|
|
* NMSettingOlpcMesh:channel:
|
|
|
|
|
*
|
|
|
|
|
* Channel on which the mesh network to join is located.
|
|
|
|
|
**/
|
2020-09-28 16:03:33 +02:00
|
|
|
obj_properties[PROP_CHANNEL] =
|
|
|
|
|
g_param_spec_uint(NM_SETTING_OLPC_MESH_CHANNEL,
|
|
|
|
|
"",
|
|
|
|
|
"",
|
|
|
|
|
0,
|
|
|
|
|
G_MAXUINT32,
|
|
|
|
|
0,
|
|
|
|
|
G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE | G_PARAM_STATIC_STRINGS);
|
|
|
|
|
|
|
|
|
|
/**
|
2020-09-28 14:50:01 +02:00
|
|
|
* NMSettingOlpcMesh:dhcp-anycast-address:
|
|
|
|
|
*
|
|
|
|
|
* Anycast DHCP MAC address used when requesting an IP address via DHCP.
|
|
|
|
|
* The specific anycast address used determines which DHCP server class
|
|
|
|
|
* answers the request.
|
|
|
|
|
**/
|
2020-09-28 16:03:33 +02:00
|
|
|
obj_properties[PROP_DHCP_ANYCAST_ADDRESS] =
|
|
|
|
|
g_param_spec_string(NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS,
|
|
|
|
|
"",
|
|
|
|
|
"",
|
|
|
|
|
NULL,
|
|
|
|
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
|
|
|
|
_nm_properties_override_gobj(properties_override,
|
|
|
|
|
obj_properties[PROP_DHCP_ANYCAST_ADDRESS],
|
|
|
|
|
&nm_sett_info_propert_type_mac_address);
|
|
|
|
|
|
|
|
|
|
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
|
|
|
|
|
|
|
|
|
|
_nm_setting_class_commit_full(setting_class,
|
|
|
|
|
NM_META_SETTING_TYPE_OLPC_MESH,
|
|
|
|
|
NULL,
|
|
|
|
|
properties_override);
|
2014-07-24 08:53:33 -04:00
|
|
|
}
|