mirror of
https://github.com/slackhq/nebula.git
synced 2026-11-15 10:06:52 +01:00
Probe for another path when the data path finds a tunnel's remote unreachable
This commit is contained in:
1 parent
0ff077fea3
commit
2fd9966fef
17 files changed
+242
-54
No files matched your search
@@ -190,8 +190,8 @@ func parseRelease(r string) (major, minor int) {
|
||||
// its packets are dropped and the rest of the chunk resumes in place.
|
||||
//
|
||||
// Returns the number of packets sent. An error means the call itself failed.
|
||||
// A short count means some destinations were undeliverable.
|
||||
func (w *batchWriter) WriteBatch(bufs [][]byte, addrs []netip.AddrPort) (int, error) {
|
||||
// A short count means some destinations were undeliverable, failed hears about each of their packets.
|
||||
func (w *batchWriter) WriteBatch(bufs [][]byte, addrs []netip.AddrPort, failed func(i int, err error)) (int, error) {
|
||||
if len(bufs) != len(addrs) {
|
||||
return 0, fmt.Errorf("WriteBatch: len(bufs)=%d != len(addrs)=%d", len(bufs), len(addrs))
|
||||
}
|
||||
@@ -233,6 +233,7 @@ func (w *batchWriter) WriteBatch(bufs [][]byte, addrs []netip.AddrPort) (int, er
|
||||
if w.l.Enabled(context.Background(), slog.LevelDebug) {
|
||||
w.l.Debug("skipping unroutable batch destination", "udpAddr", addrs[i], "packets", runLen, "error", err)
|
||||
}
|
||||
reportFailed(failed, i, i+runLen, err)
|
||||
i += runLen
|
||||
continue
|
||||
}
|
||||
@@ -300,12 +301,23 @@ func (w *batchWriter) WriteBatch(bufs [][]byte, addrs []netip.AddrPort) (int, er
|
||||
"gso", w.gsoSupported,
|
||||
)
|
||||
}
|
||||
reportFailed(failed, w.entryEnd[done]-w.entryPkts[done], w.entryEnd[done], serr)
|
||||
done++
|
||||
}
|
||||
}
|
||||
return written, nil
|
||||
}
|
||||
|
||||
// reportFailed tells failed, if anyone is listening, that every packet in bufs[start:end] was lost to err
|
||||
func reportFailed(failed func(i int, err error), start, end int, err error) {
|
||||
if failed == nil {
|
||||
return
|
||||
}
|
||||
for i := start; i < end; i++ {
|
||||
failed(i, err)
|
||||
}
|
||||
}
|
||||
|
||||
// planRun returns the length of the run starting at start and its segment
|
||||
// size (len(bufs[start])). A run of length 1 carries no UDP_SEGMENT cmsg
|
||||
// and is sent as a plain datagram; without GSO support planRun always returns 1.
|
||||
|
||||
Reference in new issue
Block a user