Esempio n. 1
0
 def _set_portmap(cmd, msg):
     if cmd == "add":
         fibcdbm.portmap().add(msg)
     elif cmd == "delete":
         fibcdbm.portmap().delete_by_name_key(msg["name"])
     else:
         _LOG.error("invalid portmap command. %s", cmd)
Esempio n. 2
0
 def get_portmap(req, **kwargs):
     """
     Get All datas.
     """
     sio = StringIO()
     fibcdbm.portmap().dump(sio)
     return Response(content_type='application/json', body=sio.getvalue())
Esempio n. 3
0
 def _on_port_config_del(self, msg):
     entry = fibcdbm.portmap().find_by_name(re_id=msg.re_id,
                                            name=msg.ifname)
     self.send_port_status_if_ready(entry, msg.status)
     entry.update_vm(0)
     if not entry.is_config():
         fibcdbm.portmap().delete_by_name(msg.re_id, msg.ifname)
Esempio n. 4
0
        def _get_entry():
            try:
                return fibcdbm.portmap().find_by_name(re_id=msg.re_id, name=msg.ifname)

            except KeyError as expt:
                if msg.dp_port != 0:
                    idmap = fibcdbm.idmap().find_by_re_id(msg.re_id)
                    entry = fibcdbm.FIBCPortEntry.new(
                        dp_id=idmap["dp_id"],
                        port=msg.dp_port,
                        re_id=msg.re_id,
                        link=msg.link,
                        name=msg.ifname,
                        no_vs=True,
                        dpenter=idmap["dp_status"],
                    )
                else:
                    entry = fibcdbm.FIBCPortEntry.new(
                        dp_id=0,
                        port=0,
                        re_id=msg.re_id,
                        link=msg.link,
                        name=msg.ifname,
                        no_vs=False,
                    )

                if not entry.is_config():
                    fibcdbm.portmap().add(entry)
                    return entry

                raise expt
Esempio n. 5
0
 def _set_portmap(cmd, msg):
     """
     cmd: "add" or "delete"
     msg: FIBCPortEntry
     """
     if cmd == "add":
         fibcdbm.portmap().add(msg)
     elif cmd == "delete":
         fibcdbm.portmap().delete_by_name_key(msg["name"])
     else:
         _LOG.error("invalid portmap command. %s", cmd)
Esempio n. 6
0
    def _on_ff_l2addr_status(self, evt):
        """
        process ff_l2addr_status  message.
        """
        msg = evt.msg # pb.FFL2AddrStatus
        dpath = evt.datapath
        dp_id = evt.datapath.id

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

        try:
            re_id = fibcdbm.idmap().find_by_dp_id(dp_id)["re_id"]

        except Exception as ex:
            _LOG.exception(ex)

        new_addrs = []
        for addr in msg.addrs:
            try:
                port = fibcdbm.portmap().find_by_dp(dp_id, addr.port_id)
                vm_port = port["vm"]
                addr.ifname = port["name"].name
                addr.port_id = vm_port.port

                new_addrs.append(addr)

            except Exception as ex:
                _LOG.exception(ex)


        _LOG.debug("FFL2AddrStatus: %s %s", re_id, new_addrs)

        msg = fibcapi.new_l2addr_status(re_id, new_addrs)
        evt = fibcevt.EventFIBCL2AddrStatus(msg)
        self.send_event_to_observers(evt)
Esempio n. 7
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)
Esempio n. 8
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)

        try:
            port = fibcdbm.portmap().find_by_dp(dp_id=evt.dp_id,
                                                port_id=evt.port_id)
            if evt.enter:
                port["dpenter"] = True
                self.send_port_status_if_ready(port, "UP")

            else:
                self.send_port_status_if_ready(port, "DOWN")
                port["dpenter"] = False

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

        except Exception as expt:
            _LOG.exception(expt)
Esempio n. 9
0
    def on_port_config(self, evt):
        """
        Process PortConfig event
        evt.msg: instance of pb.PortConfig
        """
        msg = evt.msg
        if fibclog.dump_msg():
            _LOG.debug("%s", msg)

        try:
            port = fibcdbm.portmap().find_by_name(re_id=msg.re_id,
                                                  name=msg.ifname)
            if msg.cmd == pb.PortConfig.ADD:
                port.update_vm(msg.value)
                self.send_port_status_if_ready(port, "UP")

            elif msg.cmd == pb.PortConfig.DELETE:
                self.send_port_status_if_ready(port, "DOWN")
                port.update_vm(0)

            else:
                pass

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

        except Exception as expt:
            _LOG.exception(expt)
Esempio n. 10
0
        def _get_entry():
            try:
                return fibcdbm.portmap().find_by_name(re_id=msg.re_id,
                                                      name=msg.ifname)

            except KeyError as expt:
                entry = fibcdbm.FIBCPortEntry.new(
                    dp_id=0,
                    port=0,
                    re_id=msg.re_id,
                    link=msg.link,
                    name=msg.ifname,
                )

                if not entry.is_config():
                    fibcdbm.portmap().add(entry)
                    return entry

                raise expt
Esempio n. 11
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)
Esempio n. 12
0
    def forward_pkt(self, pkt, dp_id, port_id):
        """
        forward packet.
        """
        try:
            port = fibcdbm.portmap().find_by_dp(dp_id, port_id)
            vs_port = port["vs"]
            vlan_hdr = pkt.get_protocol(vlan.vlan)
            strip_vlan = True if vlan_hdr is not None and \
                         vlan_hdr.vid == fibcapi.OFPVID_UNTAGGED else False

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

            self.packetout(pkt, vs_port.id, vs_port.port, strip_vlan)

            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)

            self.packetout(pkt, dp_port.id, dp_port.port)

            return

        except KeyError:
            _LOG.warn("drop src(%d, %d)", dp_id, port_id)
            if fibclog.dump_pkt():
                _LOG.debug("drop %s", pkt)
Esempio n. 13
0
def _extend_port_stats(stats):
    def _snmp_if_oper_status(status):
        return 1 if status else 2

    for dpid, port_stats_list in stats.items():
        dpid = int(dpid)
        for port_stats in port_stats_list:
            try:
                port_no = port_stats["port_no"]
                port_entry = fibcdbm.portmap().find_by_dp(dpid, port_no)
                port_stats["ifName"] = port_entry["name"][1]
                port_stats["ifOperStatus"] = _snmp_if_oper_status(
                    port_entry["dpenter"])

            except KeyError:
                port_stats["ifName"] = ""
                port_stats["ifOperStatus"] = _snmp_if_oper_status(False)
Esempio n. 14
0
    def on_flow_mod(self, evt):
        """
        Process FlowMod event
        """
        mod = evt.msg
        if fibclog.dump_msg():
            _LOG.debug("%s", mod)

        try:
            dpath, mode = fibcdbm.find_dp_by_re_id(mod.re_id)
            if dpath is not None:
                fibccnv.conv_flow(mod, fibcdbm.portmap())
                func = ofc.flow(mode, mod.table)
                func(dpath, mod, ofctl)
                sleep(_SEND_MOD_WAIT_SEC)

        except Exception as expt:
            _LOG.exception(expt)
Esempio n. 15
0
    def on_group_mod(self, evt):
        """
        Process GroupMod event
        """
        mod = evt.msg
        if fibclog.dump_msg():
            _LOG.debug(mod)

        try:
            dpath, mode = _find_dp_by_re_id(mod.re_id)
            if dpath is not None:
                fibccnv.conv_group(mod, fibcdbm.portmap())
                func = ofc.group(mode, mod.g_type)
                func(dpath, mod, ofctl)
                sleep(_SEND_MOD_WAIT_SEC)

        except Exception as expt:
            _LOG.exception(expt)
Esempio n. 16
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)
Esempio n. 17
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)
Esempio n. 18
0
 def send_port_status_if_ready(self, port, status):
     """
     Send PortStatus event if port is ready.
     """
     for ready_port in get_ready_ports(fibcdbm.portmap(), port):
         self.send_port_status_event(ready_port, status)