Blame

8bc858 Samuli Seppänen 2025-01-21 09:38:20 1
# CommunityMeetup2024
8cdee2 Samuli Seppänen 2025-01-21 10:55:50 2
3
## Dates
4
Set to 20-22 September 2024
5
6
## Venue
7
Game Studio at Steamworks, Roonstr. 23a, Karlsruhe, Germany.
8
9
Hotels close-by: [Hotel Santo](https://www.hotel-santo.de/)
10
11
## Who is coming?
12
13
| **Name** | **Topics** | **Arrival** | **Departure** | **Hotel** | **T-shirt size** |
14
|-----------------------|--------------------------------------------------------------|------------------------------|------------------------------|-----------|------------------|
15
| Lev Stipakov | dco-win P2MP in 2.7 | Thursday evening | Sunday afternoon-ish | Santo | M |
16
| Gert Döring | routing, VRFs, policy on Linux. Removal of wintun support. 2.7 time plan | Thursday 18:53 (IC 2064) | Sunday 11:06 (IC 2067) | Santo | XL |
17
| Arne Schwabe | | Thursday evening | Monday morning | Santo | XXL |
18
| Johan Draaisma | | Thursday 19 September | Monday 23 September | Santo | XL |
19
| Frank Lichtenheld | 2.7 release process, general merge process | N/A (Home town) | N/A | N/A | XL |
20
| Heiko Hund | | n/a | n/a | n/a | XL |
21
| Max Fillinger | TLS 1.3 with mbed TLS (again) | Thursday ~ 19:00 | Monday | Santo | XL |
22
| Steffan Karger | Crypto stuff | Thu ~ 19:00 | Sun ~ 10:00 | Santo | M |
23
| Rein van Baaren | | tbd (probably Thursday) | tbd (probably Monday) | | XL |
24
| Gianmarco De Gregori | Implement netlink introspection for DCO APIs | Thursday ~ 20:00 | Sunday around noon | Santo | M |
25
| Yuriy Darnobyt | | Thursday 19 September | Monday 23 September | Santo | L |
26
| Antonio Quartulli | 2.7 release process (can we somehow formalize it?) | N/A | N/A | | M |
27
| André (Pippin) | Shirt only, maybe sticker for laptop | n/a | n/a | | M |
28
| Jan Just Keijzer | | can't make it | | | XL |
29
| Samuli Seppänen | Buildbot, CI/CD, test frameworks | Thursday evening | Sunday afternoon-ish | Santo | L |
30
| Richard T Bonhomme | TShirt only, with thanks | unable to travel | | | XL |
31
| Reynir Björnson | | can't make it | | | |
32
33
## Meeting topics (so far)
34
- **OpenVPN 2.7**
35
- What are the major new features going in here?
36
- Roughly by when do we want to have 2.7 ready (before next debian)?
37
- **OpenVPN 2.7 release process**
38
- **General merge process**
39
- How does the process work, what changes were made (e.g. Gerrit, more tests in buildbot)
40
- Where do we have problems/shortcomings, what do we want to improve further?
41
- gert: "if possible, please include instructions how to test a change (or how to verify that 'nothing changes') in the commit message"
42
- approach to large(r) scale architectural changes
43
- "just hack on it, and then send a 20-odd page patch set"?
44
- "agree on the general direction first"?
45
- **lzo compression**
46
- How will we deal with this, when will we remove it?
47
- **krzee is asking for failover improvements**
48
- In openvpn3 some improvements have been made to allow better automatic failover when a server goes down.
49
- The ask is if we can port some of those improvements to OpenVPN2?
50
- Related github issues: [Issue 281](https://github.com/OpenVPN/openvpn/issues/281) and [Issue 282](https://github.com/OpenVPN/openvpn/issues/282)
51
- patch/code flow in ovpn-dco-win ([Pull Request #79](https://github.com/OpenVPN/ovpn-dco-win/pull/79))
52
- (which branches, what are the rules)
53
- patch/code flow in openvpn-build
54
- which branches, what are the rules?
55
- have we written this up somewhere?
56
- dco-win multipeer
57
- target for 2.7?
58
- scope (no TCP, no iroutes, no wireguard format support?)
59
- help with testing
60
- check the status of "technology preview" builds, ensure we build those from master + dco v2 (with multipeer)
61
- removal of wintun support
62
- DNS and MacOS and Tunnelblick
63
- if a laptop moves to a different wifi/lan segment while Tunnelblick is active *and* has `--dns` set up, Tunnelblick (or OpenVPN via --down script?) will restore "the old network DNS settings" on openvpn exit. Do we have a MacOS expert who can suggest how to do this better?
64
- Platforms and Tunnelcrack
65
- Windows is covered
66
- but WFP rules still permit inbound connects via LAN - intentional?
67
- Linux
68
- ip rules, ip tables, VRFs, whatnot...?
69
- macOS
70
- can it be done? if yes, how?
71
- other platforms are not typical "roaming laptop" platforms, so maybe not really in scope (if doable at all)
72
- DDoS resistance (bloom filters)
73
- where do we want to go? is this still needed?
74
- AES-GCM improvements (Arne, Steffan)
75
- and DATA_V3 patch sets for Userspace + dco-win
76
- "driver" reconstruction of tun.c & friends
77
- `--cipher`, `--data-ciphers`, Warnings, and #NM?
78
- [Gerrit Review #746](https://gerrit.openvpn.net/c/openvpn/+/746)
79
- what shall we do with a lone `--cipher` in the config in 2.7?
80
- ignore (silent, D_LOW)
81
- warn, and re-word the warning so people on #nm actually understand
82
- bring back the "just append to `--data-ciphers`" feature (maybe not if BF-CBC)? ... which has consequences for DCO, of course.
83
- there seems to be a large userbase using **AES-*-CBC** and having non-compliant servers
84
- have `--data-ciphers +AES-128-CBC` to append to list, and reword warning so people do this?
85
- the reason we have this: servers that are fixed to **AES-128-CBC** - by admins, or because it's not real OpenVPN but SoftEther or such, so NCP to **AES-*-GCM** does not work
86
- multisocket patch set
87
- mesh VPN
88
- custom control channel message "the DPC stuff"
89
- PUSH_UPDATE
90
- locked-username-replacement (pushing auth-token-user + auth-token) (Arne/Gert)
91
92
## Meeting Notes
93
Original cryptpad: [Cryptpad](https://cryptpad.fr/pad/#/2/pad/edit/KPJKt7RSPrvC9grrvQ0KhbwE/)
94
95
These notes are edited to be more accessible.
96
97
### OpenVPN 2.7
98
#### Feature Set
99
For more detailed discussions on most of these items see below.
100
- Already done
101
- Deprecation/removal stuff
102
- Static key mode going into deprecation
103
- Tunnelcrack improvements for Windows
104
- Must have (would block release):
105
- Deprecation/removal stuff
106
- Wintun driver support (Lev?)
107
- Compression support (Frank)
108
- Multi-socket support (Antonio, Gianmarco)
109
- --dns implementation (Heiko, Gert)
110
- New API for DCO kernel module on Linux (Antonio, Arne?)
111
- Should have:
112
- Data v3 format with AES rekeying (Arne, Steffan)
113
- Tunnelcrack improvements for Linux (Heiko, Gianmarco)
114
- Cipher/data-ciphers add DEFAULT syntax (Arne)
115
- Nice to have:
116
- Bloom-filter DDoS protection (Max will take a look)
117
- Live route updates / push-update (Mister Antonio)
118
- dco-win multipeer (Lev)
119
- afunix/lwipovpn (Gert, Frank, Arne)
120
- Things not put into one of the above categories yet:
121
- app custom control
122
- Testing improvements that make sense to do before this release
123
- add server multi-socket testing support to t_server_null.sh (Samuli)
124
- improve Windows t_client testing (Samuli)
125
126
#### TIMELINE and BETA process
127
- target is to release latest end of January 2025 to get into new Debian stable
128
- "the beta release happens when `--dns` and multisocket are in"
129
- provide windows installer etc
130
- branching "when it makes sense", not too early - specifics to be discussed (2.6 was not so useful, too many patches going to master+2.6)
131
132
#### Future ideas
133
- multi-channel support
134
- mesh support
135
136
### Conclusions from discussions
137
Discussions about specific topic.
138
139
#### Compression
140
Let's disable compression for good going forward. Motivation is that compression is insecure. The idea is that there is no way anymore then to override enable compression.
141
We can remove sending compressed packets, but we have to keep receiving compressed packets, because OpenVPN peers out there may still be using compression for a long time, so we want to keep things working but not in any way encourage using compression in new installations.
142
Also turn on compress mitigate automatically for `--server` and `--comp-lzo`.
143
144
#### Static key mode
145
This is a way to run an OpenVPN connection without TLS, and using static keys. We are deprecating it as per OpenVPN 2.7 and putting a warning when people try to use it. There is an override flag to keep it working in 2.7, but it will be definitely removed in OpenVPN 2.8.
146
147
#### Bloom-filter DDoS protection
148
People generally agree we want this but there seems to be no push for it. Arne cautions it is one of those things that when you really have a need for it, it is too late. There is a patchset for this. Max is willing to review.
149
Background: we want this to avoid OpenVPN stopping to reply to legitimate client hellos in the situation where "someone ugly" uses OpenVPN for reflective DDoS purposes - or just sends sufficient TLS hellos to exceed the 100 packets/minute limit. The intent is to "block that /24" or "/16" or "wherever all the crap is coming from" by hashing incoming IPs to buckets and blocking on an effective-but-not-overblocking level. Drawback: +4M memory usage if turned on.
150
Testing is not trivial...
151
The real question here is "is what we have good enough" or "can/should we do better"?
152
153
#### Wintun support
154
Short background on "frictions on licensing problems, shipping problems (wintun needs binary .dll provided by Jason to upgrade to "latest version") and personal attacks"
155
DCO-WIN is only supported on "Win10 versions after 2020 H1" and Win11 (and recent Server versions), so "someone might need wintun support for fast OpenVPN on those old platforms"
156
The conclusion basically is while DCO has been as a default driver since 2.6, TAP must also be kept for older cipher situations (because DCO only supports AEAD ciphers and tun mode) and older operating systems, and use-cases like bridging. But wintun is a complication legally and technically.
157
Windows might benefit from having "more ciphers", like AES-128-CBC in DCO-Win - and then we could go for "only install dco-win by default, tap-windows6 only on request".
158
Arne "we have decided that we want to deprecate it, just how so?" - Frank "we do not fully drop support" - Gert "make --driver wintun an alias for tap-windows" (or "ignore it with warning").
159
Needs to be very explicit on the release note pages, and explanations "what are the best options for you now?" -> stick to 2.6+wintun (support will continue for 1+ year after 2.7 release), or use 2.7+dco/tap6. So basically people using wintun and upgrading to 2.7 will be automatically switched to TAP as this is pretty much guaranteed to just work, and if they want faster implementation, they can choose to switch to DCO, but then they of course have to check that their configs are compatible with that.
160
Side note: wireguard for windows now is not using wintun anymore but WireguardNT
161
162
#### Multi-channel support
163
Basic idea is that there is one central server that handles the routing and instructing the clients what to do, and serves as a pretty much guaranteed way to reach resources. There would be one VPN adapter but the data channels can go to different peers.
164
But there may be more optimal paths to reach resources, directly through a specific peer. The central server could instruct the VPN client to send that specific traffic through that peer. But if for example the client doesn't support this it can still go through the central server.
165
166
#### Live route updates / push-update
167
This is a new control channel message that allows to instruct capable clients to implement new client-side routes without having to drop the whole VPN connection and reestablish.
168
OpenVPN Inc. is basically wanting this in OpenVPN3 / OpenVPN Connect v3, and PGMT, and is working to implement that. Client-side implementations in OpenVPN3 are done for Windows and Linux. PGMT/Cloudconnexa will soon implement it.
169
Main motivation is that ZTNA/device posture stuff is kind of a thing that 'the market' wants and you may end up having your device changing posture and that means getting more or less access and then having to reconnect a user is a bit costly. Also, if you have a busy server that implements a new route and wants clients to implement it, you basically disconnect everyone all at once and then DoS yourself for a while while hundreds of clients reconnect at the same time.
170
Antonio says that Mario has time to implement live route updates in OpenVPN2. So far there was only a small blocker that the OpenVPN RFC PR hadn't had review from Gert yet and it's kind of not great to start implementing something not fully agreed on. It looks like we can get Gert's eyes on it and then move on.
171
172
#### Multi-socket support
173
This is basically done but needs review, and Antonio will do a first round of review. Antonio intends to review it in begin October but if things don't work out that way it's still better to just throw it at Gerrit (d12fk will have a look), no matter what state it is then. Better that it gets review than stuck.
174
175
#### Merge process
176
- we want windows testing in buildbot/gerrit, so the actual merge can be done with "I already know that it does not break Windows" confirmation from Gerrit
177
- we want to abandon patchwork -> this needs an easy way to move a patch from "the mailing list" to gerrit (Frank offered to write a script to be run from his "mutt" mail client)
178
- can we have good commit messages - "how to test the effect of this patch?" - especially for bug fixes, "this is how to reproduce the bug, this is what changes"
179
- code review improvements - "Arne and Frank do all the review"
180
- can we have more reviewers, please? "If you can write code, you can also help with review"
181
- gap between "initial review" and "Gert dislikes it" can be very high, which is bad user experience
182
- "what do you want me to do?" - "just press the merge button" or "add review & merge testing?"
183
- how to scale up Gert? ;-)
184
- enhance testing so "pre-merge tests" can be better distributed?
185
- what are we going to do with patches that have NO reviews? E.g.
186
- bloom filters
187
- HAProxy protocol
188
- what about features that are technically okay, but create a maintenance burden on the project (like, test infrastructure extensions)? When "do we want" something? When does it "add value to the project"?
189
- Steffan: Gert functions are "coordinating" and "benevolent dictator"
190
- the coordination role might be distributed better ("for this meeting, we should look at *those* patches?", or "xxx, can you have a look at $patch" etc)
191
- "let's do the things we have been doing, but make them better" ;-)
192
193
#### Testing improvements
194
- t_server tests run from gerrit?
195
- `--dns`
196
- use hostnames for t_client ping
197
- have the reference servers push DNS servers that "know something not on public DNS"
198
- t_server_null
199
- add lwip client tests
200
- add actual ping / http / ... tests
201
- needs lwip support merged
202
- add server multi-socket testing support (Samuli)
203
- enhance to run "reference binaries" vs. "the binary just built" (Samuli)
204
- will not give us "cross platform interop" testing (FreeBSD <-> Linux), but this is very rarely a problem
205
- is compatible with DCO (one side uses lwip userspace IP, other side users normal OpenVPN forwarding - either "normal tun" or "dco")
206
- t_client enhancements
207
- upgrade server to DATA_V3 (Ecrist's "phillip" server)
208
- add client test with `--data-ciphers Chacha-Poly` (so this code gets exercised, especially with v3)
209
- automated windows testing from buildbot (gerrit)
210
- improve Windows t_client testing
211
- Validate that DNS and Windows Firewall setting are processed correctly
212
- Lev's current test suite uses OpenVPN GUI to emulate a real user
213
214
#### --cipher handling
215
In 2.6, `--cipher foo` triggers a warning that people misunderstand and config `--data-ciphers foo`, breaking AEAD and DCO compatibility.
216
- Can we downgrade it to D_LOW so it's causing less confusion? ([Gerrit Review #746](https://gerrit.openvpn.net/c/openvpn/+/746))
217
- Shall we reword it instead?
218
- Shall we auto-append `--cipher` to `--data-ciphers $list`?
219
- Shall we add a syntax `--data-ciphers default:$foo` and include that config statement into the warning message? or `--data-ciphers +$foo`?
220
- There is another warning message - "options error: .. add the server cipher to --data-ciphers, currently ..." (not touched by patch today).
221
- Please do not put hardcoded list of ciphers into config files (future compatibility with to-be-deprecated and nice-and-shiny-to-be ciphers)
222
223
**SUMMARY**: "the new syntax is not defined here, but should be similar to OpenSSL's cipher list syntax. the warning is kept, and changed to point to the new syntax". Arne can do it, but a volunteer would be welcome.
224
225
### DATA_V3 Discussion
226
Problem: after about \(2^{28}\) (full-size) packets with AES-GCM key needs to be regenerated (today we regenerate about at \(2^{32}\)). What we do currently is not "critical" yet, but not good enough. We look at TLS 1.3 and they also switch keys more often.
227
228
\(2^{28}\) will cause rekeying "quite often" on fast links, so we do not really want to do full TLS renegotiation. MACSEC has the same issue - they do \(2^{32}\), and need to rekey every 9 seconds(!) on 400G interfaces when on full load.
229
230
Basic idea: use tls-exporter to get new keys frequently without full TLS renegotiation.
231
232
Open question: how to signal "new key used now" - use topmost bit in 32 bit counter? go to 64 bit counter? Arne has a sketch on the tablet.
233
234
- 32bit counter -> on a fast network, and a lengthy link outage, the signal bits might wrap twice and keys are out of sync (normally noticing counter wraparound is easy if you can see "sufficient packets", but if \(linkfast+longoutage\) (15s at 400G), you desync). This is not a problem today with TLS-renegotiation every hour anyway, but might become a problem in 5 year.
235
236
(Side note: AEAD-at-end is nearly identical to IPSEC ESP packet format, and hardware-accelerated NICs for IPSEC exists - so theoretically, 200G accelerated OpenVPN look doable "in a few months"...)
237
238
- **Proposal 1**: use 32+32 ID, top 32 bit = always key ID, lower 32 bit = run up to \(2^{28}\), then restart at 0 - problem: reordered packets at key rollover fall outside of window -> drop
239
- **Proposal 2**: use 64 bit packet counter, and "certain bits" select the key ID (like, bit 28+29). Both ends need to agree on "what you are doing". Wraparound counter depends on *packet size*, and this might not be identically on both ends (and needs more testing, "mtu 9000" will have mask bits in different places than "mtu 1400").
240
241
**DCO interaction?**
242
Keys generated in userland by TLS library (this is the plan), so DCO gets new keys when needed -> which means DCO needs to tell userland when a new key is due ("half the sequence space used up")
243
244
- Steffan: we could start with the TLS EKM key, and then use our own key derivation function to generate +1 keys from that (so DCO can do that in kernel space).
245
246
(at this point the discussion derailed into ratchets and HMACs and crypto ;-) )
247
248
AES-GCM-XPN "what is that and how do they do that?" (MACSEC stuff)
249
250
**Next steps**: Lev, Arne, Steffan (+MaxF +Ryan) agree on how to implement it, taking DCO into account.
251
252
### Locked-Username-Replacement
253
- Short discussion between Arne and Gert - this is for `pushed username for future use with tokens` to actually work, because the username is locked in the TLS context, and if a client comes back with a username while "username was empty on the first connect" it's refused.
254
- Arne: "management and scripts just need to override the locked-username so pushed usernames work", but actual implementation is harder.
255
256
### DNS
257
Heiko: there is a pending implementation for `--dns` for Windows (code), Unix* (script) - get feedback, how to proceed.
258
- **Windows**: done in iservice
259
- Today: only 1 search domain can be set (wmic client)
260
- New code: directly sets registry & then tells resolver to update
261
- **Unix**: new approach similar to `--down-root` (removing config on exit) - fork() helper process that keeps running with privileges, and talks via pipe. Plus new `--dns` script hook (in addition to `--up`, so we can ship a DNS script that does "just DNS" and leave `--up` to whatever a distribution wants to ship).
262
- **MacOS**: there are "old" API calls (unclear life cycle information, deprecated or not). Entitlement is needed (signed binary). Maybe only for App Store binaries? Information unclear. Tunnelblick today has 5 different ways(!) to setup DNS... ("scutil --dns...")
263
264
**Long discussion...**
265
266
**Outcome**:
267
- If both `--dns` and `--dhcp-option DNS` are pushed, `--dhcp-option DNS` is ignored
268
- If `--dns` is pushed, 2.6 clients behave like `--dhcp-option DNS` regarding NRPT and 2.7 will behave differently
269
- On Unix, `--up` should be kept "as it is", and `--dns` added "the new nice and shiny way"
270
- Gert wants "one backend" on Windows (!) -- less testing effort on system behaviour
271
- Heiko wants "keep old backend for `--dhcp-option DNS`" and "new backend for `--dns`"
272
- Suggestion:
273
- For "master, soon" go with "new backend implementation on Windows wit NRPT, which will only be used by `--dns` (`--dhcp-option DNS` will go to the old implementations)" and then *solicit tests* and *use it* on Gert's production customers + Chosi's setup + Charité maybe?
274
- If that all works, with and without split DNS and still resolving local domains just fine, reopen discussion if "old backend on windows" (netsh) should go for 2.7, or only for 2.8
275
- More suggestions from Johan - implement `--dns` on AS and maybe cloudconnexa.
276
277
### Tunnelcrack
278
- **Windows**: WFP based filters are in master. Very little feedback so far.
279
- Somewhat surprising: *inbound* connections on LAN still work (and outbound reply packets with state) - but that's an independent discussion, and such connections can be stopped with normal Windows firewall rules (gui)
280
- Focus was *outbound* connections and that works fine to stop Tunnelcrack
281
- **Linux**: policy, firewall marks, ...? "fwmark" socket option did not work
282
- Mark packets "coming from the LAN" (or "local") that must go to the VPN
283
- Policy tables work "everything goes into the VPN, done"
284
- Main routing table is only used for OpenVPN itself
285
- "Good enough" target is "Fedora, Ubuntu" - if it breaks on other more special-case linux variants, we can look into it
286
- Gianmarcos's patch adds route-table-id to routes (but no policy)
287
- Block-local can leverage this, add policy and send everything to VPN table
288
- On Android: "everything goes to VPN table `if(!fwmark(openvpn))`" -> so setting up the policy table is very easy
289
- Two scenarios
290
- `--redirect-gateway` "can actually happily live with just 0.0.0.0/0 in table 77" (and not "all of the routes")
291
- For "Tunnelcrack mitigation" having "specific routes in table 77" (and having split tunnel) is good enough (and a nice and powerful feature)
292
- Do we want a new option `--use-policy-routing yes`? --> maybe not yet, gather experience first
293
- Decision: `--block-local` will ALWAYS do "redirect gateway and block-local and fully block everything" (and this is what we tell people to use for Tunnelcrack mitigation << documentation)
294
- **MacOS**
295
- "The Connect team will look into it"
296
- The VPN API cannot be used by "not App Store" programs (Apple signatures needed), so might never be possible from 2.x
297
298
### Repo Discussion
299
- **openvpn-dco-win**
300
- Bugfixes go to release/1 and then to master, new features (multipeer) to master (only)
301
- Sufficiently different code (multipeer support) that "just cherrypick" for bugfixes is not always working, so "backport"
302
- Review for all patches is needed
303
- Gert is not the best reviewer (lack of time and of Windows clue)
304
- **openvpn-build**
305
- Patches go to release/2.6 (which is build to release 2.6.x)
306
- Everything is merged to master (which is used to build master snapshots / 2.7)
307
- When 2.7.0 is released, release/2.7 is branched (and possibly new flow for 2.6 patches needs to be defined)
308
- **openvpn "main"**
309
- All patches & bugfixes go to master
310
- Bugfixes (and selected other patches) are cherry-picked to release/2.6, release/2.5, release/2.4 "wherever it makes sense", depending on severity
311
- Patches never(!) flow from release/2.x to master
312
- If context is too different, there will be "a master bugfix" and "a release/2.6 bugfix" patch
313
- Or there might be "a release/2.6 bugfix"
314
- But never! "apply to 2.6 and then merge/cherry-pick to master"
315
316
### Mesh
317
- Client-to-client communication
318
- Using server as rendezvous point and then have direct tunnels between clients
319
- Client connects to "server 1"
320
- Server 1 can push "extra remotes" (10.0.0.0/8 goes to <tunnel to machine x, IP address y, port Z, credentials foo(?))
321
- Arne's idea "peer-id 1378 remote-ip 1.1.1.1+2001:db8::7 + FP aa:bb:cc:..." --> "direct route 196.168.0.0 peer-id 1378 <flags>"
322
- Full TLS handshake between "client 1 and client 1378" to build session key
323
- Discussion on technical challenges ("this is all not very hard") and commercial challenges ("why are our customers asking for this?")
324
- Arne plans to work on this, Antonio planned to get funds from OTF to do mesh work
325
326
### Windows-DCO Multipeer (`--server` support)
327
- Initial implementation will not do TCP ("too many sockets")
328
- Unsolved question so far "if a packet is given to dco-win, what is the peer to sent it to?"
329
- Look at IP header, do route lookup (inside DCO or on Windows routing table)?
330
- Can we make Windows do the route lookup and pass the next-hop IP to dco-win?
331
- In comparison: *userland* openvpn is being handed the IP packet "as a bytestream" and needs to extract the IP address from the packet and do an iroute lookup
332
- Linux/FreeBSD DCO: unclear how it works, Gert thinks that "the kernel routing" will pass the packet and the next-hop IP to the DCO driver (so, the DCO driver does not need to do a routing lookup to find the right peer) - needs to be verified
333
- Lev found that linux DCO does a route lookup inside DCO (= Linux does 2x route lookup, 1x "which is the next hop interface?" and 1x "which peer does it need to go to?")
334
- Which variant can be done on Windows needs to be researched