def reader(self): # _reader returns the whole number requested or nothing and then stops for header in self._reader(Message.HEADER_LEN): if not header: yield 0, 0, '', '', None if not header.startswith(Message.MARKER): report = 'The packet received does not contain a BGP marker' yield 0, 0, header, '', NotifyError(1, 1, report) return msg = ord(header[18]) length = unpack('!H', header[16:18])[0] if length < Message.HEADER_LEN or length > Message.MAX_LEN: report = '%s has an invalid message length of %d' % ( Message.name(msg), length) yield length, 0, header, '', NotifyError(1, 2, report) return validator = Message.Length.get(msg, lambda _: _ >= 19) if not validator(length): # MUST send the faulty length back report = '%s has an invalid message length of %d' % ( Message.name(msg), length) yield length, 0, header, '', NotifyError(1, 2, report) return number = length - Message.HEADER_LEN if not number: yield length, msg, header, '', None return for body in self._reader(number): if not body: yield 0, 0, '', '', None yield length, msg, header, body, None