MCPcopy Create free account
hub / github.com/encodeous/nylon / CreateNetTUN

Function CreateNetTUN

polyamide/tun/netstack/tun.go:55–109  ·  view source on GitHub ↗
(localAddresses, dnsServers []netip.Addr, mtu int)

Source from the content-addressed store, hash-verified

53type Net netTun
54
55func CreateNetTUN(localAddresses, dnsServers []netip.Addr, mtu int) (tun.Device, *Net, error) {
56 opts := stack.Options{
57 NetworkProtocols: []stack.NetworkProtocolFactory{ipv4.NewProtocol, ipv6.NewProtocol},
58 TransportProtocols: []stack.TransportProtocolFactory{tcp.NewProtocol, udp.NewProtocol, icmp.NewProtocol6, icmp.NewProtocol4},
59 HandleLocal: true,
60 }
61 dev := &netTun{
62 ep: channel.New(1024, uint32(mtu), ""),
63 stack: stack.New(opts),
64 events: make(chan tun.Event, 10),
65 incomingPacket: make(chan *buffer.View),
66 dnsServers: dnsServers,
67 mtu: mtu,
68 }
69 sackEnabledOpt := tcpip.TCPSACKEnabled(true) // TCP SACK is disabled by default
70 tcpipErr := dev.stack.SetTransportProtocolOption(tcp.ProtocolNumber, &sackEnabledOpt)
71 if tcpipErr != nil {
72 return nil, nil, fmt.Errorf("could not enable TCP SACK: %v", tcpipErr)
73 }
74 dev.notifyHandle = dev.ep.AddNotify(dev)
75 tcpipErr = dev.stack.CreateNIC(1, dev.ep)
76 if tcpipErr != nil {
77 return nil, nil, fmt.Errorf("CreateNIC: %v", tcpipErr)
78 }
79 for _, ip := range localAddresses {
80 var protoNumber tcpip.NetworkProtocolNumber
81 if ip.Is4() {
82 protoNumber = ipv4.ProtocolNumber
83 } else if ip.Is6() {
84 protoNumber = ipv6.ProtocolNumber
85 }
86 protoAddr := tcpip.ProtocolAddress{
87 Protocol: protoNumber,
88 AddressWithPrefix: tcpip.AddrFromSlice(ip.AsSlice()).WithPrefix(),
89 }
90 tcpipErr := dev.stack.AddProtocolAddress(1, protoAddr, stack.AddressProperties{})
91 if tcpipErr != nil {
92 return nil, nil, fmt.Errorf("AddProtocolAddress(%v): %v", ip, tcpipErr)
93 }
94 if ip.Is4() {
95 dev.hasV4 = true
96 } else if ip.Is6() {
97 dev.hasV6 = true
98 }
99 }
100 if dev.hasV4 {
101 dev.stack.AddRoute(tcpip.Route{Destination: header.IPv4EmptySubnet, NIC: 1})
102 }
103 if dev.hasV6 {
104 dev.stack.AddRoute(tcpip.Route{Destination: header.IPv6EmptySubnet, NIC: 1})
105 }
106
107 dev.events <- tun.EventUp
108 return dev, (*Net)(dev), nil
109}
110
111func (tun *netTun) Name() (string, error) {
112 return "go", nil

Callers 3

mainFunction · 0.92
mainFunction · 0.92
mainFunction · 0.92

Calls

no outgoing calls

Tested by

no test coverage detected