Ejemplo n.º 1
0
 def _set_dpmap(cmd, msg):
     if cmd == "add":
         fibcdbm.dps().add(msg)
     elif cmd == "delete":
         fibcdbm.dps().delete_by_dp_id(msg["dp_id"])
     else:
         _LOG.error("invalid portmap command. %s", cmd)
Ejemplo n.º 2
0
 def get_dpmap(req, **kwargs):
     """
     Get All datas.
     """
     sio = StringIO()
     fibcdbm.dps().dump(sio)
     print sio.getvalue()
     return Response(content_type='application/json', body=sio.getvalue())
Ejemplo n.º 3
0
    def finalize(self):
        """
        send event (leave)
        """
        self.que.put(None)

        evt = fibcevt.EventFIBCEnterDP(self.dpath, False, self.ports)
        self._send_evt(evt)

        fibcdbm.dps().del_dp(self.get_id())
        _LOG.debug("FFDatapath unregistered. %s", self.dpath)
Ejemplo n.º 4
0
    def initialize(self):
        """
        send MultiPartRequet(PoerDesc)
        """
        fibcdbm.dps().add_dp(self.dpath)
        _LOG.debug("FFDatapath registered. %s", self.dpath)

        msg = fibcapi.new_ff_multipart_request_portdesc(self.get_id(),
                                                        internal=True)
        self.send_msg(pb.FF_MULTIPART_REQUEST, msg)

        hub.spawn(self._process_que)
Ejemplo n.º 5
0
 def _set_dpmap(cmd, msg):
     """
     cmd: "add" or "delete"
     msg:
       name  : <string>
       dp_id : <int>
       mode  : <"geneic" or "ofdpa2" or "ovs"
     """
     if cmd == "add":
         fibcdbm.dps().add_entry(msg)
     elif cmd == "delete":
         fibcdbm.dps().del_entry(msg["dp_id"])
     else:
         _LOG.error("invalid portmap command. %s", cmd)
Ejemplo n.º 6
0
    def on_vsport_config(self, evt):
        """
        Process VS Port Config event
        evt.msg: fibc.net.ffpacket.FFPacket
        """
        pkt = evt.msg
        if fibclog.dump_msg():
            _LOG.debug("%s", pkt)

        try:
            hw_addr = fibcdbm.dps().find_port(evt.vs_id, evt.port_id).hw_addr
        except:
            hw_addr = "00:00:00:00:00:{0:02X}".format(evt.port_id & 0xff)

        try:
            port = fibcdbm.portmap().find_by_name(re_id=pkt.re_id,
                                                  name=pkt.ifname)
            if port.update_vs(evt.vs_id, evt.port_id, hw_addr):
                self.send_port_status_if_ready(port, "UP")

        except KeyError:
            _LOG.warn("vs port not registered. re_id:%s, ifname:%s", pkt.re_id,
                      pkt.ifname)

        except Exception as expt:
            _LOG.exception(expt)
Ejemplo n.º 7
0
    def get_dplist(req, **kwars):
        """
        Get dp_id list.
        """
        _LOG.debug("get_dps %s", req)

        dpids = fibcdbm.dps().keys()
        return Response(content_type='application/json',
                        body=json.dumps(dict(dpids=dpids)))
Ejemplo n.º 8
0
    def forward_pkt(self, vlan_hdr, data, dp_id, port_id):
        """
        forward packet.
        """
        strip_vlan = True if vlan_hdr is not None and \
                     vlan_hdr.vid == fibcapi.OFPVID_UNTAGGED else False

        try:
            port = fibcdbm.portmap().find_by_dp(dp_id, port_id)
            vs_port = port["vs"]

            _LOG.debug("forwarding DP(%d, %d) -> VS(%d, %d)", dp_id, port_id,
                       vs_port.id, vs_port.port)

            dpath, mode = fibcdbm.dps().find_by_id(vs_port.id)
            pkt_out = ofc.pkt_out(mode)
            pkt_out(dpath, vs_port.port, strip_vlan, data)

            return

        except KeyError:
            # it may be packet from vs.
            pass

        try:
            port = fibcdbm.portmap().find_by_vs(dp_id, port_id)
            dp_port = port["dp"]

            _LOG.debug("forwarding VS(%d, %d) -> DP(%d, %d)", dp_id, port_id,
                       dp_port.id, dp_port.port)

            dpath, mode = fibcdbm.dps().find_by_id(dp_port.id)
            pkt_out = ofc.pkt_out(mode)
            pkt_out(dpath, dp_port.port, strip_vlan, data)

            return

        except KeyError:
            _LOG.warn("drop src(%d, %d)", dp_id, port_id)
            if fibclog.dump_pkt():
                hexdump(data)
Ejemplo n.º 9
0
    def on_port_status(self, evt):
        """
        Process Port Status event.
        """
        msg = evt.msg
        dp_id = msg.datapath.id
        port = msg.desc
        reason = msg.reason

        _LOG.debug("dp_id:%s port:%s reason: %d", dp_id, port, reason)

        if fibcdbm.dps().get_mode(dp_id) is None:
            return

        self.send_dp_port_config(msg.datapath, port, reason)
Ejemplo n.º 10
0
    def on_ff_port_mod(self, evt):
        """
        Process PortMod event
        """
        mod = evt.msg
        if fibclog.dump_msg():
            _LOG.debug(mod)

        try:
            dpath, mode = fibcdbm.dps().find_by_id(mod.dp_id)
            func = ofc.port_mod(mode)
            func(dpath, mod, ofctl)

        except Exception as expt:
            _LOG.exception(expt)
Ejemplo n.º 11
0
    def on_dp(self, evt):
        """
        Process DP enter event.
        """

        dp_id = evt.dp.id

        mode = fibcdbm.dps().get_mode(dp_id)
        if mode is None or mode == "default":
            _LOG.debug("Ignore %s. mode=%s", dp_id, mode)
            return

        datas = _load_config(self.config)
        datas["dps"][dp_id] = _get_ports(evt)
        _write_config(self.config, datas)

        _LOG.debug("new config:%s %s", dp_id, datas)
Ejemplo n.º 12
0
    def on_dp(self, evt):
        """
        Process Dp Entre event
        """
        if not evt.enter:
            return

        try:
            mode = fibcdbm.dps().get_mode(evt.dp.id, "default")
            flow = ofc.flow(mode, -1)
            group = ofc.group(mode, -1)

            flow(evt.dp, None, ofctl)
            sleep(_SEND_MOD_WAIT_SEC)
            group(evt.dp, None, ofctl)

        except Exception as expt:
            _LOG.exception(expt)
Ejemplo n.º 13
0
    def on_port_status(self, evt):
        """
        Process Port Status event.
        """
        msg = evt.msg
        dpath = msg.datapath
        port = msg.desc
        reason = msg.reason

        _LOG.debug("dp_id:%s port:%s reason: %d", dpath.id, port, reason)

        if fibcdbm.dps().get_mode(dpath.id) is None:
            return

        def _enter():
            ofp = dpath.ofproto
            return reason != ofp.OFPPR_DELETE

        self.send_dp_port_config(dpath, port, _enter())
Ejemplo n.º 14
0
    def on_dp(self, evt):
        """
        Process DP enter event.
        """
        dp_id = evt.dp.id

        _LOG.debug("dp_id:%s enter:%s", dp_id, evt.enter)

        if fibcdbm.dps().get_mode(dp_id) is None:
            return

        dp_status_evt = fibcevt.EventFIBCDpConfig(None, dp_id=dp_id, enter=evt.enter)
        self.send_event_to_observers(dp_status_evt)

        for port in evt.ports:
            self.send_dp_port_config(evt.dp, port, evt.enter)

        for port in fibcdbm.portmap().list_by_dp(dp_id):
            self.send_dp_port_config_no_vs(evt.dp, port, evt.enter)
Ejemplo n.º 15
0
    def packetout(self, pkt, dp_id, port_id, strip_vlan=False):
        """
        Send Packetout message.
        """
        dpath = fibcdbm.dps().find_by_id(dp_id)

        actions = [dpath.ofproto_parser.OFPActionOutput(port_id)]
        if strip_vlan:
            actions.insert(0, dpath.ofproto_parser.OFPActionPopVlan())

        msg = dpath.ofproto_parser.OFPPacketOut(
            datapath=dpath,
            buffer_id=dpath.ofproto.OFP_NO_BUFFER,
            in_port=dpath.ofproto.OFPP_ANY,
            actions=actions,
            data=pkt.data)
        if fibclog.dump_msg():
            _LOG.debug("PacketOUT(%s)", msg)

        dpath.send_msg(msg)
Ejemplo n.º 16
0
    def on_dp(self, evt):
        """
        Process DP enter event.
        """
        dp_id = evt.dp.id

        _LOG.debug("dp_id:%s", dp_id)

        if fibcdbm.dps().get_mode(dp_id) is None:
            return

        dp_status_evt = fibcevt.EventFIBCDpConfig(None,
                                                  dp_id=dp_id,
                                                  enter=evt.enter)
        self.send_event_to_observers(dp_status_evt)

        ofp = evt.dp.ofproto
        reason = ofp.OFPPR_ADD if evt.enter else ofp.OFPPR_DELETE
        for port in evt.ports:
            self.send_dp_port_config(evt.dp, port, reason)
Ejemplo n.º 17
0
    def get_port_stats(self, req, dp_id, **kwars):
        """
        Send get stats from dp.
        """
        _LOG.debug("get_stats %s %s", dp_id, req)

        try:
            dpath, mode = fibcdbm.dps().find_by_id(dp_id)
            get_port_stats = ofc.get_port_stats(mode)
            stats = get_port_stats(dpath, self.waiters, None, ofctl)
            _extend_port_stats(stats)
            return Response(content_type='application/json',
                            body=json.dumps(stats))

        except KeyError as ex:
            _LOG.exception(ex)
            return Response(status=404)

        except Exception as ex:  # pylint: disable=broad-except
            _LOG.exception(ex)
            return Response(status=505, body=str(ex))
Ejemplo n.º 18
0
    def on_dpport_config(self, evt):
        """
        Process DP Port Config event
        evt.msg: ryu.controller.Port
        """
        if fibclog.dump_msg():
            _LOG.debug("%s", evt.msg)

        dp_id = evt.dp_id
        port_id = evt.port_id
        link_up = (evt.state & 0x01) == 0  # 0x01:ofp.OFPPS_LINK_DOWN

        try:
            port = fibcdbm.portmap().find_by_dp(dp_id, port_id)
            vs_port = port["vs"]
            vs_dp, mode = fibcdbm.dps().find_by_id(vs_port.id)
            func = ofc.port_mod(mode)

            status = pb.PortStatus.UP if link_up else pb.PortStatus.DOWN
            mod = pb.FFPortMod(
                dp_id=vs_port.id,
                port_no=vs_port.port,
                hw_addr=port["vs_hw_addr"],
                status=status,
            )

            func(vs_dp, mod, ofctl)

            return

        except KeyError as expt:
            _LOG.warn("dp port not registered. dpid:%d, port:%d", dp_id,
                      port_id)

        except Exception as expt:
            _LOG.exception(expt)
Ejemplo n.º 19
0
def _find_dp_by_re_id(re_id):
    dp_id = fibcdbm.idmap().find_by_re_id(re_id)["dp_id"]
    return fibcdbm.dps().find_by_id(dp_id), fibcdbm.dps().get_mode(dp_id, "default")
Ejemplo n.º 20
0
def _find_dp_by_re_id(re_id):
    dp_id = fibcdbm.idmap().find_by_re_id(re_id)["dp_id"]
    return fibcdbm.dps().find_by_id(dp_id)