dataplane, transport: node keys -> peer ids#173
Open
npry wants to merge 4 commits into
Open
Conversation
9bd650d to
d290ae3
Compare
259d51d to
e7dc788
Compare
Signed-off-by: Nathan Perry <nathan@tailscale.com> Change-Id: I4bf750ea2de19b720cd9525852a5268f6a6a6964
The transport implementation is secondary, now in an especially meaningful sense given that transports communicate over PeerIds, while derp uses NodePublicKeys. This rename aligns with separation of the client into the core non-transport functionality, and a transport wrapper that handles translating to and from PeerId (forthcoming in a future commit). Signed-off-by: Nathan Perry <nathan@tailscale.com> Change-Id: If5dd9a39d4e1299fe999f8457e38e94a6a6a6964
Make `ts_transport::UnderlayTransport` parametric over the peer key type and provide a combinator that allows mapping a transport to a different key type using a lookup trait. This lets the runtime operate on `PeerId` everywhere while supplying the lookup functionality (e.g. to/from `NodePublicKey` for derp), so the peer db doesn't have to infiltrate all the transports. The derp transport implementation is refactored to make use of this in a future commit. Signed-off-by: Nathan Perry <nathan@tailscale.com> Change-Id: Ib965f787e92880ac3d74c364760acc546a6a6964
The baseline derp client doesn't need to know about translating nodekeys to transport `PeerId`s, that's a higher level concern now provided by `ts_transport::UnderlayTransportExt::with_lookup`, which the runtime provides. Signed-off-by: Nathan Perry <nathan@tailscale.com> Change-Id: Ib965f787e92880ac3d74c364760acc546a6a6964
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Begin using
ts_transport::PeerId(a locally-assigned peer index allocated byts_runtime::PeerTracker) to uniquely identify peers. This lets us stop referring toNodePublicKeyfor peer identification from everywhere exceptts_tunneland derp (which need it to function).ts_tunnelnow is no longer responsible for allocating peer ids, and instead is informed what peer id to use for what node key. (That happens inDataplaneActoras part of the peer update received fromPeerTracker.)This change revolves around
PeerDb, which isHashMap<PeerId, Node>augmented by a number of secondary indices on nodekey, name, stable id, id, tailnet ips, accepted routes, and disco key (if known).Implements an in-place update of the node key in wireguard for a given
PeerIdif the nodekey changes.Closes #167 -- the
PeerDb's name, ip, and route indexes address thisunderlay transport
The last two commits refactor
ts_transport::UnderlayTransportand derp's implementation of it. First, I wrote a helper trait that captures the packet batch iterator idea (this is basically what we had discussed @dylan-tailscale, I found a way to represent it that I think is actually easier to read, and also we need it on therecvside now too, so it got repetitive).But the bigger change is that
UnderlayTransportnow takes aPeerKeyassociated type, which isPeerIdinsidets_runtime, butNodePublicKeyinside derp. I also provide awith_lookupcombinator that allows mapping the key type for a transport using aPeerLookuptrait, which the runtime implements by referencing thePeerDb. This lets derp and any other underlay transport not care about the peer id mapping, since the runtime handles the translation to/from the transport-specific peer identifier.This is what that looks like in
ts_runtime::Multiderp:tailscale-rs/ts_runtime/src/multiderp.rs
Lines 131 to 152 in e7dc788
tailscale-rs/ts_runtime/src/multiderp.rs
Lines 187 to 188 in e7dc788
clientabove implementsUnderlayTransport<Key = NodePublicKey>, andtransportwraps it using thePeerDbLookupto provideUnderlayTransport<Key = PeerId>review notes
Review commits one at a time — the second commit is a pure rename