// attach a container network interface to an external network func (v *veth) attach(n *configs.Network) (err error) { bridge, err := net.InterfaceByName(n.Bridge) if err != nil { return err } host, err := net.InterfaceByName(n.HostInterfaceName) if err != nil { return err } if err := netlink.AddToBridge(host, bridge); err != nil { return err } if err := netlink.NetworkSetMTU(host, n.Mtu); err != nil { return err } if n.HairpinMode { if err := netlink.SetHairpinMode(host, true); err != nil { return err } } if err := netlink.NetworkLinkUp(host); err != nil { return err } return nil }
func (t *TapManager) NewTap(uid, gid int) (*Tap, error) { tap := &Tap{Name: "flynntap." + random.String(5), bridge: t.bridge} if err := createTap(tap.Name, uid, gid); err != nil { return nil, err } var err error tap.IP, err = t.bridge.alloc.RequestIP(t.bridge.ipNet, nil) if err != nil { tap.Close() return nil, err } iface, err := net.InterfaceByName(tap.Name) if err != nil { tap.Close() return nil, err } if err := netlink.NetworkLinkUp(iface); err != nil { tap.Close() return nil, err } if err := netlink.AddToBridge(iface, t.bridge.iface); err != nil { tap.Close() return nil, err } return tap, nil }
func SetInterfaceMaster(name, master string) error { iface, err := net.InterfaceByName(name) if err != nil { return err } masterIface, err := net.InterfaceByName(master) if err != nil { return err } return netlink.AddToBridge(iface, masterIface) }
func addToBridge(ifaceName, bridgeName string) error { iface, err := net.InterfaceByName(ifaceName) if err != nil { return fmt.Errorf("could not find interface %s: %v", ifaceName, err) } master, err := net.InterfaceByName(bridgeName) if err != nil { return fmt.Errorf("could not find bridge %s: %v", bridgeName, err) } return bri.AddToBridge(iface, master) }
func (v *veth) create(n *network, nspid int) (err error) { tmpName, err := v.generateTempPeerName() if err != nil { return err } n.TempVethPeerName = tmpName defer func() { if err != nil { netlink.NetworkLinkDel(n.HostInterfaceName) netlink.NetworkLinkDel(n.TempVethPeerName) } }() if n.Bridge == "" { return fmt.Errorf("bridge is not specified") } bridge, err := net.InterfaceByName(n.Bridge) if err != nil { return err } if err := netlink.NetworkCreateVethPair(n.HostInterfaceName, n.TempVethPeerName, n.TxQueueLen); err != nil { return err } host, err := net.InterfaceByName(n.HostInterfaceName) if err != nil { return err } if err := netlink.AddToBridge(host, bridge); err != nil { return err } if err := netlink.NetworkSetMTU(host, n.Mtu); err != nil { return err } if n.HairpinMode { if err := netlink.SetHairpinMode(host, true); err != nil { return err } } if err := netlink.NetworkLinkUp(host); err != nil { return err } child, err := net.InterfaceByName(n.TempVethPeerName) if err != nil { return err } return netlink.NetworkSetNsPid(child, nspid) }
func (Bridge) Add(bridge, slave *net.Interface) error { netlinkMu.Lock() defer netlinkMu.Unlock() return netlink.AddToBridge(slave, bridge) }