Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Overlapping header include additions in macsec.c A bug fix in 'net' overlapping with the removal of 'version' string in ena_netdev.c Overlapping test additions in selftests Makefile Overlapping PCI ID table adjustments in iwlwifi driver. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1,18 +1,18 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#include "../../arch/x86/include/uapi/asm/errno.h"
|
||||
#include "../../../arch/x86/include/uapi/asm/errno.h"
|
||||
#elif defined(__powerpc__)
|
||||
#include "../../arch/powerpc/include/uapi/asm/errno.h"
|
||||
#include "../../../arch/powerpc/include/uapi/asm/errno.h"
|
||||
#elif defined(__sparc__)
|
||||
#include "../../arch/sparc/include/uapi/asm/errno.h"
|
||||
#include "../../../arch/sparc/include/uapi/asm/errno.h"
|
||||
#elif defined(__alpha__)
|
||||
#include "../../arch/alpha/include/uapi/asm/errno.h"
|
||||
#include "../../../arch/alpha/include/uapi/asm/errno.h"
|
||||
#elif defined(__mips__)
|
||||
#include "../../arch/mips/include/uapi/asm/errno.h"
|
||||
#include "../../../arch/mips/include/uapi/asm/errno.h"
|
||||
#elif defined(__ia64__)
|
||||
#include "../../arch/ia64/include/uapi/asm/errno.h"
|
||||
#include "../../../arch/ia64/include/uapi/asm/errno.h"
|
||||
#elif defined(__xtensa__)
|
||||
#include "../../arch/xtensa/include/uapi/asm/errno.h"
|
||||
#include "../../../arch/xtensa/include/uapi/asm/errno.h"
|
||||
#else
|
||||
#include <asm-generic/errno.h>
|
||||
#endif
|
||||
|
||||
@@ -74,6 +74,8 @@ enum {
|
||||
#define IPPROTO_UDPLITE IPPROTO_UDPLITE
|
||||
IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */
|
||||
#define IPPROTO_MPLS IPPROTO_MPLS
|
||||
IPPROTO_ETHERNET = 143, /* Ethernet-within-IPv6 Encapsulation */
|
||||
#define IPPROTO_ETHERNET IPPROTO_ETHERNET
|
||||
IPPROTO_RAW = 255, /* Raw IP packets */
|
||||
#define IPPROTO_RAW IPPROTO_RAW
|
||||
IPPROTO_MPTCP = 262, /* Multipath TCP connection */
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ endif
|
||||
# Only pass canonical directory names as the output directory:
|
||||
#
|
||||
ifneq ($(O),)
|
||||
FULL_O := $(shell readlink -f $(O) || echo $(O))
|
||||
FULL_O := $(shell cd $(PWD); readlink -f $(O) || echo $(O))
|
||||
endif
|
||||
|
||||
#
|
||||
|
||||
@@ -11,17 +11,17 @@
|
||||
#include <linux/zalloc.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "../../util/cpumap.h"
|
||||
#include "../../util/event.h"
|
||||
#include "../../util/evsel.h"
|
||||
#include "../../util/evlist.h"
|
||||
#include "../../util/session.h"
|
||||
#include "../../../util/cpumap.h"
|
||||
#include "../../../util/event.h"
|
||||
#include "../../../util/evsel.h"
|
||||
#include "../../../util/evlist.h"
|
||||
#include "../../../util/session.h"
|
||||
#include <internal/lib.h> // page_size
|
||||
#include "../../util/pmu.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../../util/auxtrace.h"
|
||||
#include "../../util/record.h"
|
||||
#include "../../util/arm-spe.h"
|
||||
#include "../../../util/pmu.h"
|
||||
#include "../../../util/debug.h"
|
||||
#include "../../../util/auxtrace.h"
|
||||
#include "../../../util/record.h"
|
||||
#include "../../../util/arm-spe.h"
|
||||
|
||||
#define KiB(x) ((x) * 1024)
|
||||
#define MiB(x) ((x) * 1024 * 1024)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include "../../util/perf_regs.h"
|
||||
#include "../../../util/perf_regs.h"
|
||||
|
||||
const struct sample_reg sample_reg_masks[] = {
|
||||
SMPL_REG_END
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
#include <regex.h>
|
||||
#include <linux/zalloc.h>
|
||||
|
||||
#include "../../util/perf_regs.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../../../util/perf_regs.h"
|
||||
#include "../../../util/debug.h"
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "../../util/header.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../../util/pmu.h"
|
||||
#include "../../util/auxtrace.h"
|
||||
#include "../../util/intel-pt.h"
|
||||
#include "../../util/intel-bts.h"
|
||||
#include "../../util/evlist.h"
|
||||
#include "../../../util/header.h"
|
||||
#include "../../../util/debug.h"
|
||||
#include "../../../util/pmu.h"
|
||||
#include "../../../util/auxtrace.h"
|
||||
#include "../../../util/intel-pt.h"
|
||||
#include "../../../util/intel-bts.h"
|
||||
#include "../../../util/evlist.h"
|
||||
|
||||
static
|
||||
struct auxtrace_record *auxtrace_record__init_intel(struct evlist *evlist,
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/zalloc.h>
|
||||
|
||||
#include "../../util/event.h"
|
||||
#include "../../util/synthetic-events.h"
|
||||
#include "../../util/machine.h"
|
||||
#include "../../util/tool.h"
|
||||
#include "../../util/map.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../../../util/event.h"
|
||||
#include "../../../util/synthetic-events.h"
|
||||
#include "../../../util/machine.h"
|
||||
#include "../../../util/tool.h"
|
||||
#include "../../../util/map.h"
|
||||
#include "../../../util/debug.h"
|
||||
|
||||
#if defined(__x86_64__)
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
#include <string.h>
|
||||
#include <regex.h>
|
||||
|
||||
#include "../../util/debug.h"
|
||||
#include "../../util/header.h"
|
||||
#include "../../../util/debug.h"
|
||||
#include "../../../util/header.h"
|
||||
|
||||
static inline void
|
||||
cpuid(unsigned int op, unsigned int *a, unsigned int *b, unsigned int *c,
|
||||
|
||||
@@ -11,18 +11,18 @@
|
||||
#include <linux/log2.h>
|
||||
#include <linux/zalloc.h>
|
||||
|
||||
#include "../../util/cpumap.h"
|
||||
#include "../../util/event.h"
|
||||
#include "../../util/evsel.h"
|
||||
#include "../../util/evlist.h"
|
||||
#include "../../util/mmap.h"
|
||||
#include "../../util/session.h"
|
||||
#include "../../util/pmu.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../../util/record.h"
|
||||
#include "../../util/tsc.h"
|
||||
#include "../../util/auxtrace.h"
|
||||
#include "../../util/intel-bts.h"
|
||||
#include "../../../util/cpumap.h"
|
||||
#include "../../../util/event.h"
|
||||
#include "../../../util/evsel.h"
|
||||
#include "../../../util/evlist.h"
|
||||
#include "../../../util/mmap.h"
|
||||
#include "../../../util/session.h"
|
||||
#include "../../../util/pmu.h"
|
||||
#include "../../../util/debug.h"
|
||||
#include "../../../util/record.h"
|
||||
#include "../../../util/tsc.h"
|
||||
#include "../../../util/auxtrace.h"
|
||||
#include "../../../util/intel-bts.h"
|
||||
#include <internal/lib.h> // page_size
|
||||
|
||||
#define KiB(x) ((x) * 1024)
|
||||
|
||||
@@ -13,23 +13,23 @@
|
||||
#include <linux/zalloc.h>
|
||||
#include <cpuid.h>
|
||||
|
||||
#include "../../util/session.h"
|
||||
#include "../../util/event.h"
|
||||
#include "../../util/evlist.h"
|
||||
#include "../../util/evsel.h"
|
||||
#include "../../util/evsel_config.h"
|
||||
#include "../../util/cpumap.h"
|
||||
#include "../../util/mmap.h"
|
||||
#include "../../../util/session.h"
|
||||
#include "../../../util/event.h"
|
||||
#include "../../../util/evlist.h"
|
||||
#include "../../../util/evsel.h"
|
||||
#include "../../../util/evsel_config.h"
|
||||
#include "../../../util/cpumap.h"
|
||||
#include "../../../util/mmap.h"
|
||||
#include <subcmd/parse-options.h>
|
||||
#include "../../util/parse-events.h"
|
||||
#include "../../util/pmu.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../../util/auxtrace.h"
|
||||
#include "../../util/record.h"
|
||||
#include "../../util/target.h"
|
||||
#include "../../util/tsc.h"
|
||||
#include "../../../util/parse-events.h"
|
||||
#include "../../../util/pmu.h"
|
||||
#include "../../../util/debug.h"
|
||||
#include "../../../util/auxtrace.h"
|
||||
#include "../../../util/record.h"
|
||||
#include "../../../util/target.h"
|
||||
#include "../../../util/tsc.h"
|
||||
#include <internal/lib.h> // page_size
|
||||
#include "../../util/intel-pt.h"
|
||||
#include "../../../util/intel-pt.h"
|
||||
|
||||
#define KiB(x) ((x) * 1024)
|
||||
#define MiB(x) ((x) * 1024 * 1024)
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <internal/lib.h> // page_size
|
||||
#include "../../util/machine.h"
|
||||
#include "../../util/map.h"
|
||||
#include "../../util/symbol.h"
|
||||
#include "../../../util/machine.h"
|
||||
#include "../../../util/map.h"
|
||||
#include "../../../util/symbol.h"
|
||||
#include <linux/ctype.h>
|
||||
|
||||
#include <symbol/kallsyms.h>
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/zalloc.h>
|
||||
|
||||
#include "../../perf-sys.h"
|
||||
#include "../../util/perf_regs.h"
|
||||
#include "../../util/debug.h"
|
||||
#include "../../util/event.h"
|
||||
#include "../../../perf-sys.h"
|
||||
#include "../../../util/perf_regs.h"
|
||||
#include "../../../util/debug.h"
|
||||
#include "../../../util/event.h"
|
||||
|
||||
const struct sample_reg sample_reg_masks[] = {
|
||||
SMPL_REG(AX, PERF_REG_X86_AX),
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/perf_event.h>
|
||||
|
||||
#include "../../util/intel-pt.h"
|
||||
#include "../../util/intel-bts.h"
|
||||
#include "../../util/pmu.h"
|
||||
#include "../../../util/intel-pt.h"
|
||||
#include "../../../util/intel-bts.h"
|
||||
#include "../../../util/pmu.h"
|
||||
|
||||
struct perf_event_attr *perf_pmu__get_default_config(struct perf_pmu *pmu __maybe_unused)
|
||||
{
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
#ifndef BENCH_H
|
||||
#define BENCH_H
|
||||
|
||||
#include <sys/time.h>
|
||||
|
||||
extern struct timeval bench__start, bench__end, bench__runtime;
|
||||
|
||||
/*
|
||||
* The madvise transparent hugepage constants were added in glibc
|
||||
* 2.13. For compatibility with older versions of glibc, define these
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
|
||||
static unsigned int nthreads = 0;
|
||||
static unsigned int nsecs = 8;
|
||||
struct timeval start, end, runtime;
|
||||
static bool done, __verbose, randomize;
|
||||
|
||||
/*
|
||||
@@ -94,8 +93,8 @@ static void toggle_done(int sig __maybe_unused,
|
||||
{
|
||||
/* inform all threads that we're done for the day */
|
||||
done = true;
|
||||
gettimeofday(&end, NULL);
|
||||
timersub(&end, &start, &runtime);
|
||||
gettimeofday(&bench__end, NULL);
|
||||
timersub(&bench__end, &bench__start, &bench__runtime);
|
||||
}
|
||||
|
||||
static void nest_epollfd(void)
|
||||
@@ -313,6 +312,7 @@ int bench_epoll_ctl(int argc, const char **argv)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
@@ -361,7 +361,7 @@ int bench_epoll_ctl(int argc, const char **argv)
|
||||
|
||||
threads_starting = nthreads;
|
||||
|
||||
gettimeofday(&start, NULL);
|
||||
gettimeofday(&bench__start, NULL);
|
||||
|
||||
do_threads(worker, cpu);
|
||||
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
|
||||
static unsigned int nthreads = 0;
|
||||
static unsigned int nsecs = 8;
|
||||
struct timeval start, end, runtime;
|
||||
static bool wdone, done, __verbose, randomize, nonblocking;
|
||||
|
||||
/*
|
||||
@@ -276,8 +275,8 @@ static void toggle_done(int sig __maybe_unused,
|
||||
{
|
||||
/* inform all threads that we're done for the day */
|
||||
done = true;
|
||||
gettimeofday(&end, NULL);
|
||||
timersub(&end, &start, &runtime);
|
||||
gettimeofday(&bench__end, NULL);
|
||||
timersub(&bench__end, &bench__start, &bench__runtime);
|
||||
}
|
||||
|
||||
static void print_summary(void)
|
||||
@@ -287,7 +286,7 @@ static void print_summary(void)
|
||||
|
||||
printf("\nAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n",
|
||||
avg, rel_stddev_stats(stddev, avg),
|
||||
(int) runtime.tv_sec);
|
||||
(int)bench__runtime.tv_sec);
|
||||
}
|
||||
|
||||
static int do_threads(struct worker *worker, struct perf_cpu_map *cpu)
|
||||
@@ -427,6 +426,7 @@ int bench_epoll_wait(int argc, const char **argv)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
@@ -479,7 +479,7 @@ int bench_epoll_wait(int argc, const char **argv)
|
||||
|
||||
threads_starting = nthreads;
|
||||
|
||||
gettimeofday(&start, NULL);
|
||||
gettimeofday(&bench__start, NULL);
|
||||
|
||||
do_threads(worker, cpu);
|
||||
|
||||
@@ -519,7 +519,7 @@ int bench_epoll_wait(int argc, const char **argv)
|
||||
qsort(worker, nthreads, sizeof(struct worker), cmpworker);
|
||||
|
||||
for (i = 0; i < nthreads; i++) {
|
||||
unsigned long t = worker[i].ops/runtime.tv_sec;
|
||||
unsigned long t = worker[i].ops / bench__runtime.tv_sec;
|
||||
|
||||
update_stats(&throughput_stats, t);
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ static unsigned int nfutexes = 1024;
|
||||
static bool fshared = false, done = false, silent = false;
|
||||
static int futex_flag = 0;
|
||||
|
||||
struct timeval start, end, runtime;
|
||||
struct timeval bench__start, bench__end, bench__runtime;
|
||||
static pthread_mutex_t thread_lock;
|
||||
static unsigned int threads_starting;
|
||||
static struct stats throughput_stats;
|
||||
@@ -103,8 +103,8 @@ static void toggle_done(int sig __maybe_unused,
|
||||
{
|
||||
/* inform all threads that we're done for the day */
|
||||
done = true;
|
||||
gettimeofday(&end, NULL);
|
||||
timersub(&end, &start, &runtime);
|
||||
gettimeofday(&bench__end, NULL);
|
||||
timersub(&bench__end, &bench__start, &bench__runtime);
|
||||
}
|
||||
|
||||
static void print_summary(void)
|
||||
@@ -114,7 +114,7 @@ static void print_summary(void)
|
||||
|
||||
printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n",
|
||||
!silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg),
|
||||
(int) runtime.tv_sec);
|
||||
(int)bench__runtime.tv_sec);
|
||||
}
|
||||
|
||||
int bench_futex_hash(int argc, const char **argv)
|
||||
@@ -137,6 +137,7 @@ int bench_futex_hash(int argc, const char **argv)
|
||||
if (!cpu)
|
||||
goto errmem;
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
@@ -161,7 +162,7 @@ int bench_futex_hash(int argc, const char **argv)
|
||||
|
||||
threads_starting = nthreads;
|
||||
pthread_attr_init(&thread_attr);
|
||||
gettimeofday(&start, NULL);
|
||||
gettimeofday(&bench__start, NULL);
|
||||
for (i = 0; i < nthreads; i++) {
|
||||
worker[i].tid = i;
|
||||
worker[i].futex = calloc(nfutexes, sizeof(*worker[i].futex));
|
||||
@@ -204,7 +205,7 @@ int bench_futex_hash(int argc, const char **argv)
|
||||
pthread_mutex_destroy(&thread_lock);
|
||||
|
||||
for (i = 0; i < nthreads; i++) {
|
||||
unsigned long t = worker[i].ops/runtime.tv_sec;
|
||||
unsigned long t = worker[i].ops / bench__runtime.tv_sec;
|
||||
update_stats(&throughput_stats, t);
|
||||
if (!silent) {
|
||||
if (nfutexes == 1)
|
||||
|
||||
@@ -37,7 +37,6 @@ static bool silent = false, multi = false;
|
||||
static bool done = false, fshared = false;
|
||||
static unsigned int nthreads = 0;
|
||||
static int futex_flag = 0;
|
||||
struct timeval start, end, runtime;
|
||||
static pthread_mutex_t thread_lock;
|
||||
static unsigned int threads_starting;
|
||||
static struct stats throughput_stats;
|
||||
@@ -64,7 +63,7 @@ static void print_summary(void)
|
||||
|
||||
printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n",
|
||||
!silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg),
|
||||
(int) runtime.tv_sec);
|
||||
(int)bench__runtime.tv_sec);
|
||||
}
|
||||
|
||||
static void toggle_done(int sig __maybe_unused,
|
||||
@@ -73,8 +72,8 @@ static void toggle_done(int sig __maybe_unused,
|
||||
{
|
||||
/* inform all threads that we're done for the day */
|
||||
done = true;
|
||||
gettimeofday(&end, NULL);
|
||||
timersub(&end, &start, &runtime);
|
||||
gettimeofday(&bench__end, NULL);
|
||||
timersub(&bench__end, &bench__start, &bench__runtime);
|
||||
}
|
||||
|
||||
static void *workerfn(void *arg)
|
||||
@@ -161,6 +160,7 @@ int bench_futex_lock_pi(int argc, const char **argv)
|
||||
if (!cpu)
|
||||
err(EXIT_FAILURE, "calloc");
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
@@ -185,7 +185,7 @@ int bench_futex_lock_pi(int argc, const char **argv)
|
||||
|
||||
threads_starting = nthreads;
|
||||
pthread_attr_init(&thread_attr);
|
||||
gettimeofday(&start, NULL);
|
||||
gettimeofday(&bench__start, NULL);
|
||||
|
||||
create_threads(worker, thread_attr, cpu);
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
@@ -211,7 +211,7 @@ int bench_futex_lock_pi(int argc, const char **argv)
|
||||
pthread_mutex_destroy(&thread_lock);
|
||||
|
||||
for (i = 0; i < nthreads; i++) {
|
||||
unsigned long t = worker[i].ops/runtime.tv_sec;
|
||||
unsigned long t = worker[i].ops / bench__runtime.tv_sec;
|
||||
|
||||
update_stats(&throughput_stats, t);
|
||||
if (!silent)
|
||||
|
||||
@@ -128,6 +128,7 @@ int bench_futex_requeue(int argc, const char **argv)
|
||||
if (!cpu)
|
||||
err(EXIT_FAILURE, "cpu_map__new");
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
|
||||
@@ -234,6 +234,7 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
|
||||
@@ -43,7 +43,7 @@ static bool done = false, silent = false, fshared = false;
|
||||
static pthread_mutex_t thread_lock;
|
||||
static pthread_cond_t thread_parent, thread_worker;
|
||||
static struct stats waketime_stats, wakeup_stats;
|
||||
static unsigned int ncpus, threads_starting, nthreads = 0;
|
||||
static unsigned int threads_starting, nthreads = 0;
|
||||
static int futex_flag = 0;
|
||||
|
||||
static const struct option options[] = {
|
||||
@@ -136,12 +136,13 @@ int bench_futex_wake(int argc, const char **argv)
|
||||
if (!cpu)
|
||||
err(EXIT_FAILURE, "calloc");
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = toggle_done;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
|
||||
if (!nthreads)
|
||||
nthreads = ncpus;
|
||||
nthreads = cpu->nr;
|
||||
|
||||
worker = calloc(nthreads, sizeof(*worker));
|
||||
if (!worker)
|
||||
|
||||
@@ -1312,7 +1312,8 @@ static int cycles_printf(struct hist_entry *he, struct hist_entry *pair,
|
||||
end_line = map__srcline(he->ms.map, bi->sym->start + bi->end,
|
||||
he->ms.sym);
|
||||
|
||||
if ((start_line != SRCLINE_UNKNOWN) && (end_line != SRCLINE_UNKNOWN)) {
|
||||
if ((strncmp(start_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0) &&
|
||||
(strncmp(end_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0)) {
|
||||
scnprintf(buf, sizeof(buf), "[%s -> %s] %4ld",
|
||||
start_line, end_line, block_he->diff.cycles);
|
||||
} else {
|
||||
|
||||
@@ -684,7 +684,9 @@ repeat:
|
||||
delay_msecs = top->delay_secs * MSEC_PER_SEC;
|
||||
set_term_quiet_input(&save);
|
||||
/* trash return*/
|
||||
getc(stdin);
|
||||
clearerr(stdin);
|
||||
if (poll(&stdin_poll, 1, 0) > 0)
|
||||
getc(stdin);
|
||||
|
||||
while (!done) {
|
||||
perf_top__print_sym_table(top);
|
||||
|
||||
@@ -1082,10 +1082,9 @@ static int process_one_file(const char *fpath, const struct stat *sb,
|
||||
*/
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int rc;
|
||||
int rc, ret = 0;
|
||||
int maxfds;
|
||||
char ldirname[PATH_MAX];
|
||||
|
||||
const char *arch;
|
||||
const char *output_file;
|
||||
const char *start_dirname;
|
||||
@@ -1156,7 +1155,8 @@ int main(int argc, char *argv[])
|
||||
/* Make build fail */
|
||||
fclose(eventsfp);
|
||||
free_arch_std_events();
|
||||
return 1;
|
||||
ret = 1;
|
||||
goto out_free_mapfile;
|
||||
} else if (rc) {
|
||||
goto empty_map;
|
||||
}
|
||||
@@ -1174,14 +1174,17 @@ int main(int argc, char *argv[])
|
||||
/* Make build fail */
|
||||
fclose(eventsfp);
|
||||
free_arch_std_events();
|
||||
return 1;
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
goto out_free_mapfile;
|
||||
|
||||
empty_map:
|
||||
fclose(eventsfp);
|
||||
create_empty_mapping(output_file);
|
||||
free_arch_std_events();
|
||||
return 0;
|
||||
out_free_mapfile:
|
||||
free(mapfile);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#include "../perf-sys.h"
|
||||
#include "cloexec.h"
|
||||
|
||||
volatile long the_var;
|
||||
static volatile long the_var;
|
||||
|
||||
static noinline int test_function(void)
|
||||
{
|
||||
|
||||
@@ -295,7 +295,8 @@ static int block_range_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
end_line = map__srcline(he->ms.map, bi->sym->start + bi->end,
|
||||
he->ms.sym);
|
||||
|
||||
if ((start_line != SRCLINE_UNKNOWN) && (end_line != SRCLINE_UNKNOWN)) {
|
||||
if ((strncmp(start_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0) &&
|
||||
(strncmp(end_line, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0)) {
|
||||
scnprintf(buf, sizeof(buf), "[%s -> %s]",
|
||||
start_line, end_line);
|
||||
} else {
|
||||
|
||||
@@ -343,11 +343,11 @@ static const char *normalize_arch(char *arch)
|
||||
|
||||
const char *perf_env__arch(struct perf_env *env)
|
||||
{
|
||||
struct utsname uts;
|
||||
char *arch_name;
|
||||
|
||||
if (!env || !env->arch) { /* Assume local operation */
|
||||
if (uname(&uts) < 0)
|
||||
static struct utsname uts = { .machine[0] = '\0', };
|
||||
if (uts.machine[0] == '\0' && uname(&uts) < 0)
|
||||
return NULL;
|
||||
arch_name = uts.machine;
|
||||
} else
|
||||
|
||||
@@ -89,7 +89,7 @@ static inline bool replace_android_lib(const char *filename, char *newfilename)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!strncmp(filename, "/system/lib/", 11)) {
|
||||
if (!strncmp(filename, "/system/lib/", 12)) {
|
||||
char *ndk, *app;
|
||||
const char *arch;
|
||||
size_t ndk_length;
|
||||
@@ -431,7 +431,7 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
|
||||
|
||||
if (map && map->dso) {
|
||||
char *srcline = map__srcline(map, addr, NULL);
|
||||
if (srcline != SRCLINE_UNKNOWN)
|
||||
if (strncmp(srcline, SRCLINE_UNKNOWN, strlen(SRCLINE_UNKNOWN)) != 0)
|
||||
ret = fprintf(fp, "%s%s", prefix, srcline);
|
||||
free_srcline(srcline);
|
||||
}
|
||||
|
||||
@@ -257,21 +257,15 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config)
|
||||
path = zalloc(sizeof(*path));
|
||||
if (!path)
|
||||
return NULL;
|
||||
path->system = malloc(MAX_EVENT_LENGTH);
|
||||
if (!path->system) {
|
||||
if (asprintf(&path->system, "%.*s", MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) {
|
||||
free(path);
|
||||
return NULL;
|
||||
}
|
||||
path->name = malloc(MAX_EVENT_LENGTH);
|
||||
if (!path->name) {
|
||||
if (asprintf(&path->name, "%.*s", MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) {
|
||||
zfree(&path->system);
|
||||
free(path);
|
||||
return NULL;
|
||||
}
|
||||
strncpy(path->system, sys_dirent->d_name,
|
||||
MAX_EVENT_LENGTH);
|
||||
strncpy(path->name, evt_dirent->d_name,
|
||||
MAX_EVENT_LENGTH);
|
||||
return path;
|
||||
}
|
||||
}
|
||||
@@ -1219,7 +1213,7 @@ static int config_attr(struct perf_event_attr *attr,
|
||||
static int get_config_terms(struct list_head *head_config,
|
||||
struct list_head *head_terms __maybe_unused)
|
||||
{
|
||||
#define ADD_CONFIG_TERM(__type) \
|
||||
#define ADD_CONFIG_TERM(__type, __weak) \
|
||||
struct perf_evsel_config_term *__t; \
|
||||
\
|
||||
__t = zalloc(sizeof(*__t)); \
|
||||
@@ -1228,18 +1222,18 @@ static int get_config_terms(struct list_head *head_config,
|
||||
\
|
||||
INIT_LIST_HEAD(&__t->list); \
|
||||
__t->type = PERF_EVSEL__CONFIG_TERM_ ## __type; \
|
||||
__t->weak = term->weak; \
|
||||
__t->weak = __weak; \
|
||||
list_add_tail(&__t->list, head_terms)
|
||||
|
||||
#define ADD_CONFIG_TERM_VAL(__type, __name, __val) \
|
||||
#define ADD_CONFIG_TERM_VAL(__type, __name, __val, __weak) \
|
||||
do { \
|
||||
ADD_CONFIG_TERM(__type); \
|
||||
ADD_CONFIG_TERM(__type, __weak); \
|
||||
__t->val.__name = __val; \
|
||||
} while (0)
|
||||
|
||||
#define ADD_CONFIG_TERM_STR(__type, __val) \
|
||||
#define ADD_CONFIG_TERM_STR(__type, __val, __weak) \
|
||||
do { \
|
||||
ADD_CONFIG_TERM(__type); \
|
||||
ADD_CONFIG_TERM(__type, __weak); \
|
||||
__t->val.str = strdup(__val); \
|
||||
if (!__t->val.str) { \
|
||||
zfree(&__t); \
|
||||
@@ -1253,62 +1247,62 @@ do { \
|
||||
list_for_each_entry(term, head_config, list) {
|
||||
switch (term->type_term) {
|
||||
case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
|
||||
ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num);
|
||||
ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
|
||||
ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num);
|
||||
ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_TIME:
|
||||
ADD_CONFIG_TERM_VAL(TIME, time, term->val.num);
|
||||
ADD_CONFIG_TERM_VAL(TIME, time, term->val.num, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
|
||||
ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str);
|
||||
ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
|
||||
ADD_CONFIG_TERM_STR(BRANCH, term->val.str);
|
||||
ADD_CONFIG_TERM_STR(BRANCH, term->val.str, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
|
||||
ADD_CONFIG_TERM_VAL(STACK_USER, stack_user,
|
||||
term->val.num);
|
||||
term->val.num, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_INHERIT:
|
||||
ADD_CONFIG_TERM_VAL(INHERIT, inherit,
|
||||
term->val.num ? 1 : 0);
|
||||
term->val.num ? 1 : 0, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
|
||||
ADD_CONFIG_TERM_VAL(INHERIT, inherit,
|
||||
term->val.num ? 0 : 1);
|
||||
term->val.num ? 0 : 1, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
|
||||
ADD_CONFIG_TERM_VAL(MAX_STACK, max_stack,
|
||||
term->val.num);
|
||||
term->val.num, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
|
||||
ADD_CONFIG_TERM_VAL(MAX_EVENTS, max_events,
|
||||
term->val.num);
|
||||
term->val.num, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
|
||||
ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
|
||||
term->val.num ? 1 : 0);
|
||||
term->val.num ? 1 : 0, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
|
||||
ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
|
||||
term->val.num ? 0 : 1);
|
||||
term->val.num ? 0 : 1, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
|
||||
ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str);
|
||||
ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_PERCORE:
|
||||
ADD_CONFIG_TERM_VAL(PERCORE, percore,
|
||||
term->val.num ? true : false);
|
||||
term->val.num ? true : false, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
|
||||
ADD_CONFIG_TERM_VAL(AUX_OUTPUT, aux_output,
|
||||
term->val.num ? 1 : 0);
|
||||
term->val.num ? 1 : 0, term->weak);
|
||||
break;
|
||||
case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
|
||||
ADD_CONFIG_TERM_VAL(AUX_SAMPLE_SIZE, aux_sample_size,
|
||||
term->val.num);
|
||||
term->val.num, term->weak);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -1345,7 +1339,7 @@ static int get_config_chgs(struct perf_pmu *pmu, struct list_head *head_config,
|
||||
}
|
||||
|
||||
if (bits)
|
||||
ADD_CONFIG_TERM_VAL(CFG_CHG, cfg_chg, bits);
|
||||
ADD_CONFIG_TERM_VAL(CFG_CHG, cfg_chg, bits, false);
|
||||
|
||||
#undef ADD_CONFIG_TERM
|
||||
return 0;
|
||||
|
||||
@@ -206,6 +206,9 @@ static struct strlist *__probe_file__get_namelist(int fd, bool include_group)
|
||||
} else
|
||||
ret = strlist__add(sl, tev.event);
|
||||
clear_probe_trace_event(&tev);
|
||||
/* Skip if there is same name multi-probe event in the list */
|
||||
if (ret == -EEXIST)
|
||||
ret = 0;
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -637,14 +637,19 @@ static int convert_to_trace_point(Dwarf_Die *sp_die, Dwfl_Module *mod,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Try to get actual symbol name from symtab */
|
||||
symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
|
||||
if (dwarf_entrypc(sp_die, &eaddr) == 0) {
|
||||
/* If the DIE has entrypc, use it. */
|
||||
symbol = dwarf_diename(sp_die);
|
||||
} else {
|
||||
/* Try to get actual symbol name and address from symtab */
|
||||
symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
|
||||
eaddr = sym.st_value;
|
||||
}
|
||||
if (!symbol) {
|
||||
pr_warning("Failed to find symbol at 0x%lx\n",
|
||||
(unsigned long)paddr);
|
||||
return -ENOENT;
|
||||
}
|
||||
eaddr = sym.st_value;
|
||||
|
||||
tp->offset = (unsigned long)(paddr - eaddr);
|
||||
tp->address = (unsigned long)paddr;
|
||||
|
||||
@@ -2,11 +2,13 @@ from os import getenv
|
||||
from subprocess import Popen, PIPE
|
||||
from re import sub
|
||||
|
||||
def clang_has_option(option):
|
||||
return [o for o in Popen(['clang', option], stderr=PIPE).stderr.readlines() if b"unknown argument" in o] == [ ]
|
||||
|
||||
cc = getenv("CC")
|
||||
if cc == "clang":
|
||||
cc_is_clang = b"clang version" in Popen([cc, "-v"], stderr=PIPE).stderr.readline()
|
||||
|
||||
def clang_has_option(option):
|
||||
return [o for o in Popen([cc, option], stderr=PIPE).stderr.readlines() if b"unknown argument" in o] == [ ]
|
||||
|
||||
if cc_is_clang:
|
||||
from distutils.sysconfig import get_config_vars
|
||||
vars = get_config_vars()
|
||||
for var in ('CFLAGS', 'OPT'):
|
||||
@@ -40,7 +42,7 @@ class install_lib(_install_lib):
|
||||
cflags = getenv('CFLAGS', '').split()
|
||||
# switch off several checks (need to be at the end of cflags list)
|
||||
cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ]
|
||||
if cc != "clang":
|
||||
if not cc_is_clang:
|
||||
cflags += ['-Wno-cast-function-type' ]
|
||||
|
||||
src_perf = getenv('srctree') + '/tools/perf'
|
||||
|
||||
@@ -1622,7 +1622,12 @@ int dso__load(struct dso *dso, struct map *map)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (dso->kernel) {
|
||||
kmod = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
|
||||
dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ||
|
||||
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE ||
|
||||
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
|
||||
|
||||
if (dso->kernel && !kmod) {
|
||||
if (dso->kernel == DSO_TYPE_KERNEL)
|
||||
ret = dso__load_kernel_sym(dso, map);
|
||||
else if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
|
||||
@@ -1650,12 +1655,6 @@ int dso__load(struct dso *dso, struct map *map)
|
||||
if (!name)
|
||||
goto out;
|
||||
|
||||
kmod = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
|
||||
dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ||
|
||||
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE ||
|
||||
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
|
||||
|
||||
|
||||
/*
|
||||
* Read the build id if possible. This is required for
|
||||
* DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work
|
||||
|
||||
@@ -82,7 +82,7 @@ static struct pci_access *pci_acc;
|
||||
static struct pci_dev *amd_fam14h_pci_dev;
|
||||
static int nbp1_entered;
|
||||
|
||||
struct timespec start_time;
|
||||
static struct timespec start_time;
|
||||
static unsigned long long timediff;
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
@@ -19,7 +19,7 @@ struct cpuidle_monitor cpuidle_sysfs_monitor;
|
||||
|
||||
static unsigned long long **previous_count;
|
||||
static unsigned long long **current_count;
|
||||
struct timespec start_time;
|
||||
static struct timespec start_time;
|
||||
static unsigned long long timediff;
|
||||
|
||||
static int cpuidle_get_count_percent(unsigned int id, double *percent,
|
||||
|
||||
@@ -27,6 +27,8 @@ struct cpuidle_monitor *all_monitors[] = {
|
||||
0
|
||||
};
|
||||
|
||||
int cpu_count;
|
||||
|
||||
static struct cpuidle_monitor *monitors[MONITORS_MAX];
|
||||
static unsigned int avail_monitors;
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#endif
|
||||
#define CSTATE_DESC_LEN 60
|
||||
|
||||
int cpu_count;
|
||||
extern int cpu_count;
|
||||
|
||||
/* Hard to define the right names ...: */
|
||||
enum power_range_e {
|
||||
|
||||
@@ -16,7 +16,7 @@ override CFLAGS += -D_FORTIFY_SOURCE=2
|
||||
|
||||
%: %.c
|
||||
@mkdir -p $(BUILD_OUTPUT)
|
||||
$(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS)
|
||||
$(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) -lcap
|
||||
|
||||
.PHONY : clean
|
||||
clean :
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#include <sched.h>
|
||||
#include <time.h>
|
||||
#include <cpuid.h>
|
||||
#include <linux/capability.h>
|
||||
#include <sys/capability.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
|
||||
@@ -304,6 +304,10 @@ int *irqs_per_cpu; /* indexed by cpu_num */
|
||||
|
||||
void setup_all_buffers(void);
|
||||
|
||||
char *sys_lpi_file;
|
||||
char *sys_lpi_file_sysfs = "/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us";
|
||||
char *sys_lpi_file_debugfs = "/sys/kernel/debug/pmc_core/slp_s0_residency_usec";
|
||||
|
||||
int cpu_is_not_present(int cpu)
|
||||
{
|
||||
return !CPU_ISSET_S(cpu, cpu_present_setsize, cpu_present_set);
|
||||
@@ -2916,8 +2920,6 @@ int snapshot_gfx_mhz(void)
|
||||
*
|
||||
* record snapshot of
|
||||
* /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us
|
||||
*
|
||||
* return 1 if config change requires a restart, else return 0
|
||||
*/
|
||||
int snapshot_cpu_lpi_us(void)
|
||||
{
|
||||
@@ -2941,17 +2943,14 @@ int snapshot_cpu_lpi_us(void)
|
||||
/*
|
||||
* snapshot_sys_lpi()
|
||||
*
|
||||
* record snapshot of
|
||||
* /sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us
|
||||
*
|
||||
* return 1 if config change requires a restart, else return 0
|
||||
* record snapshot of sys_lpi_file
|
||||
*/
|
||||
int snapshot_sys_lpi_us(void)
|
||||
{
|
||||
FILE *fp;
|
||||
int retval;
|
||||
|
||||
fp = fopen_or_die("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", "r");
|
||||
fp = fopen_or_die(sys_lpi_file, "r");
|
||||
|
||||
retval = fscanf(fp, "%lld", &cpuidle_cur_sys_lpi_us);
|
||||
if (retval != 1) {
|
||||
@@ -3151,27 +3150,41 @@ void check_dev_msr()
|
||||
err(-5, "no /dev/cpu/0/msr, Try \"# modprobe msr\" ");
|
||||
}
|
||||
|
||||
void check_permissions()
|
||||
/*
|
||||
* check for CAP_SYS_RAWIO
|
||||
* return 0 on success
|
||||
* return 1 on fail
|
||||
*/
|
||||
int check_for_cap_sys_rawio(void)
|
||||
{
|
||||
cap_t caps;
|
||||
cap_flag_value_t cap_flag_value;
|
||||
|
||||
caps = cap_get_proc();
|
||||
if (caps == NULL)
|
||||
err(-6, "cap_get_proc\n");
|
||||
|
||||
if (cap_get_flag(caps, CAP_SYS_RAWIO, CAP_EFFECTIVE, &cap_flag_value))
|
||||
err(-6, "cap_get\n");
|
||||
|
||||
if (cap_flag_value != CAP_SET) {
|
||||
warnx("capget(CAP_SYS_RAWIO) failed,"
|
||||
" try \"# setcap cap_sys_rawio=ep %s\"", progname);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (cap_free(caps) == -1)
|
||||
err(-6, "cap_free\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
void check_permissions(void)
|
||||
{
|
||||
struct __user_cap_header_struct cap_header_data;
|
||||
cap_user_header_t cap_header = &cap_header_data;
|
||||
struct __user_cap_data_struct cap_data_data;
|
||||
cap_user_data_t cap_data = &cap_data_data;
|
||||
extern int capget(cap_user_header_t hdrp, cap_user_data_t datap);
|
||||
int do_exit = 0;
|
||||
char pathname[32];
|
||||
|
||||
/* check for CAP_SYS_RAWIO */
|
||||
cap_header->pid = getpid();
|
||||
cap_header->version = _LINUX_CAPABILITY_VERSION;
|
||||
if (capget(cap_header, cap_data) < 0)
|
||||
err(-6, "capget(2) failed");
|
||||
|
||||
if ((cap_data->effective & (1 << CAP_SYS_RAWIO)) == 0) {
|
||||
do_exit++;
|
||||
warnx("capget(CAP_SYS_RAWIO) failed,"
|
||||
" try \"# setcap cap_sys_rawio=ep %s\"", progname);
|
||||
}
|
||||
do_exit += check_for_cap_sys_rawio();
|
||||
|
||||
/* test file permissions */
|
||||
sprintf(pathname, "/dev/cpu/%d/msr", base_cpu);
|
||||
@@ -3265,6 +3278,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
|
||||
case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */
|
||||
case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
|
||||
case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */
|
||||
case INTEL_FAM6_ATOM_TREMONT: /* EHL */
|
||||
pkg_cstate_limits = glm_pkg_cstate_limits;
|
||||
break;
|
||||
default:
|
||||
@@ -3336,6 +3350,17 @@ int is_skx(unsigned int family, unsigned int model)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int is_ehl(unsigned int family, unsigned int model)
|
||||
{
|
||||
if (!genuine_intel)
|
||||
return 0;
|
||||
|
||||
switch (model) {
|
||||
case INTEL_FAM6_ATOM_TREMONT:
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int has_turbo_ratio_limit(unsigned int family, unsigned int model)
|
||||
{
|
||||
@@ -3478,6 +3503,23 @@ dump_cstate_pstate_config_info(unsigned int family, unsigned int model)
|
||||
dump_nhm_cst_cfg();
|
||||
}
|
||||
|
||||
static void dump_sysfs_file(char *path)
|
||||
{
|
||||
FILE *input;
|
||||
char cpuidle_buf[64];
|
||||
|
||||
input = fopen(path, "r");
|
||||
if (input == NULL) {
|
||||
if (debug)
|
||||
fprintf(outf, "NSFOD %s\n", path);
|
||||
return;
|
||||
}
|
||||
if (!fgets(cpuidle_buf, sizeof(cpuidle_buf), input))
|
||||
err(1, "%s: failed to read file", path);
|
||||
fclose(input);
|
||||
|
||||
fprintf(outf, "%s: %s", strrchr(path, '/') + 1, cpuidle_buf);
|
||||
}
|
||||
static void
|
||||
dump_sysfs_cstate_config(void)
|
||||
{
|
||||
@@ -3491,6 +3533,15 @@ dump_sysfs_cstate_config(void)
|
||||
if (!DO_BIC(BIC_sysfs))
|
||||
return;
|
||||
|
||||
if (access("/sys/devices/system/cpu/cpuidle", R_OK)) {
|
||||
fprintf(outf, "cpuidle not loaded\n");
|
||||
return;
|
||||
}
|
||||
|
||||
dump_sysfs_file("/sys/devices/system/cpu/cpuidle/current_driver");
|
||||
dump_sysfs_file("/sys/devices/system/cpu/cpuidle/current_governor");
|
||||
dump_sysfs_file("/sys/devices/system/cpu/cpuidle/current_governor_ro");
|
||||
|
||||
for (state = 0; state < 10; ++state) {
|
||||
|
||||
sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name",
|
||||
@@ -3894,6 +3945,20 @@ void rapl_probe_intel(unsigned int family, unsigned int model)
|
||||
else
|
||||
BIC_PRESENT(BIC_PkgWatt);
|
||||
break;
|
||||
case INTEL_FAM6_ATOM_TREMONT: /* EHL */
|
||||
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO;
|
||||
if (rapl_joules) {
|
||||
BIC_PRESENT(BIC_Pkg_J);
|
||||
BIC_PRESENT(BIC_Cor_J);
|
||||
BIC_PRESENT(BIC_RAM_J);
|
||||
BIC_PRESENT(BIC_GFX_J);
|
||||
} else {
|
||||
BIC_PRESENT(BIC_PkgWatt);
|
||||
BIC_PRESENT(BIC_CorWatt);
|
||||
BIC_PRESENT(BIC_RAMWatt);
|
||||
BIC_PRESENT(BIC_GFXWatt);
|
||||
}
|
||||
break;
|
||||
case INTEL_FAM6_SKYLAKE_L: /* SKL */
|
||||
case INTEL_FAM6_CANNONLAKE_L: /* CNL */
|
||||
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO;
|
||||
@@ -4295,6 +4360,7 @@ int has_snb_msrs(unsigned int family, unsigned int model)
|
||||
case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */
|
||||
case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
|
||||
case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */
|
||||
case INTEL_FAM6_ATOM_TREMONT: /* EHL */
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@@ -4324,6 +4390,7 @@ int has_c8910_msrs(unsigned int family, unsigned int model)
|
||||
case INTEL_FAM6_CANNONLAKE_L: /* CNL */
|
||||
case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */
|
||||
case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
|
||||
case INTEL_FAM6_ATOM_TREMONT: /* EHL */
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@@ -4610,14 +4677,24 @@ unsigned int intel_model_duplicates(unsigned int model)
|
||||
case INTEL_FAM6_SKYLAKE:
|
||||
case INTEL_FAM6_KABYLAKE_L:
|
||||
case INTEL_FAM6_KABYLAKE:
|
||||
case INTEL_FAM6_COMETLAKE_L:
|
||||
case INTEL_FAM6_COMETLAKE:
|
||||
return INTEL_FAM6_SKYLAKE_L;
|
||||
|
||||
case INTEL_FAM6_ICELAKE_L:
|
||||
case INTEL_FAM6_ICELAKE_NNPI:
|
||||
case INTEL_FAM6_TIGERLAKE_L:
|
||||
case INTEL_FAM6_TIGERLAKE:
|
||||
return INTEL_FAM6_CANNONLAKE_L;
|
||||
|
||||
case INTEL_FAM6_ATOM_TREMONT_D:
|
||||
return INTEL_FAM6_ATOM_GOLDMONT_D;
|
||||
|
||||
case INTEL_FAM6_ATOM_TREMONT_L:
|
||||
return INTEL_FAM6_ATOM_TREMONT;
|
||||
|
||||
case INTEL_FAM6_ICELAKE_X:
|
||||
return INTEL_FAM6_SKYLAKE_X;
|
||||
}
|
||||
return model;
|
||||
}
|
||||
@@ -4872,7 +4949,8 @@ void process_cpuid()
|
||||
do_slm_cstates = is_slm(family, model);
|
||||
do_knl_cstates = is_knl(family, model);
|
||||
|
||||
if (do_slm_cstates || do_knl_cstates || is_cnl(family, model))
|
||||
if (do_slm_cstates || do_knl_cstates || is_cnl(family, model) ||
|
||||
is_ehl(family, model))
|
||||
BIC_NOT_PRESENT(BIC_CPU_c3);
|
||||
|
||||
if (!quiet)
|
||||
@@ -4907,10 +4985,16 @@ void process_cpuid()
|
||||
else
|
||||
BIC_NOT_PRESENT(BIC_CPU_LPI);
|
||||
|
||||
if (!access("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", R_OK))
|
||||
if (!access(sys_lpi_file_sysfs, R_OK)) {
|
||||
sys_lpi_file = sys_lpi_file_sysfs;
|
||||
BIC_PRESENT(BIC_SYS_LPI);
|
||||
else
|
||||
} else if (!access(sys_lpi_file_debugfs, R_OK)) {
|
||||
sys_lpi_file = sys_lpi_file_debugfs;
|
||||
BIC_PRESENT(BIC_SYS_LPI);
|
||||
} else {
|
||||
sys_lpi_file_sysfs = NULL;
|
||||
BIC_NOT_PRESENT(BIC_SYS_LPI);
|
||||
}
|
||||
|
||||
if (!quiet)
|
||||
decode_misc_feature_control();
|
||||
@@ -5306,7 +5390,7 @@ int get_and_dump_counters(void)
|
||||
}
|
||||
|
||||
void print_version() {
|
||||
fprintf(outf, "turbostat version 19.08.31"
|
||||
fprintf(outf, "turbostat version 20.03.20"
|
||||
" - Len Brown <lenb@kernel.org>\n");
|
||||
}
|
||||
|
||||
@@ -5323,9 +5407,9 @@ int add_counter(unsigned int msr_num, char *path, char *name,
|
||||
}
|
||||
|
||||
msrp->msr_num = msr_num;
|
||||
strncpy(msrp->name, name, NAME_BYTES);
|
||||
strncpy(msrp->name, name, NAME_BYTES - 1);
|
||||
if (path)
|
||||
strncpy(msrp->path, path, PATH_BYTES);
|
||||
strncpy(msrp->path, path, PATH_BYTES - 1);
|
||||
msrp->width = width;
|
||||
msrp->type = type;
|
||||
msrp->format = format;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
ifneq ($(O),)
|
||||
ifeq ($(origin O), command line)
|
||||
dummy := $(if $(shell test -d $(O) || echo $(O)),$(error O=$(O) does not exist),)
|
||||
ABSOLUTE_O := $(shell cd $(O) ; pwd)
|
||||
dummy := $(if $(shell cd $(PWD); test -d $(O) || echo $(O)),$(error O=$(O) does not exist),)
|
||||
ABSOLUTE_O := $(shell cd $(PWD); cd $(O) ; pwd)
|
||||
OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/)
|
||||
COMMAND_O := O=$(ABSOLUTE_O)
|
||||
ifeq ($(objtree),)
|
||||
|
||||
@@ -33,6 +33,7 @@ TARGETS += memory-hotplug
|
||||
TARGETS += mount
|
||||
TARGETS += mqueue
|
||||
TARGETS += net
|
||||
TARGETS += net/forwarding
|
||||
TARGETS += net/mptcp
|
||||
TARGETS += netfilter
|
||||
TARGETS += networking/timestamping
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <test_progs.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/mman.h>
|
||||
#include <pthread.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include "test_send_signal_kern.skel.h"
|
||||
|
||||
static void sigusr1_handler(int signum)
|
||||
{
|
||||
}
|
||||
|
||||
#define THREAD_COUNT 100
|
||||
|
||||
static void *worker(void *p)
|
||||
{
|
||||
int i;
|
||||
|
||||
for ( i = 0; i < 1000; i++)
|
||||
usleep(1);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void test_send_signal_sched_switch(void)
|
||||
{
|
||||
struct test_send_signal_kern *skel;
|
||||
pthread_t threads[THREAD_COUNT];
|
||||
u32 duration = 0;
|
||||
int i, err;
|
||||
|
||||
signal(SIGUSR1, sigusr1_handler);
|
||||
|
||||
skel = test_send_signal_kern__open_and_load();
|
||||
if (CHECK(!skel, "skel_open_and_load", "skeleton open_and_load failed\n"))
|
||||
return;
|
||||
|
||||
skel->bss->pid = getpid();
|
||||
skel->bss->sig = SIGUSR1;
|
||||
|
||||
err = test_send_signal_kern__attach(skel);
|
||||
if (CHECK(err, "skel_attach", "skeleton attach failed\n"))
|
||||
goto destroy_skel;
|
||||
|
||||
for (i = 0; i < THREAD_COUNT; i++) {
|
||||
err = pthread_create(threads + i, NULL, worker, NULL);
|
||||
if (CHECK(err, "pthread_create", "Error creating thread, %s\n",
|
||||
strerror(errno)))
|
||||
goto destroy_skel;
|
||||
}
|
||||
|
||||
for (i = 0; i < THREAD_COUNT; i++)
|
||||
pthread_join(threads[i], NULL);
|
||||
|
||||
destroy_skel:
|
||||
test_send_signal_kern__destroy(skel);
|
||||
}
|
||||
@@ -31,6 +31,12 @@ int send_signal_tp(void *ctx)
|
||||
return bpf_send_signal_test(ctx);
|
||||
}
|
||||
|
||||
SEC("tracepoint/sched/sched_switch")
|
||||
int send_signal_tp_sched(void *ctx)
|
||||
{
|
||||
return bpf_send_signal_test(ctx);
|
||||
}
|
||||
|
||||
SEC("perf_event")
|
||||
int send_signal_perf(void *ctx)
|
||||
{
|
||||
|
||||
@@ -1062,6 +1062,48 @@ static struct btf_raw_test raw_tests[] = {
|
||||
.err_str = "Member exceeds struct_size",
|
||||
},
|
||||
|
||||
/* Test member unexceeds the size of struct
|
||||
*
|
||||
* enum E {
|
||||
* E0,
|
||||
* E1,
|
||||
* };
|
||||
*
|
||||
* struct A {
|
||||
* char m;
|
||||
* enum E __attribute__((packed)) n;
|
||||
* };
|
||||
*/
|
||||
{
|
||||
.descr = "size check test #5",
|
||||
.raw_types = {
|
||||
/* int */ /* [1] */
|
||||
BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, sizeof(int)),
|
||||
/* char */ /* [2] */
|
||||
BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 8, 1),
|
||||
/* enum E { */ /* [3] */
|
||||
BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM, 0, 2), 1),
|
||||
BTF_ENUM_ENC(NAME_TBD, 0),
|
||||
BTF_ENUM_ENC(NAME_TBD, 1),
|
||||
/* } */
|
||||
/* struct A { */ /* [4] */
|
||||
BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_STRUCT, 0, 2), 2),
|
||||
BTF_MEMBER_ENC(NAME_TBD, 2, 0), /* char m; */
|
||||
BTF_MEMBER_ENC(NAME_TBD, 3, 8),/* enum E __attribute__((packed)) n; */
|
||||
/* } */
|
||||
BTF_END_RAW,
|
||||
},
|
||||
.str_sec = "\0E\0E0\0E1\0A\0m\0n",
|
||||
.str_sec_size = sizeof("\0E\0E0\0E1\0A\0m\0n"),
|
||||
.map_type = BPF_MAP_TYPE_ARRAY,
|
||||
.map_name = "size_check5_map",
|
||||
.key_size = sizeof(int),
|
||||
.value_size = 2,
|
||||
.key_type_id = 1,
|
||||
.value_type_id = 4,
|
||||
.max_entries = 4,
|
||||
},
|
||||
|
||||
/* typedef const void * const_void_ptr;
|
||||
* struct A {
|
||||
* const_void_ptr m;
|
||||
|
||||
@@ -61,6 +61,21 @@
|
||||
},
|
||||
.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
|
||||
},
|
||||
{
|
||||
"jset32: ignores upper bits",
|
||||
.insns = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_LD_IMM64(BPF_REG_7, 0x8000000000000000),
|
||||
BPF_LD_IMM64(BPF_REG_8, 0x8000000000000000),
|
||||
BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
|
||||
BPF_EXIT_INSN(),
|
||||
BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 2),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.result = ACCEPT,
|
||||
.retval = 2,
|
||||
},
|
||||
{
|
||||
"jset32: min/max deduction",
|
||||
.insns = {
|
||||
|
||||
@@ -11,7 +11,9 @@ TEST_PROGS += udpgso_bench.sh fib_rule_tests.sh msg_zerocopy.sh psock_snd.sh
|
||||
TEST_PROGS += udpgro_bench.sh udpgro.sh test_vxlan_under_vrf.sh reuseport_addr_any.sh
|
||||
TEST_PROGS += test_vxlan_fdb_changelink.sh so_txtime.sh ipv6_flowlabel.sh
|
||||
TEST_PROGS += tcp_fastopen_backup_key.sh fcnal-test.sh l2tp.sh traceroute.sh
|
||||
TEST_PROGS += fin_ack_lat.sh
|
||||
TEST_PROGS += fin_ack_lat.sh fib_nexthop_multiprefix.sh fib_nexthops.sh
|
||||
TEST_PROGS += altnames.sh icmp_redirect.sh ip6_gre_headroom.sh
|
||||
TEST_PROGS += route_localnet.sh
|
||||
TEST_PROGS += reuseaddr_ports_exhausted.sh
|
||||
TEST_PROGS_EXTENDED := in_netns.sh
|
||||
TEST_GEN_FILES = socket nettest
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+ OR MIT
|
||||
|
||||
TEST_PROGS = bridge_igmp.sh \
|
||||
bridge_port_isolation.sh \
|
||||
bridge_sticky_fdb.sh \
|
||||
bridge_vlan_aware.sh \
|
||||
bridge_vlan_unaware.sh \
|
||||
ethtool.sh \
|
||||
gre_inner_v4_multipath.sh \
|
||||
gre_inner_v6_multipath.sh \
|
||||
gre_multipath.sh \
|
||||
ip6gre_inner_v4_multipath.sh \
|
||||
ip6gre_inner_v6_multipath.sh \
|
||||
ipip_flat_gre_key.sh \
|
||||
ipip_flat_gre_keys.sh \
|
||||
ipip_flat_gre.sh \
|
||||
ipip_hier_gre_key.sh \
|
||||
ipip_hier_gre_keys.sh \
|
||||
ipip_hier_gre.sh \
|
||||
loopback.sh \
|
||||
mirror_gre_bound.sh \
|
||||
mirror_gre_bridge_1d.sh \
|
||||
mirror_gre_bridge_1d_vlan.sh \
|
||||
mirror_gre_bridge_1q_lag.sh \
|
||||
mirror_gre_bridge_1q.sh \
|
||||
mirror_gre_changes.sh \
|
||||
mirror_gre_flower.sh \
|
||||
mirror_gre_lag_lacp.sh \
|
||||
mirror_gre_neigh.sh \
|
||||
mirror_gre_nh.sh \
|
||||
mirror_gre.sh \
|
||||
mirror_gre_vlan_bridge_1q.sh \
|
||||
mirror_gre_vlan.sh \
|
||||
mirror_vlan.sh \
|
||||
router_bridge.sh \
|
||||
router_bridge_vlan.sh \
|
||||
router_broadcast.sh \
|
||||
router_mpath_nh.sh \
|
||||
router_multicast.sh \
|
||||
router_multipath.sh \
|
||||
router.sh \
|
||||
router_vid_1.sh \
|
||||
sch_ets.sh \
|
||||
sch_tbf_ets.sh \
|
||||
sch_tbf_prio.sh \
|
||||
sch_tbf_root.sh \
|
||||
tc_actions.sh \
|
||||
tc_chains.sh \
|
||||
tc_flower_router.sh \
|
||||
tc_flower.sh \
|
||||
tc_shblocks.sh \
|
||||
tc_vlan_modify.sh \
|
||||
vxlan_asymmetric.sh \
|
||||
vxlan_bridge_1d_port_8472.sh \
|
||||
vxlan_bridge_1d.sh \
|
||||
vxlan_bridge_1q_port_8472.sh \
|
||||
vxlan_bridge_1q.sh \
|
||||
vxlan_symmetric.sh
|
||||
|
||||
TEST_PROGS_EXTENDED := devlink_lib.sh \
|
||||
ethtool_lib.sh \
|
||||
fib_offload_lib.sh \
|
||||
forwarding.config.sample \
|
||||
ipip_lib.sh \
|
||||
lib.sh \
|
||||
mirror_gre_lib.sh \
|
||||
mirror_gre_topo_lib.sh \
|
||||
mirror_lib.sh \
|
||||
mirror_topo_lib.sh \
|
||||
sch_ets_core.sh \
|
||||
sch_ets_tests.sh \
|
||||
sch_tbf_core.sh \
|
||||
sch_tbf_etsprio.sh \
|
||||
tc_common.sh
|
||||
|
||||
include ../../lib.mk
|
||||
Executable → Regular
@@ -21,6 +21,10 @@
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef SOL_DCCP
|
||||
#define SOL_DCCP 269
|
||||
#endif
|
||||
|
||||
static const char *IP4_ADDR = "127.0.0.1";
|
||||
static const char *IP6_ADDR = "::1";
|
||||
static const char *IP4_MAPPED6 = "::ffff:127.0.0.1";
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
|
||||
TEST_PROGS := nft_trans_stress.sh nft_nat.sh bridge_brouter.sh \
|
||||
conntrack_icmp_related.sh nft_flowtable.sh ipvs.sh \
|
||||
nft_concat_range.sh
|
||||
nft_concat_range.sh \
|
||||
nft_queue.sh
|
||||
|
||||
LDLIBS = -lmnl
|
||||
TEST_GEN_FILES = nf-queue
|
||||
|
||||
include ../lib.mk
|
||||
|
||||
@@ -1,2 +1,8 @@
|
||||
CONFIG_NET_NS=y
|
||||
CONFIG_NF_TABLES_INET=y
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_REDIR=m
|
||||
CONFIG_NFT_MASQ=m
|
||||
CONFIG_NFT_FLOW_OFFLOAD=m
|
||||
CONFIG_NF_CT_NETLINK=m
|
||||
|
||||
@@ -0,0 +1,352 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <libmnl/libmnl.h>
|
||||
#include <linux/netfilter.h>
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/nfnetlink_queue.h>
|
||||
|
||||
struct options {
|
||||
bool count_packets;
|
||||
int verbose;
|
||||
unsigned int queue_num;
|
||||
unsigned int timeout;
|
||||
};
|
||||
|
||||
static unsigned int queue_stats[5];
|
||||
static struct options opts;
|
||||
|
||||
static void help(const char *p)
|
||||
{
|
||||
printf("Usage: %s [-c|-v [-vv] ] [-t timeout] [-q queue_num]\n", p);
|
||||
}
|
||||
|
||||
static int parse_attr_cb(const struct nlattr *attr, void *data)
|
||||
{
|
||||
const struct nlattr **tb = data;
|
||||
int type = mnl_attr_get_type(attr);
|
||||
|
||||
/* skip unsupported attribute in user-space */
|
||||
if (mnl_attr_type_valid(attr, NFQA_MAX) < 0)
|
||||
return MNL_CB_OK;
|
||||
|
||||
switch (type) {
|
||||
case NFQA_MARK:
|
||||
case NFQA_IFINDEX_INDEV:
|
||||
case NFQA_IFINDEX_OUTDEV:
|
||||
case NFQA_IFINDEX_PHYSINDEV:
|
||||
case NFQA_IFINDEX_PHYSOUTDEV:
|
||||
if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) {
|
||||
perror("mnl_attr_validate");
|
||||
return MNL_CB_ERROR;
|
||||
}
|
||||
break;
|
||||
case NFQA_TIMESTAMP:
|
||||
if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC,
|
||||
sizeof(struct nfqnl_msg_packet_timestamp)) < 0) {
|
||||
perror("mnl_attr_validate2");
|
||||
return MNL_CB_ERROR;
|
||||
}
|
||||
break;
|
||||
case NFQA_HWADDR:
|
||||
if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC,
|
||||
sizeof(struct nfqnl_msg_packet_hw)) < 0) {
|
||||
perror("mnl_attr_validate2");
|
||||
return MNL_CB_ERROR;
|
||||
}
|
||||
break;
|
||||
case NFQA_PAYLOAD:
|
||||
break;
|
||||
}
|
||||
tb[type] = attr;
|
||||
return MNL_CB_OK;
|
||||
}
|
||||
|
||||
static int queue_cb(const struct nlmsghdr *nlh, void *data)
|
||||
{
|
||||
struct nlattr *tb[NFQA_MAX+1] = { 0 };
|
||||
struct nfqnl_msg_packet_hdr *ph = NULL;
|
||||
uint32_t id = 0;
|
||||
|
||||
(void)data;
|
||||
|
||||
mnl_attr_parse(nlh, sizeof(struct nfgenmsg), parse_attr_cb, tb);
|
||||
if (tb[NFQA_PACKET_HDR]) {
|
||||
ph = mnl_attr_get_payload(tb[NFQA_PACKET_HDR]);
|
||||
id = ntohl(ph->packet_id);
|
||||
|
||||
if (opts.verbose > 0)
|
||||
printf("packet hook=%u, hwproto 0x%x",
|
||||
ntohs(ph->hw_protocol), ph->hook);
|
||||
|
||||
if (ph->hook >= 5) {
|
||||
fprintf(stderr, "Unknown hook %d\n", ph->hook);
|
||||
return MNL_CB_ERROR;
|
||||
}
|
||||
|
||||
if (opts.verbose > 0) {
|
||||
uint32_t skbinfo = 0;
|
||||
|
||||
if (tb[NFQA_SKB_INFO])
|
||||
skbinfo = ntohl(mnl_attr_get_u32(tb[NFQA_SKB_INFO]));
|
||||
if (skbinfo & NFQA_SKB_CSUMNOTREADY)
|
||||
printf(" csumnotready");
|
||||
if (skbinfo & NFQA_SKB_GSO)
|
||||
printf(" gso");
|
||||
if (skbinfo & NFQA_SKB_CSUM_NOTVERIFIED)
|
||||
printf(" csumnotverified");
|
||||
puts("");
|
||||
}
|
||||
|
||||
if (opts.count_packets)
|
||||
queue_stats[ph->hook]++;
|
||||
}
|
||||
|
||||
return MNL_CB_OK + id;
|
||||
}
|
||||
|
||||
static struct nlmsghdr *
|
||||
nfq_build_cfg_request(char *buf, uint8_t command, int queue_num)
|
||||
{
|
||||
struct nlmsghdr *nlh = mnl_nlmsg_put_header(buf);
|
||||
struct nfqnl_msg_config_cmd cmd = {
|
||||
.command = command,
|
||||
.pf = htons(AF_INET),
|
||||
};
|
||||
struct nfgenmsg *nfg;
|
||||
|
||||
nlh->nlmsg_type = (NFNL_SUBSYS_QUEUE << 8) | NFQNL_MSG_CONFIG;
|
||||
nlh->nlmsg_flags = NLM_F_REQUEST;
|
||||
|
||||
nfg = mnl_nlmsg_put_extra_header(nlh, sizeof(*nfg));
|
||||
|
||||
nfg->nfgen_family = AF_UNSPEC;
|
||||
nfg->version = NFNETLINK_V0;
|
||||
nfg->res_id = htons(queue_num);
|
||||
|
||||
mnl_attr_put(nlh, NFQA_CFG_CMD, sizeof(cmd), &cmd);
|
||||
|
||||
return nlh;
|
||||
}
|
||||
|
||||
static struct nlmsghdr *
|
||||
nfq_build_cfg_params(char *buf, uint8_t mode, int range, int queue_num)
|
||||
{
|
||||
struct nlmsghdr *nlh = mnl_nlmsg_put_header(buf);
|
||||
struct nfqnl_msg_config_params params = {
|
||||
.copy_range = htonl(range),
|
||||
.copy_mode = mode,
|
||||
};
|
||||
struct nfgenmsg *nfg;
|
||||
|
||||
nlh->nlmsg_type = (NFNL_SUBSYS_QUEUE << 8) | NFQNL_MSG_CONFIG;
|
||||
nlh->nlmsg_flags = NLM_F_REQUEST;
|
||||
|
||||
nfg = mnl_nlmsg_put_extra_header(nlh, sizeof(*nfg));
|
||||
nfg->nfgen_family = AF_UNSPEC;
|
||||
nfg->version = NFNETLINK_V0;
|
||||
nfg->res_id = htons(queue_num);
|
||||
|
||||
mnl_attr_put(nlh, NFQA_CFG_PARAMS, sizeof(params), ¶ms);
|
||||
|
||||
return nlh;
|
||||
}
|
||||
|
||||
static struct nlmsghdr *
|
||||
nfq_build_verdict(char *buf, int id, int queue_num, int verd)
|
||||
{
|
||||
struct nfqnl_msg_verdict_hdr vh = {
|
||||
.verdict = htonl(verd),
|
||||
.id = htonl(id),
|
||||
};
|
||||
struct nlmsghdr *nlh;
|
||||
struct nfgenmsg *nfg;
|
||||
|
||||
nlh = mnl_nlmsg_put_header(buf);
|
||||
nlh->nlmsg_type = (NFNL_SUBSYS_QUEUE << 8) | NFQNL_MSG_VERDICT;
|
||||
nlh->nlmsg_flags = NLM_F_REQUEST;
|
||||
nfg = mnl_nlmsg_put_extra_header(nlh, sizeof(*nfg));
|
||||
nfg->nfgen_family = AF_UNSPEC;
|
||||
nfg->version = NFNETLINK_V0;
|
||||
nfg->res_id = htons(queue_num);
|
||||
|
||||
mnl_attr_put(nlh, NFQA_VERDICT_HDR, sizeof(vh), &vh);
|
||||
|
||||
return nlh;
|
||||
}
|
||||
|
||||
static void print_stats(void)
|
||||
{
|
||||
unsigned int last, total;
|
||||
int i;
|
||||
|
||||
if (!opts.count_packets)
|
||||
return;
|
||||
|
||||
total = 0;
|
||||
last = queue_stats[0];
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
printf("hook %d packets %08u\n", i, queue_stats[i]);
|
||||
last = queue_stats[i];
|
||||
total += last;
|
||||
}
|
||||
|
||||
printf("%u packets total\n", total);
|
||||
}
|
||||
|
||||
struct mnl_socket *open_queue(void)
|
||||
{
|
||||
char buf[MNL_SOCKET_BUFFER_SIZE];
|
||||
unsigned int queue_num;
|
||||
struct mnl_socket *nl;
|
||||
struct nlmsghdr *nlh;
|
||||
struct timeval tv;
|
||||
uint32_t flags;
|
||||
|
||||
nl = mnl_socket_open(NETLINK_NETFILTER);
|
||||
if (nl == NULL) {
|
||||
perror("mnl_socket_open");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
|
||||
perror("mnl_socket_bind");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
queue_num = opts.queue_num;
|
||||
nlh = nfq_build_cfg_request(buf, NFQNL_CFG_CMD_BIND, queue_num);
|
||||
|
||||
if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0) {
|
||||
perror("mnl_socket_sendto");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
nlh = nfq_build_cfg_params(buf, NFQNL_COPY_PACKET, 0xFFFF, queue_num);
|
||||
|
||||
flags = NFQA_CFG_F_GSO | NFQA_CFG_F_UID_GID;
|
||||
mnl_attr_put_u32(nlh, NFQA_CFG_FLAGS, htonl(flags));
|
||||
mnl_attr_put_u32(nlh, NFQA_CFG_MASK, htonl(flags));
|
||||
|
||||
if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0) {
|
||||
perror("mnl_socket_sendto");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
memset(&tv, 0, sizeof(tv));
|
||||
tv.tv_sec = opts.timeout;
|
||||
if (opts.timeout && setsockopt(mnl_socket_get_fd(nl),
|
||||
SOL_SOCKET, SO_RCVTIMEO,
|
||||
&tv, sizeof(tv))) {
|
||||
perror("setsockopt(SO_RCVTIMEO)");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return nl;
|
||||
}
|
||||
|
||||
static int mainloop(void)
|
||||
{
|
||||
unsigned int buflen = 64 * 1024 + MNL_SOCKET_BUFFER_SIZE;
|
||||
struct mnl_socket *nl;
|
||||
struct nlmsghdr *nlh;
|
||||
unsigned int portid;
|
||||
char *buf;
|
||||
int ret;
|
||||
|
||||
buf = malloc(buflen);
|
||||
if (!buf) {
|
||||
perror("malloc");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
nl = open_queue();
|
||||
portid = mnl_socket_get_portid(nl);
|
||||
|
||||
for (;;) {
|
||||
uint32_t id;
|
||||
|
||||
ret = mnl_socket_recvfrom(nl, buf, buflen);
|
||||
if (ret == -1) {
|
||||
if (errno == ENOBUFS)
|
||||
continue;
|
||||
|
||||
if (errno == EAGAIN) {
|
||||
errno = 0;
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
perror("mnl_socket_recvfrom");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
ret = mnl_cb_run(buf, ret, 0, portid, queue_cb, NULL);
|
||||
if (ret < 0) {
|
||||
perror("mnl_cb_run");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
id = ret - MNL_CB_OK;
|
||||
nlh = nfq_build_verdict(buf, id, opts.queue_num, NF_ACCEPT);
|
||||
if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0) {
|
||||
perror("mnl_socket_sendto");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
mnl_socket_close(nl);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void parse_opts(int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
|
||||
while ((c = getopt(argc, argv, "chvt:q:")) != -1) {
|
||||
switch (c) {
|
||||
case 'c':
|
||||
opts.count_packets = true;
|
||||
break;
|
||||
case 'h':
|
||||
help(argv[0]);
|
||||
exit(0);
|
||||
break;
|
||||
case 'q':
|
||||
opts.queue_num = atoi(optarg);
|
||||
if (opts.queue_num > 0xffff)
|
||||
opts.queue_num = 0;
|
||||
break;
|
||||
case 't':
|
||||
opts.timeout = atoi(optarg);
|
||||
break;
|
||||
case 'v':
|
||||
opts.verbose++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ret;
|
||||
|
||||
parse_opts(argc, argv);
|
||||
|
||||
ret = mainloop();
|
||||
if (opts.count_packets)
|
||||
print_stats();
|
||||
|
||||
return ret;
|
||||
}
|
||||
+332
@@ -0,0 +1,332 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# This tests nf_queue:
|
||||
# 1. can process packets from all hooks
|
||||
# 2. support running nfqueue from more than one base chain
|
||||
#
|
||||
# Kselftest framework requirement - SKIP code is 4.
|
||||
ksft_skip=4
|
||||
ret=0
|
||||
|
||||
sfx=$(mktemp -u "XXXXXXXX")
|
||||
ns1="ns1-$sfx"
|
||||
ns2="ns2-$sfx"
|
||||
nsrouter="nsrouter-$sfx"
|
||||
|
||||
cleanup()
|
||||
{
|
||||
ip netns del ${ns1}
|
||||
ip netns del ${ns2}
|
||||
ip netns del ${nsrouter}
|
||||
rm -f "$TMPFILE0"
|
||||
rm -f "$TMPFILE1"
|
||||
}
|
||||
|
||||
nft --version > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without nft tool"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
ip -Version > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without ip tool"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
ip netns add ${nsrouter}
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not create net namespace"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
TMPFILE0=$(mktemp)
|
||||
TMPFILE1=$(mktemp)
|
||||
trap cleanup EXIT
|
||||
|
||||
ip netns add ${ns1}
|
||||
ip netns add ${ns2}
|
||||
|
||||
ip link add veth0 netns ${nsrouter} type veth peer name eth0 netns ${ns1} > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: No virtual ethernet pair device support in kernel"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
ip link add veth1 netns ${nsrouter} type veth peer name eth0 netns ${ns2}
|
||||
|
||||
ip -net ${nsrouter} link set lo up
|
||||
ip -net ${nsrouter} link set veth0 up
|
||||
ip -net ${nsrouter} addr add 10.0.1.1/24 dev veth0
|
||||
ip -net ${nsrouter} addr add dead:1::1/64 dev veth0
|
||||
|
||||
ip -net ${nsrouter} link set veth1 up
|
||||
ip -net ${nsrouter} addr add 10.0.2.1/24 dev veth1
|
||||
ip -net ${nsrouter} addr add dead:2::1/64 dev veth1
|
||||
|
||||
ip -net ${ns1} link set lo up
|
||||
ip -net ${ns1} link set eth0 up
|
||||
|
||||
ip -net ${ns2} link set lo up
|
||||
ip -net ${ns2} link set eth0 up
|
||||
|
||||
ip -net ${ns1} addr add 10.0.1.99/24 dev eth0
|
||||
ip -net ${ns1} addr add dead:1::99/64 dev eth0
|
||||
ip -net ${ns1} route add default via 10.0.1.1
|
||||
ip -net ${ns1} route add default via dead:1::1
|
||||
|
||||
ip -net ${ns2} addr add 10.0.2.99/24 dev eth0
|
||||
ip -net ${ns2} addr add dead:2::99/64 dev eth0
|
||||
ip -net ${ns2} route add default via 10.0.2.1
|
||||
ip -net ${ns2} route add default via dead:2::1
|
||||
|
||||
load_ruleset() {
|
||||
local name=$1
|
||||
local prio=$2
|
||||
|
||||
ip netns exec ${nsrouter} nft -f - <<EOF
|
||||
table inet $name {
|
||||
chain nfq {
|
||||
ip protocol icmp queue bypass
|
||||
icmpv6 type { "echo-request", "echo-reply" } queue num 1 bypass
|
||||
}
|
||||
chain pre {
|
||||
type filter hook prerouting priority $prio; policy accept;
|
||||
jump nfq
|
||||
}
|
||||
chain input {
|
||||
type filter hook input priority $prio; policy accept;
|
||||
jump nfq
|
||||
}
|
||||
chain forward {
|
||||
type filter hook forward priority $prio; policy accept;
|
||||
tcp dport 12345 queue num 2
|
||||
jump nfq
|
||||
}
|
||||
chain output {
|
||||
type filter hook output priority $prio; policy accept;
|
||||
tcp dport 12345 queue num 3
|
||||
jump nfq
|
||||
}
|
||||
chain post {
|
||||
type filter hook postrouting priority $prio; policy accept;
|
||||
jump nfq
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
load_counter_ruleset() {
|
||||
local prio=$1
|
||||
|
||||
ip netns exec ${nsrouter} nft -f - <<EOF
|
||||
table inet countrules {
|
||||
chain pre {
|
||||
type filter hook prerouting priority $prio; policy accept;
|
||||
counter
|
||||
}
|
||||
chain input {
|
||||
type filter hook input priority $prio; policy accept;
|
||||
counter
|
||||
}
|
||||
chain forward {
|
||||
type filter hook forward priority $prio; policy accept;
|
||||
counter
|
||||
}
|
||||
chain output {
|
||||
type filter hook output priority $prio; policy accept;
|
||||
counter
|
||||
}
|
||||
chain post {
|
||||
type filter hook postrouting priority $prio; policy accept;
|
||||
counter
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
test_ping() {
|
||||
ip netns exec ${ns1} ping -c 1 -q 10.0.2.99 > /dev/null
|
||||
if [ $? -ne 0 ];then
|
||||
return 1
|
||||
fi
|
||||
|
||||
ip netns exec ${ns1} ping -c 1 -q dead:2::99 > /dev/null
|
||||
if [ $? -ne 0 ];then
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
test_ping_router() {
|
||||
ip netns exec ${ns1} ping -c 1 -q 10.0.2.1 > /dev/null
|
||||
if [ $? -ne 0 ];then
|
||||
return 1
|
||||
fi
|
||||
|
||||
ip netns exec ${ns1} ping -c 1 -q dead:2::1 > /dev/null
|
||||
if [ $? -ne 0 ];then
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
test_queue_blackhole() {
|
||||
local proto=$1
|
||||
|
||||
ip netns exec ${nsrouter} nft -f - <<EOF
|
||||
table $proto blackh {
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy accept;
|
||||
queue num 600
|
||||
}
|
||||
}
|
||||
EOF
|
||||
if [ $proto = "ip" ] ;then
|
||||
ip netns exec ${ns1} ping -c 1 -q 10.0.2.99 > /dev/null
|
||||
lret=$?
|
||||
elif [ $proto = "ip6" ]; then
|
||||
ip netns exec ${ns1} ping -c 1 -q dead:2::99 > /dev/null
|
||||
lret=$?
|
||||
else
|
||||
lret=111
|
||||
fi
|
||||
|
||||
# queue without bypass keyword should drop traffic if no listener exists.
|
||||
if [ $lret -eq 0 ];then
|
||||
echo "FAIL: $proto expected failure, got $lret" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ip netns exec ${nsrouter} nft delete table $proto blackh
|
||||
if [ $? -ne 0 ] ;then
|
||||
echo "FAIL: $proto: Could not delete blackh table"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "PASS: $proto: statement with no listener results in packet drop"
|
||||
}
|
||||
|
||||
test_queue()
|
||||
{
|
||||
local expected=$1
|
||||
local last=""
|
||||
|
||||
# spawn nf-queue listeners
|
||||
ip netns exec ${nsrouter} ./nf-queue -c -q 0 -t 3 > "$TMPFILE0" &
|
||||
ip netns exec ${nsrouter} ./nf-queue -c -q 1 -t 3 > "$TMPFILE1" &
|
||||
sleep 1
|
||||
test_ping
|
||||
ret=$?
|
||||
if [ $ret -ne 0 ];then
|
||||
echo "FAIL: netns routing/connectivity with active listener on queue $queue: $ret" 1>&2
|
||||
exit $ret
|
||||
fi
|
||||
|
||||
test_ping_router
|
||||
ret=$?
|
||||
if [ $ret -ne 0 ];then
|
||||
echo "FAIL: netns router unreachable listener on queue $queue: $ret" 1>&2
|
||||
exit $ret
|
||||
fi
|
||||
|
||||
wait
|
||||
ret=$?
|
||||
|
||||
for file in $TMPFILE0 $TMPFILE1; do
|
||||
last=$(tail -n1 "$file")
|
||||
if [ x"$last" != x"$expected packets total" ]; then
|
||||
echo "FAIL: Expected $expected packets total, but got $last" 1>&2
|
||||
cat "$file" 1>&2
|
||||
|
||||
ip netns exec ${nsrouter} nft list ruleset
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "PASS: Expected and received $last"
|
||||
}
|
||||
|
||||
test_tcp_forward()
|
||||
{
|
||||
ip netns exec ${nsrouter} ./nf-queue -q 2 -t 10 &
|
||||
local nfqpid=$!
|
||||
|
||||
tmpfile=$(mktemp) || exit 1
|
||||
dd conv=sparse status=none if=/dev/zero bs=1M count=100 of=$tmpfile
|
||||
ip netns exec ${ns2} nc -w 5 -l -p 12345 <"$tmpfile" >/dev/null &
|
||||
local rpid=$!
|
||||
|
||||
sleep 1
|
||||
ip netns exec ${ns1} nc -w 5 10.0.2.99 12345 <"$tmpfile" >/dev/null &
|
||||
|
||||
rm -f "$tmpfile"
|
||||
|
||||
wait $rpid
|
||||
wait $lpid
|
||||
[ $? -eq 0 ] && echo "PASS: tcp and nfqueue in forward chain"
|
||||
}
|
||||
|
||||
test_tcp_localhost()
|
||||
{
|
||||
tc -net "${nsrouter}" qdisc add dev lo root netem loss random 1%
|
||||
|
||||
tmpfile=$(mktemp) || exit 1
|
||||
|
||||
dd conv=sparse status=none if=/dev/zero bs=1M count=900 of=$tmpfile
|
||||
ip netns exec ${nsrouter} nc -w 5 -l -p 12345 <"$tmpfile" >/dev/null &
|
||||
local rpid=$!
|
||||
|
||||
ip netns exec ${nsrouter} ./nf-queue -q 3 -t 30 &
|
||||
local nfqpid=$!
|
||||
|
||||
sleep 1
|
||||
ip netns exec ${nsrouter} nc -w 5 127.0.0.1 12345 <"$tmpfile" > /dev/null
|
||||
rm -f "$tmpfile"
|
||||
|
||||
wait $rpid
|
||||
[ $? -eq 0 ] && echo "PASS: tcp via loopback"
|
||||
}
|
||||
|
||||
ip netns exec ${nsrouter} sysctl net.ipv6.conf.all.forwarding=1 > /dev/null
|
||||
ip netns exec ${nsrouter} sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null
|
||||
ip netns exec ${nsrouter} sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null
|
||||
|
||||
load_ruleset "filter" 0
|
||||
|
||||
sleep 3
|
||||
|
||||
test_ping
|
||||
ret=$?
|
||||
if [ $ret -eq 0 ];then
|
||||
# queue bypass works (rules were skipped, no listener)
|
||||
echo "PASS: ${ns1} can reach ${ns2}"
|
||||
else
|
||||
echo "FAIL: ${ns1} cannot reach ${ns2}: $ret" 1>&2
|
||||
exit $ret
|
||||
fi
|
||||
|
||||
test_queue_blackhole ip
|
||||
test_queue_blackhole ip6
|
||||
|
||||
# dummy ruleset to add base chains between the
|
||||
# queueing rules. We don't want the second reinject
|
||||
# to re-execute the old hooks.
|
||||
load_counter_ruleset 10
|
||||
|
||||
# we are hooking all: prerouting/input/forward/output/postrouting.
|
||||
# we ping ${ns2} from ${ns1} via ${nsrouter} using ipv4 and ipv6, so:
|
||||
# 1x icmp prerouting,forward,postrouting -> 3 queue events (6 incl. reply).
|
||||
# 1x icmp prerouting,input,output postrouting -> 4 queue events incl. reply.
|
||||
# so we expect that userspace program receives 10 packets.
|
||||
test_queue 10
|
||||
|
||||
# same. We queue to a second program as well.
|
||||
load_ruleset "filter2" 20
|
||||
test_queue 20
|
||||
|
||||
test_tcp_forward
|
||||
test_tcp_localhost
|
||||
|
||||
exit $ret
|
||||
@@ -527,11 +527,16 @@ n0 wg set wg0 peer "$pub2" allowed-ips 0.0.0.0/0
|
||||
n0 wg set wg0 peer "$pub2" allowed-ips ::/0,1700::/111,5000::/4,e000::/37,9000::/75
|
||||
n0 wg set wg0 peer "$pub2" allowed-ips ::/0
|
||||
n0 wg set wg0 peer "$pub2" remove
|
||||
low_order_points=( AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= 4Ot6fDtBuK4WVuP68Z/EatoJjeucMrH9hmIFFl9JuAA= X5yVvKNQjCSx0LFVnIPvWwREXMRYHI6G2CJO3dCfEVc= 7P///////////////////////////////////////38= 7f///////////////////////////////////////38= 7v///////////////////////////////////////38= )
|
||||
n0 wg set wg0 private-key /dev/null ${low_order_points[@]/#/peer }
|
||||
[[ -z $(n0 wg show wg0 peers) ]]
|
||||
n0 wg set wg0 private-key <(echo "$key1") ${low_order_points[@]/#/peer }
|
||||
[[ -z $(n0 wg show wg0 peers) ]]
|
||||
for low_order_point in AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= 4Ot6fDtBuK4WVuP68Z/EatoJjeucMrH9hmIFFl9JuAA= X5yVvKNQjCSx0LFVnIPvWwREXMRYHI6G2CJO3dCfEVc= 7P///////////////////////////////////////38= 7f///////////////////////////////////////38= 7v///////////////////////////////////////38=; do
|
||||
n0 wg set wg0 peer "$low_order_point" persistent-keepalive 1 endpoint 127.0.0.1:1111
|
||||
done
|
||||
[[ -n $(n0 wg show wg0 peers) ]]
|
||||
exec 4< <(n0 ncat -l -u -p 1111)
|
||||
ncat_pid=$!
|
||||
waitncatudp $netns0 $ncat_pid
|
||||
ip0 link set wg0 up
|
||||
! read -r -n 1 -t 2 <&4 || false
|
||||
kill $ncat_pid
|
||||
ip0 link del wg0
|
||||
|
||||
declare -A objects
|
||||
|
||||
@@ -41,7 +41,7 @@ $(DISTFILES_PATH)/$(1):
|
||||
flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -O $$@.tmp $(2)$(1) || rm -f $$@.tmp; [ -f $$@.tmp ] || exit 1; if echo "$(3) $$@.tmp" | sha256sum -c -; then mv $$@.tmp $$@; else rm -f $$@.tmp; exit 71; fi'
|
||||
endef
|
||||
|
||||
$(eval $(call tar_download,MUSL,musl,1.1.24,.tar.gz,https://www.musl-libc.org/releases/,1370c9a812b2cf2a7d92802510cca0058cc37e66a7bedd70051f0a34015022a3))
|
||||
$(eval $(call tar_download,MUSL,musl,1.2.0,.tar.gz,https://musl.libc.org/releases/,c6de7b191139142d3f9a7b5b702c9cae1b5ee6e7f57e582da9328629408fd4e8))
|
||||
$(eval $(call tar_download,IPERF,iperf,3.7,.tar.gz,https://downloads.es.net/pub/iperf/,d846040224317caf2f75c843d309a950a7db23f9b44b94688ccbe557d6d1710c))
|
||||
$(eval $(call tar_download,BASH,bash,5.0,.tar.gz,https://ftp.gnu.org/gnu/bash/,b4a80f2ac66170b2913efbfb9f2594f1f76c7b1afd11f799e22035d63077fb4d))
|
||||
$(eval $(call tar_download,IPROUTE2,iproute2,5.4.0,.tar.xz,https://www.kernel.org/pub/linux/utils/net/iproute2/,fe97aa60a0d4c5ac830be18937e18dc3400ca713a33a89ad896ff1e3d46086ae))
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <fcntl.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/io.h>
|
||||
|
||||
@@ -56,7 +56,6 @@ CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NO_HZ_FULL=n
|
||||
CONFIG_HZ_PERIODIC=n
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_ARCH_RANDOM=y
|
||||
CONFIG_FILE_LOCKING=y
|
||||
CONFIG_POSIX_TIMERS=y
|
||||
|
||||
Reference in New Issue
Block a user