func createIpvlan(conf *NetConf, ifName string, netns *os.File) error { mode, err := modeFromString(conf.Mode) if err != nil { return err } m, err := netlink.LinkByName(conf.Master) if err != nil { return fmt.Errorf("failed to lookup master %q: %v", conf.Master, err) } mv := &netlink.IPVlan{ LinkAttrs: netlink.LinkAttrs{ MTU: conf.MTU, Name: ifName, ParentIndex: m.Attrs().Index, Namespace: netlink.NsFd(int(netns.Fd())), }, Mode: mode, } if err := netlink.LinkAdd(mv); err != nil { return fmt.Errorf("failed to create ipvlan: %v", err) } return err }
func ensureBridge(brName string, mtu int, ipn *net.IPNet) (*netlink.Bridge, error) { br := &netlink.Bridge{ LinkAttrs: netlink.LinkAttrs{ Name: brName, MTU: mtu, }, } if err := netlink.LinkAdd(br); err != nil { if err != syscall.EEXIST { return nil, fmt.Errorf("could not add %q: %v", brName, err) } // it's ok if the device already exists as long as config is similar br, err = bridgeByName(brName) if err != nil { return nil, err } } if err := netlink.LinkSetUp(br); err != nil { return nil, err } if ipn != nil { return br, ensureBridgeAddr(br, ipn) } return br, nil }
func makeVethPair(name, peer string, mtu int) (netlink.Link, error) { veth := &netlink.Veth{ LinkAttrs: netlink.LinkAttrs{ Name: name, Flags: net.FlagUp, MTU: mtu, }, PeerName: peer, } if err := netlink.LinkAdd(veth); err != nil { return nil, err } return veth, nil }
// setupTapDevice creates persistent macvtap device // and returns a newly created netlink.Link structure func setupMacVTapDevice(podID types.UUID, config MacVTapNetConf) (netlink.Link, error) { master, err := netlink.LinkByName(config.Master) if err != nil { return nil, fmt.Errorf("Cannot find master device '%v': %v", config.Master, err) } var mode netlink.MacvlanMode switch config.Mode { // if not set - defaults to bridge mode as in: // https://github.com/coreos/rkt/blob/master/Documentation/networking.md#macvlan case "", "bridge": mode = netlink.MACVLAN_MODE_BRIDGE case "private": mode = netlink.MACVLAN_MODE_PRIVATE case "vepa": mode = netlink.MACVLAN_MODE_VEPA case "passthru": mode = netlink.MACVLAN_MODE_PASSTHRU default: return nil, fmt.Errorf("Unsupported macvtap mode: %v", config.Mode) } mtu := master.Attrs().MTU if config.MTU != 0 { mtu = config.MTU } nameTemplate := fmt.Sprintf("rkt-%s-vtap%%d", podID.String()[0:4]) link := &netlink.Macvtap{ Macvlan: netlink.Macvlan{ LinkAttrs: netlink.LinkAttrs{ Name: nameTemplate, MTU: mtu, ParentIndex: master.Attrs().Index, }, Mode: mode, }, } if err := netlink.LinkAdd(link); err != nil { return nil, fmt.Errorf("Cannot create macvtap interface: %v", err) } return link, nil }
func createMacvlan(conf *NetConf, ifName string, netns *os.File) error { mode, err := modeFromString(conf.Mode) if err != nil { return err } m, err := netlink.LinkByName(conf.Master) if err != nil { return fmt.Errorf("failed to lookup master %q: %v", conf.Master, err) } // due to kernel bug we have to create with tmpname or it might // collide with the name on the host and error out tmpName, err := ip.RandomVethName() if err != nil { return err } mv := &netlink.Macvlan{ LinkAttrs: netlink.LinkAttrs{ MTU: conf.MTU, Name: tmpName, ParentIndex: m.Attrs().Index, Namespace: netlink.NsFd(int(netns.Fd())), }, Mode: mode, } if err := netlink.LinkAdd(mv); err != nil { return fmt.Errorf("failed to create macvlan: %v", err) } return ns.WithNetNS(netns, false, func(_ *os.File) error { err := renameLink(tmpName, ifName) if err != nil { return fmt.Errorf("failed to rename macvlan to %q: %v", ifName, err) } return nil }) }