diff --git a/src/ctl/ctl-wifi.c b/src/ctl/ctl-wifi.c index 0dda927..efea8aa 100644 --- a/src/ctl/ctl-wifi.c +++ b/src/ctl/ctl-wifi.c @@ -975,6 +975,17 @@ static int ctl_wifi_peer_fn(sd_bus *bus, return cli_log_parser(r); ctl_fn_peer_provision_discovery(p, prov, pin); + } else if (sd_bus_message_is_signal(m, + "org.freedesktop.miracle.wifi.Peer", + "GoNegRequest")) { + /* connection request */ + const char *prov, *pin; + + r = sd_bus_message_read(m, "ss", &prov, &pin); + if (r < 0) + return cli_log_parser(r); + + ctl_fn_peer_go_neg_request(p, prov, pin); } else if (sd_bus_message_is_signal(m, "org.freedesktop.miracle.wifi.Peer", "FormationFailure")) { diff --git a/src/ctl/ctl.h b/src/ctl/ctl.h index 47c37ae..1d5d000 100644 --- a/src/ctl/ctl.h +++ b/src/ctl/ctl.h @@ -251,6 +251,9 @@ void ctl_fn_peer_free(struct ctl_peer *p); void ctl_fn_peer_provision_discovery(struct ctl_peer *p, const char *prov, const char *pin); +void ctl_fn_peer_go_neg_request(struct ctl_peer *p, + const char *prov, + const char *pin); void ctl_fn_peer_formation_failure(struct ctl_peer *p, const char *reason); void ctl_fn_peer_connected(struct ctl_peer *p); void ctl_fn_peer_disconnected(struct ctl_peer *p); diff --git a/src/ctl/sinkctl.c b/src/ctl/sinkctl.c index 1bbbfc5..80edc67 100644 --- a/src/ctl/sinkctl.c +++ b/src/ctl/sinkctl.c @@ -440,6 +440,18 @@ void ctl_fn_peer_provision_discovery(struct ctl_peer *p, if (cli_running()) cli_printf("[" CLI_YELLOW "PROV" CLI_DEFAULT "] Peer: %s Type: %s PIN: %s\n", p->label, prov, pin); +} + +void ctl_fn_peer_go_neg_request(struct ctl_peer *p, + const char *prov, + const char *pin) +{ + if (p->l != running_link || shl_isempty(p->wfd_subelements)) + return; + + if (cli_running()) + cli_printf("[" CLI_YELLOW "GO NEG" CLI_DEFAULT "] Peer: %s Type: %s PIN: %s\n", + p->label, prov, pin); if (!running_peer) { /* auto accept any incoming connection attempt */ diff --git a/src/wifi/wifid-dbus.c b/src/wifi/wifid-dbus.c index 35052a8..7d9520f 100644 --- a/src/wifi/wifid-dbus.c +++ b/src/wifi/wifid-dbus.c @@ -308,6 +308,7 @@ static const sd_bus_vtable peer_dbus_vtable[] = { 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_SIGNAL("ProvisionDiscovery", "ss", 0), + SD_BUS_SIGNAL("GoNegRequest", "ss", 0), SD_BUS_VTABLE_END }; @@ -408,6 +409,31 @@ void peer_dbus_provision_discovery(struct peer *p, log_vERR(r); } +void peer_dbus_go_neg_request(struct peer *p, + const char *type, + const char *pin) +{ + _shl_free_ char *node = NULL; + int r; + + if (!type) + return; + if (!pin) + pin = ""; + + node = peer_dbus_get_path(p); + if (!node) + return; + + r = sd_bus_emit_signal(p->l->m->bus, + node, + "org.freedesktop.miracle.wifi.Peer", + "GoNegRequest", + "ss", type, pin); + if (r < 0) + log_vERR(r); +} + void peer_dbus_formation_failure(struct peer *p, const char *reason) { _shl_free_ char *node = NULL; diff --git a/src/wifi/wifid-peer.c b/src/wifi/wifid-peer.c index 5f16829..a361089 100644 --- a/src/wifi/wifid-peer.c +++ b/src/wifi/wifid-peer.c @@ -200,6 +200,16 @@ void peer_supplicant_provision_discovery(struct peer *p, peer_dbus_provision_discovery(p, prov, pin); } +void peer_supplicant_go_neg_request(struct peer *p, + const char *prov, + const char *pin) +{ + if (!p || !p->public) + return; + + peer_dbus_go_neg_request(p, prov, pin); +} + void peer_supplicant_formation_failure(struct peer *p, const char *reason) { diff --git a/src/wifi/wifid-supplicant.c b/src/wifi/wifid-supplicant.c index 62677a0..a15d7c9 100644 --- a/src/wifi/wifid-supplicant.c +++ b/src/wifi/wifid-supplicant.c @@ -1008,6 +1008,8 @@ static void supplicant_event_p2p_prov_disc_pbc_req(struct supplicant *s, sp->prov = t; free(sp->pin); sp->pin = NULL; + + peer_supplicant_provision_discovery(sp->p, sp->prov, sp->pin); } static void supplicant_event_p2p_go_neg_request(struct supplicant *s, @@ -1048,7 +1050,7 @@ static void supplicant_event_p2p_go_neg_request(struct supplicant *s, if (!sp->g) { log_debug("GO Negotiation Request from %s", mac); - peer_supplicant_provision_discovery(sp->p, sp->prov, sp->pin); + peer_supplicant_go_neg_request(sp->p, sp->prov, sp->pin); } else { log_debug("GO Negotiation Request from already connected peer %s", mac); @@ -1098,6 +1100,8 @@ static void supplicant_event_p2p_prov_disc_show_pin(struct supplicant *s, sp->prov = t; free(sp->pin); sp->pin = u; + + peer_supplicant_provision_discovery(sp->p, sp->prov, sp->pin); } static void supplicant_event_p2p_prov_disc_enter_pin(struct supplicant *s, @@ -1130,6 +1134,8 @@ static void supplicant_event_p2p_prov_disc_enter_pin(struct supplicant *s, sp->prov = t; free(sp->pin); sp->pin = NULL; + + peer_supplicant_provision_discovery(sp->p, sp->prov, sp->pin); } static void supplicant_event_p2p_go_neg_success(struct supplicant *s, diff --git a/src/wifi/wifid.h b/src/wifi/wifid.h index 62d5346..5d20b02 100644 --- a/src/wifi/wifid.h +++ b/src/wifi/wifid.h @@ -101,6 +101,9 @@ void peer_supplicant_wfd_subelements_changed(struct peer *p); void peer_supplicant_provision_discovery(struct peer *p, const char *prov, const char *pin); +void peer_supplicant_go_neg_request(struct peer *p, + const char *prov, + const char *pin); void peer_supplicant_formation_failure(struct peer *p, const char *reason); void peer_supplicant_connected_changed(struct peer *p, bool connected); @@ -109,6 +112,9 @@ void peer_dbus_properties_changed(struct peer *p, const char *prop, ...); void peer_dbus_provision_discovery(struct peer *p, const char *prov, const char *pin); +void peer_dbus_go_neg_request(struct peer *p, + const char *type, + const char *pin); void peer_dbus_formation_failure(struct peer *p, const char *reason); void peer_dbus_added(struct peer *p); void peer_dbus_removed(struct peer *p);