Lines Matching defs:group

2  * Wi-Fi Direct - P2P group operations
32 * struct p2p_group - Internal P2P module per-group data
49 struct p2p_group *group, **groups;
51 group = os_zalloc(sizeof(*group));
52 if (group == NULL)
58 os_free(group);
61 groups[p2p->num_groups++] = group;
64 group->p2p = p2p;
65 group->cfg = config;
66 group->group_formation = 1;
67 group->beacon_update = 1;
68 p2p_group_update_ies(group);
69 group->cfg->idle_update(group->cfg->cb_ctx, 1);
71 return group;
84 static void p2p_group_free_members(struct p2p_group *group)
87 m = group->members;
88 group->members = NULL;
89 group->num_members = 0;
98 void p2p_group_deinit(struct p2p_group *group)
103 if (group == NULL)
106 p2p = group->p2p;
109 if (p2p->groups[g] == group) {
119 p2p_group_free_members(group);
120 os_free(group->cfg);
121 wpabuf_free(group->noa);
122 wpabuf_free(group->wfd_ie);
123 os_free(group);
137 static void p2p_group_add_common_ies(struct p2p_group *group,
140 u8 dev_capab = group->p2p->dev_capab, group_capab = 0;
145 if (group->cfg->persistent_group) {
147 if (group->cfg->persistent_group == 2)
150 if (group->p2p->cfg->p2p_intra_bss)
152 if (group->group_formation)
154 if (group->p2p->cross_connect)
156 if (group->num_members >= group->cfg->max_clients)
158 if (group->cfg->ip_addr_alloc)
208 static struct wpabuf * p2p_group_build_beacon_ie(struct p2p_group *group)
215 if (group->p2p->wfd_ie_beacon)
216 extra = wpabuf_len(group->p2p->wfd_ie_beacon);
219 if (group->p2p->vendor_elem &&
220 group->p2p->vendor_elem[VENDOR_ELEM_BEACON_P2P_GO])
221 extra += wpabuf_len(group->p2p->vendor_elem[VENDOR_ELEM_BEACON_P2P_GO]);
228 if (group->p2p->wfd_ie_beacon)
229 wpabuf_put_buf(ie, group->p2p->wfd_ie_beacon);
232 if (group->p2p->vendor_elem &&
233 group->p2p->vendor_elem[VENDOR_ELEM_BEACON_P2P_GO])
235 group->p2p->vendor_elem[VENDOR_ELEM_BEACON_P2P_GO]);
238 p2p_group_add_common_ies(group, ie);
239 p2p_buf_add_device_id(ie, group->p2p->cfg->dev_addr);
240 p2p_group_add_noa(ie, group->noa);
354 wifi_display_build_go_ie(struct p2p_group *group)
361 if (!group->p2p->wfd_ie_probe_resp)
364 wfd_subelems = wpabuf_alloc(wpabuf_len(group->p2p->wfd_ie_probe_resp) +
365 group->num_members * 24 + 100);
368 if (group->p2p->wfd_dev_info)
369 wpabuf_put_buf(wfd_subelems, group->p2p->wfd_dev_info);
370 if (group->p2p->wfd_r2_dev_info)
371 wpabuf_put_buf(wfd_subelems, group->p2p->wfd_r2_dev_info);
372 if (group->p2p->wfd_assoc_bssid)
374 group->p2p->wfd_assoc_bssid);
375 if (group->p2p->wfd_coupled_sink_info)
377 group->p2p->wfd_coupled_sink_info);
382 m = group->members;
395 p2p_dbg(group->p2p, "WFD: WFD Session Info: %u descriptors",
405 static void wifi_display_group_update(struct p2p_group *group)
407 wpabuf_free(group->wfd_ie);
408 group->wfd_ie = wifi_display_build_go_ie(group);
414 void p2p_buf_add_group_info(struct p2p_group *group, struct wpabuf *buf,
421 p2p_dbg(group->p2p, "* P2P Group Info");
425 for (m = group->members; m; m = m->next) {
436 void p2p_group_buf_add_id(struct p2p_group *group, struct wpabuf *buf)
438 p2p_buf_add_group_id(buf, group->p2p->cfg->dev_addr, group->cfg->ssid,
439 group->cfg->ssid_len);
443 static struct wpabuf * p2p_group_build_probe_resp_ie(struct p2p_group *group)
451 p2p_group_add_common_ies(group, p2p_subelems);
452 p2p_group_add_noa(p2p_subelems, group->noa);
455 p2p_buf_add_device_info(p2p_subelems, group->p2p, NULL);
458 if (group->members)
459 p2p_buf_add_group_info(group, p2p_subelems, -1);
464 if (group->p2p->vendor_elem &&
465 group->p2p->vendor_elem[VENDOR_ELEM_PROBE_RESP_P2P_GO]) {
467 extra = wpabuf_dup(group->p2p->vendor_elem[VENDOR_ELEM_PROBE_RESP_P2P_GO]);
472 if (group->wfd_ie) {
473 struct wpabuf *wfd = wpabuf_dup(group->wfd_ie);
482 void p2p_group_update_ies(struct p2p_group *group)
488 wifi_display_group_update(group);
491 probe_resp_ie = p2p_group_build_probe_resp_ie(group);
497 if (group->beacon_update) {
498 beacon_ie = p2p_group_build_beacon_ie(group);
500 group->beacon_update = 0;
506 group->cfg->ie_update(group->cfg->cb_ctx, beacon_ie, probe_resp_ie);
572 static int p2p_group_remove_member(struct p2p_group *group, const u8 *addr)
576 if (group == NULL)
579 m = group->members;
594 group->members = m->next;
596 group->num_members--;
602 int p2p_group_notif_assoc(struct p2p_group *group, const u8 *addr,
607 if (group == NULL)
610 p2p_add_device(group->p2p, addr, 0, NULL, 0, ie, len, 0);
626 p2p_group_remove_member(group, addr);
628 m->next = group->members;
629 group->members = m;
630 group->num_members++;
631 p2p_dbg(group->p2p, "Add client " MACSTR
632 " to group (p2p=%d wfd=%d client_info=%d); num_members=%u/%u",
635 group->num_members, group->cfg->max_clients);
636 if (group->num_members == group->cfg->max_clients)
637 group->beacon_update = 1;
638 p2p_group_update_ies(group);
639 if (group->num_members == 1)
640 group->cfg->idle_update(group->cfg->cb_ctx, 0);
646 struct wpabuf * p2p_group_assoc_resp_ie(struct p2p_group *group, u8 status)
653 if (group->wfd_ie)
654 extra = wpabuf_len(group->wfd_ie);
657 if (group->p2p->vendor_elem &&
658 group->p2p->vendor_elem[VENDOR_ELEM_P2P_ASSOC_RESP])
659 extra += wpabuf_len(group->p2p->vendor_elem[VENDOR_ELEM_P2P_ASSOC_RESP]);
672 if (group->wfd_ie)
673 wpabuf_put_buf(resp, group->wfd_ie);
676 if (group->p2p->vendor_elem &&
677 group->p2p->vendor_elem[VENDOR_ELEM_P2P_ASSOC_RESP])
679 group->p2p->vendor_elem[VENDOR_ELEM_P2P_ASSOC_RESP]);
690 void p2p_group_notif_disassoc(struct p2p_group *group, const u8 *addr)
692 if (p2p_group_remove_member(group, addr)) {
693 p2p_dbg(group->p2p, "Remove client " MACSTR
694 " from group; num_members=%u/%u",
695 MAC2STR(addr), group->num_members,
696 group->cfg->max_clients);
697 if (group->num_members == group->cfg->max_clients - 1)
698 group->beacon_update = 1;
699 p2p_group_update_ies(group);
700 if (group->num_members == 0)
701 group->cfg->idle_update(group->cfg->cb_ctx, 1);
713 * WPS IE with the device types of a group member for deciding whether a GO
759 int p2p_group_match_dev_type(struct p2p_group *group, struct wpabuf *wps)
763 if (p2p_match_dev_type(group->p2p, wps))
766 for (m = group->members; m; m = m->next) {
768 return 1; /* Match with group client device type */
776 int p2p_group_match_dev_id(struct p2p_group *group, struct wpabuf *p2p)
788 if (os_memcmp(msg.device_id, group->p2p->cfg->dev_addr, ETH_ALEN) == 0)
791 for (m = group->members; m; m = m->next) {
793 return 1; /* Match with group client P2P Device Address */
801 void p2p_group_notif_formation_done(struct p2p_group *group)
803 if (group == NULL)
805 group->group_formation = 0;
806 group->beacon_update = 1;
807 p2p_group_update_ies(group);
811 int p2p_group_notif_noa(struct p2p_group *group, const u8 *noa,
815 wpabuf_free(group->noa);
816 group->noa = NULL;
818 if (group->noa) {
819 if (wpabuf_size(group->noa) >= noa_len) {
820 group->noa->used = 0;
821 wpabuf_put_data(group->noa, noa, noa_len);
823 wpabuf_free(group->noa);
824 group->noa = NULL;
828 if (!group->noa) {
829 group->noa = wpabuf_alloc_copy(noa, noa_len);
830 if (group->noa == NULL)
835 group->beacon_update = 1;
836 p2p_group_update_ies(group);
841 static struct p2p_group_member * p2p_group_get_client(struct p2p_group *group,
846 for (m = group->members; m; m = m->next) {
855 const u8 * p2p_group_get_client_interface_addr(struct p2p_group *group,
860 if (!group)
862 m = p2p_group_get_client(group, dev_addr);
870 struct p2p_group *group, const u8 *interface_addr)
874 for (m = group->members; m; m = m->next) {
883 const u8 * p2p_group_get_dev_addr(struct p2p_group *group, const u8 *addr)
887 if (group == NULL)
889 m = p2p_group_get_client_iface(group, addr);
910 int p2p_group_go_discover(struct p2p_group *group, const u8 *dev_id,
915 struct p2p_data *p2p = group->p2p;
918 m = p2p_group_get_client(group, dev_id);
920 p2p_dbg(group->p2p, "Requested client was not in this group "
921 MACSTR, MAC2STR(group->cfg->interface_addr));
926 p2p_dbg(group->p2p, "Requested client does not support client discoverability");
930 p2p_dbg(group->p2p, "Schedule GO Discoverability Request to be sent to "
937 /* TODO: Should really use group operating frequency here */
942 group->cfg->interface_addr,
943 group->cfg->interface_addr,
956 const u8 * p2p_group_get_interface_addr(struct p2p_group *group)
958 return group->cfg->interface_addr;
962 u8 p2p_group_presence_req(struct p2p_group *group,
970 m = p2p_group_get_client_iface(group, client_interface_addr);
972 p2p_dbg(group->p2p, "Client was not in this group");
978 if (group->p2p->cfg->get_noa)
979 curr_noa_len = group->p2p->cfg->get_noa(
980 group->p2p->cfg->cb_ctx, group->cfg->interface_addr,
985 p2p_dbg(group->p2p, "Failed to fetch current NoA");
987 p2p_dbg(group->p2p, "No NoA being advertized");
1000 unsigned int p2p_get_group_num_members(struct p2p_group *group)
1002 if (!group)
1005 return group->num_members;
1009 int p2p_client_limit_reached(struct p2p_group *group)
1011 if (!group || !group->cfg)
1014 return group->num_members >= group->cfg->max_clients;
1018 const u8 * p2p_iterate_group_members(struct p2p_group *group, void **next)
1023 iter = group->members;
1036 int p2p_group_is_client_connected(struct p2p_group *group, const u8 *dev_addr)
1040 for (m = group->members; m; m = m->next) {
1049 int p2p_group_is_group_id_match(struct p2p_group *group, const u8 *group_id,
1052 if (group_id_len != ETH_ALEN + group->cfg->ssid_len)
1054 if (os_memcmp(group_id, group->p2p->cfg->dev_addr, ETH_ALEN) != 0)
1056 return os_memcmp(group_id + ETH_ALEN, group->cfg->ssid,
1057 group->cfg->ssid_len) == 0;
1061 void p2p_group_force_beacon_update_ies(struct p2p_group *group)
1063 group->beacon_update = 1;
1064 p2p_group_update_ies(group);
1068 int p2p_group_get_freq(struct p2p_group *group)
1070 return group->cfg->freq;
1074 const struct p2p_group_config * p2p_group_get_config(struct p2p_group *group)
1076 return group->cfg;
1081 int (*group_callback)(struct p2p_group *group,
1094 int p2p_group_get_common_freqs(struct p2p_group *group, int *common_freqs,
1101 if (!group || !common_freqs || !num)
1107 p2p_channels_union(&intersect, &group->p2p->cfg->channels,
1110 p2p_channels_dump(group->p2p,
1114 for (m = group->members; m; m = m->next) {
1117 dev = p2p_get_device(group->p2p, m->dev_addr);
1125 p2p_channels_dump(group->p2p, "Group common channels", &intersect);