From 5d45ddbfaa44d29eb6077153248806d73ceabde9 Mon Sep 17 00:00:00 2001
From: Gregor Kleen <gkleen@yggdrasil.li>
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 <if pre> <if post> [--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