def newnetif(self, net=None, addrlist=None, hwaddr=None, ifindex=None, ifname=None): """ Create a new network interface. :param core.nodes.base.CoreNetworkBase net: network to associate with :param list addrlist: addresses to add on the interface :param core.nodes.ipaddress.MacAddress hwaddr: hardware address to set for interface :param int ifindex: index of interface to create :param str ifname: name for interface :return: interface index :rtype: int """ if not addrlist: addrlist = [] with self.lock: # TODO: see if you can move this to emane specific code if nodeutils.is_node(net, NodeTypes.EMANE): ifindex = self.newtuntap(ifindex=ifindex, ifname=ifname, net=net) # TUN/TAP is not ready for addressing yet; the device may # take some time to appear, and installing it into a # namespace after it has been bound removes addressing; # save addresses with the interface now self.attachnet(ifindex, net) netif = self.netif(ifindex) netif.sethwaddr(hwaddr) for address in utils.make_tuple(addrlist): netif.addaddr(address) return ifindex else: ifindex = self.newveth(ifindex=ifindex, ifname=ifname, net=net) if net is not None: self.attachnet(ifindex, net) if hwaddr: self.sethwaddr(ifindex, hwaddr) for address in utils.make_tuple(addrlist): self.addaddr(ifindex, address) self.ifup(ifindex) return ifindex
def newnetif( self, net: "CoreNetworkBase" = None, addrlist: List[str] = None, hwaddr: str = None, ifindex: int = None, ifname: str = None, ) -> int: """ Create a new network interface. :param net: network to associate with :param addrlist: addresses to add on the interface :param hwaddr: hardware address to set for interface :param ifindex: index of interface to create :param ifname: name for interface :return: interface index """ if not addrlist: addrlist = [] with self.lock: # TODO: emane specific code if net is not None and net.is_emane is True: ifindex = self.newtuntap(ifindex, ifname) # TUN/TAP is not ready for addressing yet; the device may # take some time to appear, and installing it into a # namespace after it has been bound removes addressing; # save addresses with the interface now self.attachnet(ifindex, net) netif = self.netif(ifindex) netif.sethwaddr(hwaddr) for address in utils.make_tuple(addrlist): netif.addaddr(address) return ifindex else: ifindex = self.newveth(ifindex, ifname) if net is not None: self.attachnet(ifindex, net) if hwaddr: self.sethwaddr(ifindex, hwaddr) for address in utils.make_tuple(addrlist): self.addaddr(ifindex, address) self.ifup(ifindex) return ifindex
def adoptnetif(self, netif, ifindex, hwaddr, addrlist): """ The broker builds a GreTap tunnel device to this physical node. When a link message is received linking this node to another part of the emulation, no new interface is created; instead, adopt the GreTap netif as the node interface. """ netif.name = "gt%d" % ifindex netif.node = self self.addnetif(netif, ifindex) # use a more reasonable name, e.g. "gt0" instead of "gt.56286.150" if self.up: self.net_client.device_down(netif.localname) self.net_client.device_name(netif.localname, netif.name) netif.localname = netif.name if hwaddr: self.sethwaddr(ifindex, hwaddr) for addr in utils.make_tuple(addrlist): self.addaddr(ifindex, addr) if self.up: self.net_client.device_up(netif.localname)
def newnetif(self, net=None, addrlist=None, hwaddr=None, ifindex=None, ifname=None): """ This is called when linking with another node. Since this node represents an interface, we do not create another object here, but attach ourselves to the given network. :param core.nodes.base.CoreNetworkBase net: new network instance :param list[str] addrlist: address list :param str hwaddr: hardware address :param int ifindex: interface index :param str ifname: interface name :return: interface index :rtype: int :raises ValueError: when an interface has already been created, one max """ with self.lock: if ifindex is None: ifindex = 0 if self.net is not None: raise ValueError("RJ45 nodes support at most 1 network interface") self._netif[ifindex] = self # PyCoreNetIf.node is self self.node = self self.ifindex = ifindex if net is not None: self.attachnet(net) if addrlist: for addr in utils.make_tuple(addrlist): self.addaddr(addr) return ifindex
def newnetif(self, net=None, addrlist=None, hwaddr=None, ifindex=None, ifname=None): """ Add a network interface. If we are attaching to a CoreNs3Net, this will be a TunTap. Otherwise dispatch to CoreNode.newnetif(). """ if not addrlist: addrlist = [] if not isinstance(net, CoreNs3Net): return CoreNode.newnetif(self, net, addrlist, hwaddr, ifindex, ifname) ifindex = self.newtuntap(ifindex=ifindex, ifname=ifname, net=net) self.attachnet(ifindex, net) netif = self.netif(ifindex) netif.sethwaddr(hwaddr) for addr in make_tuple(addrlist): netif.addaddr(addr) addrstr = netif.addrlist[0] (addr, mask) = addrstr.split('/') tap = net._tapdevs[netif] tap.SetAttribute( "IpAddress", ns.network.Ipv4AddressValue(ns.network.Ipv4Address(addr))) tap.SetAttribute( "Netmask", ns.network.Ipv4MaskValue(ns.network.Ipv4Mask("/" + mask))) ns.core.Simulator.Schedule(ns.core.Time('0'), netif.install) return ifindex
def adoptnetif( self, netif: CoreInterface, ifindex: int, hwaddr: str, addrlist: List[str] ) -> None: """ When a link message is received linking this node to another part of the emulation, no new interface is created; instead, adopt the GreTap netif as the node interface. """ netif.name = f"gt{ifindex}" netif.node = self self.addnetif(netif, ifindex) # use a more reasonable name, e.g. "gt0" instead of "gt.56286.150" if self.up: self.net_client.device_down(netif.localname) self.net_client.device_name(netif.localname, netif.name) netif.localname = netif.name if hwaddr: self.sethwaddr(ifindex, hwaddr) for addr in utils.make_tuple(addrlist): self.addaddr(ifindex, addr) if self.up: self.net_client.device_up(netif.localname)