diff --git a/OAT.xml b/OAT.xml new file mode 100644 index 0000000000000000000000000000000000000000..256ed4367b0011650881f4210d850fcc173713be --- /dev/null +++ b/OAT.xml @@ -0,0 +1,90 @@ + + + + + + COPYING + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README_zh.md b/README_zh.md index 36e5e7bc8992b94885a101a795404400b988a329..9a09cc874763a73f65e5fa27d1a492cac02d60b0 100644 --- a/README_zh.md +++ b/README_zh.md @@ -2,23 +2,34 @@ ## 简介 -NewIP支持可变长多语义地址,可变长定制化报头封装,通过精简报文头开销,提升数据传输效率。 +NewIP(Network 2030 and the Future of IP)由网络5.0联盟,向联合国国际电信联盟(ITU)提议的一项新的网络技术新标准,在现有IP能力基础上,基于未来愿景,满足未来智能机器通信为主的全行业互联网和工业互联网需求。 + +目前WiFi协议报文,三层报头和地址开销使得报文开销大,传输效率较低。 + +![image-20220915162621809](figures/image-20220915162621809.png) ``` -备注: IPv4地址长度固定4字节,IPv6地址长度固定16字节。 IPv4网络层报头长度20~60字节,IPv6网络层报头长度40字节。 ``` -NewIP灵活极简报文头如下图所示,通过LLC Header中的EtherType = 0xEADD标识。Bitmap是一组由0和1组成的二进制序列,每个二进制位的数值用于表示特定目标特性的存在性。 +NewIP支持**可变长多语义地址(最短1字节)**,**可变长定制化报头封装(最短5字节)**,通过精简报文头开销,提升数据传输效率。 -![image-20220901152326770](figures/image-20220901152326770.png) +NewIP报头开销,相比IPv4节省25.9%,相比IPv6节省44.9%。 -NewIP内核协议栈架构图如下,用户态调用Socket API创建NewIP socket,采用NewIP极简帧头封装进行收发包。 +NewIP载荷传输效率,相比IPv4提高1%,相比IPv6提高2.33%。 -![image-20220901152539801](figures/image-20220901152539801.png) +| 对比场景 | 报头开销 | 载荷传输效率(WiFi MTU=1500B,BT MTU=255B) | +| -------------- | ------------ | ------------------------------------------- | +| IPv4 for WiFi | 30+8+20=58 B | (1500-58)/1500=96.13% | +| IPv6 for WiFi | 30+8+40=78 B | (1500-78)/1500=94.8% | +| NewIP for WiFi | 30+8+5=43 B | (1500-43)/1500=97.13% | + +## 系统架构 +NewIP内核协议栈架构图如下,用户态应用程序调用Socket API创建NewIP socket,采用NewIP极简帧头封装进行收发包。 +![image-20220901152539801](figures/image-20220901152539801.png) ## 目录 @@ -26,17 +37,17 @@ NewIP内核协议栈主要代码目录结构如下: ``` /foundation/communication/sfc/newip -├── patches -│ └── linux-5.10 # NewIP内核侵入式修改对应的补丁文件 -└── code - ├── common # NewIP 通用代码 - └── linux # NewIP Linux内核代码 - ├── include # NewIP 头文件 - │ ├── linux - │ ├── net - │ └── uapi - └── net - └── newip # NewIP 功能代码 +├── examples # NewIP 用户态样例代码 +├── code +│ ├── common # NewIP 通用代码 +│ └── linux # NewIP Linux内核代码 +│ ├── include # NewIP 头文件 +│ │ ├── linux +│ │ ├── net +│ │ └── uapi +│ └── net +│ └── newip # NewIP 功能代码 +└── figures # ReadMe 内嵌图例 ``` ## 编译构建 @@ -46,13 +57,27 @@ NewIP内核协议栈使能,需要在对应款型的内核defconfig文件中设 kernel\linux\config\linux-5.10\arch\arm64\configs\rk3568_standard_defconfig ```c -CONFIG_NEWIP=y +CONFIG_NEWIP=y // 使能NewIP内核协议栈 +CONFIG_NEWIP_HOOKS=y // 使能NewIP内核侵入式修改插桩函数注册,使能NewIP的同时必须使用NewIP插桩功能 ``` +另有部分CONFIG被依赖: + +```c +VENDOR_HOOKS=y // 使能内核插桩基础框架 +``` + +备注: + +1. 只在Linux 5.10内核上支持NewIP内核协议栈。 +2. 鸿蒙linux内核要求所有原生内核代码侵入式修改,都要修改成插桩方式。 + + + 代码编译完成后,通过下面命令可以确认newip协议栈代码是否使能成功。 ```c -root@nip-server:~/harmony_master/harmony# find out/ -name *nip*.o +find out/ -name *nip*.o out/rk3568/obj/third_party/glib/glib/glib_source/guniprop.o out/kernel/OBJ/linux-5.10/net/newip/nip_addrconf_core.o out/kernel/OBJ/linux-5.10/net/newip/nip_hdr_decap.o @@ -66,24 +91,50 @@ out/kernel/OBJ/linux-5.10/net/newip/tcp_nip_output.o ```c # CONFIG_NEWIP is not set +# CONFIG_NEWIP_HOOKS is not set ``` ## 说明 -### 报头字段说明 +### 可变长报头格式 -NewIP报文格式由NewIP报头与Payload两部分组成,如下图所示: +NewIP灵活极简报文头如下图所示,通过LLC Header中的EtherType = 0xEADD标识NewIP灵活极简报文。Bitmap是一组由0和1组成的二进制序列,每个二进制位的数值用于表示特定目标特性的存在性。 -![image-20220901155226078](figures/image-20220901155226078.png) +![image-20220915140627223](figures/image-20220915140627223.png) 1) Dispatch:指示封装子类,数值0b0表示其为极简封装子类,长度为1比特;(0b表示后面数值为二进制)。 2) Bitmap:变长,Bitmap默认为紧跟在Dispatch有效位后面的7比特,Bitmap字段长度可持续扩展。Bitmap最后一位置0表示Bitmap结束,最后一位置1表示Bitmap向后扩展1 Byte,直至最后一位置0。 -2) Value: 标识字段的值,长度为1 Byte的整数倍,类型及长度由报头字段语义表确定。 - - - -### 可变长地址格式说明 +3) Value: 标识字段的值,长度为1 Byte的整数倍,类型及长度由报头字段语义表确定。 + +**Bitmap字段定义如下:** + +| 极简Bitmap标识 | Bitops | 字段长度 | 置位策略 | 备注 | +| -------------------------- | ------ | ---------------- | -------------- | --------------------------------------- | +| Bitmap 1st Byte: | | | | | +| 标记位Dispatch | 0 | 不表示具体字段 | 置0 | 0:极简帧,1:普通帧。 | +| TTL | 1 | 1 Byte | 置1 | 剩余跳数。 | +| Total Length | 2 | 2 Byte | UDP置0,TCP置1 | NewIP报文总长度(包含报头长度)。 | +| Next Header | 3 | 1 Byte | 置1 | 协议类型。 | +| Reserve | 4 | 保留 | 置0 | 保留字段。 | +| Dest Address | 5 | 变长(1~8 Byte) | 置1 | 目的地址。 | +| Source Address | 6 | 变长(1~8 Byte) | 由协议自行确定 | 源地址。 | +| 标记位,标志是否有2nd Byte | 7 | 不表示具体字段 | | 0:bitmap结束,1:后跟另外8bit bitmap。 | +| Bitmap 2nd Byte: | | | | | +| Header Length | 0 | 1 Byte | | NewIP报头长度。 | +| Reserve | 1 | 保留 | 置0 | | +| Reserve | 2 | 保留 | 置0 | | +| Reserve | 3 | 保留 | 置0 | | +| Reserve | 4 | 保留 | 置0 | | +| Reserve | 5 | 保留 | 置0 | | +| Reserve | 6 | 保留 | 置0 | | +| 标记位,标志是否有3rd Byte | 7 | 不表示具体字段 | 置0 | 0:bitmap结束,1:后跟另外8bit bitmap。 | + +NewIP数据报头(极简模式)解析遇到新bitmap字段时的处理方法: + +仅解析当前版本协议中已定义的bitmap字段,从第一个未知语义的bitmap字段开始,跳过后面的所有bitmap字段,直接通过header length定位到报文开始位置并解析报文。如果报头中携带了未知语义的bitmap字段,且未携带header length字段,则丢弃该数据包。 + +### 可变长地址格式 NewIP采用自解释编码,编码格式如下所示: @@ -97,7 +148,6 @@ NewIP采用自解释编码,编码格式如下所示: | 0xDD | An 16-bit address, which is 0 + 256 * (0xDD - 0xDD) + the last byte value | 【2字节】221 ~ 255 (0x**DD**DD ~ 0x**DD**FF) | | 0xDE | An 16-bit address, which is 0 + 256 * (0xDE - 0xDD) + the last byte value | 【2字节】256 ~ 511 (0x**DE**00 ~ 0x**DE**FF) | | 0xDF | An 16-bit address, which is 0 + 256 * (0xDF - 0xDD) + the last byte value | 【2字节】512 ~ 767 (0x**DF**00 ~ 0x**DF**FF) | -| | | | | ... | ... | | | 0xF0 | An 16-bit address, which is 0 + 256 * (0xF0 - 0xDD) + the last byte value | 【2字节】4864 ~ 5119 (0x**F0**00 ~ 0x**F0**FF) | | 0xF1 | An 16-bit address is followed | 【3字节】5120 ~ 65535 (0x**F1** 1400 ~ 0x**F1** FFFF) | @@ -107,6 +157,22 @@ NewIP采用自解释编码,编码格式如下所示: ### 接口说明 +NewIP协议socket接口列表如下: + +| 函数 | 输入 | 输出 | 返回值 | 接口具体描述 | +| -------- | ------------------------------------------------------------ | ---------------------------------------------- | ---------------- | ------------------------------------------------------------ | +| socket | int **domain**, int type, int **protocol** | NA | Socket句柄sockfd | 创建NewIP 协议类型socket,并返回socket实例所对应的句柄。**domain参数填写 AF_NINET,表示创建NewIP协议类型socket。protocol参数填写IPPROTO_TCP或IPPROTO_UDP**。 | +| bind | int sockfd, const **struct sockaddr_nin** *myaddr, socklen_t addrlen | NA | int,返回错误码 | 将创建的socket绑定到指定的IP地址和端口上。**myaddr->sin_family填写AF_NINET**。 | +| listen | int socket, int backlog | NA | int,返回错误码 | 服务端监听NewIP地址和端口。 | +| connect | int sockfd, const **struct sockaddr_nin** *addr, aocklen_t addrlen | NA | int,返回错误码 | 客户端创建至服务端的连接。 | +| accept | int sockfd, **struct sockaddr_nin** *address, socklen_t *address_len | NA | 返回socket的fd | 服务端返回已建链成功的socket。 | +| send | int sockfd, const void *msg, int len, unsigned int flags, const **struct sockaddr_nin** *dst_addr, int addrlen | NA | int,返回错误码 | 用于socket已连接的NewIP类型数据发送。 | +| recv | int sockfd, size_t len, int flags, **struct sockaddr_nin** *src_addr, | void **buf, int* *fromlen | int,返回错误码 | 用于socket已连接的NewIP类型数据接收。 | +| close | int sockfd | NA | int,返回错误码 | 关闭socket,释放资源。 | +| ioctl | int sockfd, unsigned long cmd, ... | NA | int,返回错误码 | 对NewIP协议栈相关信息进行查询或更改。 | +| sendto | int sockfd, const void *msg, int len, unsigned int flags, const **struct sockaddr** *dst_addr, int addrlen | NA | int,返回错误码 | 用于socket无连接的NewIP类型数据发送。 | +| recvfrom | int sockfd, size_t len, int flags, | void *buf, struct sockaddr *from, int *fromlen | int,返回错误码 | 用于socket无连接的NewIP类型数据接收。 | + NewIP短地址结构如下: ```c @@ -169,29 +235,9 @@ struct sockaddr_nin { }; ``` +### NewIP收发包代码示例 - -NewIP协议socket接口列表如下: - -| 函数 | 输入 | 输出 | 返回值 | 接口具体描述 | -| -------- | ------------------------------------------------------------ | ---------------------------------------------- | ---------------- | ------------------------------------------------------------ | -| socket | int **domain**, int type, int **protocol** | NA | Socket句柄sockfd | 创建NewIP 协议类型socket,并返回socket实例所对应的句柄。**domain参数填写 AF_NINET,表示创建NewIP协议类型socket。protocol参数填写IPPROTO_TCP或IPPROTO_UDP**。 | -| bind | int sockfd, const **struct sockaddr_nin** *myaddr, socklen_t addrlen | NA | int,返回错误码 | 将创建的socket绑定到指定的IP地址和端口上。**myaddr->sin_family填写AF_NINET**。 | -| listen | int socket, int backlog | NA | int,返回错误码 | 服务端监听NewIP地址和端口 | -| connect | int sockfd, const **struct sockaddr_nin** *addr, aocklen_t addrlen | NA | int,返回错误码 | 客户端创建至服务端的连接 | -| accept | int sockfd, **struct sockaddr_nin** *address, socklen_t *address_len | NA | 返回socket的fd | 服务端返回已建链成功的socket | -| send | int sockfd, const void *msg, int len, unsigned int flags, const **struct sockaddr_nin** *dst_addr, int addrlen | NA | int,返回错误码 | 用于socket已连接的NewIP类型数据发送 | -| recv | int sockfd, size_t len, int flags, **struct sockaddr_nin** *src_addr, | void **buf, int* *fromlen | int,返回错误码 | 用于socket已连接的NewIP类型数据接收 | -| close | int sockfd | NA | int,返回错误码 | 关闭socket,释放资源 | -| ioctl | int sockfd, unsigned long cmd, ... | NA | int,返回错误码 | 对NewIP协议栈相关信息进行查询或更改。 | -| sendto | int sockfd, const void *msg, int len, unsigned int flags, const **struct sockaddr** *dst_addr, int addrlen | NA | int,返回错误码 | 用于socket无连接的NewIP类型数据发送 | -| recvfrom | int sockfd, size_t len, int flags, | void *buf, struct sockaddr *from, int *fromlen | int,返回错误码 | 用于socket无连接的NewIP类型数据接收 | - -### 使用说明 - -NewIP可变长地址配置,路由配置,UDP/TCP收发包demo代码链接如下,NewIP协议栈用户态接口使用方法可以参考demo代码。 - -https://gitee.com/openharmony-sig/communication_sfc_newip/tree/master/examples +NewIP可变长地址配置,路由配置,UDP/TCP收发包demo代码链接如下,NewIP协议栈用户态接口使用方法可以参考[代码仓examples代码](https://gitee.com/openharmony-sig/communication_sfc_newip/tree/master/examples)。 | 文件名 | 功能 | | --------------------- | ----------------------------- | @@ -205,15 +251,17 @@ https://gitee.com/openharmony-sig/communication_sfc_newip/tree/master/examples **基础操作步骤:** +![image-20220915165414926](figures/image-20220915165414926.png) + 1、将demo代码拷贝到Linux编译机上,make clean,make all编译demo代码。 -2、将编译生成二级制文件上传到xxx开发板。 +2、将编译生成二级制文件上传到设备1,设备2。 3、执行“ifconfig xxx up”开启网卡设备,xxx表示网卡名,比如eth0,wlan0。 -4、在1号开发板sh下执行“./nip_addr_cfg_demo server”给服务端配置0xDE00(2字节)变长地址,在2号开发板sh下执行“./nip_addr_cfg_demo client”给客户端配置0x50(1字节)变长地址,通过“cat /proc/net/nip_addr”查看内核地址配置结果。 +4、在设备1的sh下执行“./nip_addr_cfg_demo server”给服务端配置0xDE00(2字节)变长地址,在设备2的sh下执行“./nip_addr_cfg_demo client”给客户端配置0x50(1字节)变长地址,通过“cat /proc/net/nip_addr”查看内核地址配置结果。 -5、在1号开发板sh下执行“./nip_route_cfg_demo server”给服务端配置路由,在2号开发板sh下执行“./nip_route_cfg_demo client”给客户端配置路由,通过“cat /proc/net/nip_route”查看内核路由配置结果。 +5、在设备1的sh下执行“./nip_route_cfg_demo server”给服务端配置路由,在设备2的sh下执行“./nip_route_cfg_demo client”给客户端配置路由,通过“cat /proc/net/nip_route”查看内核路由配置结果。 以上步骤操作完成后,可以进行UDP/TCP收发包,收发包demo默认使用上面步骤中配置的地址和路由。 @@ -268,3 +316,31 @@ Received --1661760203 69254 NIP_TCP # 1 sock 3 success: 2/ 2/no= Received --1661760207 86544 NIP_TCP # 9 sock 3 success: 10/ 10/no= 9 ``` +### selinux规则说明 + +用户态进程操作NewIP socket需要添加selinux policy,否则操作会被拦截。 + +```sh +# base\security\selinux\sepolicy\ohos_policy\xxx\xxx.te +# socket 基础操作 +# avc: denied { create } for pid=540 comm="thread_xxx" scontext=u:r:thread_xxx:s0 tcontext=u:r:thread_xxx:s0 tclass=socket permissive=0 +allow thread_xxx thread_xxx:socket { create bind connect listen accept read write shutdown setopt getopt }; + +# ioctl 操作 +# 操作码在 linux-xxx\include\uapi\linux\sockios.h 中定义 +# 0x8933 : name -> if_index mapping +# 0x8916 : set PA address +# 0x890B : add routing table entry +allowxperm thread_xxx thread_xxx:socket ioctl { 0x8933 0x8916 0x890B }; +``` + +## 相关仓 + +[内核子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E5%86%85%E6%A0%B8%E5%AD%90%E7%B3%BB%E7%BB%9F.md) + +[kernel_linux_5.10](https://gitee.com/openharmony/kernel_linux_5.10) + +[kernel_linux_config](https://gitee.com/openharmony/kernel_linux_config) + +[kernel_linux_build](https://gitee.com/openharmony/kernel_linux_build) + diff --git a/apply_newip.sh b/apply_newip.sh index b8cf28cdc091ef7eb5a865a42d96cc4977e71b9c..bf1cfc2e091c9ff585ad2dea20dbe4f487dccaf2 100644 --- a/apply_newip.sh +++ b/apply_newip.sh @@ -40,6 +40,8 @@ function main() ln -s -f $NEWIP_SOURCE_ROOT/code/linux/include/uapi/linux/nip.h $KERNEL_BUILD_ROOT/include/uapi/linux/nip.h ln -s -f $NEWIP_SOURCE_ROOT/code/linux/include/uapi/linux/nip_icmp.h $KERNEL_BUILD_ROOT/include/uapi/linux/nip_icmp.h + ln -s -f $NEWIP_SOURCE_ROOT/code/linux/include/trace/hooks/nip_hooks.h $KERNEL_BUILD_ROOT/include/trace/hooks/nip_hooks.h + ln -s -f $NEWIP_SOURCE_ROOT/code/linux/net/newip $KERNEL_BUILD_ROOT/net ln -s -f $NEWIP_SOURCE_ROOT/code/common/nip_addr.c $KERNEL_BUILD_ROOT/net/newip/nip_addr.c ln -s -f $NEWIP_SOURCE_ROOT/code/common/nip_addr.h $KERNEL_BUILD_ROOT/net/newip/nip_addr.h @@ -49,10 +51,6 @@ function main() ln -s -f $NEWIP_SOURCE_ROOT/code/common/nip_hdr_decap.c $KERNEL_BUILD_ROOT/net/newip/nip_hdr_decap.c ln -s -f $NEWIP_SOURCE_ROOT/code/common/nip_hdr_encap.c $KERNEL_BUILD_ROOT/net/newip/nip_hdr_encap.c ln -s -f $NEWIP_SOURCE_ROOT/code/common/nip_hdr.h $KERNEL_BUILD_ROOT/net/newip/nip_hdr.h - ln -s -f $NEWIP_SOURCE_ROOT/code/common/nip_addr.c $KERNEL_BUILD_ROOT/net/newip/nip_addr.c - ln -s -f $NEWIP_SOURCE_ROOT/code/common/nip_addr.c $KERNEL_BUILD_ROOT/net/newip/nip_addr.c - ln -s -f $NEWIP_SOURCE_ROOT/code/common/nip_addr.c $KERNEL_BUILD_ROOT/net/newip/nip_addr.c - ln -s -f $NEWIP_SOURCE_ROOT/code/common/nip_addr.c $KERNEL_BUILD_ROOT/net/newip/nip_addr.c cd - } diff --git a/code/linux/include/linux/nip.h b/code/linux/include/linux/nip.h index a80d8b305e5b2d4a8630e7b7677c52168bf0fce5..2d3192e3f376d2fdb2f82169694984d746603f10 100644 --- a/code/linux/include/linux/nip.h +++ b/code/linux/include/linux/nip.h @@ -66,6 +66,4 @@ struct tcp_nip_sock { struct tcp_sock tcp; }; -int find_nip_forward_stamp(struct net *net, void __user *arg); - #endif /* _NIP_H */ diff --git a/code/linux/include/trace/hooks/nip_hooks.h b/code/linux/include/trace/hooks/nip_hooks.h new file mode 100644 index 0000000000000000000000000000000000000000..9d8c14df698279c1cf4995963f0a205b8fc2bab3 --- /dev/null +++ b/code/linux/include/trace/hooks/nip_hooks.h @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * NewIP Hooks + * + * Copyright (c) 2022, Huawei Tech. Co., Ltd. + */ +#ifdef CONFIG_NEWIP_HOOKS + +/* include/trace/hooks/nip_hooks.h */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM nip_hooks /* Header file name */ +#define TRACE_INCLUDE_PATH trace/hooks /* Header file directory */ + +/* Header files prevent duplicate definitions */ +#if !defined(_TRACE_HOOK_NIP_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_NIP_H +#include +#include + +struct net; +struct nip_addr; +DECLARE_HOOK(ninet_ehashfn_hook, + TP_PROTO(const struct net *net, const struct nip_addr *laddr, const u16 lport, + const struct nip_addr *faddr, const __be16 fport, u32 *ret), + TP_ARGS(net, laddr, lport, faddr, fport, ret) +); +#endif /* end of _TRACE_HOOK_NIP_H */ + +/* This part must be outside protection */ +#include + +#endif /* end of CONFIG_NEWIP_HOOKS */ \ No newline at end of file diff --git a/code/linux/net/newip/Makefile b/code/linux/net/newip/Makefile index c97368ec8555c534beb118fbdfd4810057dc32ab..5cf03070cc2e4f393adc8a742a8f4e312769341d 100644 --- a/code/linux/net/newip/Makefile +++ b/code/linux/net/newip/Makefile @@ -7,7 +7,9 @@ obj-$(CONFIG_NEWIP) += newip.o - newip-objs := nip_addr.o nip_hdr_encap.o nip_hdr_decap.o nip_checksum.o af_ninet.o nip_input.o udp.o protocol.o nip_output.o datagram.o nip_addrconf.o nip_addrconf_core.o route.o nip_fib.o nip_fib_rules.o nndisc.o icmp.o tcp_nip_parameter.o newip-objs += tcp_nip.o ninet_connection_sock.o ninet_hashtables.o tcp_nip_output.o tcp_nip_input.o tcp_nip_timer.o nip_sockglue.o -EXTRA_CFLAGS := -I$(src)/include + +ifeq ($(CONFIG_NEWIP_HOOKS), y) +newip-objs += nip_hooks_register.o +endif diff --git a/code/linux/net/newip/af_ninet.c b/code/linux/net/newip/af_ninet.c index 06a7c85e4b79478c1f092f2f6bf12ca404f6bc24..3d8dbddc3fa62ff69f081499d777c5e9b8872f1b 100644 --- a/code/linux/net/newip/af_ninet.c +++ b/code/linux/net/newip/af_ninet.c @@ -44,7 +44,12 @@ #include #include -MODULE_DESCRIPTION("NewiIP protocol stack for linux"); +#ifdef CONFIG_NEWIP_HOOKS +#include +#include "nip_hooks_register.h" +#endif + +MODULE_DESCRIPTION("NewIP protocol stack"); /* The inetsw_nip table contains everything that ninet_create needs to * build a new socket @@ -730,6 +735,13 @@ static int __init ninet_init(void) goto nip_packet_fail; } +#ifdef CONFIG_NEWIP_HOOKS + err = ninet_hooks_register(); + if (err) { + DEBUG("failed to register to nip hooks"); + goto nip_packet_fail; + } +#endif DEBUG("NewIP: init newip address family ok!"); out: diff --git a/code/linux/net/newip/hooks/Kconfig b/code/linux/net/newip/hooks/Kconfig new file mode 100644 index 0000000000000000000000000000000000000000..83e2e44cc8e3cd8f81aa4324543d31badf4c966d --- /dev/null +++ b/code/linux/net/newip/hooks/Kconfig @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Copyright (c) 2022 Huawei Device Co., Ltd. +# +# NewIP Hooks configuration +# + +menu "NewIP Hooks" + +config NEWIP_HOOKS + tristate "NewIP Hooks" + depends on VENDOR_HOOKS && NEWIP + default n + help + Enable NewIP hooks implemented as tracepoints + + Allow NewIP modules to attach to tracepoint "hooks" defined via + DECLARE_TRACE or DECLARE_HOOK + +endmenu diff --git a/code/linux/net/newip/hooks/Makefile b/code/linux/net/newip/hooks/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..62e5a04a535040ef46707d4790267a2fadd37b6b --- /dev/null +++ b/code/linux/net/newip/hooks/Makefile @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (c) 2022 Huawei Device Co., Ltd. +# +# Makefile for NewIP Hooks +# + +ccflags-y += -I$(src) # needed for trace events + +obj-$(CONFIG_NEWIP_HOOKS) += nip_hooks.o diff --git a/code/linux/net/newip/hooks/nip_hooks.c b/code/linux/net/newip/hooks/nip_hooks.c new file mode 100644 index 0000000000000000000000000000000000000000..af110c6fe0d7f014e9cc7a690b78c3401996c5d8 --- /dev/null +++ b/code/linux/net/newip/hooks/nip_hooks.c @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * + * NewIP Hooks + */ +#define CREATE_TRACE_POINTS +#include +#include + +#ifdef CONFIG_NEWIP_HOOKS +EXPORT_TRACEPOINT_SYMBOL_GPL(ninet_ehashfn_hook); +#endif diff --git a/code/linux/net/newip/ninet_hashtables.c b/code/linux/net/newip/ninet_hashtables.c index 0a7353edebd1c5851a40b4b18c2d0f8727cca70c..b777636d1effb4f097de47080ee93fe7faa5d5ba 100644 --- a/code/linux/net/newip/ninet_hashtables.c +++ b/code/linux/net/newip/ninet_hashtables.c @@ -335,6 +335,7 @@ static inline int nip_tcp_compute_score(struct sock *sk, struct net *net, return score; } +/* nip reuseport */ static struct sock *ninet_lhash2_lookup(struct net *net, struct inet_listen_hashbucket *ilb2, struct sk_buff *skb, int doff, diff --git a/code/linux/net/newip/nip_hooks_register.c b/code/linux/net/newip/nip_hooks_register.c new file mode 100644 index 0000000000000000000000000000000000000000..5122286fc1c3d0e9f5df51ffd48ffc3eabf31be1 --- /dev/null +++ b/code/linux/net/newip/nip_hooks_register.c @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * + * Definitions for the NewIP Hooks Register module. + */ +#ifdef CONFIG_NEWIP_HOOKS +#include /* ninet_ehashfn */ +#include + +void ninet_ehashfn_hook(void *data, const struct net *net, + const struct nip_addr *laddr, const u16 lport, + const struct nip_addr *faddr, const __be16 fport, u32 *ret) +{ + *ret = ninet_ehashfn(net, laddr, lport, faddr, fport); +} + +int ninet_hooks_register(void) +{ + int ret; + + ret = register_trace_ninet_ehashfn_hook(&ninet_ehashfn_hook, NULL); + if (ret) { + DEBUG("failed to register to ninet_ehashfn_hook"); + return -1; + } + + return 0; +} +#endif /* CONFIG_NEWIP_HOOKS */ + diff --git a/code/linux/net/newip/nip_hooks_register.h b/code/linux/net/newip/nip_hooks_register.h new file mode 100644 index 0000000000000000000000000000000000000000..1d3a0e05957ebabe16530beefe3cd0408807be0e --- /dev/null +++ b/code/linux/net/newip/nip_hooks_register.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * + * Definitions for the NewIP Hooks Register module. + */ +#ifndef _NIP_HOOKS_REGISTER_H +#define _NIP_HOOKS_REGISTER_H + +#ifdef CONFIG_NEWIP_HOOKS +int ninet_hooks_register(void); +#endif + +#endif /* _NIP_HOOKS_REGISTER_H */ diff --git a/figures/image-20220901152326770.png b/figures/image-20220901152326770.png deleted file mode 100644 index 37823919b253df5831f619fdca0201836e5955a5..0000000000000000000000000000000000000000 Binary files a/figures/image-20220901152326770.png and /dev/null differ diff --git a/figures/image-20220901155226078.png b/figures/image-20220901155226078.png deleted file mode 100644 index 5fe124d9130d2bea74d6c6efca190c1bb24de7c3..0000000000000000000000000000000000000000 Binary files a/figures/image-20220901155226078.png and /dev/null differ diff --git a/figures/image-20220915140627223.png b/figures/image-20220915140627223.png new file mode 100644 index 0000000000000000000000000000000000000000..5d27f2620ca837e6b90416e16aa7456919762104 Binary files /dev/null and b/figures/image-20220915140627223.png differ diff --git a/figures/image-20220915162621809.png b/figures/image-20220915162621809.png new file mode 100644 index 0000000000000000000000000000000000000000..76a2d26c0af54daf903d70b8cee350bf34e83c78 Binary files /dev/null and b/figures/image-20220915162621809.png differ diff --git a/figures/image-20220915165414926.png b/figures/image-20220915165414926.png new file mode 100644 index 0000000000000000000000000000000000000000..5635e7de0f5ff8a0f02fe778c5f38803e3f1b05a Binary files /dev/null and b/figures/image-20220915165414926.png differ