Пример #1
0
 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)
Пример #2
0
    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)
Пример #3
0
 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)
Пример #4
0
 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)