diff options
author | Rob Austein <sra@hactrn.net> | 2009-04-08 04:18:28 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2009-04-08 04:18:28 +0000 |
commit | b91f188c90874693fca9d8102a0aa30c40aa9ad0 (patch) | |
tree | 3e2de1435b91c7ac93d1407a94ab84fbb72ad8e0 /rtr-origin | |
parent | 45d66ed01b1c025e2a27ef7b4ef31c5b906e539b (diff) |
Update protocol from -02 to (current) -03.
svn path=/rtr-origin/rtr-origin.py; revision=2326
Diffstat (limited to 'rtr-origin')
-rw-r--r-- | rtr-origin/rtr-origin.py | 78 |
1 files changed, 41 insertions, 37 deletions
diff --git a/rtr-origin/rtr-origin.py b/rtr-origin/rtr-origin.py index e1ae90d6..f31cf5e6 100644 --- a/rtr-origin/rtr-origin.py +++ b/rtr-origin/rtr-origin.py @@ -123,6 +123,29 @@ class pdu(object): print out the PDU.""" log(self) + def send_ixfr(self, server): + """Send an incremental response. Caller should catch IOError.""" + fn = "%s.ix.%s" % (server.current_serial, self.serial) + f = open(fn, "rb") + server.push_pdu(incremental_response()) + server.push_file(f) + server.push_pdu(end_of_data(serial = server.current_serial)) + + def send_axfr(self, server): + """Send a complete response, or send an error if we can't.""" + try: + fn = "%s.ax" % server.current_serial + f = open(fn, "rb") + server.push_pdu(complete_response()) + server.push_file(f) + server.push_pdu(end_of_data(serial = server.current_serial)) + except IOError: + server.push_pdu(error_report(errno = 666, errpdu = self, errmsg = "Couldn't open %s" % fn)) + + def send_nodata(self, server): + """Send a nodata error.""" + server.push_pdu(error_report(errno = 666, errpdu = self, errmsg = "Sorry, I have no current data to give you")) + class pdu_with_serial(pdu): """Base class for PDUs consisting of just a serial number.""" @@ -205,21 +228,16 @@ class serial_query(pdu_with_serial): """ log(self) if server.get_serial() is None: - server.push_pdu(error_report(errno = 666, errpdu = self, errmsg = "Sorry, I have no current data to give you")) + self.send_nodata(server) elif int(server.current_serial) == self.serial: log("[Client is already current, sending empty IXFR]") - server.push_pdu(cache_response()) + server.push_pdu(incremental_response()) server.push_pdu(end_of_data(serial = server.current_serial)) else: try: - fn = "%s.ix.%s" % (server.current_serial, self.serial) - log("Looking for %s" % fn) - f = open(fn, "rb") - server.push_pdu(cache_response()) - server.push_file(f) - server.push_pdu(end_of_data(serial = server.current_serial)) + self.send_ixfr(server) except IOError: - server.push_pdu(cache_reset()) + self.send_axfr(server) class reset_query(pdu_empty): """Reset Query PDU.""" @@ -230,21 +248,18 @@ class reset_query(pdu_empty): """Received a reset query, send full current state in response.""" log(self) if server.get_serial() is None: - server.push_pdu(error_report(errno = 666, errpdu = self, errmsg = "Sorry, I have no current data to give you")) + self.send_nodata(server) else: - try: - fn = "%s.ax" % server.current_serial - f = open(fn, "rb") - server.push_pdu(cache_response()) - server.push_file(f) - server.push_pdu(end_of_data(serial = server.current_serial)) - except IOError: - server.push_pdu(error_report(errno = 666, errpdu = self, errmsg = "Couldn't open %s" % fn)) + self.send_axfr(server) -class cache_response(pdu_empty): - """Cache Response PDU.""" +class incremental_response(pdu_empty): + """Incremental Response PDU.""" pdu_type = 3 +class complete_response(pdu_empty): + """Complete Response PDU.""" + pdu_type = 5 + class end_of_data(pdu_with_serial): """End of Data PDU.""" @@ -256,16 +271,6 @@ class end_of_data(pdu_with_serial): client.current_serial = self.serial #client.close() -class cache_reset(pdu_empty): - """Cache reset PDU.""" - - pdu_type = 8 - - def consume(self, client): - """Handle cache_reset response, by issuing a reset_query.""" - log(self) - client.push_pdu(reset_query()) - class prefix(pdu): """Object representing one prefix. This corresponds closely to one PDU in the rpki-router protocol, so closely that we use lexical @@ -359,9 +364,7 @@ class ipv6_prefix(prefix): addr_type = rpki.ipaddrs.v6addr class error_report(pdu): - """Error Report PDU. This is kind of painful to parse, but easier - than it used to be. - """ + """Error Report PDU.""" pdu_type = 10 @@ -386,9 +389,9 @@ class error_report(pdu): elif isinstance(p, pdu): p = p.to_pdu() assert isinstance(p, str) - self._pdu = (self.header_struct.pack(self.version, self.pdu_type, self.errno, - len(p), len(self.errmsg)) + - p + self.errmsg) + self._pdu = self.header_struct.pack(self.version, self.pdu_type, self.errno, len(p), len(self.errmsg)) + self._pdu += p + self._pdu += self.errmsg return self._pdu def got_header(self, reader): @@ -408,7 +411,8 @@ class error_report(pdu): 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)) +pdu.pdu_map = dict((p.pdu_type, p) for p in (ipv4_prefix, ipv6_prefix, serial_notify, serial_query, reset_query, + incremental_response, complete_response, end_of_data, error_report)) class prefix_set(list): """Object representing a set of prefixes, that is, one versioned and |