summaryrefslogtreecommitdiff
path: root/hosts/vidhar/network/pppoe
diff options
context:
space:
mode:
Diffstat (limited to 'hosts/vidhar/network/pppoe')
-rw-r--r--hosts/vidhar/network/pppoe/default.nix167
-rw-r--r--hosts/vidhar/network/pppoe/no-double-timeout.patch13
-rw-r--r--hosts/vidhar/network/pppoe/o2-password18
3 files changed, 198 insertions, 0 deletions
diff --git a/hosts/vidhar/network/pppoe/default.nix b/hosts/vidhar/network/pppoe/default.nix
new file mode 100644
index 00000000..2ada4577
--- /dev/null
+++ b/hosts/vidhar/network/pppoe/default.nix
@@ -0,0 +1,167 @@
1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 inherit (config.networking) pppInterface;
7in {
8 options = {
9 networking.pppInterface = mkOption {
10 type = types.str;
11 default = "ppp";
12 };
13 };
14
15 config = {
16 networking.vlans = {
17 pppoe = {
18 id = 7;
19 interface = "eno2";
20 };
21 };
22
23 services.pppd = {
24 enable = true;
25 package = pkgs.ppp.overrideAttrs (oldAttrs: {
26 patches = [
27 ./no-double-timeout.patch
28 ] ++ (oldAttrs.patches or []);
29 });
30 peers = {
31 o2.config = ''
32 user DSL0004874856014@s93.bbi-o2.de
33 '';
34 };
35 };
36 systemd.services."pppd-o2" = {
37 stopIfChanged = true;
38
39 restartTriggers = with config; [
40 environment.etc."ppp/pap-secrets".source
41 environment.etc."ppp/options".source
42 environment.etc."ppp/ip-pre-up".source
43 environment.etc."ppp/ip-up".source
44 environment.etc."ppp/ip-down".source
45 ];
46
47 serviceConfig = {
48 LoadCredential = [
49 "password:${config.sops.secrets."o2-password".path}"
50 ];
51
52 RestartSec = lib.mkForce "50ms";
53 RestartMaxDelaySec = "5s";
54 RestartSteps = 4;
55 StartLimitBurst = 10;
56
57 ProtectHome = lib.mkForce "tmpfs";
58 };
59
60 bindsTo = [ "sys-subsystem-net-devices-pppoe.device" ];
61 after = [ "sys-subsystem-net-devices-pppoe.device" ];
62 };
63 sops.secrets."o2-password" = {
64 format = "binary";
65 sopsFile = ./o2-password;
66 };
67
68 environment.etc = {
69 "ppp/options".text = ''
70 nodefaultroute
71 ifname ${pppInterface}
72 lcp-echo-adaptive
73 lcp-echo-failure 10
74 lcp-echo-interval 1
75 maxfail 0
76 mtu 1492
77 mru 1492
78 plugin pppoe.so
79 pppoe-padi-timeout 1
80 pppoe-padi-attempts 10
81 nic-pppoe
82 debug
83 +ipv6
84 '';
85 "ppp/pap-secrets" = {
86 mode = "0400";
87 text = ''
88 DSL0004874856014@s93.bbi-o2.de * @/run/credentials/pppd-o2.service/password *
89 '';
90 };
91 "ppp/ip-pre-up".source = pkgs.resholve.writeScript "ip-pre-up" {
92 interpreter = pkgs.runtimeShell;
93 inputs = [ pkgs.iproute2 pkgs.ethtool ];
94 execer = [
95 "cannot:${lib.getExe' pkgs.iproute2 "ip"}"
96 "cannot:${lib.getExe' pkgs.iproute2 "tc"}"
97 ];
98 } ''
99 ethtool -K pppoe tso off gso off gro off
100
101 ip link del "ifb4$1" || true
102 ip link add name "ifb4$1" type ifb
103 ip link set "ifb4$1" up
104
105 tc qdisc del dev "ifb4$1" root || true
106 tc qdisc del dev "$1" ingress || true
107 tc qdisc del dev "$1" root || true
108
109 tc qdisc add dev "$1" handle ffff: ingress
110 tc filter add dev "$1" parent ffff: basic action ctinfo dscp 0x0000003f 0x00000040 action mirred egress redirect dev "ifb4$1"
111 tc qdisc replace dev "ifb4$1" root cake memlimit 128Mb overhead 35 mpu 74 regional diffserv4 bandwidth 175mbit
112 tc qdisc replace dev "$1" root cake memlimit 128Mb overhead 35 mpu 74 regional nat diffserv4 wash bandwidth 40mbit
113 '';
114 "ppp/ip-up".source = pkgs.resholve.writeScript "ip-up" {
115 interpreter = pkgs.runtimeShell;
116 inputs = [ pkgs.iproute2 ];
117 execer = [ "cannot:${lib.getExe' pkgs.iproute2 "ip"}" ];
118 } ''
119 ip addr add "$4" peer "$5"/32 dev "$1"
120 ip route add default dev "$1" metric 512
121 '';
122 "ppp/ip-down".source = pkgs.resholve.writeScript "ip-down" {
123 interpreter = pkgs.runtimeShell;
124 inputs = [ pkgs.iproute2 ];
125 execer = [ "cannot:${lib.getExe' pkgs.iproute2 "ip"}" ];
126 } ''
127 ip link del "ifb4$1"
128 '';
129 };
130
131 systemd.package = pkgs.systemd.overrideAttrs (oldAttrs: {
132 patches = (oldAttrs.patches or []) ++ [
133 (pkgs.fetchpatch {
134 url = "https://github.com/sysedwinistrator/systemd/commit/b9691a43551739ddacdb8d53a4312964c3ddfa08.patch";
135 hash = "sha256-TLfOTFodLzCVywnF4Xp4BR2Pja0Qq4ItE/yaKkzI414=";
136 })
137 ];
138 });
139
140 systemd.network.networks = {
141 "40-${pppInterface}" = {
142 matchConfig.Name = pppInterface;
143 dns = [ "::1" "127.0.0.1" ];
144 domains = [ "~." ];
145 networkConfig = {
146 DHCP = true;
147 DNSSEC = true;
148 };
149 dhcpV6Config = {
150 PrefixDelegationHint = "::/64";
151 WithoutRA = "solicit";
152 };
153 };
154 };
155
156 boot.kernelModules = [ "ifb" ];
157 boot.kernel.sysctl = {
158 "net.ipv6.conf.all.forwarding" = true;
159 "net.ipv6.conf.default.forwarding" = true;
160 "net.ipv4.conf.all.forwarding" = true;
161 "net.ipv4.conf.default.forwarding" = true;
162
163 "net.core.rmem_max" = 4194304;
164 "net.core.wmem_max" = 4194304;
165 };
166 };
167}
diff --git a/hosts/vidhar/network/pppoe/no-double-timeout.patch b/hosts/vidhar/network/pppoe/no-double-timeout.patch
new file mode 100644
index 00000000..53f41ae1
--- /dev/null
+++ b/hosts/vidhar/network/pppoe/no-double-timeout.patch
@@ -0,0 +1,13 @@
1diff --git i/pppd/plugins/pppoe/discovery.c w/pppd/plugins/pppoe/discovery.c
2index 86bda61..8060558 100644
3--- i/pppd/plugins/pppoe/discovery.c
4+++ w/pppd/plugins/pppoe/discovery.c
5@@ -686,7 +686,7 @@ discovery1(PPPoEConnection *conn, int waitWholeTimeoutForPADO)
6 conn->discoveryState = STATE_SENT_PADI;
7 waitForPADO(conn, timeout, waitWholeTimeoutForPADO);
8
9- timeout *= 2;
10+ // timeout *= 2;
11 } while (conn->discoveryState == STATE_SENT_PADI);
12 }
13
diff --git a/hosts/vidhar/network/pppoe/o2-password b/hosts/vidhar/network/pppoe/o2-password
new file mode 100644
index 00000000..cd3aed78
--- /dev/null
+++ b/hosts/vidhar/network/pppoe/o2-password
@@ -0,0 +1,18 @@
1{
2 "data": "ENC[AES256_GCM,data:mxHA3rrs5Sc50jAP,iv:iW1ua7wjZR8rPwXw21TdFK+fbfosc1CmnrTG34OJ2zM=,tag:pZ/FAHupnKy0wHtF6RN7yA==,type:str]",
3 "sops": {
4 "age": [
5 {
6 "recipient": "age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866",
7 "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpUzAvSlJkSFhhRTFLY0VO\nU1VYbFhpMEpxaFhlb2NyS0xDNU5oMm9EZzJnCm5vbTM4c3lFMU5EajhwTGd6MTVx\nZTFmNVlyaVZuRy9hL2VnWFR0TTNEemsKLS0tIDdTemNMTTllQ1pmb0JNTlVGcTlU\nWjQ2MW4yVmtvRng3TlRDbmpHdmRkbUEKtIVAq4aZD6rhtX7+67EE5eOKAtGsVpBg\nPkfjkyV8ifBEx/lwDaJSHpLPfkbI9oArTL8BloodJEEGql5PXZxtvg==\n-----END AGE ENCRYPTED FILE-----\n"
8 },
9 {
10 "recipient": "age1qffdqvy9arld9zd5a5cylt0n98xhcns5shxhrhwjq5g4qa844ejselaa4l",
11 "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBmUk1oZGdjL25YbGRzdFFh\nRllkcU1IM0x6a2M2S0JicDBFYnBxMWluaEFzCjJ3WHozNkw0RThCMG5BNE5uUkZa\nTnV1OHpaSkMrTk9XM1NRWmxlTmRuUFkKLS0tIE9qdXVWOG9CL0MyS1JXbzhmbVdC\nZlRBWm1SSTZWYzBDc1U4ci94a0hMcHcKLgbJSAMUJ9VaXVmYQe+Uj13KrWFe4QvJ\nRcibCyOJH/VO3rmxU8RAkx0jaH448h9klWhs583Od5yNg7GleC+/qg==\n-----END AGE ENCRYPTED FILE-----\n"
12 }
13 ],
14 "lastmodified": "2026-04-14T15:24:19Z",
15 "mac": "ENC[AES256_GCM,data:/dr0bXAf0v5K9LdKw7RzTTL8Qw/WqiHqLk0EbahDnFg3cVplV0s+ImCnxmhutv3hxdtMZ2dmLBfb8CYb/ZLc4HtNT/K2iKGQM7pF4+XxIjS35Q1JUcXxLrsGZcpARuCZ0AJnKo8yFgtM64dYcbxHlRwGG4u4Ds9fEHHLUMigNM0=,iv:jfFlfscUB7S1JjL/uBeW3uD4bugCT9Cj/vigGvGXrlA=,tag:suol02QD4jRH/QulWoV21A==,type:str]",
16 "version": "3.12.2"
17 }
18}