aboutsummaryrefslogtreecommitdiff
path: root/rpki/rtr/pdus.py
diff options
context:
space:
mode:
Diffstat (limited to 'rpki/rtr/pdus.py')
-rw-r--r--rpki/rtr/pdus.py38
1 files changed, 33 insertions, 5 deletions
diff --git a/rpki/rtr/pdus.py b/rpki/rtr/pdus.py
index d355026c..3fb7457d 100644
--- a/rpki/rtr/pdus.py
+++ b/rpki/rtr/pdus.py
@@ -116,6 +116,8 @@ class PDU(object):
header_struct = struct.Struct("!BB2xL")
+ pdu_type = None
+
def __init__(self, version):
assert version in self.version_map
self.version = version
@@ -123,6 +125,9 @@ class PDU(object):
def __cmp__(self, other):
return cmp(self.to_pdu(), other.to_pdu())
+ def to_pdu(self, announce = None):
+ return NotImplementedError
+
@property
def default_version(self):
return max(self.version_map.iterkeys())
@@ -170,11 +175,12 @@ class PDUWithSerial(PDU):
def __str__(self):
return "[%s, serial #%d nonce %d]" % (self.__class__.__name__, self.serial, self.nonce)
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU.
"""
+ assert announce is None
if self._pdu is None:
self._pdu = self.header_struct.pack(self.version, self.pdu_type, self.nonce,
self.header_struct.size, self.serial)
@@ -208,11 +214,12 @@ class PDUWithNonce(PDU):
def __str__(self):
return "[%s, nonce %d]" % (self.__class__.__name__, self.nonce)
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU.
"""
+ assert announce is None
if self._pdu is None:
self._pdu = self.header_struct.pack(self.version, self.pdu_type, self.nonce, self.header_struct.size)
return self._pdu
@@ -239,11 +246,12 @@ class PDUEmpty(PDU):
def __str__(self):
return "[%s]" % self.__class__.__name__
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU for this prefix.
"""
+ assert announce is None
if self._pdu is None:
self._pdu = self.header_struct.pack(self.version, self.pdu_type, 0, self.header_struct.size)
return self._pdu
@@ -370,11 +378,12 @@ class EndOfDataPDUv1(EndOfDataPDUv0):
return "[%s, serial #%d nonce %d refresh %d retry %d expire %d]" % (
self.__class__.__name__, self.serial, self.nonce, self.refresh, self.retry, self.expire)
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU.
"""
+ assert announce is None
if self._pdu is None:
self._pdu = self.header_struct.pack(self.version, self.pdu_type, self.nonce,
self.header_struct.size, self.serial,
@@ -416,6 +425,15 @@ class PrefixPDU(PDU):
header_struct = struct.Struct("!BB2xLBBBx")
asnum_struct = struct.Struct("!L")
+ address_byte_count = 0
+
+ def __init__(self, version):
+ super(PrefixPDU, self).__init__(version)
+ self.asn = None
+ self.prefix = None
+ self.prefixlen = None
+ self.max_prefixlen = None
+ self.announce = None
def __str__(self):
plm = "%s/%s-%s" % (self.prefix, self.prefixlen, self.max_prefixlen)
@@ -511,6 +529,13 @@ class RouterKeyPDU(PDU):
header_struct = struct.Struct("!BBBxL20sL")
+ def __init__(self, version):
+ super(RouterKeyPDU, self).__init__(version)
+ self.announce = None
+ self.ski = None
+ self.asn = None
+ self.key = None
+
def __str__(self):
return "%s %8s %-32s %s" % ("+" if self.announce else "-", self.asn,
base64.urlsafe_b64encode(self.ski).rstrip("="),
@@ -596,6 +621,8 @@ class ErrorReportPDU(PDU):
self.errno = errno
self.errpdu = errpdu
self.errmsg = errmsg if errmsg is not None or errno is None else self.errors[errno]
+ self.pdulen = None
+ self.errlen = None
def __str__(self):
return "[%s, error #%s: %r]" % (self.__class__.__name__, self.errno, self.errmsg)
@@ -609,11 +636,12 @@ class ErrorReportPDU(PDU):
assert remaining >= self.string_struct.size + n
return n, reader.get(n), (remaining - self.string_struct.size - n)
- def to_pdu(self):
+ def to_pdu(self, announce = None):
"""
Generate the wire format PDU for this error report.
"""
+ assert announce is None
if self._pdu is None:
assert isinstance(self.errno, int)
assert not isinstance(self.errpdu, ErrorReportPDU)