一、 概述
authmanager模块是鸿蒙为设备提供认证机制的模块。模块内的主要处理过程包括报文的接收、解密、再次封装、加密、发送的步骤。本文重点介绍当有设备发起身份认证连接请求时,系统是如何管理的。处理过程主要集中在wifi_auth_manager.c文件中。
二、 源码分析
- 当有设备发起连接请求时,首先在trans_service模块建立socket连接,主要在函数 ProcessAuthData() 中实现:
/*
函数功能: 处理listenFd的事件调用accept建立连接生成通信描述符g_dataFd,或者处理g_dataFd的通信事件
函数参数:监听描述符listenFd,可读描述符集合
函数返回值:成功返回true,失败返回false
详细:
*/
static bool ProcessAuthData(int listenFd, const fd_set *readSet)
{
if (readSet == NULL || g_callback == NULL || g_callback->onConnectEvent == NULL ||
g_callback->onDataEvent == NULL) {
return false;
}
//如果有设备发起连接,响应listenFd事件,accept建立socket连接,然后调用回调函数onConnectEvent处理连接事件
if (FD_ISSET(listenFd, readSet)) {
struct sockaddr_in addrClient = {
0};
socklen_t addrLen = sizeof(addrClient);
//建立socket连接
g_dataFd = accept(listenFd, (struct sockaddr *)(&addrClient), &addrLen);
if (g_dataFd < 0) {
//accept函数执行出错
CloseAuthSessionFd(listenFd);
return false;
}
//更新最大描述符值,因为后续需要为select函数提供最大描述符值,select函数需要获得监听集合中所有文件描述符的范围
RefreshMaxFd(g_dataFd);
//响应新连接事件
if (g_callback->onConnectEvent(g_dataFd, inet_ntoa(addrClient.sin_addr)) != 0) {
CloseAuthSessionFd(g_dataFd);
}