mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-03 03:30:14 +01:00
wifi/p2p: merge branch 'benzea/p2p-assigned-addr'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/899
This commit is contained in:
commit
88005e36a4
3 changed files with 96 additions and 3 deletions
|
|
@ -560,14 +560,39 @@ act_stage3_ip_config_start(NMDevice * device,
|
|||
gpointer * out_config,
|
||||
NMDeviceStateReason *out_failure_reason)
|
||||
{
|
||||
gboolean indicate_addressing_running;
|
||||
NMConnection *connection;
|
||||
const char * method;
|
||||
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(device);
|
||||
gboolean indicate_addressing_running;
|
||||
NMConnection * connection;
|
||||
const char * method;
|
||||
|
||||
connection = nm_device_get_applied_connection(device);
|
||||
|
||||
method = nm_utils_get_ip_config_method(connection, addr_family);
|
||||
|
||||
/* We may have an address assigned by the group owner */
|
||||
if (NM_IN_STRSET(method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) && priv->group_iface
|
||||
&& !nm_supplicant_interface_get_p2p_group_owner(priv->group_iface)) {
|
||||
in_addr_t addr;
|
||||
guint8 plen;
|
||||
|
||||
if (nm_supplicant_interface_get_p2p_assigned_addr(priv->group_iface, &addr, &plen)) {
|
||||
NMPlatformIP4Address address = {
|
||||
.addr_source = NM_IP_CONFIG_SOURCE_DHCP,
|
||||
};
|
||||
gs_unref_object NMIP4Config *ip4_config = NULL;
|
||||
|
||||
nm_platform_ip4_address_set_addr(&address, addr, plen);
|
||||
|
||||
ip4_config = nm_device_ip4_config_new(device);
|
||||
nm_ip4_config_add_address(ip4_config, &address);
|
||||
|
||||
nm_device_set_dev2_ip_config(device, AF_INET, NM_IP_CONFIG(ip4_config));
|
||||
|
||||
/* This just disables the addressing indicator. */
|
||||
method = NM_SETTING_IP4_CONFIG_METHOD_DISABLED;
|
||||
}
|
||||
}
|
||||
|
||||
if (addr_family == AF_INET)
|
||||
indicate_addressing_running = NM_IN_STRSET(method, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
|
||||
else {
|
||||
|
|
@ -622,6 +647,11 @@ get_auto_ip_config_method(NMDevice *device, int addr_family)
|
|||
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(device);
|
||||
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
||||
|
||||
if (addr_family == AF_INET && priv->group_iface
|
||||
&& !nm_supplicant_interface_get_p2p_group_owner(priv->group_iface)
|
||||
&& nm_supplicant_interface_get_p2p_assigned_addr(priv->group_iface, NULL, NULL))
|
||||
return NM_SETTING_IP4_CONFIG_METHOD_DISABLED;
|
||||
|
||||
/* Override the AUTO method to mean shared if we are group owner. */
|
||||
if (priv->group_iface && nm_supplicant_interface_get_p2p_group_owner(priv->group_iface)) {
|
||||
if (addr_family == AF_INET)
|
||||
|
|
|
|||
|
|
@ -115,6 +115,9 @@ typedef struct _NMSupplicantInterfacePrivate {
|
|||
CList peer_lst_head;
|
||||
CList peer_initializing_lst_head;
|
||||
|
||||
in_addr_t p2p_assigned_addr;
|
||||
guint8 p2p_assigned_plen;
|
||||
|
||||
gint64 last_scan_msec;
|
||||
|
||||
NMSupplicantAuthState auth_state;
|
||||
|
|
@ -2904,6 +2907,15 @@ _get_all_p2p_device_cb(GVariant *result, GError *error, gpointer user_data)
|
|||
_properties_changed(user_data, NM_WPAS_DBUS_IFACE_INTERFACE_P2P_DEVICE, properties, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
_set_p2p_assigned_addr(NMSupplicantInterface *self, gconstpointer addr, guint8 plen)
|
||||
{
|
||||
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE(self);
|
||||
|
||||
nm_ip_addr_set(AF_INET, &priv->p2p_assigned_addr, addr);
|
||||
priv->p2p_assigned_plen = plen;
|
||||
}
|
||||
|
||||
static void
|
||||
_signal_handle(NMSupplicantInterface *self,
|
||||
const char * signal_interface_name,
|
||||
|
|
@ -2998,6 +3010,7 @@ _signal_handle(NMSupplicantInterface *self,
|
|||
gs_unref_object NMSupplicantInterface *iface = NULL;
|
||||
const char * group_path;
|
||||
const char * iface_path;
|
||||
GVariant * v_v = NULL;
|
||||
|
||||
g_variant_get(parameters, "(@a{sv})", &args);
|
||||
if (!g_variant_lookup(args, "group_object", "&o", &group_path))
|
||||
|
|
@ -3019,6 +3032,34 @@ _signal_handle(NMSupplicantInterface *self,
|
|||
}
|
||||
}
|
||||
|
||||
v_v = g_variant_lookup_value(args, "IpAddr", G_VARIANT_TYPE_BYTESTRING);
|
||||
if (v_v) {
|
||||
const guint8 *addr_data;
|
||||
gsize addr_len = 0;
|
||||
const guint8 *mask_data = NULL;
|
||||
gsize mask_len = 0;
|
||||
|
||||
/* The address is passed in network-byte-order */
|
||||
addr_data = g_variant_get_fixed_array(v_v, &addr_len, 1);
|
||||
|
||||
/* TODO: Should we expose IpAddrGo? If yes, maybe as gateway? */
|
||||
v_v = g_variant_lookup_value(args, "IpAddrMask", G_VARIANT_TYPE_BYTESTRING);
|
||||
if (v_v)
|
||||
mask_data = g_variant_get_fixed_array(v_v, &mask_len, 1);
|
||||
|
||||
if (addr_len == NM_AF_INET_SIZE && mask_len == NM_AF_INET_SIZE) {
|
||||
guint32 netmask;
|
||||
|
||||
memcpy(&netmask, mask_data, NM_AF_INET_SIZE);
|
||||
|
||||
_set_p2p_assigned_addr(iface,
|
||||
addr_data,
|
||||
nm_utils_ip4_netmask_to_prefix(netmask));
|
||||
} else {
|
||||
_LOGW("P2P: GroupStarted signaled invalid IP Address information");
|
||||
}
|
||||
}
|
||||
|
||||
/* Signal existence of the (new) interface. */
|
||||
g_signal_emit(self, signals[GROUP_STARTED], 0, iface);
|
||||
}
|
||||
|
|
@ -3099,6 +3140,24 @@ nm_supplicant_interface_get_p2p_group_owner(NMSupplicantInterface *self)
|
|||
return NM_SUPPLICANT_INTERFACE_GET_PRIVATE(self)->p2p_group_owner_cached;
|
||||
}
|
||||
|
||||
gboolean
|
||||
nm_supplicant_interface_get_p2p_assigned_addr(NMSupplicantInterface *self,
|
||||
in_addr_t * addr,
|
||||
guint8 * plen)
|
||||
{
|
||||
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE(self);
|
||||
|
||||
if (nm_ip_addr_is_null(AF_INET, &priv->p2p_assigned_addr))
|
||||
return FALSE;
|
||||
|
||||
if (addr)
|
||||
nm_ip_addr_set(AF_INET, addr, &priv->p2p_assigned_addr);
|
||||
if (plen)
|
||||
*plen = priv->p2p_assigned_plen;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -164,6 +164,10 @@ const char *nm_supplicant_interface_get_p2p_group_path(NMSupplicantInterface *se
|
|||
|
||||
gboolean nm_supplicant_interface_get_p2p_group_owner(NMSupplicantInterface *self);
|
||||
|
||||
gboolean nm_supplicant_interface_get_p2p_assigned_addr(NMSupplicantInterface *self,
|
||||
in_addr_t * assigned_addr,
|
||||
guint8 * plen);
|
||||
|
||||
void nm_supplicant_interface_p2p_start_find(NMSupplicantInterface *self, guint timeout);
|
||||
void nm_supplicant_interface_p2p_stop_find(NMSupplicantInterface *self);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue