go语言p2p原理 go语言详解( 五 )


P2pStateMachine将发送"P2P_FIND 120"命令给WPAS以触发P2P Device Discovery流程
ctrl_iface.c: : wpa_supplicant_ctrl_iface_process
ctrl_iface.c: : p2p_ctrl_find
P2P_FIND支持三种不同的Discovery Type
· P2P_FIND_START_WITH_FULL: 默认设置 。表示先扫描所有频段,然后再扫描social channels 。这种搜索方式如图7-3所示 。
· P2P_FIND_ONLY_SOCIAL: 只扫描social channels 。它将跳过“ 扫描所有频段” 这一过程 。这种搜索方式能加快搜索的速度 。
· P2P_FIND_PROGRESSIVE: 它和P2P_FIND_START_WITH_FULL类似,只不过在Search State阶段将逐个扫描所有频段
1.P2P设备扫描流程
P2P设备扫描流程从wpas_p2p_find开始
p2p_supplicant.c: : wpas_p2p_find
p2p.c: : p2p_find
p2p_supplicant.c: : wpas_p2p_scan
2.P2P设备扫描结果处理流程
当scan_res_handler不为空的时候,扫描结果将交给scan_res_handler来处理
对P2P设备扫描时将设置scan_res_handler为wpas_p2p_scan_res_handler
p2p_supplicant.c: : wpas_p2p_scan_res_handler
P2pStateMachine的ProvisionDiscoveryState在其EA中将发送形如"P2P_PROV_DISC 8a: 32: 9b: 6c: d1: 80 pbc"的命令给WPAS 去执行, 其核心处理函数是p2p_ctrl_prov_disc
1.PD Request帧发送流程
p2p.c: : p2p_prov_disc_req
p2p_pd.c: : p2p_send_prov_disc_req
2.Action帧接收流程
PD Response帧属于Public Action帧的一种,当收到对端设备发来的PD Response帧后,process_bss_event函数将被调用
3.PD Response帧处理流程
p2p_pd.c: : p2p_process_prov_disc_resp
p2p_supplicant.c: : wpas_prov_disc_resp
wpa_msg将发送P2P_EVENT_PROV_DISC_PBC_RESP( 字符串,值为"P2P-PROV-DISC-PBCRESP") 消息给客户端
P2pStateMachine收到P2P_PROV_DISC_PBC_RSP_EVENT消息后,将在
ProvisionDiscoveryState中调用p2pConnectWithPinDisplay, 该函数内部将发送P2P_CONNECT命令给WPAS
1.P2P_CONNECT处理流程
ctrl_iface.c: : p2p_ctrl_connect
p2p_supplicant.c: : wpas_p2p_connect
2.GON Request发送流程
p2p.c: : p2p_connect
p2p_go_neg.c: : p2p_connect_send
3.GON Response帧处理流程
p2p_go_neg.c: : p2p_process_go_neg_resp
当GON Confirmation帧发送出去后,wifi driver将向WPAS发送一个NL80211_CMD_FRAME_TX_STATUS消息,而该消息将导致driver wrapper发送EVENT_TX_STATUS消息给WPAS
4.EVENT_TX_STATUS处理流程
在events.c中,和P2P以及EVENT_TX_STATUS相关的处理函数是offchannel_send_action_tx_status
offchannel.c: : offchannel_send_action_tx_status
当Group Negotiation完成后,WPAS将新创建一个wpa_supplicant对象,它将用于管理和操作专门用于P2P Group的virtual interface
· 一个interface对应一个wpa_supplicant对象 。
· 此处新创建的wpa_supplicant对象用于GO, 即扮演AP的角色, 专门处理和P2PGroup相关的事情, 其MAC地址为P2P Interface Address 。
· 之前使用的wpa_supplicant用于非P2P Group操作,其MAC地址为P2P DeviceAddress
IPFS(四) 源码解读之-p2p package p2p
import (
"context"
"errors"
"time"
net "gx/ipfs/QmPjvxTpVH8qJyQDnxnsxF9kv9jezKD1kozz1hs3fCGsNh/go-libp2p-net"
manet "gx/ipfs/QmV6FjemM1K8oXjrvuq3wuVWWoU2TLDPmNnKrxHzY3v6Ai/go-multiaddr-net"
ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr"
pro "gx/ipfs/QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN/go-libp2p-protocol"
pstore "gx/ipfs/QmZR2XWVVBCtbgBWnQhWk2xcQfaR3W8faQPriAiaaj7rsr/go-libp2p-peerstore"
p2phost "gx/ipfs/Qmb8T6YBBsjYsVGfrihQLfCJveczZnneSBqBKkYEBWDjge/go-libp2p-host"
peer "gx/ipfs/QmdVrMn1LhB4ybb8hMVaMLXnA8XRSewMnK6YqXKXoTcRvN/go-libp2p-peer"
)
//P2P结构保存当前正在运行的流/监听器的信息

推荐阅读