diff --git a/tuntap_linux.go b/tuntap_linux.go index e2bd01b..4e83fa9 100644 --- a/tuntap_linux.go +++ b/tuntap_linux.go @@ -74,9 +74,13 @@ func createTun(cfg TunConfig) (conn net.Conn, itf *net.Interface, err error) { } func createTap(cfg TapConfig) (conn net.Conn, itf *net.Interface, err error) { - ip, ipNet, err := net.ParseCIDR(cfg.Addr) - if err != nil { - return + var ip net.IP + var ipNet *net.IPNet + if cfg.Addr != "" { + ip, ipNet, err = net.ParseCIDR(cfg.Addr) + if err != nil { + return + } } ifce, err := water.New(water.Config{ @@ -106,11 +110,13 @@ func createTap(cfg TapConfig) (conn net.Conn, itf *net.Interface, err error) { return } - cmd = fmt.Sprintf("ip address add %s dev %s", cfg.Addr, ifce.Name()) - log.Log("[tap]", cmd) - if er := link.SetLinkIp(ip, ipNet); er != nil { - err = fmt.Errorf("%s: %v", cmd, er) - return + if cfg.Addr != "" { + cmd = fmt.Sprintf("ip address add %s dev %s", cfg.Addr, ifce.Name()) + log.Log("[tap]", cmd) + if er := link.SetLinkIp(ip, ipNet); er != nil { + err = fmt.Errorf("%s: %v", cmd, er) + return + } } cmd = fmt.Sprintf("ip link set dev %s up", ifce.Name()) diff --git a/tuntap_unix.go b/tuntap_unix.go index a7db978..9a6d17e 100644 --- a/tuntap_unix.go +++ b/tuntap_unix.go @@ -55,10 +55,7 @@ func createTun(cfg TunConfig) (conn net.Conn, itf *net.Interface, err error) { } func createTap(cfg TapConfig) (conn net.Conn, itf *net.Interface, err error) { - ip, _, err := net.ParseCIDR(cfg.Addr) - if err != nil { - return - } + ip, _, _ := net.ParseCIDR(cfg.Addr) ifce, err := water.New(water.Config{ DeviceType: water.TAP, @@ -72,7 +69,12 @@ func createTap(cfg TapConfig) (conn net.Conn, itf *net.Interface, err error) { mtu = DefaultMTU } - cmd := fmt.Sprintf("ifconfig %s inet %s mtu %d up", ifce.Name(), cfg.Addr, mtu) + var cmd string + if cfg.Addr != "" { + cmd = fmt.Sprintf("ifconfig %s inet %s mtu %d up", ifce.Name(), cfg.Addr, mtu) + } else { + cmd = fmt.Sprintf("ifconfig %s mtu %d up", ifce.Name(), mtu) + } log.Log("[tap]", cmd) args := strings.Split(cmd, " ") if er := exec.Command(args[0], args[1:]...).Run(); er != nil { diff --git a/tuntap_windows.go b/tuntap_windows.go index b5e12d9..21af512 100644 --- a/tuntap_windows.go +++ b/tuntap_windows.go @@ -55,10 +55,7 @@ func createTun(cfg TunConfig) (conn net.Conn, itf *net.Interface, err error) { } func createTap(cfg TapConfig) (conn net.Conn, itf *net.Interface, err error) { - ip, ipNet, err := net.ParseCIDR(cfg.Addr) - if err != nil { - return - } + ip, ipNet, _ := net.ParseCIDR(cfg.Addr) ifce, err := water.New(water.Config{ DeviceType: water.TAP, @@ -72,14 +69,16 @@ func createTap(cfg TapConfig) (conn net.Conn, itf *net.Interface, err error) { return } - cmd := fmt.Sprintf("netsh interface ip set address name=%s "+ - "source=static addr=%s mask=%s gateway=none", - ifce.Name(), ip.String(), ipMask(ipNet.Mask)) - log.Log("[tap]", cmd) - args := strings.Split(cmd, " ") - if er := exec.Command(args[0], args[1:]...).Run(); er != nil { - err = fmt.Errorf("%s: %v", cmd, er) - return + if ip != nil && ipNet != nil { + cmd := fmt.Sprintf("netsh interface ip set address name=%s "+ + "source=static addr=%s mask=%s gateway=none", + ifce.Name(), ip.String(), ipMask(ipNet.Mask)) + log.Log("[tap]", cmd) + args := strings.Split(cmd, " ") + if er := exec.Command(args[0], args[1:]...).Run(); er != nil { + err = fmt.Errorf("%s: %v", cmd, er) + return + } } if err = addTapRoutes(ifce.Name(), cfg.Gateway, cfg.Routes...); err != nil {