def _handle_barrier(self, ev): msg = ev.msg datapath = msg.datapath try: si = self._switches[datapath.id] except KeyError: self.logger.error('unknown dpid %s' % (datapath.id, )) return try: xid = si.barriers.pop(msg.xid) except KeyError: self.logger.error('unknown barrier xid %s' % (msg.xid, )) return result = si.results.pop(xid) req = si.xids.pop(xid) if req.reply_cls is not None: self._unobserve_msg(req.reply_cls) if any(self._is_error(r) for r in result): rep = event.Reply(exception=exception.OFError(result=result)) elif req.reply_multi: rep = event.Reply(result=result) elif len(result) == 0: rep = event.Reply() elif len(result) == 1: rep = event.Reply(result=result[0]) else: rep = event.Reply(exception=exception.UnexpectedMultiReply( result=result)) self.reply_to_request(req, rep)
def _handle_send_msg(self, req): msg = req.msg datapath = msg.datapath try: si = self._switches[datapath.id] except KeyError: self.logger.error('unknown dpid %s' % (datapath.id,)) rep = event.Reply(exception=exception. InvalidDatapath(result=datapath.id)) self.reply_to_request(req, rep) return if req.reply_cls is not None: self._observe_msg(req.reply_cls) datapath.set_xid(msg) xid = msg.xid barrier = datapath.ofproto_parser.OFPBarrierRequest(datapath) datapath.set_xid(barrier) barrier_xid = barrier.xid assert xid not in si.results assert xid not in si.xids assert barrier_xid not in si.barriers si.results[xid] = [] si.xids[xid] = req si.barriers[barrier_xid] = xid datapath.send_msg(msg) datapath.send_msg(barrier)
def _handle_get_datapath(self, req): id = req.dpid assert isinstance(id, (int, long)) try: datapath = self._switches[id].datapath except KeyError: datapath = None self.logger.debug('dpid %s -> datapath %s' % (id, datapath)) rep = event.Reply(result=datapath) self.reply_to_request(req, rep)
def _handle_barrier(self, ev): msg = ev.msg datapath = msg.datapath try: si = self._switches[datapath.id] except KeyError: self.logger.error('unknown dpid %s' % (datapath.id,)) return try: xid = si.barriers[msg.xid] except KeyError: self.logger.error('unknown barrier xid %s' % (msg.xid,)) return try: result = si.results.pop(xid) except KeyError: result = None req = si.xids.pop(xid) rep = event.Reply(result=result) self.reply_to_request(req, rep)