From 3f288faeec7a7345b59dfa9cbecf8507008c8a6b Mon Sep 17 00:00:00 2001 From: gaoxingwang 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 #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