!14 init
From: @jia_zhenyuan Reviewed-by: @jiaoff Signed-off-by: @jiaoff
This commit is contained in:
commit
a5830ce59a
165
0001-support-arm64.patch
Normal file
165
0001-support-arm64.patch
Normal file
@ -0,0 +1,165 @@
|
||||
From 792c1c14d77dc6013ab730fc8d5267ac07864916 Mon Sep 17 00:00:00 2001
|
||||
From: Jiao Fenfang <jiaofenfang@uniontech.com>
|
||||
Date: Wed, 26 Jan 2022 14:37:36 +0800
|
||||
Subject: [PATCH] support arm64
|
||||
|
||||
---
|
||||
src/toa.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
|
||||
src/toa.h | 2 ++
|
||||
2 files changed, 87 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/src/toa.c b/src/toa.c
|
||||
index e02ef24..2942674 100644
|
||||
--- a/src/toa.c
|
||||
+++ b/src/toa.c
|
||||
@@ -23,6 +23,50 @@ struct toa_stats_entry toa_stats[] = {
|
||||
|
||||
struct toa_stat_mib *ext_stats;
|
||||
|
||||
+#if defined(CONFIG_ARM64)
|
||||
+/*
|
||||
+ * ARM64 interface
|
||||
+ * Lookup the page table entry for a virtual address. Return a pointer
|
||||
+ * to the entry and the level of the mapping.
|
||||
+ *
|
||||
+ * Note: We return pud and pmd either when the entry is marked large
|
||||
+ * or when the present bit is not set. Otherwise we would return a
|
||||
+ * pointer to a nonexisting mapping.
|
||||
+ */
|
||||
+static pte_t *lookup_address(unsigned long address, unsigned int *level)
|
||||
+{
|
||||
+ pgd_t *pgdp;
|
||||
+ pud_t *pudp, pud;
|
||||
+ pmd_t *pmdp, pmd;
|
||||
+ pte_t *ptep;
|
||||
+ unsigned long addr = address;
|
||||
+
|
||||
+ unsigned long init_mm = kallsyms_lookup_name("init_mm");
|
||||
+ if (!init_mm) {
|
||||
+ TOA_INFO("CPU [%u] lookup_address init_mm null\n", smp_processor_id());
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ /*pgdp = pgd_offset_k(addr);*/
|
||||
+ pgdp = pgd_offset((struct mm_struct *)init_mm, addr);
|
||||
+ if (pgd_none(READ_ONCE(*pgdp)))
|
||||
+ return NULL;
|
||||
+
|
||||
+ pudp = pud_offset(pgdp, addr);
|
||||
+ pud = READ_ONCE(*pudp);
|
||||
+ if (pud_none(pud))
|
||||
+ return NULL;
|
||||
+
|
||||
+ pmdp = pmd_offset(pudp, addr);
|
||||
+ pmd = READ_ONCE(*pmdp);
|
||||
+ if (pmd_none(pmd))
|
||||
+ return NULL;
|
||||
+
|
||||
+ ptep = pte_offset_kernel(pmdp, addr);
|
||||
+ return ptep;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* Funcs for toa hooks
|
||||
*/
|
||||
@@ -304,6 +348,7 @@ hook_toa_functions(void)
|
||||
/* hook tcp_v4_syn_recv_sock for ipv4 */
|
||||
struct inet_connection_sock_af_ops *ipv4_specific_p =
|
||||
(struct inet_connection_sock_af_ops *)&ipv4_specific;
|
||||
+
|
||||
#ifdef CONFIG_IP_VS_TOA_IPV6
|
||||
/* hook inet6_getname for ipv6 */
|
||||
struct proto_ops *inet6_stream_ops_p =
|
||||
@@ -316,9 +361,18 @@ hook_toa_functions(void)
|
||||
pte = lookup_address((unsigned long )inet_stream_ops_p, &level);
|
||||
if (pte == NULL)
|
||||
return 1;
|
||||
- if (pte->pte & ~_PAGE_RW) {
|
||||
- pte->pte |= _PAGE_RW;
|
||||
- }
|
||||
+
|
||||
+#if defined(CONFIG_ARM64)
|
||||
+ *pte = pte_mkwrite(*pte);
|
||||
+ __sync_icache_dcache(*pte);
|
||||
+ flush_tlb_all();
|
||||
+#else
|
||||
+ if (pte->pte & ~_PAGE_RW) {
|
||||
+ pte->pte |= _PAGE_RW;
|
||||
+ }
|
||||
+#endif
|
||||
+ /*TOA_INFO("CPU [%u] hooked before inet_getname <%p> --> <%p>\n",
|
||||
+ smp_processor_id(), inet_getname, inet_getname_toa);*/
|
||||
|
||||
inet_stream_ops_p->getname = inet_getname_toa;
|
||||
TOA_INFO("CPU [%u] hooked inet_getname <%p> --> <%p>\n",
|
||||
@@ -345,7 +399,14 @@ hook_toa_functions(void)
|
||||
pte = lookup_address((unsigned long )inet_stream_ops_p, &level);
|
||||
if (pte == NULL)
|
||||
return 1;
|
||||
- pte->pte |= pte->pte &~_PAGE_RW;
|
||||
+
|
||||
+#if defined(CONFIG_ARM64)
|
||||
+ *pte = pte_wrprotect(*pte);
|
||||
+ __sync_icache_dcache(*pte);
|
||||
+ flush_tlb_all();
|
||||
+#else
|
||||
+ pte->pte |= pte->pte &~_PAGE_RW;
|
||||
+#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -376,9 +437,18 @@ unhook_toa_functions(void)
|
||||
pte = lookup_address((unsigned long )inet_stream_ops_p, &level);
|
||||
if (pte == NULL)
|
||||
return 1;
|
||||
- if (pte->pte & ~_PAGE_RW) {
|
||||
- pte->pte |= _PAGE_RW;
|
||||
- }
|
||||
+
|
||||
+#if defined(CONFIG_ARM64)
|
||||
+ *pte = pte_mkwrite(*pte);
|
||||
+ __sync_icache_dcache(*pte);
|
||||
+ flush_tlb_all();
|
||||
+#else
|
||||
+ if (pte->pte & ~_PAGE_RW) {
|
||||
+ pte->pte |= _PAGE_RW;
|
||||
+ }
|
||||
+#endif
|
||||
+ /*TOA_INFO("CPU [%u] unhooked before inet_getname: %p\n",
|
||||
+ smp_processor_id(), inet_getname);*/
|
||||
|
||||
inet_stream_ops_p->getname = inet_getname;
|
||||
TOA_INFO("CPU [%u] unhooked inet_getname\n",
|
||||
@@ -403,7 +473,14 @@ unhook_toa_functions(void)
|
||||
pte = lookup_address((unsigned long )inet_stream_ops_p, &level);
|
||||
if (pte == NULL)
|
||||
return 1;
|
||||
- pte->pte |= pte->pte &~_PAGE_RW;
|
||||
+
|
||||
+#if defined(CONFIG_ARM64)
|
||||
+ *pte = pte_wrprotect(*pte);
|
||||
+ __sync_icache_dcache(*pte);
|
||||
+ flush_tlb_all();
|
||||
+#else
|
||||
+ pte->pte |= pte->pte &~_PAGE_RW;
|
||||
+#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/src/toa.h b/src/toa.h
|
||||
index b47fac3..a46f82d 100644
|
||||
--- a/src/toa.h
|
||||
+++ b/src/toa.h
|
||||
@@ -20,6 +20,8 @@
|
||||
#include <net/ipv6.h>
|
||||
#include <net/transp_v6.h>
|
||||
|
||||
+#include <asm/tlbflush.h>
|
||||
+
|
||||
#define TOA_VERSION "1.0.0.0"
|
||||
|
||||
#ifdef TOA_DBG_MSG
|
||||
--
|
||||
2.20.1
|
||||
|
||||
27
0002-fix-build-error.patch
Normal file
27
0002-fix-build-error.patch
Normal file
@ -0,0 +1,27 @@
|
||||
diff --git a/src/Makefile b/src/Makefile
|
||||
index 155146d..7f61dba 100644
|
||||
--- a/src/Makefile
|
||||
+++ b/src/Makefile
|
||||
@@ -4,15 +4,17 @@
|
||||
|
||||
obj-$(CONFIG_TOA) += toa.o
|
||||
|
||||
+kerver=$(shell rpm -q kernel-devel --queryformat=%{VERSION}-%{RELEASE}.%{ARCH})
|
||||
+
|
||||
default:
|
||||
- make CONFIG_TOA=m -C /lib/modules/`uname -r`/build M=`pwd` modules
|
||||
+ make CONFIG_TOA=m -C /lib/modules/${kerver}/build M=`pwd` modules
|
||||
|
||||
debug:
|
||||
- make CONFIG_TOA=m -C /lib/modules/`uname -r`/build M=`pwd` modules EXTRA_CFLAGS="-DTOA_DBG_MSG"
|
||||
+ make CONFIG_TOA=m -C /lib/modules/${kerver}/build M=`pwd` modules EXTRA_CFLAGS="-DTOA_DBG_MSG"
|
||||
clean:
|
||||
rm -f .*.cmd *.o *.ko *.mod.c modules.order Module.symvers
|
||||
rm -rf .tmp_versions
|
||||
install:
|
||||
- test -d "$(DESTDIR)/lib/modules/`uname -r`/extra/net/toa" \
|
||||
- || mkdir -p "$(DESTDIR)/lib/modules/`uname -r`/extra/net/toa"
|
||||
- cp *.ko "$(DESTDIR)/lib/modules/`uname -r`/extra/net/toa"
|
||||
+ test -d "$(DESTDIR)/lib/modules/${kerver}/extra/net/toa" \
|
||||
+ || mkdir -p "$(DESTDIR)/lib/modules/${kerver}/extra/net/toa"
|
||||
+ cp *.ko "$(DESTDIR)/lib/modules/${kerver}/extra/net/toa"
|
||||
107
0003-patch-for-5_10.patch
Normal file
107
0003-patch-for-5_10.patch
Normal file
@ -0,0 +1,107 @@
|
||||
diff --git a/src/toa.c b/src/toa.c
|
||||
index 2942674..82382f9 100644
|
||||
--- a/src/toa.c
|
||||
+++ b/src/toa.c
|
||||
@@ -1,3 +1,4 @@
|
||||
+#include <linux/kprobes.h>
|
||||
#include "toa.h"
|
||||
|
||||
/*
|
||||
@@ -7,6 +8,9 @@
|
||||
|
||||
unsigned long sk_data_ready_addr = 0;
|
||||
|
||||
+typedef unsigned long (*kallsyms_lookup_name_fun_t)(const char *name);
|
||||
+static kallsyms_lookup_name_fun_t kallsyms_lookup_name_fun;
|
||||
+
|
||||
/*
|
||||
* Statistics of toa in proc /proc/net/toa_stats
|
||||
*/
|
||||
@@ -23,6 +27,23 @@ struct toa_stats_entry toa_stats[] = {
|
||||
|
||||
struct toa_stat_mib *ext_stats;
|
||||
|
||||
+static int toa_get_kallsyms_lookup_name_addr(void)
|
||||
+{
|
||||
+ static struct kprobe kp = {
|
||||
+ .symbol_name = "kallsyms_lookup_name",
|
||||
+ };
|
||||
+
|
||||
+ if (register_kprobe(&kp) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (!kallsyms_lookup_name_fun) {
|
||||
+ kallsyms_lookup_name_fun = (kallsyms_lookup_name_fun_t)kp.addr;
|
||||
+ }
|
||||
+ unregister_kprobe(&kp);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
#if defined(CONFIG_ARM64)
|
||||
/*
|
||||
* ARM64 interface
|
||||
@@ -41,7 +62,7 @@ static pte_t *lookup_address(unsigned long address, unsigned int *level)
|
||||
pte_t *ptep;
|
||||
unsigned long addr = address;
|
||||
|
||||
- unsigned long init_mm = kallsyms_lookup_name("init_mm");
|
||||
+ unsigned long init_mm = kallsyms_lookup_name_fun("init_mm");
|
||||
if (!init_mm) {
|
||||
TOA_INFO("CPU [%u] lookup_address init_mm null\n", smp_processor_id());
|
||||
return NULL;
|
||||
@@ -52,7 +73,7 @@ static pte_t *lookup_address(unsigned long address, unsigned int *level)
|
||||
if (pgd_none(READ_ONCE(*pgdp)))
|
||||
return NULL;
|
||||
|
||||
- pudp = pud_offset(pgdp, addr);
|
||||
+ pudp = pud_offset((p4d_t *)pgdp, addr);
|
||||
pud = READ_ONCE(*pudp);
|
||||
if (pud_none(pud))
|
||||
return NULL;
|
||||
@@ -522,6 +543,14 @@ static int toa_stats_seq_open(struct inode *inode, struct file *file)
|
||||
return single_open(file, toa_stats_show, NULL);
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,5,0)
|
||||
+static const struct proc_ops toa_stats_fops = {
|
||||
+ .proc_open = toa_stats_seq_open,
|
||||
+ .proc_read = seq_read,
|
||||
+ .proc_lseek = seq_lseek,
|
||||
+ .proc_release = single_release,
|
||||
+};
|
||||
+#else
|
||||
static const struct file_operations toa_stats_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = toa_stats_seq_open,
|
||||
@@ -529,6 +558,7 @@ static const struct file_operations toa_stats_fops = {
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* TOA module init and destory
|
||||
@@ -538,6 +568,13 @@ static const struct file_operations toa_stats_fops = {
|
||||
static int __init
|
||||
toa_init(void)
|
||||
{
|
||||
+ int ret = -1;
|
||||
+
|
||||
+ ret = toa_get_kallsyms_lookup_name_addr();
|
||||
+ if (ret < 0) {
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
/* alloc statistics array for toa */
|
||||
ext_stats = alloc_percpu(struct toa_stat_mib);
|
||||
if (NULL == ext_stats)
|
||||
@@ -547,7 +584,7 @@ toa_init(void)
|
||||
/* get the address of function sock_def_readable
|
||||
* so later we can know whether the sock is for rpc, tux or others
|
||||
*/
|
||||
- sk_data_ready_addr = kallsyms_lookup_name("sock_def_readable");
|
||||
+ sk_data_ready_addr = kallsyms_lookup_name_fun("sock_def_readable");
|
||||
TOA_INFO("CPU [%u] sk_data_ready_addr = "
|
||||
"kallsyms_lookup_name(sock_def_readable) = %lu\n",
|
||||
smp_processor_id(), sk_data_ready_addr);
|
||||
BIN
TCP_option_address.tar.gz
Normal file
BIN
TCP_option_address.tar.gz
Normal file
Binary file not shown.
108
toa.spec
Normal file
108
toa.spec
Normal file
@ -0,0 +1,108 @@
|
||||
%global debug_package %{nil}
|
||||
# macros for finding system files to update at install time (pci.ids, pcitable)
|
||||
%define find() %(for f in %*; do if [ -e $f ]; then echo $f; break; fi; done)
|
||||
|
||||
Name: TCP_option_address
|
||||
Summary: Intel(R) Ethernet Adaptive Virtual Function Driver
|
||||
Version: 1.0.0
|
||||
Release: 1
|
||||
#Release: 0.%{krelver}
|
||||
Vendor: Huawei
|
||||
License: GPL-2.0
|
||||
URL: https://github.com/dongzerun/TCP_option_address
|
||||
Source0: TCP_option_address.tar.gz
|
||||
|
||||
Patch0001: 0001-support-arm64.patch
|
||||
Patch0002: 0002-fix-build-error.patch
|
||||
Patch0003: 0003-patch-for-5_10.patch
|
||||
|
||||
Requires: kernel, findutils, gawk, bash
|
||||
|
||||
BuildRequires: kernel-devel hwdata elfutils-devel gcc
|
||||
|
||||
%description
|
||||
The TCP Option Address (TOA) module is a kernel module that obtains the source IPv4 address from the option section of a TCP header.
|
||||
|
||||
%prep
|
||||
%autosetup -n %{name} -p1
|
||||
|
||||
%build
|
||||
make -C src clean
|
||||
make -C src
|
||||
|
||||
%install
|
||||
make -C src DESTDIR=%{buildroot} install
|
||||
# Remove modules files that we do not want to include
|
||||
find %{buildroot}/lib/modules/ -name 'modules.*' -exec rm -f {} \;
|
||||
cd %{buildroot}
|
||||
find lib -name "toa" \
|
||||
-fprintf %{_builddir}/%{name}/file.list "/%p\n"
|
||||
|
||||
|
||||
%clean
|
||||
rm -rf %{buildroot}
|
||||
|
||||
%files -f file.list
|
||||
%defattr(-,root,root)
|
||||
%doc README.md file.list
|
||||
%license LICENSE NOTICE
|
||||
|
||||
%post
|
||||
uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true
|
||||
|
||||
if which dracut >/dev/null 2>&1; then
|
||||
echo "Updating initramfs with dracut..."
|
||||
if dracut --force ; then
|
||||
echo "Successfully updated initramfs."
|
||||
else
|
||||
echo "Failed to update initramfs."
|
||||
echo "You must update your initramfs image for changes to take place."
|
||||
exit -1
|
||||
fi
|
||||
elif which mkinitrd >/dev/null 2>&1; then
|
||||
echo "Updating initrd with mkinitrd..."
|
||||
if mkinitrd; then
|
||||
echo "Successfully updated initrd."
|
||||
else
|
||||
echo "Failed to update initrd."
|
||||
echo "You must update your initrd image for changes to take place."
|
||||
exit -1
|
||||
fi
|
||||
else
|
||||
echo "Unable to determine utility to update initrd image."
|
||||
echo "You must update your initrd manually for changes to take place."
|
||||
exit -1
|
||||
fi
|
||||
|
||||
%preun
|
||||
|
||||
%postun
|
||||
uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true
|
||||
|
||||
if which dracut >/dev/null 2>&1; then
|
||||
echo "Updating initramfs with dracut..."
|
||||
if dracut --force ; then
|
||||
echo "Successfully updated initramfs."
|
||||
else
|
||||
echo "Failed to update initramfs."
|
||||
echo "You must update your initramfs image for changes to take place."
|
||||
exit -1
|
||||
fi
|
||||
elif which mkinitrd >/dev/null 2>&1; then
|
||||
echo "Updating initrd with mkinitrd..."
|
||||
if mkinitrd; then
|
||||
echo "Successfully updated initrd."
|
||||
else
|
||||
echo "Failed to update initrd."
|
||||
echo "You must update your initrd image for changes to take place."
|
||||
exit -1
|
||||
fi
|
||||
else
|
||||
echo "Unable to determine utility to update initrd image."
|
||||
echo "You must update your initrd manually for changes to take place."
|
||||
exit -1
|
||||
fi
|
||||
|
||||
%changelog
|
||||
* Mon Jan 24 2022 jiaofenfang<jiaofenfang@uniontech.com> - 1.0.0-1
|
||||
- Package init
|
||||
Loading…
x
Reference in New Issue
Block a user