diff options
author | Mikael Magnusson <mikma@users.sourceforge.net> | 2021-03-14 22:02:56 +0100 |
---|---|---|
committer | Mikael Magnusson <mikma@users.sourceforge.net> | 2021-11-09 23:09:50 +0100 |
commit | ebef2c3fe37b723843fb84695a25df2d4db40038 (patch) | |
tree | b298a7c5c24e870fdee2b4f45259eccbc6ba162f | |
parent | 94e20c34249558152e75c785fa1e0a44cc1a6561 (diff) |
netstack: implement Net.AddAddress
Signed-off-by: Mikael Magnusson <mikma@users.sourceforge.net>
-rw-r--r-- | tun/netstack/tun.go | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/tun/netstack/tun.go b/tun/netstack/tun.go index 44b5f04..f61cc2a 100644 --- a/tun/netstack/tun.go +++ b/tun/netstack/tun.go @@ -94,6 +94,32 @@ func (*endpoint) ARPHardwareType() header.ARPHardwareType { func (e *endpoint) AddHeader(tcpip.LinkAddress, tcpip.LinkAddress, tcpip.NetworkProtocolNumber, *stack.PacketBuffer) { } +func (net *Net) addAddress(ip net.IP) tcpip.Error { + if ip4 := ip.To4(); ip4 != nil { + protoAddr := tcpip.ProtocolAddress{ + Protocol: ipv4.ProtocolNumber, + AddressWithPrefix: tcpip.Address(ip4).WithPrefix(), + } + tcpipErr := net.stack.AddProtocolAddress(1, protoAddr, stack.AddressProperties{}) + if tcpipErr == nil && !net.hasV4 { + net.hasV4 = true + net.stack.AddRoute(tcpip.Route{Destination: header.IPv4EmptySubnet, NIC: 1}) + } + return tcpipErr + } else { + protoAddr := tcpip.ProtocolAddress{ + Protocol: ipv6.ProtocolNumber, + AddressWithPrefix: tcpip.Address(ip).WithPrefix(), + } + tcpipErr := net.stack.AddProtocolAddress(1, protoAddr, stack.AddressProperties{}) + if tcpipErr == nil && !net.hasV6{ + net.hasV6 = true + net.stack.AddRoute(tcpip.Route{Destination: header.IPv6EmptySubnet, NIC: 1}) + } + return tcpipErr + } +} + func CreateNetTUN(localAddresses, dnsServers []net.IP, mtu int) (tun.Device, *Net, error) { opts := stack.Options{ NetworkProtocols: []stack.NetworkProtocolFactory{ipv4.NewProtocol, ipv6.NewProtocol}, @@ -112,34 +138,11 @@ func CreateNetTUN(localAddresses, dnsServers []net.IP, mtu int) (tun.Device, *Ne return nil, nil, fmt.Errorf("CreateNIC: %v", tcpipErr) } for _, ip := range localAddresses { - if ip4 := ip.To4(); ip4 != nil { - protoAddr := tcpip.ProtocolAddress{ - Protocol: ipv4.ProtocolNumber, - AddressWithPrefix: tcpip.Address(ip4).WithPrefix(), - } - tcpipErr := dev.stack.AddProtocolAddress(1, protoAddr, stack.AddressProperties{}) - if tcpipErr != nil { - return nil, nil, fmt.Errorf("AddProtocolAddress(%v): %v", ip4, tcpipErr) - } - dev.hasV4 = true - } else { - protoAddr := tcpip.ProtocolAddress{ - Protocol: ipv6.ProtocolNumber, - AddressWithPrefix: tcpip.Address(ip).WithPrefix(), - } - tcpipErr := dev.stack.AddProtocolAddress(1, protoAddr, stack.AddressProperties{}) - if tcpipErr != nil { - return nil, nil, fmt.Errorf("AddProtocolAddress(%v): %v", ip, tcpipErr) - } - dev.hasV6 = true + tcpipErr := tnet.addAddress(ip) + if tcpipErr != nil { + return nil, fmt.Errorf("addAddress(%v): %w", ip, tcpipErr) } } - if dev.hasV4 { - dev.stack.AddRoute(tcpip.Route{Destination: header.IPv4EmptySubnet, NIC: 1}) - } - if dev.hasV6 { - dev.stack.AddRoute(tcpip.Route{Destination: header.IPv6EmptySubnet, NIC: 1}) - } dev.events <- tun.EventUp return dev, (*Net)(dev), nil |