+ @classmethod
+ def cxx_ini_parse(self, code, src, dest, ret):
+ code('%s = Net::EthAddr(%s);' % (dest, src))
+ code('%s true;' % ret)
+
+# When initializing an IpAddress, pass in an existing IpAddress, a string of
+# the form "a.b.c.d", or an integer representing an IP.
+class IpAddress(ParamValue):
+ cxx_type = 'Net::IpAddress'
+ ex_str = "127.0.0.1"
+ cmd_line_settable = True
+
+ @classmethod
+ def cxx_predecls(cls, code):
+ code('#include "base/inet.hh"')
+
+ def __init__(self, value):
+ if isinstance(value, IpAddress):
+ self.ip = value.ip
+ else:
+ try:
+ self.ip = convert.toIpAddress(value)
+ except TypeError:
+ self.ip = long(value)
+ self.verifyIp()
+
+ def __call__(self, value):
+ self.__init__(value)
+ return value
+
+ def __str__(self):
+ tup = [(self.ip >> i) & 0xff for i in (24, 16, 8, 0)]
+ return '%d.%d.%d.%d' % tuple(tup)
+
+ def __eq__(self, other):
+ if isinstance(other, IpAddress):
+ return self.ip == other.ip
+ elif isinstance(other, str):
+ try:
+ return self.ip == convert.toIpAddress(other)
+ except:
+ return False
+ else:
+ return self.ip == other
+
+ def __ne__(self, other):
+ return not (self == other)
+
+ def verifyIp(self):
+ if self.ip < 0 or self.ip >= (1 << 32):
+ raise TypeError("invalid ip address %#08x" % self.ip)
+
+ def getValue(self):
+ from _m5.net import IpAddress
+ return IpAddress(self.ip)
+
+# When initializing an IpNetmask, pass in an existing IpNetmask, a string of
+# the form "a.b.c.d/n" or "a.b.c.d/e.f.g.h", or an ip and netmask as
+# positional or keyword arguments.
+class IpNetmask(IpAddress):
+ cxx_type = 'Net::IpNetmask'
+ ex_str = "127.0.0.0/24"
+ cmd_line_settable = True
+
+ @classmethod
+ def cxx_predecls(cls, code):
+ code('#include "base/inet.hh"')
+
+ def __init__(self, *args, **kwargs):
+ def handle_kwarg(self, kwargs, key, elseVal = None):
+ if key in kwargs:
+ setattr(self, key, kwargs.pop(key))
+ elif elseVal:
+ setattr(self, key, elseVal)
+ else:
+ raise TypeError("No value set for %s" % key)
+
+ if len(args) == 0:
+ handle_kwarg(self, kwargs, 'ip')
+ handle_kwarg(self, kwargs, 'netmask')
+
+ elif len(args) == 1:
+ if kwargs:
+ if not 'ip' in kwargs and not 'netmask' in kwargs:
+ raise TypeError("Invalid arguments")
+ handle_kwarg(self, kwargs, 'ip', args[0])
+ handle_kwarg(self, kwargs, 'netmask', args[0])
+ elif isinstance(args[0], IpNetmask):
+ self.ip = args[0].ip
+ self.netmask = args[0].netmask
+ else:
+ (self.ip, self.netmask) = convert.toIpNetmask(args[0])
+
+ elif len(args) == 2:
+ self.ip = args[0]
+ self.netmask = args[1]
+ else:
+ raise TypeError("Too many arguments specified")
+
+ if kwargs:
+ raise TypeError("Too many keywords: %s" % list(kwargs.keys()))
+
+ self.verify()
+
+ def __call__(self, value):
+ self.__init__(value)
+ return value
+
+ def __str__(self):
+ return "%s/%d" % (super(IpNetmask, self).__str__(), self.netmask)
+
+ def __eq__(self, other):
+ if isinstance(other, IpNetmask):
+ return self.ip == other.ip and self.netmask == other.netmask
+ elif isinstance(other, str):
+ try:
+ return (self.ip, self.netmask) == convert.toIpNetmask(other)
+ except:
+ return False
+ else:
+ return False
+
+ def verify(self):
+ self.verifyIp()
+ if self.netmask < 0 or self.netmask > 32:
+ raise TypeError("invalid netmask %d" % netmask)
+
+ def getValue(self):
+ from _m5.net import IpNetmask
+ return IpNetmask(self.ip, self.netmask)
+
+# When initializing an IpWithPort, pass in an existing IpWithPort, a string of
+# the form "a.b.c.d:p", or an ip and port as positional or keyword arguments.
+class IpWithPort(IpAddress):
+ cxx_type = 'Net::IpWithPort'
+ ex_str = "127.0.0.1:80"
+ cmd_line_settable = True
+
+ @classmethod
+ def cxx_predecls(cls, code):
+ code('#include "base/inet.hh"')
+
+ def __init__(self, *args, **kwargs):
+ def handle_kwarg(self, kwargs, key, elseVal = None):
+ if key in kwargs:
+ setattr(self, key, kwargs.pop(key))
+ elif elseVal:
+ setattr(self, key, elseVal)
+ else:
+ raise TypeError("No value set for %s" % key)
+
+ if len(args) == 0:
+ handle_kwarg(self, kwargs, 'ip')
+ handle_kwarg(self, kwargs, 'port')
+
+ elif len(args) == 1:
+ if kwargs:
+ if not 'ip' in kwargs and not 'port' in kwargs:
+ raise TypeError("Invalid arguments")
+ handle_kwarg(self, kwargs, 'ip', args[0])
+ handle_kwarg(self, kwargs, 'port', args[0])
+ elif isinstance(args[0], IpWithPort):
+ self.ip = args[0].ip
+ self.port = args[0].port
+ else:
+ (self.ip, self.port) = convert.toIpWithPort(args[0])
+
+ elif len(args) == 2:
+ self.ip = args[0]
+ self.port = args[1]
+ else:
+ raise TypeError("Too many arguments specified")
+
+ if kwargs:
+ raise TypeError("Too many keywords: %s" % list(kwargs.keys()))
+
+ self.verify()
+
+ def __call__(self, value):
+ self.__init__(value)
+ return value
+
+ def __str__(self):
+ return "%s:%d" % (super(IpWithPort, self).__str__(), self.port)
+
+ def __eq__(self, other):
+ if isinstance(other, IpWithPort):
+ return self.ip == other.ip and self.port == other.port
+ elif isinstance(other, str):
+ try:
+ return (self.ip, self.port) == convert.toIpWithPort(other)
+ except:
+ return False
+ else:
+ return False
+
+ def verify(self):
+ self.verifyIp()
+ if self.port < 0 or self.port > 0xffff:
+ raise TypeError("invalid port %d" % self.port)
+
+ def getValue(self):
+ from _m5.net import IpWithPort
+ return IpWithPort(self.ip, self.port)
+