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)
def get_portmap(req, **kwargs): """ Get All datas. """ sio = StringIO() fibcdbm.portmap().dump(sio) return Response(content_type='application/json', body=sio.getvalue())
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)
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
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)
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)
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)
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)
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)
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
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)
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)
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)
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)
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)
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)
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)
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)