From 25794b873063944970b8b807691c465c7f9cb046 Mon Sep 17 00:00:00 2001 From: liulihong Date: Tue, 9 May 2023 17:40:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4libpcap=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liulihong --- thirdparty/libpcap/HPKBUILD | 71 ++++++++++++++++++ thirdparty/libpcap/README.OpenSource | 11 +++ thirdparty/libpcap/README_zh.md | 13 ++++ thirdparty/libpcap/SHA512SUM | 1 + thirdparty/libpcap/docs/hap_integrate.md | 69 +++++++++++++++++ .../libpcap/docs/pic/libpcap_install_dir.png | Bin 0 -> 9240 bytes thirdparty/libpcap/docs/pic/libpcap_test.png | Bin 0 -> 9952 bytes thirdparty/libpcap/docs/pic/libpcap_usage.png | Bin 0 -> 26791 bytes 8 files changed, 165 insertions(+) create mode 100644 thirdparty/libpcap/HPKBUILD create mode 100644 thirdparty/libpcap/README.OpenSource create mode 100644 thirdparty/libpcap/README_zh.md create mode 100644 thirdparty/libpcap/SHA512SUM create mode 100644 thirdparty/libpcap/docs/hap_integrate.md create mode 100644 thirdparty/libpcap/docs/pic/libpcap_install_dir.png create mode 100644 thirdparty/libpcap/docs/pic/libpcap_test.png create mode 100644 thirdparty/libpcap/docs/pic/libpcap_usage.png diff --git a/thirdparty/libpcap/HPKBUILD b/thirdparty/libpcap/HPKBUILD new file mode 100644 index 00000000..f3a2eb5c --- /dev/null +++ b/thirdparty/libpcap/HPKBUILD @@ -0,0 +1,71 @@ +# Contributor: liulihong +# Maintainer: liulihong + +pkgname=libpcap +pkgver=libpcap-1.10.3 +pkgrel=0 +pkgdesc="" +url="" +archs=("armeabi-v7a" "arm64-v8a") +license=("BSD") +depends=() +makedepends=() +install= +source="https://github.com/the-tcpdump-group/$pkgname/archive/refs/tags/$pkgver.tar.gz" +builddir=$pkgname-$pkgver +packagename=$builddir.tar.gz +buildtools="configure" + +source envset.sh +host= +prepare() { + mkdir -p $builddir/$ARCH-build + if [ $ARCH == "armeabi-v7a" ] + then + setarm32ENV + host=arm-linux + fi + if [ $ARCH == "arm64-v8a" ] + then + setarm64ENV + host=aarch64-linux + fi + cd $builddir + cd $OLDPWD +} + +build() { + + cd $builddir/$ARCH-build + ../configure "$@" --host=$host > `pwd`/build.log 2>&1 + make -j4 >> `pwd`/build.log 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir/$ARCH-build + make install >> `pwd`/build.log 2>&1 + cd $OLDPWD + if [ $ARCH == "armeabi-v7a" ] + then + unsetarm32ENV + fi + if [ $ARCH == "arm64-v8a" ] + then + unsetarm64ENV + fi + unset host +} + +check() { + cd $builddir/$ARCH-build + make testprogs >> `pwd`/build.log 2>&1 + cd $OLDPWD + echo "The test must be on an OpenHarmony device!" +} + +cleanbuild(){ + rm -rf ${PWD}/$builddir #${PWD}/packagename +} diff --git a/thirdparty/libpcap/README.OpenSource b/thirdparty/libpcap/README.OpenSource new file mode 100644 index 00000000..2c962321 --- /dev/null +++ b/thirdparty/libpcap/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "libpcap", + "License": "BSD", + "License File": "notes.txt", + "Version Number": "libpcap-1.10.3", + "Owner": "llh_01129@163.com", + "Upstream URL": "https://github.com/the-tcpdump-group/libpcap/archive/refs/tags/libpcap-1.10.3.tar.gz", + "Description": "This directory contains source code for libpcap, a system-independent interface for user-level packet capture. libpcap provides a portable framework for low-level network monitoring." + } +] diff --git a/thirdparty/libpcap/README_zh.md b/thirdparty/libpcap/README_zh.md new file mode 100644 index 00000000..ef6411f5 --- /dev/null +++ b/thirdparty/libpcap/README_zh.md @@ -0,0 +1,13 @@ +# libpcap三方库说明 +## 功能简介 +libpcap是unix/linux平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。 + +## 使用约束 +- IDE版本:DevEco Studio 3.1 Beta2 +- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- 三方库版本:libpcap-1.10.3 +- 当前适配的功能:支持网络数据包捕获 +- [BSD](https://github.com/the-tcpdump-group/libpcap/blob/master/LICENSE) + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/libpcap/SHA512SUM b/thirdparty/libpcap/SHA512SUM new file mode 100644 index 00000000..60b6a958 --- /dev/null +++ b/thirdparty/libpcap/SHA512SUM @@ -0,0 +1 @@ +3e872265d4d3d85637fa00c5851269f3b03035df7a93b9168bb49b7f3965765e000bac8e65b4c69f42c6090fd2cb7bde0304d37efb453cd71d214088dd37cd6b libpcap-libpcap-1.10.3.tar.gz diff --git a/thirdparty/libpcap/docs/hap_integrate.md b/thirdparty/libpcap/docs/hap_integrate.md new file mode 100644 index 00000000..d1401324 --- /dev/null +++ b/thirdparty/libpcap/docs/hap_integrate.md @@ -0,0 +1,69 @@ +# libpcap集成到应用hap +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 +## 开发环境 +- ubuntu20.04 +- [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) +- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) +- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [准备三方库构建环境](../../../tools/README.md#编译环境准备) +- [准备三方库测试环境](../../../tools/README.md#ci环境准备) +## 编译三方库 +- 下载本仓库 + ``` + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/thirdparty/libpcap #三方库libpcap的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── SHA512SUM #三方库校验文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 将libpcap拷贝至tools/main目录下 + ``` + cd tpc_c_cplusplus + cp thirdparty/libpcap tools/main -rf + ``` +- 在tools目录下编译三方库 + 编译环境的搭建参考[准备三方库构建环境](../../../tools/README.md#编译环境准备) + ``` + cd tools + ./build.sh libpcap + ``` +- 三方库头文件及生成的库 + 在tools目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + + ``` + libpcap/arm64-v8a libpcap/armeabi-v7a + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示 + ![thirdparty_install_dir](pic/libpcap_install_dir.png) +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + ``` + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libpcap/${OHOS_ARCH}/lib/libpcap.a) + + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libpcap/${OHOS_ARCH}/include) + ``` + ![tinyxpath_usage](pic/libpcap_usage.png) +## 测试三方库 +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../tools/README.md#ci环境准备) + +进入到构建目录,再去testprogs目录执行./capturetest进行抓包测试(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录,下图是设备联网后应用请求网络数据的抓包测试截图) + + ![tinyxpath_test](pic/libpcap_test.png) + +## 参考资料 +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/libpcap/docs/pic/libpcap_install_dir.png b/thirdparty/libpcap/docs/pic/libpcap_install_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..226559cf34a432574f721332a493eb535238ddea GIT binary patch literal 9240 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 a5_i7&hHdf-3n>1OL;FAY6X(4@fAZg6l5~0i literal 0 HcmV?d00001 diff --git a/thirdparty/libpcap/docs/pic/libpcap_usage.png b/thirdparty/libpcap/docs/pic/libpcap_usage.png new file mode 100644 index 0000000000000000000000000000000000000000..ae647d89969d64a129092be0a5917754d855954d GIT binary patch literal 26791 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�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