class Open(Message): ID = Message.CODE.OPEN TYPE = chr(Message.CODE.OPEN) def __init__(self, version, asn, router_id, capabilities, hold_time): self.version = Version(version) self.asn = ASN(asn) self.hold_time = HoldTime(hold_time) self.router_id = RouterID(router_id) self.capabilities = capabilities def message(self, negotiated=None): return self._message( "%s%s%s%s%s" % (self.version.pack(), self.asn.trans(), self.hold_time.pack(), self.router_id.pack(), self.capabilities.pack())) def __str__(self): return "OPEN version=%d asn=%d hold_time=%s router_id=%s capabilities=[%s]" % ( self.version, self.asn, self.hold_time, self.router_id, self.capabilities) @classmethod def unpack_message(cls, data, _=None): version = ord(data[0]) if version != 4: # Only version 4 is supported nowdays.. raise Notify(2, 1, data[0]) asn = unpack('!H', data[1:3])[0] hold_time = unpack('!H', data[3:5])[0] numeric = unpack('!L', data[5:9])[0] router_id = "%d.%d.%d.%d" % (numeric >> 24, (numeric >> 16) & 0xFF, (numeric >> 8) & 0xFF, numeric & 0xFF) capabilities = Capabilities.unpack(data[9:]) return cls(version, asn, router_id, capabilities, hold_time)
class Open (Message): ID = Message.CODE.OPEN TYPE = chr(Message.CODE.OPEN) def __init__ (self, version, asn, router_id, capabilities, hold_time): self.version = Version(version) self.asn = ASN(asn) self.hold_time = HoldTime(hold_time) self.router_id = RouterID(router_id) self.capabilities = capabilities def message (self): return self._message("%s%s%s%s%s" % ( self.version.pack(), self.asn.trans(), self.hold_time.pack(), self.router_id.pack(), self.capabilities.pack() )) def __str__ (self): return "OPEN version=%d asn=%d hold_time=%s router_id=%s capabilities=[%s]" % (self.version, self.asn, self.hold_time, self.router_id,self.capabilities) @classmethod def unpack_message (cls, data, _): version = ord(data[0]) if version != 4: # Only version 4 is supported nowdays.. raise Notify(2,1,data[0]) asn = unpack('!H',data[1:3])[0] hold_time = unpack('!H',data[3:5])[0] numeric = unpack('!L',data[5:9])[0] router_id = "%d.%d.%d.%d" % (numeric >> 24,(numeric >> 16) & 0xFF,(numeric >> 8) & 0xFF,numeric & 0xFF) capabilities = Capabilities.unpack(data[9:]) return cls(version,asn,router_id,capabilities,hold_time)
class Aggregator (Attribute): ID = AttributeID.AGGREGATOR FLAG = Flag.TRANSITIVE|Flag.OPTIONAL MULTIPLE = False def __init__ (self,aggregator): asn = 0 for value in (ord(_) for _ in aggregator[:-4]): asn = (asn << 8) + value self.asn=ASN(asn) self.speaker=Inet(AFI.ipv4,SAFI.unicast,aggregator[-4:]) self._str = '%s:%s' % (self.asn,self.speaker) def pack (self,asn4,as4agg=False): if as4agg: backup = self.ID self.ID = AttributeID.AS4_AGGREGATOR packed = self._attribute(self.asn.pack(True)+self.speaker.pack()) self.ID = backup return packed elif asn4: return self._attribute(self.asn.pack(True)+self.speaker.pack()) elif not self.asn.asn4(): return self._attribute(self.asn.pack(False)+self.speaker.pack()) else: return self._attribute(self.asn.trans()+self.speaker.pack()) + self.pack(True,True) def __len__ (self): raise RuntimeError('size can be 6 or 8 - we can not say') def __str__ (self): return self._str
class Open (Message): TYPE = chr(Message.Type.OPEN) def __init__ (self,version,asn,router_id,capabilities,hold_time): self.version = Version(version) self.asn = ASN(asn) self.hold_time = HoldTime(hold_time) self.router_id = RouterID(router_id) self.capabilities = capabilities def message (self): return self._message("%s%s%s%s%s" % ( self.version.pack(), self.asn.trans(), self.hold_time.pack(), self.router_id.pack(), self.capabilities.pack() )) def __str__ (self): return "OPEN version=%d asn=%d hold_time=%s router_id=%s capabilities=[%s]" % (self.version, self.asn, self.hold_time, self.router_id,self.capabilities)