【MTK平台】【wpa_supplicant】关于wpa_supplicant_8/src/p2p/p2p.c文件的介绍

本文主要介绍external/wpa_supplicant_8/src/p2p/p2p.c文件

先看下p2p_find 这个方法

P2P_find 主要用于 P2P(点对点)网络中查找其他对等方的功能。另外可以看到设置P2P模块的状态为 P2P_SEARCH

int p2p_find(struct p2p_data *p2p, unsigned int timeout,enum p2p_discovery_type type,unsigned int num_req_dev_types, const u8 *req_dev_types,const u8 *dev_id, unsigned int search_delay,u8 seek_count, const char **seek, int freq, bool include_6ghz)
{int res;struct os_reltime start;p2p_dbg(p2p, "Starting find (type=%d)", type);//确认P2P扫描已经可以使用if (p2p->p2p_scan_running) {p2p_dbg(p2p, "p2p_scan is already running");}p2p_free_req_dev_types(p2p);if (req_dev_types && num_req_dev_types) {p2p->req_dev_types = os_memdup(req_dev_types,num_req_dev_types *WPS_DEV_TYPE_LEN);if (p2p->req_dev_types == NULL)return -1;p2p->num_req_dev_types = num_req_dev_types;}if (dev_id) {os_memcpy(p2p->find_dev_id_buf, dev_id, ETH_ALEN);p2p->find_dev_id = p2p->find_dev_id_buf;} elsep2p->find_dev_id = NULL;p2p->include_6ghz = p2p_wfd_enabled(p2p) && include_6ghz;if (seek_count == 0 || !seek) {/* Not an ASP search */p2p->p2ps_seek = 0;} else if (seek_count == 1 && seek && (!seek[0] || !seek[0][0])) {/** An empty seek string means no hash values, but still an ASP* search.*/p2p_dbg(p2p, "ASP search");p2p->p2ps_seek_count = 0;p2p->p2ps_seek = 1;} else if (seek && seek_count <= P2P_MAX_QUERY_HASH) {u8 buf[P2PS_HASH_LEN];int i, count = 0;for (i = 0; i < seek_count; i++) {if (!p2ps_gen_hash(p2p, seek[i], buf))continue;p2p_dbg(p2p, "Seek service %s hash " MACSTR,seek[i], MAC2STR(buf));os_memcpy(&p2p->p2ps_seek_hash[count * P2PS_HASH_LEN],buf, P2PS_HASH_LEN);count++;}p2p->p2ps_seek_count = count;p2p->p2ps_seek = 1;} else {p2p->p2ps_seek_count = 0;p2p->p2ps_seek = 1;}/* Special case to perform wildcard search */if (p2p->p2ps_seek_count == 0 && p2p->p2ps_seek) {p2p->p2ps_seek_count = 1;os_memcpy(&p2p->p2ps_seek_hash, p2p->wild_card_hash,P2PS_HASH_LEN);}//P2P_AFTER_SCAN_NOTHING表示P2P设备完成scan动作后,无需做其他动作p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;p2p_clear_timeout(p2p);if (p2p->pending_listen_freq) {p2p_dbg(p2p, "Clear pending_listen_freq for p2p_find");p2p->pending_listen_freq = 0;}//停止监听p2p->cfg->stop_listen(p2p->cfg->cb_ctx);p2p->find_pending_full = 0;p2p->find_type = type;if (freq != 2412 && freq != 2437 && freq != 2462 && freq != 60480)p2p->find_specified_freq = freq;elsep2p->find_specified_freq = 0;p2p_device_clear_reported(p2p);os_memset(p2p->sd_query_no_ack, 0, ETH_ALEN);//设置P2P模块的状态为 P2P_SEARCHp2p_set_state(p2p, P2P_SEARCH);p2p->search_delay = search_delay;p2p->in_search_delay = 0;eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);p2p->last_p2p_find_timeout = timeout;if (timeout)//注册一个扫描超时处理任务eloop_register_timeout(timeout, 0, p2p_find_timeout,p2p, NULL);os_get_reltime(&start);switch (type) {case P2P_FIND_START_WITH_FULL:if (freq > 0) {/** Start with the specified channel and then move to* scans for social channels and this specific channel.*/res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx,P2P_SCAN_SPECIFIC, freq,p2p->num_req_dev_types,p2p->req_dev_types, dev_id,DEV_PW_DEFAULT,p2p->include_6ghz);break;}/* fall through */case P2P_FIND_PROGRESSIVE: //p2p_scan指向函数 wpas_p2p_scanres = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_FULL, 0,p2p->num_req_dev_types,p2p->req_dev_types, dev_id,DEV_PW_DEFAULT, p2p->include_6ghz);break;case P2P_FIND_ONLY_SOCIAL:res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_SOCIAL, 0,p2p->num_req_dev_types,p2p->req_dev_types, dev_id,DEV_PW_DEFAULT, p2p->include_6ghz);break;default:return -1;}if (!res)p2p->find_start = start;if (res != 0 && p2p->p2p_scan_running) {p2p_dbg(p2p, "Failed to start p2p_scan - another p2p_scan was already running");/* wait for the previous p2p_scan to complete */if (type == P2P_FIND_PROGRESSIVE ||(type == P2P_FIND_START_WITH_FULL && freq == 0))p2p->find_pending_full = 1;res = 0; /* do not report failure */} else if (res != 0) {p2p_dbg(p2p, "Failed to start p2p_scan");p2p_set_state(p2p, P2P_IDLE);eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);}return res;
}

 接着看下P2P模块的状态为 P2P_SEARCH后如何进行进入listen状态

 也就是p2p_listen_in_find这个方法

static void p2p_listen_in_find(struct p2p_data *p2p, int dev_disc)
{unsigned int r, tu;int freq;struct wpabuf *ies;p2p_dbg(p2p, "Starting short listen state (state=%s)",p2p_state_txt(p2p->state));if (p2p->pending_listen_freq) {/* We have a pending p2p_listen request */p2p_dbg(p2p, "p2p_listen command pending already");return;}//根据 p2p_supplicant.conf中listen_channel等配置参数获取对应的频段freq = p2p_channel_to_freq(p2p->cfg->reg_class, p2p->cfg->channel);if (freq < 0) {p2p_dbg(p2p, "Unknown regulatory class/channel");return;}//计算需要在listen state 等待的时间if (os_get_random((u8 *) &r, sizeof(r)) < 0)r = 0;tu = (r % ((p2p->max_disc_int - p2p->min_disc_int) + 1) +p2p->min_disc_int) * 100;if (p2p->max_disc_tu >= 0 && tu > (unsigned int) p2p->max_disc_tu)tu = p2p->max_disc_tu;if (!dev_disc && tu < 100)tu = 100; /* Need to wait in non-device discovery use cases */if (p2p->cfg->max_listen && 1024 * tu / 1000 > p2p->cfg->max_listen)tu = p2p->cfg->max_listen * 1000 / 1024;if (tu == 0) {p2p_dbg(p2p, "Skip listen state since duration was 0 TU");p2p_set_timeout(p2p, 0, 0);return;}//构造P2P Probe Response帧,当我们在Listen state收到其他设备发来的Probe Request帧后,wifi驱动将直接回复此处设置的 P2P Probe Response帧。ies = p2p_build_probe_resp_ies(p2p, NULL, 0);if (ies == NULL)return;p2p->pending_listen_freq = freq;p2p->pending_listen_sec = 0;p2p->pending_listen_usec = 1024 * tu;//start_listen指向 wpas_start_listen 函数if (p2p->cfg->start_listen(p2p->cfg->cb_ctx, freq, 1024 * tu / 1000,ies) < 0) {p2p_dbg(p2p, "Failed to start listen mode");p2p->pending_listen_freq = 0;}wpabuf_free(ies);
}

在来看p2p_connect函数,其代码如下所示

这里面有3个重要的知识点

1、是 breaker值在每次发起P2P_CONNECT时都取反一次,这样做的目的是在双方的Intent值相同的情况下,多次协商时,双方都有机会做GO。并且在发送Request时才填入自己的breaker值,在回应Response时,是把对方的breaker值取反后作为breaker值发送。

2. 如果当前P2P还在扫描过程中,则设置start_after_scan为P2P_AFTER_SCAN_CONNECT标志,当scan结束后,在扫描结果处理流程中,该标志将通知P2P进入connect处理流程

3.   p2p_connect_send发送GON Request帧

int p2p_connect(struct p2p_data *p2p, const u8 *peer_addr,enum p2p_wps_method wps_method,int go_intent, const u8 *own_interface_addr,unsigned int force_freq, int persistent_group,const u8 *force_ssid, size_t force_ssid_len,int pd_before_go_neg, unsigned int pref_freq, u16 oob_pw_id)
{struct p2p_device *dev;p2p_dbg(p2p, "Request to start group negotiation - peer=" MACSTR"  GO Intent=%d  Intended Interface Address=" MACSTR" wps_method=%d persistent_group=%d pd_before_go_neg=%d ""oob_pw_id=%u allow_6ghz=%d",MAC2STR(peer_addr), go_intent, MAC2STR(own_interface_addr),wps_method, persistent_group, pd_before_go_neg, oob_pw_id,p2p->allow_6ghz);//获取当前设备p2p dev设备的信息dev = p2p_get_device(p2p, peer_addr);if (dev == NULL || (dev->flags & P2P_DEV_PROBE_REQ_ONLY)) {p2p_dbg(p2p, "Cannot connect to unknown P2P Device " MACSTR,MAC2STR(peer_addr));return -1;}// 如果指定了工作频段,则需要判断是否支持该工作频段,否则return -1if (p2p_prepare_channel(p2p, dev, force_freq, pref_freq,go_intent == 15) < 0)return -1;if (dev->flags & P2P_DEV_GROUP_CLIENT_ONLY) {if (!(dev->info.dev_capab &P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY)) {p2p_dbg(p2p, "Cannot connect to P2P Device " MACSTR" that is in a group and is not discoverable",MAC2STR(peer_addr));return -1;}if (dev->oper_freq <= 0) {p2p_dbg(p2p, "Cannot connect to P2P Device " MACSTR" with incomplete information",MAC2STR(peer_addr));return -1;}/** First, try to connect directly. If the peer does not* acknowledge frames, assume it is sleeping and use device* discoverability via the GO at that point.*/}p2p->ssid_set = 0;if (force_ssid) {wpa_hexdump_ascii(MSG_DEBUG, "P2P: Forced SSID",force_ssid, force_ssid_len);os_memcpy(p2p->ssid, force_ssid, force_ssid_len);p2p->ssid_len = force_ssid_len;p2p->ssid_set = 1;}dev->flags &= ~P2P_DEV_NOT_YET_READY;dev->flags &= ~P2P_DEV_USER_REJECTED;dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;dev->flags &= ~P2P_DEV_WAIT_GO_NEG_CONFIRM;if (pd_before_go_neg)dev->flags |= P2P_DEV_PD_BEFORE_GO_NEG;else {dev->flags &= ~P2P_DEV_PD_BEFORE_GO_NEG;/** Assign dialog token and tie breaker here to use the same* values in each retry within the same GO Negotiation exchange.*/dev->dialog_token++;if (dev->dialog_token == 0)dev->dialog_token = 1;dev->tie_breaker = p2p->next_tie_breaker;p2p->next_tie_breaker = !p2p->next_tie_breaker;//这里是对intent的值取反}dev->connect_reqs = 0;dev->go_neg_req_sent = 0;dev->go_state = UNKNOWN_GO;p2p_set_dev_persistent(dev, persistent_group);p2p->go_intent = go_intent;os_memcpy(p2p->intended_addr, own_interface_addr, ETH_ALEN);if (p2p->state != P2P_IDLE)p2p_stop_find(p2p);dev->wps_method = wps_method;dev->oob_pw_id = oob_pw_id;dev->status = P2P_SC_SUCCESS;if (p2p->p2p_scan_running) {p2p_dbg(p2p, "p2p_scan running - delay connect send");
/*
如果当前P2P还在扫描过程中,则设置start_after_scan为P2P_AFTER_SCAN_CONNECT标志,
当scan结束后,在扫描结果处理流程中,该标志将通知P2P进入connect处理流程。
*/p2p->start_after_scan = P2P_AFTER_SCAN_CONNECT;os_memcpy(p2p->after_scan_peer, peer_addr, ETH_ALEN);return 0;}// 下面这个函数将发送GON Request帧return p2p_connect_send(p2p, dev);
}

p2p_set_state和p2p_set_timeout记录了P2P: State和Timeout

void p2p_set_state(struct p2p_data *p2p, int new_state)
{p2p_dbg(p2p, "State %s -> %s",p2p_state_txt(p2p->state), p2p_state_txt(new_state));p2p->state = new_state;if (new_state == P2P_IDLE && p2p->pending_channel) {p2p_dbg(p2p, "Apply change in listen channel");p2p->cfg->reg_class = p2p->pending_reg_class;p2p->cfg->channel = p2p->pending_channel;p2p->pending_reg_class = 0;p2p->pending_channel = 0;}
}void p2p_set_timeout(struct p2p_data *p2p, unsigned int sec, unsigned int usec)
{p2p_dbg(p2p, "Set timeout (state=%s): %u.%06u sec",p2p_state_txt(p2p->state), sec, usec);eloop_cancel_timeout(p2p_state_timeout, p2p, NULL);eloop_register_timeout(sec, usec, p2p_state_timeout, p2p, NULL);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode-简单】剑指 Offer 24. 反转链表(详解)

题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 方法&#xff1a;迭代 思路 定义三个指针&#xff0c;一起往后走&#xff0c;走一步就修改mid指针的next&#xff0c;原本是mid的next 是right&#xff0c;我们修改成l…

安装支持vs2019的MFC(解决MSBuild 错误 MSB8041、MSB8042)

安装支持MFC的vs2019&#xff08;解决MSBuild 错误 MSB8041、MSB8042&#xff09; 常用安装选项解决MSBuild 错误 常用安装选项 解决MSBuild 错误 安装上述勾选内容后&#xff0c;即可解决MSBuild 错误 MSB8041 MSB8041&#xff1a;此项目需要 MFC/ATL 库。 https://learn.mic…

Easy-Es笔记

一、Easy-ES概述 Easy-Es&#xff08;简称EE&#xff09;是一款由国内开发者打造并完全开源的ElasticSearch-ORM框架。在原生 RestHighLevelClient 的基础上&#xff0c;只做增强不做改变&#xff0c;为简化开发、提高效率而生。Easy-Es采用和MP一致的语法设计&#xff0c;降低…

STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

时钟配置HSI主频配置64M 勾选打开8个通道的ADC 使能连续转换模式 配置好串口&#xff0c;选择异步模式配置好需要的开发环境并获取代码 修改main.c 串口重定向 #include "stdio.h" int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch…

Verilog | Round_Robin_Arbiter

重写了权重轮询仲裁&#xff0c;添加lock输入信号&#xff0c;表示请求方收到了仲裁许可&#xff0c;在对应的lock拉低之前&#xff0c;仲裁器不可以开启新的仲裁。 Generics Generic nameTypeValueDescriptionN4 Ports Port nameDirectionTypeDescriptionclkinputrst_ninp…

运维工程师第一阶段windows的学习

文章目录 计算机硬件组成计算机历史计算机硬件组成最重要的三个硬件冯诺依曼体系:组装一台电脑:虚拟机和装系统虚拟机VMware安装系统搭建局域网本地安全策略用户本地安全策略共享文件删除操作系统操作系统分类系统优化常用命令系统的启动和密码破解winodws启动过程windows系统…

牛客上面的约瑟夫环问题

对于本题 我感觉还是链表做起来舒服 数组也可以做 但是数组需要去控制循环 不太好控制 我之前搞了 最后看别人的实现 但是链表搞了一次就搞好了 香的嘞~ 下面是代码 用单链表实现循环 再去删除要删除的人 5个人 数到2 你们在纸上画图 我就不画了 对于数组实现你们可以去…

文件上传漏洞 -- uploadlabs为例

文件上传漏洞原理 一些web应用程序中允许上传图片、视频、头像和许多其他类型的文件到服务器中。 文件上传漏洞就是利用服务端代码对文件上传路径变量过滤不严格将可执行的文件上传到一个到服务器中 &#xff0c;再通过URL去访问以执行恶意代码。 非法用户可以利用上传的恶意脚…

onnxruntime (C++/CUDA) 编译安装

一、克隆及编译 git clone --recursive https://github.com/Microsoft/onnxruntime cd onnxruntime/ git checkout v1.8.0如果克隆的时候报错&#xff1a; 执行以下&#xff1a; apt-get install gnutls-bin git config --global http.sslVerify false git config --global h…

【机器学习】随机森林 – Random forest

随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法&#xff0c;用于解决分类和回归问题。它由多个决策树组成&#xff0c;每个决策树都是一个弱分类器。 随机森林的主要特点包括&#xff1a; 1. 随机选择特征子集&#xff1a;对于每个决策树&#xff0c;随机森林…

20.2 HTML 常用标签

1. head头部标签 <head>标签用于定义网页的头部, 其中的内容是给浏览器读取和解析的, 并不在网页中直接显示给用户. <head>标签通常包含以下一些常见的子标签: - <title>: 定义网页的标题, 在浏览器的标题栏或标签页上显示. - <meta>: 用于设置网页的…

linux学成之路(基础篇)(二十三)MySQL服务(数据库备份——补充)

目录 一、MySQL数据库备份 概述 重要性 造成数据丢失的原因 二、备份类型 一、物理与逻辑角度 一、物理备份 二、逻辑备份 二、数据库备份策略角度 一、完整备份 二、增量备份 三、常见的备份方法 一、物理备份 二、使用专用备份工具 三、通过启用二进制日志增量…

Idea 结合docker-compose 发布项目

Idea 结合docker-compose 发布项目 这里写目录标题 Idea 结合docker-compose 发布项目Docker 开启远程访问功能 添加相应端口配置IDEA 链接Docker配置项目 docker-compose.yml本地还需要安装 dockerwin11 安装本地Docker 可能存在问题 Linux内核不是最新 Docker 开启远程访问功…

银行API安全解决方案

数字经济背景下&#xff0c;外部市场环境的快速变化给商业银行带来很多不确定性&#xff0c;随着银行行业数字化转型进入深水区&#xff0c;银行经营面临新的机遇和挑战。 数字经济是传统银行向开放银行转型发展的重要支撑&#xff0c;开放银行旨在运用数字技术通过开放数据和…

IP协议详解

IP协议详解 IP首部&#xff08;IPv4&#xff09;IP分片IP分片的概念IP分片的原因IP分片的具体实现 IP首部&#xff08;IPv4&#xff09; IP首部最小是20个字节&#xff0c;最大是60个字节。 第一个4字节 版本号&#xff08;Version&#xff09;&#xff0c;4位&#xff1b;用…

详解Mybatis之自动映射 自定义映射问题

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 一、Mybatis中的自动映射是什么&#xff1f;二、Mybatis中的自定义映射是什么&#xff1f;三、为什…

工作纪实34-emoji表情包存储异常,修改db的字段类型

线上问题&#xff0c;发现emojo表情写入数据库出现异常 修改mysql字段的字符集 ALTER TABLE customer_cycle_info MODIFY COLUMN customer_sales_remark varchar(500) CHARACTER SET

【node】使用express+gitee搭建图床,并解决防盗链问题

首先创建一个gitee的项目&#xff0c;详细步骤我就不一一说明 注解&#xff1a;大家记得将这个项目开源&#xff0c;还有记得获取自己的私钥&#xff0c;私钥操作如下&#xff1a; node依赖下载&#xff1a; "axios": "cors": "express"…

IOS自动化测试环境搭建教程

目录 一、前言 二、环境依赖 1、环境依赖项 2、环境需求与支持 三、环境配置 1、xcode安装 2、Git安装 3、Homebrew安装&#xff08;用brew来安装依赖&#xff09; 4、npm和nodejs安装 5、libimobiledevice安装 6、idevicesinstaller安装 7、ios-deploy安装 8、Ca…

安卓的播放器对比与选型(vlc,EXOplayer,Ijkplayer,GSYVideoPlayer)详细过程

安卓的播放器对比与选型&#xff08;vlc&#xff0c;EXOplayer&#xff0c;Ijkplayer&#xff0c;GSYVideoPlayer&#xff09;&#x1f4fa;详细过程 前言一、vlc二、EXOplayer三、Ijkplayer四、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;五、其他的开源播放器jia…