Lines Matching refs:group

2  * Wi-Fi Direct - P2P group operations
31 * struct p2p_group - Internal P2P module per-group data
48 struct p2p_group *group, **groups;
50 group = os_zalloc(sizeof(*group));
51 if (group == NULL)
57 os_free(group);
60 groups[p2p->num_groups++] = group;
63 group->p2p = p2p;
64 group->cfg = config;
65 group->group_formation = 1;
66 group->beacon_update = 1;
67 p2p_group_update_ies(group);
68 group->cfg->idle_update(group->cfg->cb_ctx, 1);
70 return group;
83 static void p2p_group_free_members(struct p2p_group *group)
86 m = group->members;
87 group->members = NULL;
88 group->num_members = 0;
97 void p2p_group_deinit(struct p2p_group *group)
102 if (group == NULL)
105 p2p = group->p2p;
108 if (p2p->groups[g] == group) {
118 p2p_group_free_members(group);
119 os_free(group->cfg);
120 wpabuf_free(group->noa);
121 wpabuf_free(group->wfd_ie);
122 os_free(group);
136 static void p2p_group_add_common_ies(struct p2p_group *group,
139 u8 dev_capab = group->p2p->dev_capab, group_capab = 0;
144 if (group->cfg->persistent_group) {
146 if (group->cfg->persistent_group == 2)
149 if (group->p2p->cfg->p2p_intra_bss)
151 if (group->group_formation)
153 if (group->p2p->cross_connect)
155 if (group->num_members >= group->cfg->max_clients)
205 static struct wpabuf * p2p_group_build_beacon_ie(struct p2p_group *group)
212 if (group->p2p->wfd_ie_beacon)
213 extra = wpabuf_len(group->p2p->wfd_ie_beacon);
221 if (group->p2p->wfd_ie_beacon)
222 wpabuf_put_buf(ie, group->p2p->wfd_ie_beacon);
226 p2p_group_add_common_ies(group, ie);
227 p2p_buf_add_device_id(ie, group->p2p->cfg->dev_addr);
228 p2p_group_add_noa(ie, group->noa);
342 wifi_display_build_go_ie(struct p2p_group *group)
349 if (!group->p2p->wfd_ie_probe_resp)
352 wfd_subelems = wpabuf_alloc(wpabuf_len(group->p2p->wfd_ie_probe_resp) +
353 group->num_members * 24 + 100);
356 if (group->p2p->wfd_dev_info)
357 wpabuf_put_buf(wfd_subelems, group->p2p->wfd_dev_info);
358 if (group->p2p->wfd_assoc_bssid)
360 group->p2p->wfd_assoc_bssid);
361 if (group->p2p->wfd_coupled_sink_info)
363 group->p2p->wfd_coupled_sink_info);
368 m = group->members;
381 p2p_dbg(group->p2p, "WFD: WFD Session Info: %u descriptors",
391 static void wifi_display_group_update(struct p2p_group *group)
393 wpabuf_free(group->wfd_ie);
394 group->wfd_ie = wifi_display_build_go_ie(group);
400 static struct wpabuf * p2p_group_build_probe_resp_ie(struct p2p_group *group)
409 p2p_group_add_common_ies(group, p2p_subelems);
410 p2p_group_add_noa(p2p_subelems, group->noa);
413 p2p_buf_add_device_info(p2p_subelems, group->p2p, NULL);
416 if (group->members) {
421 for (m = group->members; m; m = m->next)
432 if (group->wfd_ie) {
433 struct wpabuf *wfd = wpabuf_dup(group->wfd_ie);
442 void p2p_group_update_ies(struct p2p_group *group)
448 wifi_display_group_update(group);
451 probe_resp_ie = p2p_group_build_probe_resp_ie(group);
457 if (group->beacon_update) {
458 beacon_ie = p2p_group_build_beacon_ie(group);
460 group->beacon_update = 0;
466 group->cfg->ie_update(group->cfg->cb_ctx, beacon_ie, probe_resp_ie);
532 static int p2p_group_remove_member(struct p2p_group *group, const u8 *addr)
536 if (group == NULL)
539 m = group->members;
554 group->members = m->next;
556 group->num_members--;
562 int p2p_group_notif_assoc(struct p2p_group *group, const u8 *addr,
567 if (group == NULL)
570 p2p_add_device(group->p2p, addr, 0, NULL, 0, ie, len, 0);
586 p2p_group_remove_member(group, addr);
588 m->next = group->members;
589 group->members = m;
590 group->num_members++;
591 p2p_dbg(group->p2p, "Add client " MACSTR
592 " to group (p2p=%d wfd=%d client_info=%d); num_members=%u/%u",
595 group->num_members, group->cfg->max_clients);
596 if (group->num_members == group->cfg->max_clients)
597 group->beacon_update = 1;
598 p2p_group_update_ies(group);
599 if (group->num_members == 1)
600 group->cfg->idle_update(group->cfg->cb_ctx, 0);
606 struct wpabuf * p2p_group_assoc_resp_ie(struct p2p_group *group, u8 status)
613 if (group->wfd_ie)
614 extra = wpabuf_len(group->wfd_ie);
628 if (group->wfd_ie)
629 wpabuf_put_buf(resp, group->wfd_ie);
641 void p2p_group_notif_disassoc(struct p2p_group *group, const u8 *addr)
643 if (p2p_group_remove_member(group, addr)) {
644 p2p_dbg(group->p2p, "Remove client " MACSTR
645 " from group; num_members=%u/%u",
646 MAC2STR(addr), group->num_members,
647 group->cfg->max_clients);
648 if (group->num_members == group->cfg->max_clients - 1)
649 group->beacon_update = 1;
650 p2p_group_update_ies(group);
651 if (group->num_members == 0)
652 group->cfg->idle_update(group->cfg->cb_ctx, 1);
664 * WPS IE with the device types of a group member for deciding whether a GO
710 int p2p_group_match_dev_type(struct p2p_group *group, struct wpabuf *wps)
714 if (p2p_match_dev_type(group->p2p, wps))
717 for (m = group->members; m; m = m->next) {
719 return 1; /* Match with group client device type */
727 int p2p_group_match_dev_id(struct p2p_group *group, struct wpabuf *p2p)
739 if (os_memcmp(msg.device_id, group->p2p->cfg->dev_addr, ETH_ALEN) == 0)
742 for (m = group->members; m; m = m->next) {
744 return 1; /* Match with group client P2P Device Address */
752 void p2p_group_notif_formation_done(struct p2p_group *group)
754 if (group == NULL)
756 group->group_formation = 0;
757 group->beacon_update = 1;
758 p2p_group_update_ies(group);
762 int p2p_group_notif_noa(struct p2p_group *group, const u8 *noa,
766 wpabuf_free(group->noa);
767 group->noa = NULL;
769 if (group->noa) {
770 if (wpabuf_size(group->noa) >= noa_len) {
771 group->noa->used = 0;
772 wpabuf_put_data(group->noa, noa, noa_len);
774 wpabuf_free(group->noa);
775 group->noa = NULL;
779 if (!group->noa) {
780 group->noa = wpabuf_alloc_copy(noa, noa_len);
781 if (group->noa == NULL)
786 group->beacon_update = 1;
787 p2p_group_update_ies(group);
792 static struct p2p_group_member * p2p_group_get_client(struct p2p_group *group,
797 for (m = group->members; m; m = m->next) {
807 struct p2p_group *group, const u8 *interface_addr)
811 for (m = group->members; m; m = m->next) {
820 const u8 * p2p_group_get_dev_addr(struct p2p_group *group, const u8 *addr)
824 if (group == NULL)
826 m = p2p_group_get_client_iface(group, addr);
847 int p2p_group_go_discover(struct p2p_group *group, const u8 *dev_id,
852 struct p2p_data *p2p = group->p2p;
855 m = p2p_group_get_client(group, dev_id);
857 p2p_dbg(group->p2p, "Requested client was not in this group "
858 MACSTR, MAC2STR(group->cfg->interface_addr));
863 p2p_dbg(group->p2p, "Requested client does not support client discoverability");
867 p2p_dbg(group->p2p, "Schedule GO Discoverability Request to be sent to "
874 /* TODO: Should really use group operating frequency here */
879 group->cfg->interface_addr,
880 group->cfg->interface_addr,
892 const u8 * p2p_group_get_interface_addr(struct p2p_group *group)
894 return group->cfg->interface_addr;
898 u8 p2p_group_presence_req(struct p2p_group *group,
906 m = p2p_group_get_client_iface(group, client_interface_addr);
908 p2p_dbg(group->p2p, "Client was not in this group");
914 if (group->p2p->cfg->get_noa)
915 curr_noa_len = group->p2p->cfg->get_noa(
916 group->p2p->cfg->cb_ctx, group->cfg->interface_addr,
921 p2p_dbg(group->p2p, "Failed to fetch current NoA");
923 p2p_dbg(group->p2p, "No NoA being advertized");
936 unsigned int p2p_get_group_num_members(struct p2p_group *group)
938 return group->num_members;
942 const u8 * p2p_iterate_group_members(struct p2p_group *group, void **next)
947 iter = group->members;
960 int p2p_group_is_client_connected(struct p2p_group *group, const u8 *dev_addr)
964 for (m = group->members; m; m = m->next) {
973 int p2p_group_is_group_id_match(struct p2p_group *group, const u8 *group_id,
976 if (group_id_len != ETH_ALEN + group->cfg->ssid_len)
978 if (os_memcmp(group_id, group->p2p->cfg->dev_addr, ETH_ALEN) != 0)
980 return os_memcmp(group_id + ETH_ALEN, group->cfg->ssid,
981 group->cfg->ssid_len) == 0;