160 lines
5.5 KiB
Diff
160 lines
5.5 KiB
Diff
From 3f288faeec7a7345b59dfa9cbecf8507008c8a6b Mon Sep 17 00:00:00 2001
|
|
From: gaoxingwang <gxw94linux@163.com>
|
|
Date: Tue, 1 Nov 2022 11:14:05 +0800
|
|
Subject: [PATCH] add sysctl to change opcode dynamic
|
|
|
|
---
|
|
src/toa.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
|
|
src/toa.h | 3 ---
|
|
2 files changed, 54 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/src/toa.c b/src/toa.c
|
|
index 931607d..2de3442 100644
|
|
--- a/src/toa.c
|
|
+++ b/src/toa.c
|
|
@@ -15,12 +15,16 @@
|
|
* GNU General Public License for more details.
|
|
*
|
|
*/
|
|
+#include <net/net_namespace.h>
|
|
#include "toa.h"
|
|
/*
|
|
* TOA: Address is a new TCP Option
|
|
* Address include ip+port, Now support IPV4 and IPV6
|
|
*/
|
|
|
|
+static unsigned int sysctl_toa_opcode_v4 = 254;
|
|
+static unsigned int sysctl_toa_opcode_v6 = 254;
|
|
+
|
|
#if defined(CONFIG_ARM64)
|
|
/*
|
|
* ARM64 interface
|
|
@@ -436,7 +440,7 @@ static void *get_toa_data(int af, struct sk_buff *skb, int *nat64)
|
|
if (opsize > length)
|
|
/* don't parse partial options */
|
|
return NULL;
|
|
- if (TCPOPT_TOA == opcode &&
|
|
+ if (sysctl_toa_opcode_v4 == opcode &&
|
|
TCPOLEN_IP4_TOA == opsize) {
|
|
|
|
struct toa_ip4_data tdata;
|
|
@@ -479,7 +483,7 @@ static void *get_toa_data(int af, struct sk_buff *skb, int *nat64)
|
|
}
|
|
|
|
#if (defined(TOA_IPV6_ENABLE) || defined(TOA_NAT64_ENABLE))
|
|
- if (TCPOPT_TOA == opcode &&
|
|
+ if (sysctl_toa_opcode_v6 == opcode &&
|
|
TCPOLEN_IP6_TOA == opsize) {
|
|
struct toa_ip6_data *ptr_toa_ip6;
|
|
struct toa_ip6_entry *ptr_toa_entry =
|
|
@@ -552,7 +556,7 @@ inet_getname_toa(struct socket *sock, struct sockaddr *uaddr,
|
|
if (sk_data_ready_addr == (unsigned long) sk->sk_data_ready &&
|
|
!sock_flag(sk, SOCK_NAT64)) {
|
|
memcpy(&tdata, &sk->sk_user_data, sizeof(tdata));
|
|
- if (TCPOPT_TOA == tdata.opcode &&
|
|
+ if (sysctl_toa_opcode_v4 == tdata.opcode &&
|
|
TCPOLEN_IP4_TOA == tdata.opsize) {
|
|
TOA_INC_STATS(ext_stats, GETNAME_TOA_OK_CNT);
|
|
TOA_DBG("inet_getname_toa: set new sockaddr, ip "
|
|
@@ -639,7 +643,7 @@ inet64_getname_toa(struct sock *sk, int cmd, void __user *user, int *len)
|
|
ptr_ip6_entry = sk->sk_user_data;
|
|
ptr_ip6_data = &ptr_ip6_entry->toa_data;
|
|
|
|
- if (TCPOPT_TOA == ptr_ip6_data->opcode &&
|
|
+ if (sysctl_toa_opcode_v6 == ptr_ip6_data->opcode &&
|
|
TCPOLEN_IP6_TOA == ptr_ip6_data->opsize) {
|
|
TOA_INC_STATS(ext_stats, GETNAME_TOA_OK_CNT);
|
|
TOA_DBG("inet64_getname_toa: set new sockaddr, ip "
|
|
@@ -720,7 +724,7 @@ inet6_getname_toa(struct socket *sock, struct sockaddr *uaddr,
|
|
struct toa_ip6_data* ptr_ip6_data = &ptr_ip6_entry->toa_data;
|
|
|
|
if (sk == ptr_ip6_entry->sk &&
|
|
- TCPOPT_TOA == ptr_ip6_data->opcode &&
|
|
+ sysctl_toa_opcode_v6 == ptr_ip6_data->opcode &&
|
|
TCPOLEN_IP6_TOA == ptr_ip6_data->opsize) {
|
|
TOA_INC_STATS(ext_stats, GETNAME_TOA_OK_CNT);
|
|
TOA_DBG("inet6_getname_toa: set new sockaddr, ip "
|
|
@@ -1124,6 +1128,38 @@ static void proc_net_remove(struct net *net, const char *name)
|
|
}
|
|
#endif
|
|
|
|
+static unsigned int byte_min = 0;
|
|
+static unsigned int byte_max = 255;
|
|
+static struct ctl_table toa_v4_sysctl_table[] = {
|
|
+ {
|
|
+ .procname = "toa_opcode_v4",
|
|
+ .data = &sysctl_toa_opcode_v4,
|
|
+ .maxlen = sizeof(unsigned int),
|
|
+ .mode = 0644,
|
|
+ .proc_handler = proc_dointvec_minmax,
|
|
+ .extra1 = &byte_min,
|
|
+ .extra2 = &byte_max,
|
|
+ },
|
|
+ {
|
|
+ },
|
|
+};
|
|
+
|
|
+static struct ctl_table toa_v6_sysctl_table[] = {
|
|
+ {
|
|
+ .procname = "toa_opcode_v6",
|
|
+ .data = &sysctl_toa_opcode_v6,
|
|
+ .maxlen = sizeof(unsigned int),
|
|
+ .mode = 0644,
|
|
+ .proc_handler = proc_dointvec_minmax,
|
|
+ .extra1 = &byte_min,
|
|
+ .extra2 = &byte_max,
|
|
+ },
|
|
+ {
|
|
+ },
|
|
+};
|
|
+static struct ctl_table_header *toa_v4_sysctl_header = NULL;
|
|
+static struct ctl_table_header *toa_v6_sysctl_header = NULL;
|
|
+
|
|
/* module init */
|
|
static int __init
|
|
toa_init(void)
|
|
@@ -1140,6 +1176,16 @@ toa_init(void)
|
|
|
|
TOA_INFO("TOA " TOA_VERSION " by qlb of iqiyi.\n");
|
|
|
|
+ toa_v4_sysctl_header = register_net_sysctl(&init_net, "net/ipv4", toa_v4_sysctl_table);
|
|
+ if (NULL == toa_v4_sysctl_header) {
|
|
+ TOA_INFO("register toa v4 sysctl failed\n");
|
|
+ }
|
|
+
|
|
+ toa_v6_sysctl_header = register_net_sysctl(&init_net, "net/ipv6", toa_v6_sysctl_table);
|
|
+ if (NULL == toa_v4_sysctl_header) {
|
|
+ TOA_INFO("register toa v6 sysctl failed\n");
|
|
+ }
|
|
+
|
|
/* alloc statistics array for toa */
|
|
ext_stats = alloc_percpu(struct toa_stat_mib);
|
|
if (NULL == ext_stats)
|
|
@@ -1215,6 +1261,9 @@ toa_exit(void)
|
|
unregister_kprobe(&kp);
|
|
#endif
|
|
|
|
+ unregister_sysctl_table(toa_v4_sysctl_header);
|
|
+ unregister_sysctl_table(toa_v6_sysctl_header);
|
|
+
|
|
proc_net_remove(&init_net, "toa_stats");
|
|
if (NULL != ext_stats) {
|
|
free_percpu(ext_stats);
|
|
diff --git a/src/toa.h b/src/toa.h
|
|
index 64095c3..6c64c61 100644
|
|
--- a/src/toa.h
|
|
+++ b/src/toa.h
|
|
@@ -61,9 +61,6 @@
|
|
printk(KERN_INFO "TOA: " msg); \
|
|
} while (0)
|
|
|
|
-
|
|
-#define TCPOPT_TOA 254
|
|
-
|
|
/* MUST be 4n !!!! */
|
|
#define TCPOLEN_IP4_TOA 8 /* |opcode|size|ip+port| = 1 + 1 + 6 */
|
|
#define TCPOLEN_IP6_TOA 20 /* |opcode|size|ip_of_v6+port| = 1 + 1 + 18 */
|
|
--
|
|
2.27.0
|
|
|