def parse_experimenter(reader): experimenter, = reader.peek("!4xL") if experimenter == 0x005c16c7: # Big Switch Networks subtype, = reader.peek("!8xL") elif experimenter == 0x00002320: # Nicira subtype, = reader.peek("!8xH") else: raise loxi.ProtocolError("unexpected experimenter id %#x" % experimenter) if subtype in experimenter_parsers[experimenter]: return experimenter_parsers[experimenter][subtype](reader) else: raise loxi.ProtocolError("unexpected BSN experimenter subtype %#x" % subtype)
def read(self, fmt): st = struct.Struct(fmt) if self.offset + st.size > self.length: raise loxi.ProtocolError("Buffer too short") result = st.unpack_from(self.buf, self.start + self.offset) self.offset += st.size return result
def slice(self, length, rewind=0): if self.offset + length - rewind > self.length: raise loxi.ProtocolError("Buffer too short") reader = OFReader(self.buf, self.start + self.offset - rewind, length) reader.skip(rewind) self.offset += length - rewind return reader
def deserializer(reader, typ): parser = parsers.get(typ) if not parser: raise loxi.ProtocolError("unknown instruction type %d" % typ) return parser(reader)
def skip(self, length): if self.offset + length > self.length: raise loxi.ProtocolError("Buffer too short") self.offset += length
def skip_align(self): new_offset = (self.offset + 7) / 8 * 8 if new_offset > self.length: raise loxi.ProtocolError("Buffer too short") self.offset = new_offset
def slice(self, length): if self.offset + length > self.length: raise loxi.ProtocolError("Buffer too short") reader = OFReader(self.buf, self.start + self.offset, length) self.offset += length return reader
def slice(self, length): if self.offset + length > len(self.buf): raise loxi.ProtocolError("Buffer too short") buf = OFReader(buffer(self.buf, self.offset, length)) self.offset += length return buf
def peek(self, fmt): st = struct.Struct(fmt) if self.offset + st.size > len(self.buf): raise loxi.ProtocolError("Buffer too short") result = st.unpack_from(self.buf, self.offset) return result