use adapter of specified name

This commit is contained in:
Jason
2019-08-10 19:18:27 +08:00
parent 1f9c20f6fa
commit 0ebb6278f4

View File

@@ -84,11 +84,12 @@ func getTuntapName(componentId string) (string, error) {
return s, nil return s, nil
} }
func getTuntapComponentId() (string, error) { func getTuntapComponentId(ifaceName string) (string, string, error) {
adapters, err := registry.OpenKey(registry.LOCAL_MACHINE, ADAPTER_KEY, registry.READ) adapters, err := registry.OpenKey(registry.LOCAL_MACHINE, ADAPTER_KEY, registry.READ)
if err != nil { if err != nil {
return "", err return "", "", fmt.Errorf("failed to read adapter list: %v", err)
} }
defer adapters.Close()
var i uint32 var i uint32
for i = 0; i < 1000; i++ { for i = 0; i < 1000; i++ {
var name_length uint32 = TAPWIN32_MAX_REG_SIZE var name_length uint32 = TAPWIN32_MAX_REG_SIZE
@@ -102,10 +103,11 @@ func getTuntapComponentId() (string, error) {
nil, nil,
nil, nil,
nil); err != nil { nil); err != nil {
return "", err return "", "", fmt.Errorf("failed to read name: %v", err)
} }
key_name := windows.UTF16ToString(buf[:]) key_name := windows.UTF16ToString(buf[:])
adapter, err := registry.OpenKey(adapters, key_name, registry.READ) adapter, err := registry.OpenKey(adapters, key_name, registry.READ)
defer adapter.Close()
if err != nil { if err != nil {
continue continue
} }
@@ -136,29 +138,33 @@ func getTuntapComponentId() (string, error) {
&valtype, &valtype,
&netCfgInstanceId[0], &netCfgInstanceId[0],
&netCfgInstanceIdLen); err != nil { &netCfgInstanceIdLen); err != nil {
return "", err return "", "", fmt.Errorf("failed to read net cfg instance id: %v", err)
} }
s := decodeUTF16(netCfgInstanceId) s := decodeUTF16(netCfgInstanceId)
log.Printf("device component id: %s", s) log.Printf("TAP device component ID: %s", s)
adapter.Close()
adapters.Close() devName, err := getTuntapName(s)
return s, nil if err != nil {
return "", "", fmt.Errorf("failed to get tun/tap name: %v", err)
}
if len(ifaceName) == 0 {
return s, devName, nil
} else if devName == ifaceName {
return s, devName, nil
}
} }
adapter.Close()
} }
adapters.Close() return "", "", errors.New("not found component id")
return "", errors.New("not found component id")
} }
func OpenTunDevice(name, addr, gw, mask string, dnsServers []string) (io.ReadWriteCloser, error) { func OpenTunDevice(name, addr, gw, mask string, dns []string) (io.ReadWriteCloser, error) {
componentId, err := getTuntapComponentId() componentId, devName, err := getTuntapComponentId(name)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("failed to get component ID: %v", err)
} }
log.Printf("TAP device name: %s", devName)
devId, _ := windows.UTF16FromString(fmt.Sprintf(`\\.\Global\%s.tap`, componentId)) devId, _ := windows.UTF16FromString(fmt.Sprintf(`\\.\Global\%s.tap`, componentId))
devName, err := getTuntapName(componentId)
log.Printf("device name: %s", devName)
// set dhcp with netsh // set dhcp with netsh
cmd := exec.Command("netsh", "interface", "ip", "set", "address", devName, "dhcp") cmd := exec.Command("netsh", "interface", "ip", "set", "address", devName, "dhcp")
cmd.Run() cmd.Run()
@@ -202,15 +208,15 @@ func OpenTunDevice(name, addr, gw, mask string, dnsServers []string) (io.ReadWri
windows.Close(fd) windows.Close(fd)
return nil, err return nil, err
} else { } else {
log.Printf("set %s with net/mask: %s/%s through DHCP", devName, addr, mask) log.Printf("Set %s with net/mask: %s/%s through DHCP", devName, addr, mask)
} }
// set dns with dncp // set dns with dncp
dnsParam := []byte{6, 4} dnsParam := []byte{6, 4}
primaryDNS := net.ParseIP(dnsServers[0]).To4() primaryDNS := net.ParseIP(dns[0]).To4()
dnsParam = append(dnsParam, primaryDNS...) dnsParam = append(dnsParam, primaryDNS...)
if len(dnsServers) >= 2 { if len(dns) >= 2 {
secondaryDNS := net.ParseIP(dnsServers[1]).To4() secondaryDNS := net.ParseIP(dns[1]).To4()
dnsParam = append(dnsParam, secondaryDNS...) dnsParam = append(dnsParam, secondaryDNS...)
dnsParam[1] += 4 dnsParam[1] += 4
} }
@@ -228,7 +234,7 @@ func OpenTunDevice(name, addr, gw, mask string, dnsServers []string) (io.ReadWri
windows.Close(fd) windows.Close(fd)
return nil, err return nil, err
} else { } else {
log.Printf("set %s with dns: %s through DHCP", devName, strings.Join(dnsServers, ",")) log.Printf("Set %s with DNS: %s through DHCP", devName, strings.Join(dns, ","))
} }
// set connect. // set connect.