Netlink设计详细资料汇编.docx
- 文档编号:28838904
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:23
- 大小:18.73KB
Netlink设计详细资料汇编.docx
《Netlink设计详细资料汇编.docx》由会员分享,可在线阅读,更多相关《Netlink设计详细资料汇编.docx(23页珍藏版)》请在冰豆网上搜索。
Netlink设计详细资料汇编
Netlink设计详细资料汇编
1引言
1.1编写目的
详细描述etrinf接口各功能块的实现方法。
此文档是《etrainf概要设计》的输出,是软件代码的输入文档。
1.2背景
etrainf用于内核态与用户态的通道,为了提高通信效率,简化设计,模块采用了netlink方式。
1.3定义
参见概要设计
1.4设计依据
《D8135软件概要设计说明书》V0.23.2.2.7EtraInf模块
2软件系统结构
2.1功能需求
参见《终端基础平台软件需求规格说明书》V0.13.1.7Etrainf
2.2etrainf模块提供的接口函数
intEtraInfSend(char*pBuf,intiByteSize,unsignedshorteType);
intEtraInfSendMsg(MSG_NODE*pMsg);
3数据结构
3.1公有数据结构
typedefenum{
CONFLICT_PARA=5,//
RET_REG_CMDFAILED=6
}ETRAINF_KERN_ERR_CODE_e;//etrainf无法统计的出错码
typedefenum{
ETRAINF_MSG=0,/*通过netlink发送消息*/
ETRAINF_OAM=1,/*............oam*/
ETRAINF_DATA=2,/*............语言数据*/
ETRAINF_LOG=3,/*............log*/
ETRAINF_INIT_MSG=4,
ETRAINF_INIT_DATA=5,
ETRAINF_OAM_TO_DSP=6/*直接发送给dsp的oam*/
}ETRAINF_MSGTYPE_e;
#defineNETLINK_ETRAINF17//neilink协议值
#defineETRAINF_MAX_PAYLOAD2048//netlink最大负载
3.1.1用户态
#defineETRAINF_SEND_STACK_SIZE0x1000//用户态send任务堆栈大小
#defineETRAINF_RECV_STACK_SIZE0x1000//用户态recv任务堆栈大小
#defineETRAINF_SEND_PRIORITY200//用户态send任务优先级
#defineETRAINF_RECV_PRIORITY201//用户态recv任务优先级
#defineEF_MAX_DATA_NODE1024//模块提供同时处理的最大数据节点
#defineEF_MAX_TMP_BUFF512//需要etrainf提供零时数据存储区的最大数据节点
3.1.2内核态
无
3.2私有数据结构
typedefstruct{
char*pname;//统计项名称
intiValue;//相应次数
}ETRAINF_STAT_t;//统计计数数据结构
typedefstruct{
structnlmsghdrtNlMsgHdr;
charpDataBuf[0];
}ETRAINF_EMBED_COMM_t;
typedefstruct{
char*pName;//通道名称
intiSockfd;//通道sockfd
intiPid;//该值应该另外赋值的,socket理论上根据pid进行创建
LISTsendList;//通道在用户态的发送队列
int(*HandleRecv)(void*ptNlMsg);//通道的接收回调函数
structnlmsghdr*(*GetNlhdr)(char*buff,intihdrSize);//赋值必须把FreeNode赋上
void(*FreeNode)(void*buff);//释放该通道上数据节点函数
}ETRAINF_CHANN_ATTR_t;
3.2.1用户态
3.2.2内核态
4程序设计说明
4.1.1intEtraInfInit(void)
4.1.1.1程序描述
在平台初始化的时候,调用该函数初始化etrainf模块
4.1.1.2功能
初始化etrainf所需所有资源,包括命令行相关
4.1.1.3性能
无
4.1.1.4输入
无
4.1.1.5输出
无
4.1.1.6返回
成功ETOK,失败ETERRORorRET_REG_CMDFAILED
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1注册命令行regEtraInfUsrCmd()
2.初始化各种锁CreateSem()
3.初始化发送节点etraInfInitNodePool()
4.初始化零时缓存节点etraInfInitTmpBuffPool()
5根据通道创建相应的socketetraInfCreateSocket()
6.初始化各通道发送队列lstInit
7.创建发送任务CreateCommonThread
8创建接收任务CreateCommonThread
4.1.1.8.2内核态
1.注册命令行regEtraInfUsrCmd()
2.创建sock并注册接收回调函数netlink_kernel_create(…EtraInfRecv…)
3.注册sysfs文件系统etraInfRegSysfs()
4.1.2intregEtraInfUsrCmd(void)
4.1.2.1程序描述
注册模块相应命令行
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
成功ETOK,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
调用平台命令行注册接口注册
4.1.1.8.2内核态
调用平台命令行注册接口注册
4.1.2EINT32etraInfInitNodePool()
4.1.2.1程序描述
初始化用户态数据发送节点
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
成功ETOK,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.申请sizeof(ETRAINF_NODE_t)*EF_MAX_DATA_NODE大小空间
2.将申请到的内存分块并连入链表
4.1.1.8.2内核态
无该函数
4.1.2EINT32etraInfInitTmpBuffPool()
4.1.2.1程序描述
初始化用户态零时缓存区节点
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
成功ETOK,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.申请sizeof(ETRAINF_TMP_BUFF_t)*EF_MAX_TMP_BUFF大小空间
2.将申请到的内存分块并连入链表
4.1.1.8.2内核态
无该函数
4.1.2EINT32etraInfCreateSocket(intiPid)
4.1.2.1程序描述
根据传入的pid创建相应socket
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
通道号,也即pid
4.1.2.5输出
无
4.1.1.6返回
成功socketfd,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.根据传入通道号判断是否有相同pid注册过
2.若注册过则执行第3步否则跳到第7步
3.遍历所有注册通道并找到第一个注册该通道号通道,记录其接收处理函数与socketfd
4.判断接收处理函数是否与本次注册一样,若一样则执行第5步,否则跳转至第6步
5.将本次找到的socketfd返回
6.遍历每个通道,将通道号与本次注册一样的接收处理函数全部指向handleConflictChannId函数,跳转至第5步
7.创建socket
8.bind相应地址
9.返回socketfd
4.1.1.8.2内核态
无该函数
4.1.2inthandleConflictChannId(void*iSkfd)
4.1.2.1程序描述
通道创建冲突后的处理函数
4.1.2.2功能
打印提示通道初始化时出错
4.1.2.3性能
无
4.1.2.4输入
void*iSkfd
4.1.2.5输出
无
4.1.1.6返回
ETOK
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
打印socket通道创建冲突
统计信息更新
4.1.1.8.2内核态
无该函数
4.1.2voidetraInfRegSysfs(void)
4.1.2.1程序描述
注册sysfs文件系统
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
无
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
无该函数
4.1.1.8.2内核态
调用内核接口注册相应的sysfs
4.1.2intEtraInfSend(char*pBuf,intiByteSize,unsignedshorteType)
4.1.2.1程序描述
通用发送接口
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
pBuf待发送数据指针
iByteSize待发送数据字节大小
eType数据类型
4.1.2.5输出
无
4.1.1.6返回
成功ETOK,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.根据数据类型转成通道类型
2.传入数据合法性检查
3.获取发送数据节点EtraInfGetNode()
4.判断是否需要拷贝发送数据放到零时缓存区,若不需要则执行第5步否则跳转至第6步
5.根据传入数据找到预留给nl头节点指针,跳转至第7步
6.申请零时缓存节点,并拷贝相应数据EtraInfGetTmpBuff()
7.初始化相应数据结构,放入相应发送队列,释放发送信号量
4.1.1.8.2内核态
1.传入数据合法性检查
2.申请sk_buff
3.填充相应数据
4.调用内核接口发送数据
4.1.2ETRAINF_NODE_t*EtraInfGetNode(void)
4.1.2.1程序描述
分配数据节点
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
ETRAINF_NODE_t*
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
从数据节点list中get节点
4.1.1.8.2内核态
无该函数
4.1.2ETRAINF_TMP_BUFF_t*EtraInfGetTmpBuff(void)
4.1.2.1程序描述
分配临时数据节点
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
ETRAINF_TMP_BUFF_t*
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
从零时数据节点list中get节点
4.1.1.8.2内核态
无该函数
4.1.2void*EtraInfSendThread(void*pVoid)
4.1.2.1程序描述
用户态数据发送任务
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
无
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.等待发送信号量
2.获取发送数据节点EtraInfGetSendData()
3.发送相应数据
4.释放请求数据缓冲区ptDataNode->pFreeExternMMFun()
5.释放数据节点缓冲区EtraInfPutNode()
4.1.1.8.2内核态
无该函数
4.1.2ETRAINF_NODE_t*EtraInfGetSendData()
4.1.2.1程序描述
从发送队列中获得发送数据节点
4.1.2.2功能
按优先级遍历各个通道的发送数据
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
ETRAINF_NODE_t*
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
按优先级遍历各个通道是否有数据发送,如有则立即返回,若无则继续往下一条通道查找
4.1.1.8.2内核态
无该函数
4.1.2voidEtraInfPutNode(ETRAINF_NODE_t*ptDataNode)
4.1.2.1程序描述
将数据节点放回list
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
无
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
将数据放回节点list
4.1.1.8.2内核态
无该函数
4.1.2voidEtraInfPutTmpBuff(ETRAINF_TMP_BUFF_t*ptTmpBuff)
4.1.2.1程序描述
将零时缓冲区放回list
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
无
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
将零时缓存节点放回list
4.1.1.8.2内核态
无该函数
4.1.2intEtraInfSendMsg(MSG_NODE*pMsg)
4.1.2.1程序描述
etrainf提供给msg模块使用接口
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
成功ETOK,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.计算实际发送数据长度
2.获取msg有效数据指针
3.调用EtraInfSend
4.1.1.8.2内核态
1.计算实际发送数据长度
2.得到app_msg出去nl的指针
3.调用EtraInfSend
4.1.2voidEtraInfRecv(structsk_buff*pSkb)
4.1.2.1程序描述
内核态接收数据回调函数
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
*pSkb
4.1.2.5输出
无
4.1.1.6返回
无
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
无该函数
4.1.1.8.2内核态
1.获取sk_buff的nl指针
2.根据收到nl数据的头指针判断数据类型
3.调用相应的接收函数
4.1.2intEtraInfRecvMsg(void*pnl)
4.1.2.1程序描述
内核态处理收到msg消息
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
*pnl
4.1.2.5输出
无
4.1.1.6返回
成功ETOK,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.getMsgNode()
2.调用系统调用recvfrom接收数据,并传入消息的app_msg结构
3.sendmsg
4.1.1.8.2内核态
1.getMsgNode,并初始化相应值
2.将nl收到的app_msg拷贝到申请的消息节点中
3.sendmsg()
4.1.2intEtraInfRecvOAM(void*pnl)
4.1.2.1程序描述
处理收到的oam数据类型
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
成功ETOK,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.用栈空间数组调用recvfrom接收数据
2.调用相应的处理函数
4.1.1.8.2内核态
1.进一步判断数据类型是否需要直接发送给dsp
2.根据判断结果调用相应处理函数
4.1.2intEtraInfRecvDate(void*pnl)
4.1.2.1程序描述
处理收到data数据类型
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
成功ETOK,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.用栈空间数组调用recvfrom接收数据
2.调用相应的处理函数
4.1.1.8.2内核态
调用发送到dsp接口函数
4.1.2intEtraInfRecvLog(void*pnl)
4.1.2.1程序描述
处理收到log数据类型
4.1.2.2功能
无
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
成功ETOK,失败ETERROR
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.用栈空间数组调用recvfrom接收数据
2.调用相应的处理函数
4.1.1.8.2内核态
收到不可能的数据,打印并更新统计信息
4.1.2void*EtraInfRecvThread(void*pVoid)
4.1.2.1程序描述
用户态数据接收任务
4.1.2.2功能
用于接收从内核态上发的nl数据
4.1.2.3性能
无
4.1.2.4输入
无
4.1.2.5输出
无
4.1.1.6返回
无
4.1.1.7算法
无
4.1.1.8流程
4.1.1.8.1用户态
1.使用select判断是否有数据上来,如有则执行第2步,否则循环
2.根据优先级遍历相应通道是否有数据到达,并调用相应接收函数
4.1.1.8.2内核态
无该函数.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Netlink 设计 详细资料 汇编