From fec71008984994d4849287608f41164f5c953de2 Mon Sep 17 00:00:00 2001 From: cathugger Date: Mon, 30 Jul 2018 00:01:37 +0000 Subject: [PATCH] Clean up / clarify coords sending code. --- src/yggdrasil/session.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/yggdrasil/session.go b/src/yggdrasil/session.go index 647bb0c..4a44887 100644 --- a/src/yggdrasil/session.go +++ b/src/yggdrasil/session.go @@ -428,7 +428,7 @@ func (sinfo *sessionInfo) doSend(bs []byte) { var coords []byte // Read IPv6 flowlabel field (20 bits). - // XXX(cathugger): is len(bs) validated there? + // Assumes packet at least contains IPv6 header. flowlabel := uint(bs[1]&0x0f)<<16 | uint(bs[2])<<8 | uint(bs[3]) if flowlabel != 0 { // Now we append something to the coords @@ -437,14 +437,15 @@ func (sinfo *sessionInfo) doSend(bs []byte) { // The rest is ignored, but it's still part as the coords, so it affects switch queues // This helps separate traffic streams (coords, flowlabel) to be queued independently - coords = append(coords, sinfo.coords...) // Start with the real coords - coords = append(coords, 0) // Then target the local switchport - coords = append(coords, wire_encode_uint64(uint64(flowlabel))...) // Then variable-length encoded flowlabel + coords = append(coords, sinfo.coords...) // Start with the real coords + coords = append(coords, 0) // Then target the local switchport + coords = wire_put_uint64(uint64(flowlabel), coords) // Then variable-length encoded flowlabel } else { // 0 value means that flowlabels aren't being generated by OS. // To save bytes, we're not including it, therefore we won't need self-port override either. // So just use sinfo.coords directly to avoid golang GC allocations. - // XXX: investigate where flowlabels aren't included, and attempt to look into TCP/UDP/SCTP/DCCP headers' sport/dport fields? + // Recent enough Linux kernel supports flowlabels out of the box so this will be rare. + // XXX Attempt to look into TCP/UDP/SCTP/DCCP headers' sport/dport fields there? coords = sinfo.coords } payload, nonce := boxSeal(&sinfo.sharedSesKey, bs, &sinfo.myNonce)