mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-10-31 13:05:22 +00:00 
			
		
		
		
	 5041800ac6
			
		
	
	5041800ac6
	
	
	
		
			
			At some point faketun got implemented as a loopback (put a packet in from wireguard, the same packet goes back to wireguard) which is not useful. It's supposed to be an interface that just sinks all packets, and then wgengine adds *only* and ICMP Echo responder as a layer on top. This caused extremely odd bugs on darwin, where the special case that reinjects packets from local->local was filling the loopback channel and creating an infinite loop (which became jammed since the reader and writer were in the same goroutine). Signed-off-by: Avery Pennarun <apenwarr@tailscale.com>
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style
 | |
| // license that can be found in the LICENSE file.
 | |
| 
 | |
| package tstun
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"os"
 | |
| 
 | |
| 	"github.com/tailscale/wireguard-go/tun"
 | |
| )
 | |
| 
 | |
| type fakeTUN struct {
 | |
| 	evchan    chan tun.Event
 | |
| 	closechan chan struct{}
 | |
| }
 | |
| 
 | |
| // NewFakeTUN returns a fake TUN device that does not depend on the
 | |
| // operating system or any special permissions.
 | |
| // It primarily exists for testing.
 | |
| func NewFakeTUN() tun.Device {
 | |
| 	return &fakeTUN{
 | |
| 		evchan:    make(chan tun.Event),
 | |
| 		closechan: make(chan struct{}),
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (t *fakeTUN) File() *os.File {
 | |
| 	panic("fakeTUN.File() called, which makes no sense")
 | |
| }
 | |
| 
 | |
| func (t *fakeTUN) Close() error {
 | |
| 	close(t.closechan)
 | |
| 	close(t.evchan)
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (t *fakeTUN) Read(out []byte, offset int) (int, error) {
 | |
| 	<-t.closechan
 | |
| 	return 0, io.EOF
 | |
| }
 | |
| 
 | |
| func (t *fakeTUN) Write(b []byte, n int) (int, error) {
 | |
| 	select {
 | |
| 	case <-t.closechan:
 | |
| 		return 0, ErrClosed
 | |
| 	default:
 | |
| 	}
 | |
| 	return len(b), nil
 | |
| }
 | |
| 
 | |
| func (t *fakeTUN) Flush() error           { return nil }
 | |
| func (t *fakeTUN) MTU() (int, error)      { return 1500, nil }
 | |
| func (t *fakeTUN) Name() (string, error)  { return "FakeTUN", nil }
 | |
| func (t *fakeTUN) Events() chan tun.Event { return t.evchan }
 |