Skip to content

Commit 6146d2c

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 <[email protected]>
1 parent f1cae6b commit 6146d2c

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
@@ -1467,6 +1467,12 @@ enum wifi_p2p_op {
14671467
WIFI_P2P_PEER,
14681468
/** P2P connect to peer */
14691469
WIFI_P2P_CONNECT,
1470+
/** P2P group add */
1471+
WIFI_P2P_GROUP_ADD,
1472+
/** P2P group remove */
1473+
WIFI_P2P_GROUP_REMOVE,
1474+
/** P2P invite */
1475+
WIFI_P2P_INVITE,
14701476
};
14711477

14721478
/** Wi-Fi P2P discovery type */
@@ -1522,6 +1528,50 @@ struct wifi_p2p_params {
15221528
/** Frequency in MHz (0 = not specified, use default) */
15231529
unsigned int freq;
15241530
} connect;
1531+
/** Group add specific parameters */
1532+
struct {
1533+
/** Frequency in MHz (0 = auto) */
1534+
int freq;
1535+
/** Persistent group ID (-1 = not persistent) */
1536+
int persistent;
1537+
/** Enable HT40 */
1538+
bool ht40;
1539+
/** Enable VHT */
1540+
bool vht;
1541+
/** Enable HE */
1542+
bool he;
1543+
/** Enable EDMG */
1544+
bool edmg;
1545+
/** GO BSSID (NULL = auto) */
1546+
uint8_t go_bssid[WIFI_MAC_ADDR_LEN];
1547+
/** GO BSSID length */
1548+
uint8_t go_bssid_length;
1549+
} group_add;
1550+
/** Group remove specific parameters */
1551+
struct {
1552+
/** Interface name (e.g., "wlan0") */
1553+
char ifname[CONFIG_NET_INTERFACE_NAME_LEN + 1];
1554+
} group_remove;
1555+
/** Invite specific parameters */
1556+
struct {
1557+
/** Invite type: persistent or group */
1558+
enum {
1559+
WIFI_P2P_INVITE_PERSISTENT = 0,
1560+
WIFI_P2P_INVITE_GROUP,
1561+
} type;
1562+
/** Persistent group ID (for persistent type) */
1563+
int persistent_id;
1564+
/** Group interface name (for group type) */
1565+
char group_ifname[CONFIG_NET_INTERFACE_NAME_LEN + 1];
1566+
/** Peer MAC address */
1567+
uint8_t peer_addr[WIFI_MAC_ADDR_LEN];
1568+
/** Frequency in MHz (0 = auto) */
1569+
int freq;
1570+
/** GO device address (for group type, NULL = auto) */
1571+
uint8_t go_dev_addr[WIFI_MAC_ADDR_LEN];
1572+
/** GO device address length */
1573+
uint8_t go_dev_addr_length;
1574+
} invite;
15251575
};
15261576
#endif /* CONFIG_WIFI_NM_WPA_SUPPLICANT_P2P */
15271577

modules/hostap/src/supp_api.c

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

2905+
case WIFI_P2P_GROUP_ADD: {
2906+
int len = 0;
2907+
2908+
if (!params) {
2909+
wpa_printf(MSG_ERROR, "P2P group add params are NULL");
2910+
return -EINVAL;
2911+
}
2912+
2913+
len = snprintk(cmd_buf, sizeof(cmd_buf), "P2P_GROUP_ADD");
2914+
2915+
if (params->group_add.freq > 0) {
2916+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len, " freq=%d",
2917+
params->group_add.freq);
2918+
}
2919+
2920+
if (params->group_add.persistent >= 0) {
2921+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len, " persistent=%d",
2922+
params->group_add.persistent);
2923+
}
2924+
2925+
if (params->group_add.ht40) {
2926+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len, " ht40");
2927+
}
2928+
2929+
if (params->group_add.vht) {
2930+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len, " vht");
2931+
}
2932+
2933+
if (params->group_add.he) {
2934+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len, " he");
2935+
}
2936+
2937+
if (params->group_add.edmg) {
2938+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len, " edmg");
2939+
}
2940+
2941+
if (params->group_add.go_bssid_length == WIFI_MAC_ADDR_LEN) {
2942+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len,
2943+
" go_bssid=%02x:%02x:%02x:%02x:%02x:%02x",
2944+
params->group_add.go_bssid[0],
2945+
params->group_add.go_bssid[1],
2946+
params->group_add.go_bssid[2],
2947+
params->group_add.go_bssid[3],
2948+
params->group_add.go_bssid[4],
2949+
params->group_add.go_bssid[5]);
2950+
}
2951+
2952+
ret = zephyr_wpa_cli_cmd_resp_noprint(wpa_s->ctrl_conn, cmd_buf, resp_buf);
2953+
if (ret < 0) {
2954+
wpa_printf(MSG_ERROR, "P2P_GROUP_ADD command failed: %d", ret);
2955+
return -EIO;
2956+
}
2957+
ret = 0;
2958+
break;
2959+
}
2960+
2961+
case WIFI_P2P_GROUP_REMOVE:
2962+
if (!params) {
2963+
wpa_printf(MSG_ERROR, "P2P group remove params are NULL");
2964+
return -EINVAL;
2965+
}
2966+
2967+
if (params->group_remove.ifname[0] == '\0') {
2968+
wpa_printf(MSG_ERROR, "Interface name required for P2P_GROUP_REMOVE");
2969+
return -EINVAL;
2970+
}
2971+
2972+
snprintk(cmd_buf, sizeof(cmd_buf), "P2P_GROUP_REMOVE %s",
2973+
params->group_remove.ifname);
2974+
2975+
ret = zephyr_wpa_cli_cmd_resp_noprint(wpa_s->ctrl_conn, cmd_buf, resp_buf);
2976+
if (ret < 0) {
2977+
wpa_printf(MSG_ERROR, "P2P_GROUP_REMOVE command failed: %d", ret);
2978+
return -EIO;
2979+
}
2980+
ret = 0;
2981+
break;
2982+
2983+
case WIFI_P2P_INVITE: {
2984+
char addr_str[18];
2985+
int len = 0;
2986+
2987+
if (!params) {
2988+
wpa_printf(MSG_ERROR, "P2P invite params are NULL");
2989+
return -EINVAL;
2990+
}
2991+
2992+
snprintk(addr_str, sizeof(addr_str), "%02x:%02x:%02x:%02x:%02x:%02x",
2993+
params->invite.peer_addr[0], params->invite.peer_addr[1],
2994+
params->invite.peer_addr[2], params->invite.peer_addr[3],
2995+
params->invite.peer_addr[4], params->invite.peer_addr[5]);
2996+
2997+
if (params->invite.type == WIFI_P2P_INVITE_PERSISTENT) {
2998+
if (params->invite.persistent_id < 0) {
2999+
wpa_printf(MSG_ERROR, "Persistent group ID required");
3000+
return -EINVAL;
3001+
}
3002+
len = snprintk(cmd_buf, sizeof(cmd_buf), "P2P_INVITE persistent=%d peer=%s",
3003+
params->invite.persistent_id, addr_str);
3004+
3005+
if (params->invite.freq > 0) {
3006+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len, " freq=%d",
3007+
params->invite.freq);
3008+
}
3009+
} else if (params->invite.type == WIFI_P2P_INVITE_GROUP) {
3010+
if (params->invite.group_ifname[0] == '\0') {
3011+
wpa_printf(MSG_ERROR, "Group interface name required");
3012+
return -EINVAL;
3013+
}
3014+
len = snprintk(cmd_buf, sizeof(cmd_buf), "P2P_INVITE group=%s peer=%s",
3015+
params->invite.group_ifname, addr_str);
3016+
3017+
if (params->invite.freq > 0) {
3018+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len, " freq=%d",
3019+
params->invite.freq);
3020+
}
3021+
3022+
if (params->invite.go_dev_addr_length == WIFI_MAC_ADDR_LEN) {
3023+
len += snprintk(cmd_buf + len, sizeof(cmd_buf) - len,
3024+
" go_dev_addr=%02x:%02x:%02x:%02x:%02x:%02x",
3025+
params->invite.go_dev_addr[0],
3026+
params->invite.go_dev_addr[1],
3027+
params->invite.go_dev_addr[2],
3028+
params->invite.go_dev_addr[3],
3029+
params->invite.go_dev_addr[4],
3030+
params->invite.go_dev_addr[5]);
3031+
}
3032+
} else {
3033+
wpa_printf(MSG_ERROR, "Invalid invite type: %d", params->invite.type);
3034+
return -EINVAL;
3035+
}
3036+
3037+
ret = zephyr_wpa_cli_cmd_resp_noprint(wpa_s->ctrl_conn, cmd_buf, resp_buf);
3038+
if (ret < 0) {
3039+
wpa_printf(MSG_ERROR, "P2P_INVITE command failed: %d", ret);
3040+
return -EIO;
3041+
}
3042+
ret = 0;
3043+
break;
3044+
}
3045+
29053046
default:
29063047
wpa_printf(MSG_ERROR, "Unknown P2P operation: %d", params->oper);
29073048
ret = -EINVAL;

0 commit comments

Comments
 (0)