diff options
Diffstat (limited to 'rtr-origin/updater.py')
-rwxr-xr-x | rtr-origin/updater.py | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/rtr-origin/updater.py b/rtr-origin/updater.py index b4ffb51b..53178cf7 100755 --- a/rtr-origin/updater.py +++ b/rtr-origin/updater.py @@ -224,9 +224,45 @@ class ipv6_prefix(prefix): addr_type = rpki.ipaddrs.v6addr class error_report(pdu): - """Error Report PDU. Not yet implemented.""" + """Error Report PDU. This is kind of painful to parse, an explicit + count for the encapsulated PDU would simplify this considerably. + """ + pdu_type = 10 + header_struct = struct.Struct("!BBH") + errlen_struct = struct.Struct("!B") + + errmsg = "" + + def __str__(self): + return "#%s: %s" % (self.errno, self.errmsg) + + def to_pdu(self): + """Generate the wire format PDU for this prefix.""" + if self._pdu is None: + assert isinstance(self.errno, int) + assert isinstance(self.errpdu, pdu) + assert not isinstance(self.errpdu, error_report) + self._pdu = (self.header_struct.pack(self.version, self.pdu_type, self.errno) + + self.errpdu.to_pdu() + + self.errlen_struct.pack(len(self.errmsg)) + + self.errmsg) + return self._pdu + + @classmethod + def from_pdu_file_helper(cls, f, b): + """Read one wire format prefix PDU from a file.""" + self = cls() + b += f.read(cls.header_struct.size - len(b)) + version, pdu_type, self.errno = cls.header_struct.unpack(b) + self.errpdu = pdu.from_pdu_file(f) + b = f.read(cls.errlen_struct.size) + n = cls.errlen_struct.unpack(b) + if n: + self.errmsg = f.read(n) + return self + prefix.afi_map = { "\x00\x01" : ipv4_prefix, "\x00\x02" : ipv6_prefix } pdu.pdu_map = dict((p.pdu_type, p) for p in (ipv4_prefix, ipv6_prefix, serial_notify, serial_query, reset_query, cache_response, end_of_data, cache_reset, error_report)) |