openharmony(rk3568)移植tcpdump

我们已经完成了openharmony(ohos_lite)移植tcpdump,参考
openharmony(ohos_lite)移植tcpdump

接下来我们只需要在这个基础上改造适配 rk3568即可。

1、产品引用:把子系统及其组件加入产品定义中,rk3568产品定义文件为
vendor/hihope/rk3568/config.json 添加 tcpdump

    {
      "subsystem": "thirdparty",
      "components": [
        {
          "component": "libuv",
          "features": [
            "use_ffrt = true"
          ]
        }
        ,{ "component": "tcpdump", "features":[ "" ] }
      ]
    },

2、修改libpcap 的BUILD.gn 文件

config("common_config") {
    cflags = [
        "-fpic"
    ]
    defines = [ "BUILDING_PCAP","pcap_EXPORTS","HAVE_CONFIG_H","_GNU_SOURCE"]
}

common_include_dirs = ["//third_party/libpcap"] #通过分析Makefile补充
libpcap_sources =[ ] #通过分析Makefile补充
PLATFORM_C_SRC = ["pcap-linux.c","fad-getad.c"]
MODULE_C_SRC = ["pcap-usb-linux.c","pcap-netfilter-linux.c"]
REMOTE_C_SRC =[]
COMMON_C_SRC =["pcap.c","gencode.c","optimize.c","nametoaddr.c","etherent.c"
,"fmtutils.c","pcap-util.c","savefile.c","sf-pcap.c","sf-pcapng.c"
,"pcap-common.c","pcap-usb-linux-common.c","bpf_image.c","bpf_filter.c","bpf_dump.c"]
GENERATED_C_SRC = ["scanner.c","grammar.c"]

libpcap_sources +=PLATFORM_C_SRC
libpcap_sources +=MODULE_C_SRC
libpcap_sources +=REMOTE_C_SRC
libpcap_sources +=COMMON_C_SRC
libpcap_sources +=GENERATED_C_SRC


# 定义可执行文件目标
if (defined(ohos_lite))
{
    shared_library("libpcap_shared") {
        sources = libpcap_sources
        include_dirs = common_include_dirs
        configs = []
        configs = [ ":common_config" ]
        deps = []
    }
}
else
{
    import("//build/ohos.gni")
    import("//build/ohos/ndk/ndk.gni")
    ohos_shared_library("libpcap_shared") {
        sources = libpcap_sources
        include_dirs = common_include_dirs
        configs = [ ":common_config" ]
        deps = []
        part_name = "libpcap"
        install_enable = true  # 是否默认安装(缺省默认不安装),可选
        install_images = [ "system" ]   
        subsystem_name = "thirdparty"
    }
}

3、修改tcpdump 的BUILD.gn文件

config("common_config") #通过分析Makefile补充
{
  cflags = ["-Wall","-Wextra","-Werror","-g","-O2","-Wno-unused-parameter","-Wno-gnu-variable-sized-type-not-at-end","-Wno-unused-but-set-variable","-Wno-unused-function","-Wno-deprecated-non-prototype"]
  defines = ["HAVE_CONFIG_H","_GNU_SOURCE"]
}
common_include_dirs = [
    "."
    ,"//third_party/libpcap"]  #通过分析Makefile补充
tcpdump_sources =[ ]  #通过分析Makefile补充

common_deps = ["//third_party/libpcap:libpcap_shared"] #通过分析Makefile补充

CSRC = ["fptype.c","tcpdump.c"]
LIBNETDISSECT_SRC = [
"addrtoname.c","addrtostr.c","af.c","ascii_strcasecmp.c","checksum.c","cpack.c","gmpls.c","in_cksum.c","ipproto.c","l2vpn.c",
"machdep.c","netdissect.c","netdissect-alloc.c","nlpid.c","ntp.c","oui.c","parsenfsfh.c","print.c","print-802_11.c","print-802_15_4.c",
"print-ah.c","print-ahcp.c","print-aodv.c","print-aoe.c","print-ap1394.c","print-arcnet.c","print-arista.c","print-arp.c","print-ascii.c","print-atalk.c",
"print-atm.c","print-babel.c","print-bcm-li.c","print-beep.c","print-bfd.c","print-bgp.c","print-bootp.c","print-brcmtag.c","print-bt.c","print-calm-fast.c",
"print-carp.c","print-cdp.c","print-cfm.c","print-chdlc.c","print-cip.c","print-cnfp.c","print-dccp.c","print-decnet.c","print-dhcp6.c"
,"print-domain.c","print-dsa.c","print-dtp.c","print-dvmrp.c","print-eap.c","print-egp.c","print-eigrp.c","print-enc.c","print-esp.c",
"print-ether.c","print-fddi.c","print-forces.c","print-fr.c","print-frag6.c","print-ftp.c","print-geneve.c","print-geonet.c","print-gre.c","print-hncp.c",
"print-hsrp.c","print-http.c","print-icmp.c","print-icmp6.c","print-igmp.c","print-igrp.c","print-ip-demux.c","print-ip.c","print-ip6.c","print-ip6opts.c",
"print-ipcomp.c","print-ipfc.c","print-ipnet.c","print-ipoib.c","print-ipx.c","print-isakmp.c","print-isoclns.c","print-juniper.c","print-krb.c","print-l2tp.c",
"print-lane.c","print-ldp.c","print-lisp.c","print-llc.c","print-lldp.c","print-lmp.c","print-loopback.c","print-lspping.c","print-lwapp.c","print-lwres.c",
"print-m3ua.c","print-macsec.c","print-mobile.c","print-mobility.c","print-mpcp.c","print-mpls.c","print-mptcp.c","print-msdp.c","print-msnlb.c","print-nflog.c",
"print-nfs.c","print-nsh.c","print-ntp.c","print-null.c","print-olsr.c","print-openflow-1.0.c","print-openflow-1.3.c","print-openflow.c","print-ospf.c","print-ospf6.c",
"print-otv.c","print-pflog.c","print-pgm.c","print-pim.c","print-pktap.c","print-ppi.c","print-ppp.c","print-pppoe.c","print-pptp.c","print-ptp.c",
"print-radius.c","print-raw.c","print-realtek.c","print-resp.c","print-rip.c","print-ripng.c","print-rpki-rtr.c","print-rsvp.c","print-rt6.c","print-rtsp.c",
"print-rx.c","print-sctp.c","print-sflow.c","print-sip.c","print-sl.c","print-sll.c","print-slow.c","print-smtp.c","print-snmp.c","print-someip.c","print-ssh.c","print-stp.c",
"print-sunatm.c","print-sunrpc.c","print-symantec.c","print-syslog.c","print-tcp.c","print-telnet.c","print-tftp.c","print-timed.c","print-tipc.c",
"print-token.c","print-udld.c","print-udp.c","print-unsupported.c","print-usb.c","print-vjc.c","print-vqp.c","print-vrrp.c","print-vsock.c","print-vtp.c",
"print-vxlan-gpe.c","print-vxlan.c","print-wb.c","print-whois.c","print-zep.c","print-zephyr.c","print-zeromq.c","signature.c","strtoaddr.c","util-print.c"
]
MISSING_SRC = [
"missing/datalinks.c","missing/dlnames.c","missing/getopt_long.c","missing/getservent.c","missing/pcap_dump_ftell.c","missing/snprintf.c","missing/strdup.c","missing/strlcat.c","missing/strlcpy.c","missing/strsep.c"
]

tcpdump_sources += CSRC
tcpdump_sources += LIBNETDISSECT_SRC
tcpdump_sources += MISSING_SRC

# 定义可执行文件目标
if (defined(ohos_lite))
{
    executable("tcpdump") {
        sources = tcpdump_sources 
        include_dirs = common_include_dirs
        deps = common_deps
        configs += [ ":common_config" ]
    }
}
else
{
    import("//build/ohos.gni")  # 导入编译模板
    ohos_executable("tcpdump") {
        sources = tcpdump_sources 
        include_dirs = common_include_dirs
        deps = common_deps
        configs = [ ":common_config" ]
        
        part_name = "tcpdump"
        install_enable = true  # 是否默认安装(缺省默认不安装),可选
        install_images = [ "system" ]   
        subsystem_name = "thirdparty"        
    }
}

4、编译 hb set 设置 standard --> rk3568
hb build --ccache -T tcpdump

报错

[OHOS ERROR] ../../third_party/libpcap/fmtutils.c:354:6: error: incompatible pointer to integer conversion initializing 'int' with an expression of type 'char *' [-Wint-conversion]
[OHOS ERROR]         int err = strerror_r(errnum, p, errbuflen_remaining);
[OHOS ERROR]             ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[OHOS ERROR] 1 warning and 1 error generated.

解决方法
这个是应为没有引入 import(“//build/ohos.gni”) # 导入编译模板 导致的
修改tcpdump 的BUILD.gn文件 判断没有定义 ohos_lite 的情况下 导入编译模板

报错

../../third_party/tcpdump/missing/strdup.c:41:1: error: a function definition without a prototype is deprecated in all versions of C and is not supported in C2x [-Werror,-Wdeprecated-non-prototype]

解决方法
根据提示添加编译选项 “-Wno-deprecated-non-prototype”

报错

[OHOS ERROR] ../../third_party/tcpdump/missing/snprintf.c:262:1: error: unused function 'xyzprintf' [-Werror,-Wunused-function]
[OHOS ERROR] xyzprintf (struct state *state, const char *char_format, va_list ap)
[OHOS ERROR] ^

解决方法
根据提示添加编译选项 “-Wno-unused-function”

报错

[OHOS ERROR] In file included from ../../third_party/tcpdump/fptype.c:36:
[OHOS ERROR] In file included from ../../third_party/tcpdump/netdissect-stdinc.h:42:
[OHOS ERROR] ../../third_party/tcpdump/ftmacros.h:104:11: error: '_GNU_SOURCE' macro redefined [-Werror,-Wmacro-redefined]
[OHOS ERROR]   #define _GNU_SOURCE
[OHOS ERROR]           ^
[OHOS ERROR] <command line>:2:9: note: previous definition is here
[OHOS ERROR] #define _GNU_SOURCE 1
[OHOS ERROR]         ^
[OHOS ERROR] 1 error generated.

解决方法
代码中找到 #define _GNU_SOURCE 的地方 修改为

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif

重新编译

这里看到编译通过了。

到此 openharmony(rk3568)移植tcpdump 完成了

RK3568芯片组上安装tcpdump通常需要一些Linux环境下的操作步骤。由于rk3568是一种嵌入式系统处理器,具体步骤可能会因使用的Linux发行版(如Ubuntu、Android Things等)以及是否root权限有所不同。以下是一个基本的通用指南: 1. **获取tcpdump源码**: - 如果是在Ubuntu或基于Debian的系统上,可以先更新包列表并安装`build-essential`软件包,然后从apt仓库安装: ``` sudo apt- 对于非官方源,可以从tcpdump的官方网站下载源码tarball。 2. **解压并配置**: ``` wget https://www.tcpdump.org/tcpdump-current.tar.gz tar xvfz tcpdump-current.tar.gz cd tcpdump-* # 进入解压后的目录 ``` 确保你已经配置了适合rk3568架构的内核模块支持,比如选择`--host-endian`选项。 3. **编译和安装**: ``` ./configure --prefix=/usr/local --host=arm-linux-gnueabihf --enable-cross-compiling \ --target=arm-linux-gnueabihf --host-endian --disable-dependency-tracking make sudo make install ``` 4. **添加设备路径**: 如果tcpdump无法访问网络设备,可能需要添加设备路径,这取决于你的硬件设置。在`/sys/class/net`目录下查找对应网络接口的设备文件,例如`eth0`,然后运行类似下面的命令: ``` sudo tee /etc/modules | grep -i tcpdump # 添加到内核模块加载列表 sudo depmod -a # 更新模块 sudo modprobe tcpdump ``` 5. **验证安装**: 最后,你可以通过输入`tcpdump -D`来检查tcpdump是否已成功安装,并列出可用的网络接口。 注意:如果在Android Things环境中,上述步骤可能略有不同,因为它们通常是受限的环境,可能需要在系统的特权沙盒中运行特定版本的tcpdump或者修改系统设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值