From 5d45ddbfaa44d29eb6077153248806d73ceabde9 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Fri, 10 Mar 2023 22:36:47 +0100 Subject: surtr: bifrost dscp --- overlays/preserve-dscp/default.nix | 36 ++++++++++++++++++++++++ overlays/preserve-dscp/kern_env.patch | 24 ++++++++++++++++ overlays/preserve-dscp/kern_sec_classifier.patch | 22 +++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 overlays/preserve-dscp/default.nix create mode 100644 overlays/preserve-dscp/kern_env.patch create mode 100644 overlays/preserve-dscp/kern_sec_classifier.patch (limited to 'overlays/preserve-dscp') diff --git a/overlays/preserve-dscp/default.nix b/overlays/preserve-dscp/default.nix new file mode 100644 index 00000000..7f956a12 --- /dev/null +++ b/overlays/preserve-dscp/default.nix @@ -0,0 +1,36 @@ +{ final, prev, sources, ... }: +{ + preserve-dscp = prev.stdenv.mkDerivation rec { + pname = "preserve-dscp"; + inherit (sources.bpf-examples) version src; + + patches = [ ./kern_env.patch ./kern_sec_classifier.patch ]; + + makeFlags = [ "PREFIX=$(out)" ]; + buildFlags = [ "preserve-dscp" ]; + + CPATH = prev.lib.makeSearchPathOutput "dev" "include" (buildInputs ++ nativeBuildInputs); + BPF_CFLAGS = "-Wno-unused-command-line-argument -fno-stack-protector"; + + outputs = [ "out" "lib" ]; + + buildInputs = with final; [ elfutils libpcap zlib ]; + nativeBuildInputs = with final; [ llvmPackages.clang llvmPackages.llvm pkgconfig bpftool libmnl gnum4 glibc_multi makeWrapper ]; + + installPhase = '' + mkdir -p $lib/lib/bpf + install -t $lib/lib/bpf \ + preserve-dscp/preserve_dscp_kern.o + + mkdir -p $out/bin + install -m 555 -t $out/bin \ + preserve-dscp/preserve-dscp + wrapProgram $out/bin/preserve-dscp \ + --set-default PRESERVE_DSCP_KERN $lib/lib/bpf/preserve_dscp_kern.o + ''; + + dontFixup = true; + + meta.mainProgram = "preserve-dscp"; + }; +} diff --git a/overlays/preserve-dscp/kern_env.patch b/overlays/preserve-dscp/kern_env.patch new file mode 100644 index 00000000..7fe57b19 --- /dev/null +++ b/overlays/preserve-dscp/kern_env.patch @@ -0,0 +1,24 @@ +diff --git a/preserve-dscp/preserve-dscp.c b/preserve-dscp/preserve-dscp.c +index 8c66186..5916fc5 100644 +--- a/preserve-dscp/preserve-dscp.c ++++ b/preserve-dscp/preserve-dscp.c +@@ -13,7 +13,7 @@ + + int main(int argc, char *argv[]) + { +- const char *filename = "preserve_dscp_kern.o"; ++ char *filename = 0; + char *ifname_pre, *ifname_post; + int ifindex_pre, ifindex_post; + struct bpf_map *map = NULL; +@@ -26,6 +26,10 @@ int main(int argc, char *argv[]) + DECLARE_LIBBPF_OPTS(bpf_tc_opts, attach_post); + + ++ if (!(filename = getenv("PRESERVE_DSCP_KERN"))) ++ filename = "preserve_dscp_kern.o"; ++ ++ + if (argc < 3) { + fprintf(stderr, "Usage: %s [--unload]\n", argv[0]); + return 1; diff --git a/overlays/preserve-dscp/kern_sec_classifier.patch b/overlays/preserve-dscp/kern_sec_classifier.patch new file mode 100644 index 00000000..465b36f6 --- /dev/null +++ b/overlays/preserve-dscp/kern_sec_classifier.patch @@ -0,0 +1,22 @@ +diff --git a/preserve-dscp/preserve_dscp_kern.c b/preserve-dscp/preserve_dscp_kern.c +index 24120cb..b070733 100644 +--- a/preserve-dscp/preserve_dscp_kern.c ++++ b/preserve-dscp/preserve_dscp_kern.c +@@ -91,7 +91,7 @@ static void set_dscp(struct __sk_buff *skb, __u8 dscp) + ipv6_change_dsfield(ipv6hdr, INET_ECN_MASK, dscp << 2); + } + +-SEC("classifier/read") ++SEC("classifier") + int read_dscp(struct __sk_buff *skb) + { + __u32 key = bpf_get_hash_recalc(skb); +@@ -106,7 +106,7 @@ int read_dscp(struct __sk_buff *skb) + return TC_ACT_OK; + } + +-SEC("classifier/write") ++SEC("classifier") + int write_dscp(struct __sk_buff *skb) + { + __u32 key = skb->hash; -- cgit v1.2.3