P2P: Notify the IP address of the connected P2P Client

When wpa_supplicant assigns the IP address (WFA EAPOL IP address
allocation feature), the assigned IP address of the P2P Client on the GO
side is notified in the AP-STA-CONNECTED event. So to obtain the IP info
to external programs, modify the STA authorized event to include the the
assigned IP address of the P2P Client.

Test: Establish P2P connection and verified from the logs that
      the P2P Client IP address is notified.
Signed-off-by: Sunil Ravi <sunilravi@google.com>
This commit is contained in:
Sunil Ravi 2024-02-29 01:36:40 +00:00 committed by Jouni Malinen
parent b18d957593
commit dbcf9ff156
5 changed files with 17 additions and 11 deletions

View file

@ -293,7 +293,8 @@ struct hostapd_data {
void *wps_event_cb_ctx; void *wps_event_cb_ctx;
void (*sta_authorized_cb)(void *ctx, const u8 *mac_addr, void (*sta_authorized_cb)(void *ctx, const u8 *mac_addr,
int authorized, const u8 *p2p_dev_addr); int authorized, const u8 *p2p_dev_addr,
const u8 *ip);
void *sta_authorized_cb_ctx; void *sta_authorized_cb_ctx;
void (*setup_complete_cb)(void *ctx); void (*setup_complete_cb)(void *ctx);

View file

@ -1433,6 +1433,7 @@ void ap_sta_set_authorized_event(struct hostapd_data *hapd,
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];
u8 ip_addr_buf[4]; u8 ip_addr_buf[4];
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
const u8 *ip_ptr = NULL;
#ifdef CONFIG_P2P #ifdef CONFIG_P2P
if (hapd->p2p_group == NULL) { if (hapd->p2p_group == NULL) {
@ -1449,10 +1450,6 @@ void ap_sta_set_authorized_event(struct hostapd_data *hapd,
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(sta->addr)); os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(sta->addr));
if (hapd->sta_authorized_cb)
hapd->sta_authorized_cb(hapd->sta_authorized_cb_ctx,
sta->addr, authorized, dev_addr);
if (authorized) { if (authorized) {
const u8 *dpp_pkhash; const u8 *dpp_pkhash;
const char *keyid; const char *keyid;
@ -1469,6 +1466,7 @@ void ap_sta_set_authorized_event(struct hostapd_data *hapd,
" ip_addr=%u.%u.%u.%u", " ip_addr=%u.%u.%u.%u",
ip_addr_buf[0], ip_addr_buf[1], ip_addr_buf[0], ip_addr_buf[1],
ip_addr_buf[2], ip_addr_buf[3]); ip_addr_buf[2], ip_addr_buf[3]);
ip_ptr = ip_addr_buf;
} }
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
@ -1508,6 +1506,11 @@ void ap_sta_set_authorized_event(struct hostapd_data *hapd,
AP_STA_DISCONNECTED "%s", buf); AP_STA_DISCONNECTED "%s", buf);
} }
if (hapd->sta_authorized_cb)
hapd->sta_authorized_cb(hapd->sta_authorized_cb_ctx,
sta->addr, authorized, dev_addr,
ip_ptr);
#ifdef CONFIG_FST #ifdef CONFIG_FST
if (hapd->iface->fst) { if (hapd->iface->fst) {
if (authorized) if (authorized)

View file

@ -868,9 +868,10 @@ static void ap_wps_event_cb(void *ctx, enum wps_event event,
static void ap_sta_authorized_cb(void *ctx, const u8 *mac_addr, static void ap_sta_authorized_cb(void *ctx, const u8 *mac_addr,
int authorized, const u8 *p2p_dev_addr) int authorized, const u8 *p2p_dev_addr,
const u8 *ip)
{ {
wpas_notify_sta_authorized(ctx, mac_addr, authorized, p2p_dev_addr); wpas_notify_sta_authorized(ctx, mac_addr, authorized, p2p_dev_addr, ip);
} }

View file

@ -776,7 +776,7 @@ void wpas_notify_p2p_invitation_received(struct wpa_supplicant *wpa_s,
static void wpas_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s, static void wpas_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
const u8 *sta, const u8 *sta,
const u8 *p2p_dev_addr) const u8 *p2p_dev_addr, const u8 *ip)
{ {
#ifdef CONFIG_P2P #ifdef CONFIG_P2P
wpas_p2p_notify_ap_sta_authorized(wpa_s, p2p_dev_addr); wpas_p2p_notify_ap_sta_authorized(wpa_s, p2p_dev_addr);
@ -820,10 +820,11 @@ static void wpas_notify_ap_sta_deauthorized(struct wpa_supplicant *wpa_s,
void wpas_notify_sta_authorized(struct wpa_supplicant *wpa_s, void wpas_notify_sta_authorized(struct wpa_supplicant *wpa_s,
const u8 *mac_addr, int authorized, const u8 *mac_addr, int authorized,
const u8 *p2p_dev_addr) const u8 *p2p_dev_addr, const u8 *ip)
{ {
if (authorized) if (authorized)
wpas_notify_ap_sta_authorized(wpa_s, mac_addr, p2p_dev_addr); wpas_notify_ap_sta_authorized(wpa_s, mac_addr, p2p_dev_addr,
ip);
else else
wpas_notify_ap_sta_deauthorized(wpa_s, mac_addr, p2p_dev_addr); wpas_notify_ap_sta_deauthorized(wpa_s, mac_addr, p2p_dev_addr);
} }

View file

@ -94,7 +94,7 @@ void wpas_notify_resume(struct wpa_global *global);
void wpas_notify_sta_authorized(struct wpa_supplicant *wpa_s, void wpas_notify_sta_authorized(struct wpa_supplicant *wpa_s,
const u8 *mac_addr, int authorized, const u8 *mac_addr, int authorized,
const u8 *p2p_dev_addr); const u8 *p2p_dev_addr, const u8 *ip);
void wpas_notify_p2p_find_stopped(struct wpa_supplicant *wpa_s); void wpas_notify_p2p_find_stopped(struct wpa_supplicant *wpa_s);
void wpas_notify_p2p_device_found(struct wpa_supplicant *wpa_s, void wpas_notify_p2p_device_found(struct wpa_supplicant *wpa_s,
const u8 *dev_addr, int new_device); const u8 *dev_addr, int new_device);