Skip to content

Commit 347c8c4

Browse files
committed
[nrf fromlist] net: wifi: Add API support for P2P GO mode
Add structures and API support for P2P Go mode. Upstream PR #: 97183 Signed-off-by: Kapil Bhatt <kapil.bhatt@nordicsemi.no>
1 parent 5979047 commit 347c8c4

File tree

2 files changed

+191
-0
lines changed

2 files changed

+191
-0
lines changed

include/zephyr/net/wifi_mgmt.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,12 @@ enum wifi_p2p_op {
14441444
WIFI_P2P_PEER,
14451445
/** P2P connect to peer */
14461446
WIFI_P2P_CONNECT,
1447+
/** P2P group add */
1448+
WIFI_P2P_GROUP_ADD,
1449+
/** P2P group remove */
1450+
WIFI_P2P_GROUP_REMOVE,
1451+
/** P2P invite */
1452+
WIFI_P2P_INVITE,
14471453
};
14481454

14491455
/** Wi-Fi P2P discovery type */
@@ -1499,6 +1505,50 @@ struct wifi_p2p_params {
14991505
/** Frequency in MHz (0 = not specified, use default) */
15001506
unsigned int freq;
15011507
} connect;
1508+
/** Group add specific parameters */
1509+
struct {
1510+
/** Frequency in MHz (0 = auto) */
1511+
int freq;
1512+
/** Persistent group ID (-1 = not persistent) */
1513+
int persistent;
1514+
/** Enable HT40 */
1515+
bool ht40;
1516+
/** Enable VHT */
1517+
bool vht;
1518+
/** Enable HE */
1519+
bool he;
1520+
/** Enable EDMG */
1521+
bool edmg;
1522+
/** GO BSSID (NULL = auto) */
1523+
uint8_t go_bssid[WIFI_MAC_ADDR_LEN];
1524+
/** GO BSSID length */
1525+
uint8_t go_bssid_length;
1526+
} group_add;
1527+
/** Group remove specific parameters */
1528+
struct {
1529+
/** Interface name (e.g., "wlan0") */
1530+
char ifname[CONFIG_NET_INTERFACE_NAME_LEN + 1];
1531+
} group_remove;
1532+
/** Invite specific parameters */
1533+
struct {
1534+
/** Invite type: persistent or group */
1535+
enum {
1536+
WIFI_P2P_INVITE_PERSISTENT = 0,
1537+
WIFI_P2P_INVITE_GROUP,
1538+
} type;
1539+
/** Persistent group ID (for persistent type) */
1540+
int persistent_id;
1541+
/** Group interface name (for group type) */
1542+
char group_ifname[CONFIG_NET_INTERFACE_NAME_LEN + 1];
1543+
/** Peer MAC address */
1544+
uint8_t peer_addr[WIFI_MAC_ADDR_LEN];
1545+
/** Frequency in MHz (0 = auto) */
1546+
int freq;
1547+
/** GO device address (for group type, NULL = auto) */
1548+
uint8_t go_dev_addr[WIFI_MAC_ADDR_LEN];
1549+
/** GO device address length */
1550+
uint8_t go_dev_addr_length;
1551+
} invite;
15021552
};
15031553
#endif /* CONFIG_WIFI_NM_WPA_SUPPLICANT_P2P */
15041554

modules/hostap/src/supp_api.c

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2874,6 +2874,147 @@ int supplicant_p2p_oper(const struct device *dev, struct wifi_p2p_params *params
28742874
break;
28752875
}
28762876

2877+
case WIFI_P2P_GROUP_ADD: {
2878+
int len = 0;
2879+
2880+
if (!params) {
2881+
wpa_printf(MSG_ERROR, "P2P group add params are NULL");
2882+
return -EINVAL;
2883+
}
2884+
2885+
len = snprintf(cmd_buf, sizeof(cmd_buf), "P2P_GROUP_ADD");
2886+
2887+
if (params->group_add.freq > 0) {
2888+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len, " freq=%d",
2889+
params->group_add.freq);
2890+
}
2891+
2892+
if (params->group_add.persistent >= 0) {
2893+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len, " persistent=%d",
2894+
params->group_add.persistent);
2895+
}
2896+
2897+
if (params->group_add.ht40) {
2898+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len, " ht40");
2899+
}
2900+
2901+
if (params->group_add.vht) {
2902+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len, " vht");
2903+
}
2904+
2905+
if (params->group_add.he) {
2906+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len, " he");
2907+
}
2908+
2909+
if (params->group_add.edmg) {
2910+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len, " edmg");
2911+
}
2912+
2913+
if (params->group_add.go_bssid_length == WIFI_MAC_ADDR_LEN) {
2914+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len,
2915+
" go_bssid=%02x:%02x:%02x:%02x:%02x:%02x",
2916+
params->group_add.go_bssid[0],
2917+
params->group_add.go_bssid[1],
2918+
params->group_add.go_bssid[2],
2919+
params->group_add.go_bssid[3],
2920+
params->group_add.go_bssid[4],
2921+
params->group_add.go_bssid[5]);
2922+
}
2923+
2924+
ret = zephyr_wpa_cli_cmd_resp_noprint(wpa_s->ctrl_conn, cmd_buf, resp_buf);
2925+
if (ret < 0) {
2926+
wpa_printf(MSG_ERROR, "P2P_GROUP_ADD command failed: %d", ret);
2927+
return -EIO;
2928+
}
2929+
ret = 0;
2930+
break;
2931+
}
2932+
2933+
case WIFI_P2P_GROUP_REMOVE:
2934+
if (!params) {
2935+
wpa_printf(MSG_ERROR, "P2P group remove params are NULL");
2936+
return -EINVAL;
2937+
}
2938+
2939+
if (params->group_remove.ifname[0] == '\0') {
2940+
wpa_printf(MSG_ERROR, "Interface name required for P2P_GROUP_REMOVE");
2941+
return -EINVAL;
2942+
}
2943+
2944+
snprintf(cmd_buf, sizeof(cmd_buf), "P2P_GROUP_REMOVE %s",
2945+
params->group_remove.ifname);
2946+
2947+
ret = zephyr_wpa_cli_cmd_resp_noprint(wpa_s->ctrl_conn, cmd_buf, resp_buf);
2948+
if (ret < 0) {
2949+
wpa_printf(MSG_ERROR, "P2P_GROUP_REMOVE command failed: %d", ret);
2950+
return -EIO;
2951+
}
2952+
ret = 0;
2953+
break;
2954+
2955+
case WIFI_P2P_INVITE: {
2956+
char addr_str[18];
2957+
int len = 0;
2958+
2959+
if (!params) {
2960+
wpa_printf(MSG_ERROR, "P2P invite params are NULL");
2961+
return -EINVAL;
2962+
}
2963+
2964+
snprintf(addr_str, sizeof(addr_str), "%02x:%02x:%02x:%02x:%02x:%02x",
2965+
params->invite.peer_addr[0], params->invite.peer_addr[1],
2966+
params->invite.peer_addr[2], params->invite.peer_addr[3],
2967+
params->invite.peer_addr[4], params->invite.peer_addr[5]);
2968+
2969+
if (params->invite.type == WIFI_P2P_INVITE_PERSISTENT) {
2970+
if (params->invite.persistent_id < 0) {
2971+
wpa_printf(MSG_ERROR, "Persistent group ID required");
2972+
return -EINVAL;
2973+
}
2974+
len = snprintf(cmd_buf, sizeof(cmd_buf), "P2P_INVITE persistent=%d peer=%s",
2975+
params->invite.persistent_id, addr_str);
2976+
2977+
if (params->invite.freq > 0) {
2978+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len, " freq=%d",
2979+
params->invite.freq);
2980+
}
2981+
} else if (params->invite.type == WIFI_P2P_INVITE_GROUP) {
2982+
if (params->invite.group_ifname[0] == '\0') {
2983+
wpa_printf(MSG_ERROR, "Group interface name required");
2984+
return -EINVAL;
2985+
}
2986+
len = snprintf(cmd_buf, sizeof(cmd_buf), "P2P_INVITE group=%s peer=%s",
2987+
params->invite.group_ifname, addr_str);
2988+
2989+
if (params->invite.freq > 0) {
2990+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len, " freq=%d",
2991+
params->invite.freq);
2992+
}
2993+
2994+
if (params->invite.go_dev_addr_length == WIFI_MAC_ADDR_LEN) {
2995+
len += snprintf(cmd_buf + len, sizeof(cmd_buf) - len,
2996+
" go_dev_addr=%02x:%02x:%02x:%02x:%02x:%02x",
2997+
params->invite.go_dev_addr[0],
2998+
params->invite.go_dev_addr[1],
2999+
params->invite.go_dev_addr[2],
3000+
params->invite.go_dev_addr[3],
3001+
params->invite.go_dev_addr[4],
3002+
params->invite.go_dev_addr[5]);
3003+
}
3004+
} else {
3005+
wpa_printf(MSG_ERROR, "Invalid invite type: %d", params->invite.type);
3006+
return -EINVAL;
3007+
}
3008+
3009+
ret = zephyr_wpa_cli_cmd_resp_noprint(wpa_s->ctrl_conn, cmd_buf, resp_buf);
3010+
if (ret < 0) {
3011+
wpa_printf(MSG_ERROR, "P2P_INVITE command failed: %d", ret);
3012+
return -EIO;
3013+
}
3014+
ret = 0;
3015+
break;
3016+
}
3017+
28773018
default:
28783019
wpa_printf(MSG_ERROR, "Unknown P2P operation: %d", params->oper);
28793020
ret = -EINVAL;

0 commit comments

Comments
 (0)