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协议报文,三层报头和地址开销使得报文开销大,传输效率较低。
+
+
```
-备注:
IPv4地址长度固定4字节,IPv6地址长度固定16字节。
IPv4网络层报头长度20~60字节,IPv6网络层报头长度40字节。
```
-NewIP灵活极简报文头如下图所示,通过LLC Header中的EtherType = 0xEADD标识。Bitmap是一组由0和1组成的二进制序列,每个二进制位的数值用于表示特定目标特性的存在性。
+NewIP支持**可变长多语义地址(最短1字节)**,**可变长定制化报头封装(最短5字节)**,通过精简报文头开销,提升数据传输效率。
-
+NewIP报头开销,相比IPv4节省25.9%,相比IPv6节省44.9%。
-NewIP内核协议栈架构图如下,用户态调用Socket API创建NewIP socket,采用NewIP极简帧头封装进行收发包。
+NewIP载荷传输效率,相比IPv4提高1%,相比IPv6提高2.33%。
-
+| 对比场景 | 报头开销 | 载荷传输效率(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极简帧头封装进行收发包。
+
## 目录
@@ -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组成的二进制序列,每个二进制位的数值用于表示特定目标特性的存在性。
-
+
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
**基础操作步骤:**
+
+
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