def __init__(self, *args, **kwargs): super(SimpleSwitch13, self).__init__(*args, **kwargs) self.mac_to_port = {} self.stp = kwargs['stplib'] # Sample of stplib config. # please refer to stplib.Stp.set_config() for details. config = { dpid_lib.str_to_dpid('0000000000000001'): { 'bridge': { 'priority': 0x8000 } }, dpid_lib.str_to_dpid('0000000000000002'): { 'bridge': { 'priority': 0x9000 } }, dpid_lib.str_to_dpid('0000000000000003'): { 'bridge': { 'priority': 0xa000 } } } self.stp.set_config(config)
def __init__(self, *args, **kwargs): super(SimpleSwitchLacp, self).__init__(*args, **kwargs) self.mac_to_port = {} self._lacp = kwargs['lacplib'] # in this sample application, bonding i/fs of the switchs # shall be set up as follows: # - the port 1 and 2 of the datapath 1 face the slave i/fs. # - the port 3, 4 and 5 of the datapath 1 face the others. # - the port 1 and 2 of the datapath 2 face the others. self._lacp.add(dpid=str_to_dpid('0000000000000001'), ports=[1, 2]) self._lacp.add(dpid=str_to_dpid('0000000000000001'), ports=[3, 4, 5]) self._lacp.add(dpid=str_to_dpid('0000000000000002'), ports=[1, 2])
def lldp_parse(data): pkt = packet.Packet(data) i = iter(pkt) eth_pkt = six.next(i) assert type(eth_pkt) == ethernet.ethernet lldp_pkt = six.next(i) if type(lldp_pkt) != lldp.lldp: raise LLDPPacket.LLDPUnknownFormat() tlv_chassis_id = lldp_pkt.tlvs[0] if tlv_chassis_id.subtype != lldp.ChassisID.SUB_LOCALLY_ASSIGNED: raise LLDPPacket.LLDPUnknownFormat( msg='unknown chassis id subtype %d' % tlv_chassis_id.subtype) chassis_id = tlv_chassis_id.chassis_id.decode('utf-8') if not chassis_id.startswith(LLDPPacket.CHASSIS_ID_PREFIX): raise LLDPPacket.LLDPUnknownFormat( msg='unknown chassis id format %s' % chassis_id) src_dpid = str_to_dpid(chassis_id[LLDPPacket.CHASSIS_ID_PREFIX_LEN:]) tlv_port_id = lldp_pkt.tlvs[1] if tlv_port_id.subtype != lldp.PortID.SUB_PORT_COMPONENT: raise LLDPPacket.LLDPUnknownFormat( msg='unknown port id subtype %d' % tlv_port_id.subtype) port_id = tlv_port_id.port_id if len(port_id) != LLDPPacket.PORT_ID_SIZE: raise LLDPPacket.LLDPUnknownFormat(msg='unknown port id %d' % port_id) (src_port_no, ) = struct.unpack(LLDPPacket.PORT_ID_STR, port_id) return src_dpid, src_port_no
def _switches(self, req, **kwargs): dpid = None if 'dpid' in kwargs: dpid = dpid_lib.str_to_dpid(kwargs['dpid']) switches = get_switch(self.topology_api_app, dpid) body = json.dumps([switch.to_dict() for switch in switches]) return Response(content_type='application/json', body=body)
def _links(self, req, **kwargs): dpid = None if 'dpid' in kwargs: dpid = dpid_lib.str_to_dpid(kwargs['dpid']) links = get_link(self.topology_api_app, dpid) body = json.dumps([link.to_dict() for link in links]) return Response(content_type='application/json', body=body)
def _hosts(self, req, **kwargs): dpid = None if 'dpid' in kwargs: dpid = dpid_lib.str_to_dpid(kwargs['dpid']) hosts = get_host(self.topology_api_app, dpid) body = json.dumps([host.to_dict() for host in hosts]) return Response(content_type='application/json', body=body)
def __init__(self, *args, **kwargs): super(SimpleSwitchIgmp, self).__init__(*args, **kwargs) self.mac_to_port = {} self._snoop = kwargs['igmplib'] # if you want a switch to operate as a querier, # set up as follows: self._snoop.set_querier_mode( dpid=str_to_dpid('0000000000000001'), server_port=2)
def _do_key(dpid, key, func, ret_func): dpid = dpid_lib.str_to_dpid(dpid) try: ret = func(dpid, key) except KeyError: return Response(status=http_client.NOT_FOUND, body='no dpid/key is found %s %s' % (dpid_lib.dpid_to_str(dpid), key)) return ret_func(ret)
def _do_switch(dpid, func, ret_func): dpid = dpid_lib.str_to_dpid(dpid) try: ret = func(dpid) except KeyError: return Response(status=http_client.NOT_FOUND, body='no dpid is found %s' % dpid_lib.dpid_to_str(dpid)) return ret_func(ret)
def list_mac_table(self, req, **kwargs): simple_switch = self.simple_switch_app dpid = dpid_lib.str_to_dpid(kwargs['dpid']) if dpid not in simple_switch.mac_to_port: return Response(status=404) mac_table = simple_switch.mac_to_port.get(dpid, {}) body = json.dumps(mac_table) return Response(content_type='application/json', body=body)
def _get_dp_ids(tables): dp_ids = [] bridges = tables.get('Bridge') if not bridges: return dp_ids for bridge in bridges.rows.values(): datapath_ids = bridge.datapath_id dp_ids.extend(dpidlib.str_to_dpid(dp_id) for dp_id in datapath_ids) return dp_ids
def _get_dp_ids(tables): bridges = tables.get('Bridge') if not bridges: return None for bridge in bridges.rows.values(): datapath_ids = [dpidlib.str_to_dpid(dp_id) for dp_id in bridge.datapath_id] if datapath_id in datapath_ids: openvswitch = tables['Open_vSwitch'].rows if openvswitch: row = openvswitch.get(list(openvswitch.keys())[0]) return row.external_ids.get('system-id') return None
def put_mac_table(self, req, **kwargs): simple_switch = self.simple_switch_app dpid = dpid_lib.str_to_dpid(kwargs['dpid']) try: new_entry = req.json if req.body else {} except ValueError: raise Response(status=400) if dpid not in simple_switch.mac_to_port: return Response(status=404) try: mac_table = simple_switch.set_mac_to_port(dpid, new_entry) body = json.dumps(mac_table) return Response(content_type='application/json', body=body) except Exception as e: return Response(status=500)
def get_ofs(self, dp_id): if len(self) == 0: raise ValueError('qos sw is not connected.') dps = {} if dp_id == REST_ALL: dps = self else: try: dpid = dpid_lib.str_to_dpid(dp_id) except: raise ValueError('Invalid switchID.') if dpid in self: dps = {dpid: self[dpid]} else: msg = 'qos sw is not connected. : switchID=%s' % dp_id raise ValueError(msg) return dps
def get_ofs(self, dp_id): LOG.info('%s(): caller(): %s', log_utils.get_fname(1), log_utils.get_fname(2)) if len(self) == 0: raise ValueError('qos sw is not connected.') dps = {} if dp_id == REST_ALL: dps = self else: try: dpid = dpid_lib.str_to_dpid(dp_id) except: raise ValueError('Invalid switchID.') if dpid in self: dps = {dpid: self[dpid]} else: msg = 'qos sw is not connected. : switchID=%s' % dp_id raise ValueError(msg) return dps
def __init__(self, *args, **kwargs): super(SimpleSwitchLacp13, self).__init__(*args, **kwargs) self.mac_to_port = {} self._lacp = kwargs['lacplib'] self._lacp.add(dpid=str_to_dpid('0000000000000001'), ports=[1, 2])
def __init__(self, *args, **kwargs): super(SimpleSwitchIgmp13, self).__init__(*args, **kwargs) self.mac_to_port = {} self._snoop = kwargs['igmplib'] self._snoop.set_querier_mode(dpid=str_to_dpid('0000000000000001'), server_port=2)
def _match_fn(row): row_dpid = dpidlib.str_to_dpid(str(row.datapath_id[0])) return row_dpid == datapath_id