一、 概述
authmanager模块是鸿蒙为设备提供认证机制的模块。模块内的主要处理过程包括报文的接收、解密、再次封装、加密、发送的步骤。备注:该版本的鸿蒙仅实现了基于WiFi即局域网的设备身份认证机制。
本文重点介绍在设备间建立起socket连接之后,系统是如何处理接收到的新数据。处理过程主要集中在wifi_auth_manager.c文件中。
二、 源码分析
- 当有设备发起连接请求时,首先在trans_service模块建立socket连接,建立连接之后,若有设备发送认证请求的数据,将在函数 ProcessDataEvent() 中进行处理,对该函数的阅读理解如下:
/*
函数功能:处理设备间通信(新数据到达)事件
函数参数:fd 用于通信的套接字fd
函数返回值:无
详细:
*/
void ProcessDataEvent(int fd)
{
SOFTBUS_PRINT("[AUTH] ProcessDataEvent fd = %d\n", fd);
AuthConn *conn = FindAuthConnByFd(fd);//通过fd查找认证连接链表中是否已存在该设备
if (conn == NULL) {
SOFTBUS_PRINT("ProcessDataEvent get authConn fail\n");
return;
}
//已存在,则进行下一步
if (conn->db.buf == NULL) {
//如果是第一次通信,则初始化数据缓冲区
//申请用于设备间通信的数据缓冲区内存
conn->db.buf = (char *)malloc(DEFAULT_BUF_SIZE);
if (conn->db.buf == NULL) {
return;
}
//清空数据缓冲区
(void)memset_s(conn->db.buf, DEFAULT_BUF_SIZE, 0, DEFAULT_BUF_SIZE);
conn->db.size = DEFAULT_BUF_SIZE;//默认缓冲区大小1536
conn->db.used = 0;//缓冲区已使用量为0
}
//用局部变量保存数据缓冲区信息,因为参数通过地址传递,防止改变原有地址空间内容
DataBuffer *db = &conn->db;
char *buf = db->buf;
int used = db->used;
int size = db->size;
//接收设备认证过程中传输的数据,预读取size-used大小
int rc = AuthConnRecv(fd, buf, used, size - used, 0);
if (rc == 0) {
//若没有数据,则返回
return;
} else if (rc < 0) {
CloseConn(conn);
return;
}
used += rc;//更新缓冲区已使用空间
int processed = ProcessPackets(conn, buf, size, used);//处理身份认证协议数据包
if (processed > 0) {
used -= processed;