func newTunTap(name string, flags uint16) (*TunTap, error) { dev, err := os.OpenFile(tunDevice, os.O_RDWR, 0) if err != nil { return nil, err } var ifr ifreqFlags copy(ifr.IfrnName[:len(ifr.IfrnName)-1], []byte(name+"\000")) ifr.IfruFlags = flags | syscall.IFF_NO_PI err = ioctl(dev.Fd(), syscall.TUNSETIFF, uintptr(unsafe.Pointer(&ifr))) if err != nil { return nil, err } ifname := fromZeroTerm(ifr.IfrnName[:len(ifr.IfrnName)-1]) iflink, err := netlink.LinkByName(ifname) if err != nil { dev.Close() return nil, err } tt := TunTap{ File: dev, LinkAttrs: iflink.Attrs(), } return &tt, nil }
func (lc *LocalCluster) NewTap(bridge string) (*TunTap, error) { nsExit, err := NsEnter(lc.nshandle) if err != nil { return nil, err } defer nsExit() tap, err := AddLinkTap("") if err != nil { return nil, fmt.Errorf("tap failed: %v", err) } err = netlink.LinkSetUp(tap) if err != nil { return nil, fmt.Errorf("tap up failed: %v", err) } br, err := netlink.LinkByName(bridge) if err != nil { return nil, fmt.Errorf("bridge failed: %v", err) } err = netlink.LinkSetMaster(tap, br.(*netlink.Bridge)) if err != nil { return nil, fmt.Errorf("set master failed: %v", err) } return tap, nil }
func NewDnsmasq() (*Dnsmasq, error) { dm := &Dnsmasq{} for s := byte(0); s < numSegments; s++ { seg, err := newSegment(s) if err != nil { return nil, fmt.Errorf("Network setup failed: %v", err) } dm.Segments = append(dm.Segments, seg) } // setup lo lo, err := netlink.LinkByName("lo") if err != nil { return nil, fmt.Errorf("Network loopback setup failed: %v", err) } err = netlink.LinkSetUp(lo) if err != nil { return nil, fmt.Errorf("Network loopback setup failed: %v", err) } dm.dnsmasq = exec.Command("dnsmasq", "--conf-file=-") cfg, err := dm.dnsmasq.StdinPipe() if err != nil { return nil, err } out, err := dm.dnsmasq.StdoutPipe() if err != nil { return nil, err } dm.dnsmasq.Stderr = dm.dnsmasq.Stdout go util.LogFrom(capnslog.INFO, out) if err = dm.dnsmasq.Start(); err != nil { cfg.Close() return nil, err } if err = configTemplate.Execute(cfg, dm); err != nil { cfg.Close() dm.Destroy() return nil, err } cfg.Close() return dm, nil }