Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[connman] Upgrade upstream WiFi plugin to latest. Fixes JB#62992 #86

Open
wants to merge 17 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions connman/gsupplicant/gsupplicant.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ extern "C" {
#define G_SUPPLICANT_KEYMGMT_WPA_EAP (1 << 7)
#define G_SUPPLICANT_KEYMGMT_WPA_EAP_256 (1 << 8)
#define G_SUPPLICANT_KEYMGMT_WPS (1 << 9)
#define G_SUPPLICANT_KEYMGMT_SAE (1 << 10)

#define G_SUPPLICANT_PROTO_WPA (1 << 0)
#define G_SUPPLICANT_PROTO_RSN (1 << 1)
Expand Down Expand Up @@ -129,6 +130,12 @@ typedef enum {
G_SUPPLICANT_PEER_GROUP_FAILED,
} GSupplicantPeerState;

typedef enum {
G_SUPPLICANT_MFP_NONE,
G_SUPPLICANT_MFP_OPTIONAL,
G_SUPPLICANT_MFP_REQUIRED,
} GSupplicantMfpOptions;

struct _GSupplicantSSID {
const void *ssid;
unsigned int ssid_len;
Expand All @@ -144,13 +151,19 @@ struct _GSupplicantSSID {
const char *identity;
const char *anonymous_identity;
const char *ca_cert_path;
const char *subject_match;
const char *altsubject_match;
const char *domain_suffix_match;
const char *domain_match;
const char *client_cert_path;
const char *private_key_path;
const char *private_key_passphrase;
const char *phase2_auth;
dbus_bool_t use_wps;
const char *pin_wps;
const char *bgscan;
unsigned int keymgmt;
GSupplicantMfpOptions ieee80211w;
};

typedef struct _GSupplicantSSID GSupplicantSSID;
Expand Down Expand Up @@ -335,6 +348,7 @@ bool g_supplicant_peer_is_in_a_group(GSupplicantPeer *peer);
GSupplicantInterface *g_supplicant_peer_get_group_interface(GSupplicantPeer *peer);
bool g_supplicant_peer_is_client(GSupplicantPeer *peer);
bool g_supplicant_peer_has_requested_connection(GSupplicantPeer *peer);
unsigned int g_supplicant_network_get_keymgmt(GSupplicantNetwork *network);

struct _GSupplicantCallbacks {
void (*system_ready) (void);
Expand Down
104 changes: 97 additions & 7 deletions connman/gsupplicant/supplicant.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ static struct strvalmap keymgmt_map[] = {
{ "wpa-eap", G_SUPPLICANT_KEYMGMT_WPA_EAP },
{ "wpa-eap-sha256", G_SUPPLICANT_KEYMGMT_WPA_EAP_256 },
{ "wps", G_SUPPLICANT_KEYMGMT_WPS },
{ "sae", G_SUPPLICANT_KEYMGMT_SAE },
{ }
};

Expand Down Expand Up @@ -234,6 +235,7 @@ struct _GSupplicantNetwork {
unsigned int wps_capabilities;
GHashTable *bss_table;
GHashTable *config_table;
unsigned int keymgmt;
};

struct _GSupplicantPeer {
Expand Down Expand Up @@ -808,6 +810,33 @@ static void remove_peer(gpointer data)
g_free(peer);
}

static void remove_ssid(gpointer data)
{
GSupplicantSSID *ssid = data;

if (!ssid)
return;

g_free((void *) ssid->ssid);
g_free((char *) ssid->eap);
g_free((char *) ssid->passphrase);
g_free((char *) ssid->identity);
g_free((char *) ssid->anonymous_identity);
g_free((char *) ssid->ca_cert_path);
g_free((char *) ssid->subject_match);
g_free((char *) ssid->altsubject_match);
g_free((char *) ssid->domain_suffix_match);
g_free((char *) ssid->domain_match);
g_free((char *) ssid->client_cert_path);
g_free((char *) ssid->private_key_path);
g_free((char *) ssid->private_key_passphrase);
g_free((char *) ssid->phase2_auth);
g_free((char *) ssid->pin_wps);
g_free((char *) ssid->bgscan);

g_free(ssid);
}

static void debug_strvalmap(const char *label, struct strvalmap *map,
unsigned int val)
{
Expand Down Expand Up @@ -1427,6 +1456,14 @@ bool g_supplicant_peer_has_requested_connection(GSupplicantPeer *peer)
return peer->connection_requested;
}

unsigned int g_supplicant_network_get_keymgmt(GSupplicantNetwork *network)
{
if (!network)
return 0;

return network->keymgmt;
}

static void merge_network(GSupplicantNetwork *network)
{
GString *str;
Expand Down Expand Up @@ -1457,7 +1494,8 @@ static void merge_network(GSupplicantNetwork *network)
else if (g_strcmp0(mode, "1") == 0)
g_string_append_printf(str, "_adhoc");

if (g_strcmp0(key_mgmt, "WPA-PSK") == 0)
if ((g_strcmp0(key_mgmt, "WPA-PSK") == 0) ||
(g_strcmp0(key_mgmt, "SAE") == 0))
g_string_append_printf(str, "_psk");

group = g_string_free(str, FALSE);
Expand Down Expand Up @@ -1650,6 +1688,7 @@ static int add_or_replace_bss_to_network(struct g_supplicant_bss *bss)
network->name = create_name(bss->ssid, bss->ssid_len);
network->mode = bss->mode;
network->security = bss->security;
network->keymgmt = bss->keymgmt;
network->ssid_len = bss->ssid_len;
memcpy(network->ssid, bss->ssid, bss->ssid_len);
network->signal = bss->signal;
Expand Down Expand Up @@ -1931,7 +1970,8 @@ static void bss_compute_security(struct g_supplicant_bss *bss)
if (bss->keymgmt &
(G_SUPPLICANT_KEYMGMT_WPA_PSK |
G_SUPPLICANT_KEYMGMT_WPA_FT_PSK |
G_SUPPLICANT_KEYMGMT_WPA_PSK_256))
G_SUPPLICANT_KEYMGMT_WPA_PSK_256 |
G_SUPPLICANT_KEYMGMT_SAE))
bss->psk = TRUE;

if (bss->ieee8021x)
Expand Down Expand Up @@ -4138,6 +4178,7 @@ static void interface_remove_result(const char *error,
if (data->callback)
data->callback(err, NULL, data->user_data);

remove_ssid(data->ssid);
dbus_free(data);
}

Expand Down Expand Up @@ -4456,7 +4497,7 @@ static void interface_select_network_result(const char *error,
if (data->callback)
data->callback(err, data->interface, data->user_data);

g_free(data->ssid);
remove_ssid(data->ssid);
dbus_free(data);
}

Expand Down Expand Up @@ -4512,7 +4553,7 @@ static void interface_add_network_result(const char *error,
}

g_free(data->path);
g_free(data->ssid);
remove_ssid(data->ssid);
g_free(data);
}

Expand Down Expand Up @@ -4775,6 +4816,26 @@ static void add_network_security_eap(DBusMessageIter *dict,
DBUS_TYPE_STRING,
&ssid->anonymous_identity);

if(ssid->subject_match)
supplicant_dbus_dict_append_basic(dict, "subject_match",
DBUS_TYPE_STRING,
&ssid->subject_match);

if(ssid->altsubject_match)
supplicant_dbus_dict_append_basic(dict, "altsubject_match",
DBUS_TYPE_STRING,
&ssid->altsubject_match);

if(ssid->domain_suffix_match)
supplicant_dbus_dict_append_basic(dict, "domain_suffix_match",
DBUS_TYPE_STRING,
&ssid->domain_suffix_match);

if(ssid->domain_match)
supplicant_dbus_dict_append_basic(dict, "domain_match",
DBUS_TYPE_STRING,
&ssid->domain_match);

g_free(eap_value);
}

Expand Down Expand Up @@ -4870,8 +4931,16 @@ static void add_network_security_proto(DBusMessageIter *dict,
g_free(proto);
}

static void add_network_ieee80211w(DBusMessageIter *dict, GSupplicantSSID *ssid,
GSupplicantMfpOptions ieee80211w)
{
supplicant_dbus_dict_append_basic(dict, "ieee80211w", DBUS_TYPE_UINT32,
&ieee80211w);
}

static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid)
{
GSupplicantMfpOptions ieee80211w;
char *key_mgmt;

switch (ssid->security) {
Expand All @@ -4887,7 +4956,22 @@ static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid)
add_network_security_ciphers(dict, ssid);
break;
case G_SUPPLICANT_SECURITY_PSK:
key_mgmt = "WPA-PSK";
if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_SAE) {
if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK) {
/*
* WPA3-Personal transition mode: supports both
* WPA2-Personal (PSK) and WPA3-Personal (SAE)
*/
key_mgmt = "SAE WPA-PSK";
ieee80211w = G_SUPPLICANT_MFP_OPTIONAL;
} else {
key_mgmt = "SAE";
ieee80211w = G_SUPPLICANT_MFP_REQUIRED;
}
add_network_ieee80211w(dict, ssid, ieee80211w);
} else {
key_mgmt = "WPA-PSK";
}
add_network_security_psk(dict, ssid);
add_network_security_ciphers(dict, ssid);
add_network_security_proto(dict, ssid);
Expand Down Expand Up @@ -4974,7 +5058,7 @@ static void interface_wps_start_result(const char *error,
data->callback(err, data->interface, data->user_data);

g_free(data->path);
g_free(data->ssid);
remove_ssid(data->ssid);
dbus_free(data);
}

Expand Down Expand Up @@ -5014,7 +5098,7 @@ static void wps_start(const char *error, DBusMessageIter *iter, void *user_data)
if (error) {
SUPPLICANT_DBG("error: %s", error);
g_free(data->path);
g_free(data->ssid);
remove_ssid(data->ssid);
dbus_free(data);
return;
}
Expand Down Expand Up @@ -5103,6 +5187,7 @@ int g_supplicant_interface_connect(GSupplicantInterface *interface,
* type is 802.11x).
*/
if (compare_network_parameters(interface, ssid)) {
remove_ssid(ssid);
return -EALREADY;
}

Expand All @@ -5128,6 +5213,7 @@ int g_supplicant_interface_connect(GSupplicantInterface *interface,

if (ret < 0) {
g_free(data->path);
remove_ssid(data->ssid);
dbus_free(data);
return ret;
}
Expand Down Expand Up @@ -5178,6 +5264,7 @@ static void network_remove_result(const char *error,
} else {
if (data->callback)
data->callback(result, data->interface, data->user_data);
remove_ssid(data->ssid);
}
g_free(data->path);
dbus_free(data);
Expand Down Expand Up @@ -5231,6 +5318,7 @@ static void interface_disconnect_result(const char *error,
data->user_data);

g_free(data->path);
remove_ssid(data->ssid);
dbus_free(data);
return;
}
Expand All @@ -5243,10 +5331,12 @@ static void interface_disconnect_result(const char *error,
if (result != -ECONNABORTED) {
if (network_remove(data) < 0) {
g_free(data->path);
remove_ssid(data->ssid);
dbus_free(data);
}
} else {
g_free(data->path);
remove_ssid(data->ssid);
dbus_free(data);
}
}
Expand Down
Loading