int p2p_group_notif_noa(struct p2p_group *group, const u8 *noa, size_t noa_len) { if (noa == NULL) { wpabuf_free(group->noa); group->noa = NULL; } else { if (group->noa) { if (wpabuf_size(group->noa) >= noa_len) { group->noa->used = 0; wpabuf_put_data(group->noa, noa, noa_len); } else { wpabuf_free(group->noa); group->noa = NULL; } } if (!group->noa) { group->noa = wpabuf_alloc_copy(noa, noa_len); if (group->noa == NULL) return -1; } } group->beacon_update = 1; p2p_group_update_ies(group); return 0; }
struct p2p_group * p2p_group_init(struct p2p_data *p2p, struct p2p_group_config *config) { struct p2p_group *group, **groups; group = os_zalloc(sizeof(*group)); if (group == NULL) return NULL; groups = os_realloc(p2p->groups, (p2p->num_groups + 1) * sizeof(struct p2p_group *)); if (groups == NULL) { os_free(group); return NULL; } groups[p2p->num_groups++] = group; p2p->groups = groups; group->p2p = p2p; group->cfg = config; group->group_formation = 1; group->beacon_update = 1; p2p_group_update_ies(group); group->cfg->idle_update(group->cfg->cb_ctx, 1); return group; }
void p2p_group_notif_disassoc(struct p2p_group *group, const u8 *addr) { struct p2p_group_member *m, *prev; if (group == NULL) return; m = group->members; prev = NULL; while (m) { if (os_memcmp(m->addr, addr, ETH_ALEN) == 0) break; prev = m; m = m->next; } if (m) { if (prev) prev->next = m->next; else group->members = m->next; p2p_group_free_member(m); group->num_members--; wpa_msg(group->p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Remove " "client " MACSTR " from group; num_members=%u/%u", MAC2STR(addr), group->num_members, group->cfg->max_clients); if (group->num_members == group->cfg->max_clients - 1) group->beacon_update = 1; p2p_group_update_ies(group); if (group->num_members == 0) group->cfg->idle_update(group->cfg->cb_ctx, 1); } }
int p2p_group_notif_assoc(struct p2p_group *group, const u8 *addr, const u8 *ie, size_t len) { struct p2p_group_member *m; if (group == NULL) return -1; m = os_zalloc(sizeof(*m)); if (m == NULL) return -1; os_memcpy(m->addr, addr, ETH_ALEN); m->p2p_ie = ieee802_11_vendor_ie_concat(ie, len, P2P_IE_VENDOR_TYPE); if (m->p2p_ie) { m->client_info = p2p_build_client_info(addr, m->p2p_ie, &m->dev_capab, m->dev_addr); } m->next = group->members; group->members = m; group->num_members++; wpa_msg(group->p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Add client " MACSTR " to group (p2p=%d client_info=%d); num_members=%u/%u", MAC2STR(addr), m->p2p_ie ? 1 : 0, m->client_info ? 1 : 0, group->num_members, group->cfg->max_clients); if (group->num_members == group->cfg->max_clients) group->beacon_update = 1; p2p_group_update_ies(group); if (group->num_members == 1) group->cfg->idle_update(group->cfg->cb_ctx, 0); return 0; }
void p2p_group_notif_formation_done(struct p2p_group *group) { if (group == NULL) return; group->group_formation = 0; group->beacon_update = 1; p2p_group_update_ies(group); }
void p2p_group_notif_disassoc(struct p2p_group *group, const u8 *addr) { if (p2p_group_remove_member(group, addr)) { wpa_msg(group->p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Remove " "client " MACSTR " from group; num_members=%u/%u", MAC2STR(addr), group->num_members, group->cfg->max_clients); if (group->num_members == group->cfg->max_clients - 1) group->beacon_update = 1; p2p_group_update_ies(group); if (group->num_members == 0) group->cfg->idle_update(group->cfg->cb_ctx, 1); } }
int p2p_group_notif_assoc(struct p2p_group *group, const u8 *addr, const u8 *ie, size_t len) { struct p2p_group_member *m; if (group == NULL) return -1; p2p_add_device(group->p2p, addr, 0, NULL, 0, ie, len, 0); m = os_zalloc(sizeof(*m)); if (m == NULL) return -1; os_memcpy(m->addr, addr, ETH_ALEN); m->p2p_ie = ieee802_11_vendor_ie_concat(ie, len, P2P_IE_VENDOR_TYPE); if (m->p2p_ie) { m->client_info = p2p_build_client_info(addr, m->p2p_ie, &m->dev_capab, m->dev_addr); } #ifdef CONFIG_WIFI_DISPLAY m->wfd_ie = ieee802_11_vendor_ie_concat(ie, len, WFD_IE_VENDOR_TYPE); #endif /* CONFIG_WIFI_DISPLAY */ p2p_group_remove_member(group, addr); m->next = group->members; group->members = m; group->num_members++; p2p_dbg(group->p2p, "Add client " MACSTR " to group (p2p=%d wfd=%d client_info=%d); num_members=%u/%u", MAC2STR(addr), m->p2p_ie ? 1 : 0, m->wfd_ie ? 1 : 0, m->client_info ? 1 : 0, group->num_members, group->cfg->max_clients); if (group->num_members == group->cfg->max_clients) group->beacon_update = 1; p2p_group_update_ies(group); if (group->num_members == 1) group->cfg->idle_update(group->cfg->cb_ctx, 0); return 0; }
int p2p_group_notif_assoc(struct p2p_group *group, const u8 *addr, const u8 *ie, size_t len) { struct p2p_group_member *m; struct p2p_device *dev = NULL; if (group == NULL) return -1; m = os_zalloc(sizeof(*m)); if (m == NULL) return -1; os_memcpy(m->addr, addr, ETH_ALEN); m->p2p_ie = ieee802_11_vendor_ie_concat(ie, len, P2P_IE_VENDOR_TYPE); if (m->p2p_ie) { m->client_info = p2p_build_client_info(addr, m->p2p_ie, &m->dev_capab, m->dev_addr); } //patched by george@20120305 if(m->dev_addr) { printf("%s-1\n", __func__); dev = p2p_get_device(group->p2p, m->dev_addr); } else if(m->addr) { printf("%s-2\n", __func__); dev = p2p_get_device(group->p2p, m->addr); } else { printf("addr==NULL\n"); } if(dev) { u8 *paddr = NULL; printf("got dev, got interface_addr=" MACSTR", intended_addr=" MACSTR "\n", MAC2STR(dev->interface_addr), MAC2STR(dev->intended_addr)); if(m->addr) paddr = m->addr; else paddr = m->dev_addr; if(paddr) { if(os_memcmp(paddr, dev->intended_addr, ETH_ALEN)) { os_memcpy(dev->intended_addr, paddr, ETH_ALEN); printf("got dev, set intended_addr=" MACSTR "\n", MAC2STR(dev->intended_addr)); } if(os_memcmp(paddr, dev->interface_addr, ETH_ALEN)) { os_memcpy(dev->interface_addr, paddr, ETH_ALEN); printf("got dev, set interface_addr=" MACSTR "\n", MAC2STR(dev->interface_addr)); } } } else { printf("dev==NULL\n"); } m->next = group->members; group->members = m; group->num_members++; wpa_msg(group->p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Add client " MACSTR " to group (p2p=%d client_info=%d); num_members=%u/%u", MAC2STR(addr), m->p2p_ie ? 1 : 0, m->client_info ? 1 : 0, group->num_members, group->cfg->max_clients); if (group->num_members == group->cfg->max_clients) group->beacon_update = 1; p2p_group_update_ies(group); if (group->num_members == 1) group->cfg->idle_update(group->cfg->cb_ctx, 0); return 0; }