zoukankan      html  css  js  c++  java
  • 移植 iperf 网络性能测试工具到 Android-P

    .

    .

    .

    .

    .

    新开发板使用了 Android-P 的方案,WiFi 刚刚调通,为了测试 WiFi 稳定性,需要使用 iperf 工具。但 Android 并没有提供这个工具,只能自己移植一份了。

    首先下载源代码,下载地址:https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/iperf/source-archive.zip

    解压后删除 Makefile 等不相关的文件,并建立 Android.mk,内容如下:

     1 LOCAL_PATH := $(call my-dir)
     2 
     3 # Device executable.
     4 # =========================================================
     5 
     6 include $(CLEAR_VARS)
     7 
     8 LOCAL_MODULE := iperf
     9 
    10 LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
    11 
    12 LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
    13 
    14 LOCAL_SRC_FILES := $(call all-c-files-under, src)
    15 
    16 LOCAL_CFLAGS := -Wno-error -DIPERF_HOST=0
    17 
    18 LOCAL_MODULE_TAGS := debug
    19 
    20 LOCAL_FORCE_STATIC_EXECUTABLE := true
    21 
    22 include $(BUILD_EXECUTABLE)
    23 
    24 
    25 # Host executable.
    26 # =========================================================
    27 
    28 include $(CLEAR_VARS)
    29 
    30 LOCAL_MODULE := iperf_x86
    31 
    32 LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
    33 
    34 LOCAL_SRC_FILES := $(call all-c-files-under, src)
    35 
    36 LOCAL_CFLAGS := -Wno-error -DIPERF_HOST=1
    37 
    38 LOCAL_LDFLAGS := -static
    39 
    40 LOCAL_MODULE_TAGS := debug
    41 
    42 include $(BUILD_HOST_EXECUTABLE)
    43 
    44 
    45 include $(call first-makefiles-under,$(LOCAL_PATH))

    接下来打开 src/flowlabel.h 文件,在 struct in6_flowlabel_req 结构体的定义外面加上条件编译指令,修改后如下所示:

     1 // It's defined in bionic/libc/kernel/uapi/linux/in6.h
     2 #if IPERF_HOST
     3 struct in6_flowlabel_req
     4 {
     5     struct in6_addr flr_dst;
     6     __u32   flr_label;
     7     __u8    flr_action;
     8     __u8    flr_share;
     9     __u16   flr_flags;
    10     __u16   flr_expires;
    11     __u16   flr_linger;
    12     __u32   __flr_pad;
    13     /* Options in format of IPV6_PKTOPTIONS */
    14 };
    15 #endif 

    IPERF_HOST 这个宏是我们在 Android.mk 里面定义的,因为编译 arm 版 iperf 时,编译参数中会指定 boinic 的库,这个宏会出现重定义的情况。但编译 x86 版本的 iperf 时,不会链接这些库,所以这个结构体必须由本程序来定义。

    接下来打开 src/iperf_api.c 文件,找到 iperf_new_stream(struct iperf_test *, int) 函数,里面有这样的变量定义:

    char template[] = "/tmp/iperf3.XXXXXX";

    由于 Android 没有 /tmp 目录,所以运行的时候会报错,所以我们把这个目录修改为 /data 目录,修改后的代码如下:

    1 #if IPERF_HOST
    2     char template[] = "/tmp/iperf3.XXXXXX";
    3 #else
    4     char template[] = "/data/iperf3.XXXXXX";
    5 #endif

    接下来把 src/config.h.in 重命名为 src/config.h:

    >$ mv src/config.h.in src/config.h

    最后一步,删掉 src/t_uuid.c、src/t_timer.c 和 src/t_units.c 三个文件,否则会出现 main() 函数冲突的错误。
    当然,如果在 Android.mk 中通过 LOCAL_SRC_FILES 变量来指定每个要编译的源文件,再从中排除掉这三个文件也是可以的。不过这样做写的内容比较罗嗦,干脆把它们仨删掉,直接用 LOCAL_SRC_FILES := $(call all-c-files-under, src) 自动包含 src 目录下所有的 .c 文件。

    >$ rm src/t_uuid.c src/t_timer.c src/t_units.c 

    mm 编译后会生成两个文件,分别是 arm 版和 x86 版的可执行程序。

    >$ mm
    Install: out/host/linux-x86/bin/iperf_x86
    Install: out/target/product/msm8909go/system/xbin/iperf

    记录一个遇到的坑:

    一开始编译的时候报这样一个错误:

    error: unused parameter 'argc' [-Werror,-Wunused-parameter]

    main() 函数的 argc 参数没有使用,一般来说报个警告就可以了,为什么直接报成错误了呢?
    后来仔细研究了生成的编译命令发现里面带了 -Werror 参数,这个参数会将 warning 转换为 error,强制要求程序编译期间不能出现警告。
    为了解决这个问题,只需在 Android.mk 中指定 -Wno-error 参数即可:

    LOCAL_CFLAGS := -Wno-error

    iperf 工具的使用很简单,网上有很多教程,这里只给出几个示例。

    启动服务端:

    ># iperf -s

    -s 参数表示以服务端形式启动。
    网上有些文章说如果使用 UDP 协议需要,指定 -u 参数。但经实测后发现,我使用的这个版本,服务端无需指定 -u 就可以支持 TCP 和 UDP 两种协议。

    启动客户端:

    ./iperf_x86 -c 172.16.61.90 -u -t 600 -b 16M

    -c 表示启动客户端,后面跟服务端的 IP 地址。
    -u 表示使用 UDP 协议,不加此参数使用 TCP 协议。
    -t 表示持续执行多少秒的测试,默认10秒。
    -b 表示发送的数据包大小,TCP 默认使用最大带宽,UDP 默认1Mbits。

    TCP 协议适合用来测试最大带宽,UDP 协议适合用来测试丢包率、网络抖动等情况。

  • 相关阅读:
    function to_timestamp(timestamp without time zone, unknown) does not exist
    Xshell连接不上Ubuntu解决方式
    怎样使用MobaXterm上传文件到远程Linux系统 MobaXterm怎么使用连接远程服务器?
    notepad++怎样删除空行
    思维脑图在线制作工具网址
    @ApiImplicitParams
    .bat批出处理文件
    主题模型及其在文本情感分析中的应用
    表达式求职JAVA(转)
    2013华为校园招聘java实现(大家水个回复啊)
  • 原文地址:https://www.cnblogs.com/0xcafebabe/p/10685938.html
Copyright © 2011-2022 走看看