def _producer_threadproc(self): while core.running: data = self.tx_q.get() if data is None: # Signal to quit break (in_port, packet_data) = data if self.policy: state = self.policy.get() if state.header[Field('DRP')].value == 1: pass elif state.header[Field('CTR')].value == 1: reason = (str(state.reason.reason), str(state.reason.description)) data = {'type': 'in', 'operation': 'packet-in', 'data': (in_port, packet_data, reason)} self._tx_vendor(of.ofp_vendor_generic(data=str(data))) else: out_ports = bitmap_to_ports(state.header[Field('outport_bitmap')].value) packet_data = state.packet.bytes for out_port in out_ports: self.tx_packet(packet_data, out_port) else: continue
def _handle_query_message(self, message, connection): if message['operation'] == 'query-table-entry': t_name = message['data'][0] t_index = message['data'][1] if self.policy: t_id = TableId(t_name) t_entry = self.policy.query_table_entry(t_id, t_index) data = {'type': 'in', 'operation': 'query-table-entry', 'data': (t_name, t_index, t_entry)} self._tx_vendor(of.ofp_vendor_generic(data=str(data))) elif message['operation'] == 'query-table-list': if self.policy: t_list = self.policy.query_table_list() data = {'type': 'in', 'operation': 'query-table-list', 'data': t_list} self._tx_vendor(of.ofp_vendor_generic(data=str(data))) else: raise RuntimeError("Invalid message from the controller")