diff --git a/misc/run-schannel-netns b/misc/run-schannel-netns index 9723e73b..74a02942 100755 --- a/misc/run-schannel-netns +++ b/misc/run-schannel-netns @@ -51,12 +51,12 @@ ip netns exec node4 ip link set lo up ip netns exec node5 ip link set lo up ip netns exec node6 ip link set lo up -ip netns exec node1 env PPROFLISTEN=localhost:6060 ./run --autoconf &> /dev/null & -ip netns exec node2 env PPROFLISTEN=localhost:6060 ./run --autoconf &> /dev/null & -ip netns exec node3 env PPROFLISTEN=localhost:6060 ./run --autoconf &> /dev/null & -ip netns exec node4 env PPROFLISTEN=localhost:6060 ./run --autoconf &> /dev/null & -ip netns exec node5 env PPROFLISTEN=localhost:6060 ./run --autoconf &> /dev/null & -ip netns exec node6 env PPROFLISTEN=localhost:6060 ./run --autoconf &> /dev/null & +echo '{AdminListen: "none"}' | ip netns exec node1 env PPROFLISTEN=localhost:6060 ./yggdrasil --useconf &> /dev/null & +echo '{AdminListen: "none"}' | ip netns exec node2 env PPROFLISTEN=localhost:6060 ./yggdrasil --useconf &> /dev/null & +echo '{AdminListen: "none"}' | ip netns exec node3 env PPROFLISTEN=localhost:6060 ./yggdrasil --useconf &> /dev/null & +echo '{AdminListen: "none"}' | ip netns exec node4 env PPROFLISTEN=localhost:6060 ./yggdrasil --useconf &> /dev/null & +echo '{AdminListen: "none"}' | ip netns exec node5 env PPROFLISTEN=localhost:6060 ./yggdrasil --useconf &> /dev/null & +echo '{AdminListen: "none"}' | ip netns exec node6 env PPROFLISTEN=localhost:6060 ./yggdrasil --useconf &> /dev/null & echo "Started, to continue you should (possibly w/ sudo):" echo "kill" $(jobs -p) diff --git a/src/yggdrasil/admin.go b/src/yggdrasil/admin.go index b54ac5cf..f8347f0d 100644 --- a/src/yggdrasil/admin.go +++ b/src/yggdrasil/admin.go @@ -388,7 +388,11 @@ func (a *admin) start() error { // cleans up when stopping func (a *admin) close() error { - return a.listener.Close() + if a.listener != nil { + return a.listener.Close() + } else { + return nil + } } // listen is run by start and manages API connections. diff --git a/src/yggdrasil/stream.go b/src/yggdrasil/stream.go index db2cdf7e..4d73844f 100644 --- a/src/yggdrasil/stream.go +++ b/src/yggdrasil/stream.go @@ -12,8 +12,10 @@ import ( var _ = linkInterfaceMsgIO(&stream{}) type stream struct { - rwc io.ReadWriteCloser - inputBuffer []byte // Incoming packet stream + rwc io.ReadWriteCloser + inputBuffer []byte // Incoming packet stream + frag [2 * streamMsgSize]byte // Temporary data read off the underlying rwc, on its way to the inputBuffer + outputBuffer [2 * streamMsgSize]byte // Temporary data about to be written to the rwc } func (s *stream) close() error { @@ -32,10 +34,9 @@ func (s *stream) init(rwc io.ReadWriteCloser) { // writeMsg writes a message with stream padding, and is *not* thread safe. func (s *stream) writeMsg(bs []byte) (int, error) { - buf := util.GetBytes() - defer util.PutBytes(buf) + buf := s.outputBuffer[:0] buf = append(buf, streamMsg[:]...) - buf = append(buf, wire_encode_uint64(uint64(len(bs)))...) + buf = wire_put_uint64(uint64(len(bs)), buf) padLen := len(buf) buf = append(buf, bs...) var bn int @@ -69,10 +70,9 @@ func (s *stream) readMsg() ([]byte, error) { return msg, nil default: // Wait for the underlying reader to return enough info for us to proceed - frag := make([]byte, 2*streamMsgSize) - n, err := s.rwc.Read(frag) + n, err := s.rwc.Read(s.frag[:]) if n > 0 { - s.inputBuffer = append(s.inputBuffer, frag[:n]...) + s.inputBuffer = append(s.inputBuffer, s.frag[:n]...) } else if err != nil { return nil, err }