// NewLinkWithOptions creates new network link on Linux host and sets some of its network // parameters passed in as LinkOptions // // Calling NewLinkWithOptions is equivalent of running following commands one after another if // particular option is passed in as a parameter: // ip link add name ${ifcName} type dummy // ip link set dev ${ifcName} address ${MAC address} // ip link set dev ${ifcName} mtu ${MTU value} // ip link set dev ${ifcName} up // NewLinkWithOptions returns Linker which is initialized to a pointer of type Link if the network // link with given LinkOptions was created successfully on the Linux host. // It attempts to delete the link if any of the LinkOptions are incorrect or if setting the options // failed and returns error. func NewLinkWithOptions(ifcName string, opts LinkOptions) (Linker, error) { if ok, err := NetInterfaceNameValid(ifcName); !ok { return nil, err } if _, err := net.InterfaceByName(ifcName); err == nil { return nil, fmt.Errorf("Interface name %s already assigned on the host", ifcName) } if err := netlink.NetworkLinkAdd(ifcName, "dummy"); err != nil { return nil, fmt.Errorf("Could not create new link %s: %s", ifcName, err) } newIfc, err := net.InterfaceByName(ifcName) if err != nil { return nil, fmt.Errorf("Could not find the new interface: %s", err) } if (opts != LinkOptions{}) { errOpts := setLinkOptions(newIfc, opts) if errOpts != nil { if errDel := DeleteLink(newIfc.Name); err != nil { return nil, fmt.Errorf("Incorrect options specified: %s. Attempt to delete the link failed: %s", errOpts, errDel) } return nil, fmt.Errorf("Could not set link options: %s", errOpts) } } return &Link{ ifc: newIfc, }, nil }
// NewBridge creates new network bridge on Linux host. // // It is equivalent of running: ip link add name br${RANDOM STRING} type bridge // NewBridge returns Bridger which is initialized to a pointer of type Bridge if the // bridge was created successfully on the Linux host. Newly created bridge is assigned // a random name starting with "br". // It returns error if the bridge could not be created. func NewBridge() (Bridger, error) { brDev := makeNetInterfaceName("br") if ok, err := NetInterfaceNameValid(brDev); !ok { return nil, err } if _, err := net.InterfaceByName(brDev); err == nil { return nil, fmt.Errorf("Interface name %s already assigned on the host", brDev) } if err := netlink.NetworkLinkAdd(brDev, "bridge"); err != nil { return nil, err } newIfc, err := net.InterfaceByName(brDev) if err != nil { return nil, fmt.Errorf("Could not find the new interface: %s", err) } return &Bridge{ Link: Link{ ifc: newIfc, }, }, nil }
// NewLink creates new network link on Linux host. // // It is equivalent of running: ip link add name ${ifcName} type dummy // NewLink returns Linker which is initialized to a pointer of type Link if the // link was created successfully on the Linux host. // It returns error if the network link could not be created on Linux host. func NewLink(ifcName string) (Linker, error) { if ok, err := NetInterfaceNameValid(ifcName); !ok { return nil, err } if _, err := net.InterfaceByName(ifcName); err == nil { return nil, fmt.Errorf("Interface name %s already assigned on the host", ifcName) } if err := netlink.NetworkLinkAdd(ifcName, "dummy"); err != nil { return nil, fmt.Errorf("Could not create new link %s: %s", ifcName, err) } newIfc, err := net.InterfaceByName(ifcName) if err != nil { return nil, fmt.Errorf("Could not find the new interface: %s", err) } return &Link{ ifc: newIfc, }, nil }
// NewBridge creates new network bridge on Linux host with the name passed as a parameter. // It is equivalent of running: ip link add name ${ifcName} type bridge // It returns error if the bridge can not be created. func NewBridgeWithName(ifcName string) (Bridger, error) { if ok, err := NetInterfaceNameValid(ifcName); !ok { return nil, err } if _, err := net.InterfaceByName(ifcName); err == nil { return nil, fmt.Errorf("Interface name %s already assigned on the host", ifcName) } if err := netlink.NetworkLinkAdd(ifcName, "bridge"); err != nil { return nil, err } newIfc, err := net.InterfaceByName(ifcName) if err != nil { return nil, fmt.Errorf("Could not find the new interface: %s", err) } return &Bridge{ Link: Link{ ifc: newIfc, }, }, nil }