一、iperf3作业原理

iperf3主要的功用是测验依据特定途径的带宽,在客户端和服务器端树立衔接(三次握手)后,客户端发送必定巨细的数据报并记下发送的时刻,或许客户端在必定的时刻内发送数据并记下发送的总数据。带宽的巨细等于发送的总数据除以发送的总时刻。对服务器端来说,在衔接树立时刻内,接收的总数据除以所花时刻即为服务器端所测得的带宽。

iperf3测验UDP的功用时,客户端能够指定UDP数据流的速率。客户端发送数据时,将依据客户供给的速率核算数据报发送之间的时延,客户还能够指定发送数据报的巨细。每个发送的数据报包括一个ID号,用来仅有地标识该报文。服务器端则依据该ID号来确认数据报丢掉和乱序。当把UDP报文巨细设置能够将整个报文放入IP层的包(packet)内时,那么UDP所测得的报文丢掉数据即为IP层包的丢掉数据。这供给了一个有用的测验包丢掉状况的办法。数据报传输推迟颤动(Jitter)的测验由服务器端完结,客户发送的报文数据包括有发送时刻戳,服务器端依据该时刻信息和接收到报文的时刻戳来核算传输推迟颤动。传输推迟颤动反映传输进程中是否滑润。因为它是一个相对值,所以并不需求客户端和服务器端时刻同步。

由上介绍我们能够知道iperf3的功用增加了操作体系网络度量的能力,而带着Liteos_A内核的OpenAtom OpenHarmony(以下简称“OpenHarmony”)操作体系现在还不支撑这个功用,特此测验把iperf3移植到支撑Liteos_A内核的OpenHarmony操作体系中,并作此文共享一些心得。

二、iperf3移植进程

iperf3能够运转在Linux和Windows平台下,其运用了标准的POSIX接口,因此将iperf3移植到Liteos_A上,现在Liteos_A支撑用户态和内核态的指令,这个也形成了移植的很大困难,所以以下将2种增加指令的办法都记录下,供读者参阅。

1. 确认库的类型

OpenHarmony有如下几种方针类型:

executable: 生成可执行文件,关于Liteos_A,在目录/bin下能够找到可执行文件

shared_library: 生成.dll或.so动态链接库、关于Liteos_A,在目录/lib或许 /usr/lib下能够找到动态库

static_library: 生成.lib或.a静态链接库

group: 生成依靠联系组

action: 运转脚本以生成文件

依据以上几种类型的描绘可知,将iperf3移植成executable类型的组件最为适宜。

2. 增加库到工程中

将源码下载到Linux下并解压,执行./configure,生成iperf_config.h,将iperf3的源码拷贝到OpenHarmony代码库中适宜的位置,如下将iperf3增加到/third_party目录下。

OpenHarmony Liteos_A内核之iperf3移植心得

需求注意的是非内核态的库不能增加到内核的目录下,否则编译和调试进程中相关的头文件或许找不到。在/vendor/厂商名/产品型号/config.json中的某一子体系下增加组件。

OpenHarmony Liteos_A内核之iperf3移植心得

在 /build/lite/components/子体系名.json中增加组件,如下:

OpenHarmony Liteos_A内核之iperf3移植心得

3. 编写配置BUILD.gn

OpenHarmony Liteos_A内核之iperf3移植心得

移植的iperf3代码目录下需求供给一个gn文件,指明需求编译的代码。此文件能够经过import组件模板函数。一方面,许多引用到的头文件需求逐个增加到体系BUILD.GN中去,import组件模板函数能够省去许多费事;另一方面,头文件有多个,终究还很难确认是哪一个,运用体系配置好的组件模板函数,能够自动匹配。

4. 程序启动入口:将三方库增加到shell指令

  1. 内核态的shell功用不符合POSIX标准,仅供调试运用,本文特记录下其增加指令的办法,此办法分为静态和动态两种办法,增加办法如下:

① 指令源代码包括如下头文件

#include "shell.h"
#include "shcmd.h"

② 静态注册指令办法

第一步:调用SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook),在源文件最后增加这个调用即可。

第二步:在链接选项中增加链接该新增指令项参数。

即在kernel/liteos_a/tools/build/mk/liteos_tables_ldflags.mk中增加相应选项,SHELLCMD_ENTRY的第一个参数前加-u。

此办法增加的shell,在代码编译阶段就已编译进去了,其完成原理是利用了编译器的section特性(也是代码模块化的重要手段),将所有shell指令相关功用都放在一段连续的地址空间,将SHELLCMD_ENTRY宏一层层打开,即可得到下面原型。

LOS_HAL_TABLE_BEGIN(g_shellcmd, shellcmd); //段的开始tag
LOS_HAL_TABLE_END(g_shellcmdEnd, shellcmd); //段的完毕tag
SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook)

如下是编译后生成的map文件中shell段的部分,能够观察到已经经过此办法加入的shell指令。

OpenHarmony Liteos_A内核之iperf3移植心得
OpenHarmony Liteos_A内核之iperf3移植心得

③ 动态注册指令办法

此类办法是在代码运转阶段动态的注册,osCmdReg自身是一个函数,在指令初始化的源代码增加此函数调用。

UINT32 osCmdReg(CmdT ype cmdType, CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)

函数原型在/kernel/liteos_a/shell/full/src/base/shcmd.c 能够找到,基本原理是将动态注册的shell指令加入到动态shell指令链表空间。

2)用户态的shell不用手动增加

增加方针的办法为executable,将程序下载到方针板上,在/bin目录下找到可执行的文件,只要在串口助手中输入 ./bin/可执行文件名,内核即可动态加载可执行的文件(或许输入exec /bin/可执行文件名)。

三、iperf3运用办法介绍

运用iperf3测验时必须将一台主机设置为客户端,一台主机设置为服务器。在Linux环境或许Windows或许OpenHarmony shell交互窗口输入iperf3 -h能够获取iperf3的协助信息。以下介绍几种常见的运用办法:

1. iperf3测验TCP

在默许的状况下,iperf3客户端与指定的监听5201端口的iperf3服务器树立一个TCP会话。

服务端:iperf3 -s
客户端:iperf3 -c 服务器IP   (默许测验10),运用t来设置测验时刻,单位是秒。
例如:iperf3 -c 192.168.99.74 -t 20

运转成果如下:

OpenHarmony Liteos_A内核之iperf3移植心得
OpenHarmony Liteos_A内核之iperf3移植心得

2. iperf3测验UDP

iperf3测验UDP功用时,客户端能够指定UDP数据流的速率。客户端发送数据时,将依据客户端供给的速率核算数据报发送之间的时延。

客户端还能够指定发送数据报的巨细。每个发送的数据报包括一个ID号,用来仅有标识报文,服务器端依据该ID号来确认数据报丢掉和乱序。

当把UDP报文巨细设置能够将整个报文放入IP层的包(packet)内时,那么UDP所测得的报文丢掉数据即为IP层包的丢掉数据,这供给了一个有用的测验包丢掉状况的办法。

数据报传输推迟颤动(Jitter)的测验由服务器端完结,客户发送的报文数据包括有发送时刻戳,服务器端依据该时刻信息和接收到报文的时刻戳来核算传输推迟颤动。传输推迟颤动反映传输进程中是否滑润。因为它是一个相对值,所以并不需求客户端和服务器端时刻同步。测验进程如下:

服务端:iperf3 -s -p 6868  (设定服务端监听6868端口)
Liteos_A shell客户端:./bin/iperf3 -c 172.17.5.159 -p 6868 -u -b 100M

测验成果:

OpenHarmony Liteos_A内核之iperf3移植心得
OpenHarmony Liteos_A内核之iperf3移植心得

  • Jitter(延时改变):用iperf3 UDP测验来测量

  • 数据报丢掉:用iperf3 UDP测验来测量

  • 带宽:经过TCP测验来测量

3. 反向带宽测验

服务端运用的指令不变,客户端需求加上参数-R,在协助信息中,能够看到-R的信息是run in reverse mode (server sends, client receives)

服务端:iperf3 -s -p 6868
客户端:./bin/iperf3 -c 172.17.5.159 -p 6868 -u -b 100M -R

测验成果如下:

OpenHarmony Liteos_A内核之iperf3移植心得
OpenHarmony Liteos_A内核之iperf3移植心得

4. 同步双向带宽测验

客户端加上指令参数 -bidir

服务端:iperf3 -s -p 6868
客户端:./bin/iperf3 -c 172.17.5.159 -p 6868 -u -b 100M -bidir

测验成果如下:

OpenHarmony Liteos_A内核之iperf3移植心得
OpenHarmony Liteos_A内核之iperf3移植心得

四、注意事项和遇到的问题及处理办法

  1. Hi3516有三种下载程序的办法:串口、USB、网口转USB。引荐运用USB来下载程序,运用串口来调试程序。

  2. DevEco Device Tool东西运用USB烧录Hi3516DV300镜像时失败,怎么处理?

OpenHarmony Liteos_A内核之iperf3移植心得

处理办法:

出现这个问题,主要是因为开发者将Device Tool东西装置在体系盘符,在烧录大文件时会因为没有权限导致失败,能够依据以下操作处理:

● 在Windows平台找到装置目录,如图。鼠标右键,选中特点。

●顺次操作,进程5将红框中两个选项都勾选上。

OpenHarmony Liteos_A内核之iperf3移植心得

  1. Hi3516假如带着操作体系是支撑Linux内核的OpenHarmony,第一次下载时,需求格式化,下载完结后,体系启动到boot,就不会引导整个体系应用程序,这时需求点击如下菜单,然后从头拔插USB才能进入整个体系。

OpenHarmony Liteos_A内核之iperf3移植心得

  1. 在编写.gn文件时,假如三方组件为executable,那么第三方库代码中需求有仅有个入口main函数,终究生成一个可执行的指令。

  2. iperf有大版别1,2,3,现在最新的是iperf3,不同的版别间指令参数不同,作业机制有所不同,所以在测验时,服务端和客户端要求运用相同的大版别。例如iperf3服务端不支撑iperf的-u,-指令。

  3. 在运用iperf3进行测验进程中,需求关闭防火墙,否则或许不能进行正常测验,能够提前运用ping测验一下网络是否已通。

  4. 公司网络端的操控也会对测验形成影响,假如测验中发现发送和接收到的数据一直是0,则或许是网络操控端进行了操控,在拔掉外网络的状况,测验出来的成果就会很安稳。

  5. Hi3516主板作为服务端,输入iperf3 -s,然后在PC机上启动客户端进行测验,发现根本不能进行正常测验,原因也是公司网络操控导致,处理办法是将要测验的两个网络接口,接到同一交换机下,然后拔掉外网的网线,能够进行正常测验;或许需求IT开发权限,当然假如不是在公司特定网络环境下,这个现象是不会出现的。

  6. Hi3516需求设置网络才能进行测验,能够运用指令ifconfig来设置,例如:ifconfig eth0172.17.5.253 netmask 255.255.254.0 gateway 172.17.4.1

  7. MSS在OpenHarmony的底层LWIP不支撑,在iperf_connect函数中调用getsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_MAXSEG, &opt, &len),会经过体系调用到达kernel层中的/kernel/liteos_a/compat/posix/src/socket.c, 终究走到底层LWIP的lwip_getsockopt_impl接口,在level IPPROTO_TCP下,关于分支TCP_MAXSEG,没有完成,处理办法是先屏蔽iperf3对此处的操作。同样在调用setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt))时,SO_SNDBUF分支在LWIP也未完成,先屏蔽此处,将发送缓冲区设置成和接收缓冲区同样的巨细。

  8. Liteos_A未完成延时删除,所以调用unlink时会出错,现在处理是先屏蔽此处。

  9. Liteos_A对fprintf的完成也不如Linux,Windows好,所以对help指令输出到stdout上,长字串显现不出来,处理办法是运用fputs替换fprintf。

五、总结

本文从iperf3的作业原理、移植进程、运用办法、注意事项四个方面介绍了将iperf3移植到支撑Liteos_A内核的OpenHarmony操作体系中的办法,希望本篇文章对开发者有所协助。

关于OpenHarmony内核的内容,之前我还介绍了内核目标行列的算法、OpenHarmony LiteOS-M内核事情的运作机制,以及内核IPC机制数据结构,感兴趣的读者能够点击阅览:

《OpenHarmony——内核目标行列之算法详解(上)》、

《OpenHarmony——内核目标行列之算法详解(下)》、

《OpenHarmony——内核目标事情之源码详解》、

《OpenHarmony——内核IPC机制数据结构解析》。