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)
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())
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)
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)
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)
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 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)))
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 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)
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)
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)
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)
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())
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 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)
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)
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))
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 _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")
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)