一種基于openflow的虛擬化層軟件flowvisor的API測(cè)試

一種基于openflow的虛擬化層軟件flowvisor的API測(cè)試

注明:本文并不對(duì)openflow進(jìn)行分析,本人也是略略知道這個(gè)概念,對(duì)flowvisor也只是對(duì)其API有所測(cè)試,更深的源碼并未涉及,只是希望該文能對(duì)以后的flowvisor研究者提供些許幫助。如果本文排版有問題,請(qǐng)看http://www.cnblogs.com/hyd-desert-camel/p/3891515.html

一:flowvisor簡(jiǎn)介  

flowvisor是基于openflow的一個(gè)中間代理層,其目的在于對(duì)物理資源的抽象和分片,從而使得每個(gè)控制器下的slice相互隔離,從而做到網(wǎng)絡(luò)的虛擬化?,F(xiàn)有的openflow機(jī)制中,主要提供了虛擬交換機(jī)如open vswitch,還有控制器如POX,floodlight等,但沒有一個(gè)很好地資源抽象來實(shí)現(xiàn)多用戶隔離和分片,flowvisor就是希望完成這個(gè)目標(biāo)。  

flowvisor中有幾個(gè)比較關(guān)鍵的概念?! ?/p>

? ? ? 1.flow:這個(gè)其實(shí)是對(duì)應(yīng)著openflow報(bào)文的10個(gè)field的,每一個(gè)精確地flow就是這10個(gè)filed的一個(gè)精確匹配。換言之,由于這10個(gè)field總計(jì)占256bit,所以這是一個(gè)256維的空間,每一個(gè)flow就是這個(gè)256維空間中的一個(gè)點(diǎn).  

? ? ? 2.flowspace:上文提到整個(gè)openflow報(bào)文在匹配(match)時(shí)是一個(gè)256維空間中的一個(gè)點(diǎn),那么對(duì)于整個(gè)網(wǎng)絡(luò)而言,其flowspace就是256維空間。正如論文中所說的那樣,flowspace是他們對(duì)匹配頭的一個(gè)稱呼。比如slice1下控制有一個(gè)所有協(xié)議使用TCP/IP的報(bào)文的流,那么這所有符合這個(gè)匹配條件的流就是這一個(gè)slice所對(duì)應(yīng)的子空間,也就是改slice所擁有的一個(gè)flowspace。不同的slice可以對(duì)同一個(gè)flowspace有權(quán)限,但其權(quán)限應(yīng)該不同.此概念不易理解,可以直接參考論文進(jìn)行理解。  

? ? ? ?3.slice:網(wǎng)絡(luò)虛擬化的目的,就是希望不同的用戶看到完全隔離的不同的物理網(wǎng)絡(luò),但實(shí)際網(wǎng)絡(luò)并非用戶看到的那樣,所以slice就是一個(gè)對(duì)物理網(wǎng)絡(luò)的抽象和劃分,就是資源的分割,權(quán)限的分配。每一個(gè)slice本質(zhì)上就是一個(gè)配置文件,其中對(duì)slice的參數(shù)進(jìn)行的描述。在flowvisor中,其存儲(chǔ)在數(shù)據(jù)庫中?! ?/p>

flowvisor是基于RPC機(jī)制的,目前其使用的是JSON-RPC機(jī)制,其大致機(jī)制如下:


二:API測(cè)試測(cè)試環(huán)境:ubuntu12.04 LTS節(jié)點(diǎn)拓?fù)浣Y(jié)構(gòu):


?flowspace match字段:

?all or any is used to specify a flow that matches all packets.????

? in_port=port_no?????????????

?Matches? physical? port? port_no.?? Switch ports are numbered as????????????? displayed by fvctl getDeviceInfo DPID.???????

?dl_vlan=vlan??????????????

Matches IEEE 802.1q virtual LAN tag? vlan.?? Specify? 0xffff? as????????????? vlan? to? match? packets that are not tagged with a virtual LAN;????????????? otherwise, specify a number between 0 and? 4095,? inclusive,? as????????????? the 12-bit VLAN ID to match.??????? dl_src=mac????????????? Matches? Ethernet? source address mac, which should be specified????????????? as 6 pairs of? hexadecimal? digits? delimited? by? colons,? e.g.????????????? 00:0A:E4:25:6B:B0.??????? dl_dst=mac????????????? Matches Ethernet destination address mac.??????? dl_type=ethertype????????????? Matches Ethernet protocol type ethertype, which should be speci‐????????????? fied as a integer between 0 and 65535, inclusive, either in dec‐????????????? imal? or? as a hexadecimal number prefixed by 0x, e.g. 0x0806 to????????????? match ARP packets.????? nw_src=ip[/netmask]????????????? Matches IPv4 source address ip, which should be specified as? an????????????? IP? address,? e.g.? 192.168.1.1.?? The? optional? netmask allows????????????? matching only on an IPv4 address prefix.? The netmask is? speci‐????????????? ficed "CIDR-style", i.e., 192.168.1.0/24.??????? nw_dst=ip[/netmask]????????????? Matches IPv4 destination address ip.??????? nw_proto=proto????????????? Matches? IP? protocol type proto, which should be specified as a????????????? decimal number between 0 and 255, inclusive, e.g. 6 to match TCP????????????? packets.??????? nw_tos=tos/dscp????????????? Matches? ToS/DSCP? (only? 6-bits, not modify reserved 2-bits for????????????? future use) field of IPv4 header tos/dscp, which should be spec‐????????????? ified as a decimal number between 0 and 255, inclusive.????? tp_src=port????????????? Matches transport-layer (e.g., TCP, UDP, ICMP) source port port,????????????? which should be specified as a? decimal? number? between? 0? and????????????? 65535? (in? the case of TCP or UDP) or between 0 and 255 (in the????????????? case of ICMP), inclusive, e.g. 80 to match? packets? originating????????????? from a HTTP server.??????? tp_dst=port????????????? Matches transport-layer destination port port.?slice權(quán)限參數(shù):DELEGATE(1), READ(2), and WRITE(4)?API測(cè)試:一:add-1.add-slice:命令語法:fvctl add-slice [options] <slicename> <controller-url> <admin-email>?? -d DROP, --drop-policy=DROP??????????????????????? Drop rule type; default='exact'? -l, --recv-lldp?????? Slice to receive unknown LLDP; default=False? -f FLOW, --flowmod-limit=FLOW??????????????????????? Slice tcam usage; default is none (-1)? -r RATE, --rate-limit=RATE??????????????????????? Slice control path rate limit; default is none (-1)? -p PASSWD, --password=PASSWD??????????????????????? Slice password? --disabled??? ????????Disable this slice initially; default=False輸入:fvctl -p 8081 add-slice -l s4 tcp:127.0.0.1?hyd@126.com輸出:Slice s4 was successfully createdroot@icecamel-virtual-machine:/home/icecamel/nv# fvctl -p 8081 list-slice-info s4Password:{? "admin-contact": "hyd@126.com",? "admin-status": true,? "controller-url": "tcp:127.0.0.1:6633",? "current-flowmod-usage": 0,? "current-rate": 0,? "drop-policy": "exact",? "recv-lldp": true,? "slice-name": "s4"}輸入:fvctl -p 8081 add-slice -r 1 s5 tcp:127.0.0.1:6640?hyd@126.com輸出:Slice s5 was successfully createdroot@icecamel-virtual-machine:/home/icecamel/nv# fvctl -p 8081 list-slice-info s5Password:{? "admin-contact": "hyd@126.com",? "admin-status": true,? "controller-url": "tcp:127.0.0.1:6640",? "current-flowmod-usage": 0,? "current-rate": 0,? "drop-policy": "exact",? "recv-lldp": false,? "slice-name": "s5"}ps:????? 1.slice不可同名????? 2.slice的controller不可相同?2.add-flowspace語法規(guī)則: fvctl add-flowspace [options] <flowspace-name> <dpid> <priority> <match> <slice-perm>Options:? -h, --help??????????? show this help message and exit? -q QUEUES, --queues=QUEUES??????????????????????? Define list of queues permitted on this flowspace.? -f FQUEUE, --forced-queue=FQUEUE??????????????????????? Force a queue id upon output action.注明:match字段如文檔開頭描述,在這里用perm1=x1,perm=x2的形式列舉希望匹配的字段即可,all或者any可以表示所有資源,slice-perm的規(guī)則是slice-name1=num1,slice-name2=num2,其中slice權(quán)限參數(shù):DELEGATE(1), READ(2), and WRITE(4)輸入:fvctl -p 8081 add-flowspace -f 2 fs3 all 100 all s1=5輸出:FlowSpace fs3 was added with request id 4{"force-enqueue": 2, "name": "fs3", "slice-action": [{"slice-name": "s1", "permission": 5}], "queues": [], "priority": 100, "dpid": "all_dpids", "id": 5, "match": {"wildcards": 4194303}}輸入:fvctl -p 8081 add-flowspace fs12 all 90 all s2=4輸出:{?"dpid": "all_dpids",?"force-enqueue": -1,?"id": 7,?"match": {? "wildcards": 4194303?},?"name": "fs12",?"priority": 90,?"queues": [],?"slice-action": [? {?? "permission": 4,?? "slice-name": "s2"? }?]}ps:如果執(zhí)行fvctl -p 8081 add-flowspace all 90 all s1=5,s2=5,會(huì)出現(xiàn)兩個(gè)完全一模一樣的flowspace,其ID也是一樣的,避免使用。??二:list-1.list-datapaths:Displays the devices輸入:?fvctl -p 8081 list-datapaths輸出:Connected switches:? 1 : 00:00:1e:e3:d3:5e:b1:47? 2 : 00:00:4a:e6:f6:f2:1e:4c? 3 : 00:00:72:cf:98:c4:27:41? 4 : 00:00:ee:95:d7:4d:0f:49?2.list-datapath-info:Displays information for a connected device輸入:fvctl -p 8081 list-datapath-info 00:00:1e:e3:d3:5e:b1:47 (00:00:1e:e3:d3:5e:b1:47 是dpid)輸出:{? "connection": "/127.0.0.1:6633-->/127.0.0.1:58527",? "current-flowmod-usage": {??? "fvadmin": 0,??? "s1": 0,??? "s2": 0? },? "dpid": "00:00:1e:e3:d3:5e:b1:47",? "num-ports": 4,? "port-list": [??? 3,??? 2,??? 65534,??? 1? ],? "port-names": [??? "b2-b3",??? "b2-b1",??? "b2",??? "p2"? ]}?3.list-datapath-stats:Display statistics for a connected device輸入:fvctl -p 8081 list-datapath-stats 00:00:1e:e3:d3:5e:b1:47輸出:{? "drop": {??? "Total": {}? },? "rx": {??? "Total": {????? "ECHO_REPLY": 426,????? "ECHO_REQUEST": 423,????? "FEATURES_REPLY": 1,????? "HELLO": 1??? },??? "classifier-dpid=00:00:1e:e3:d3:5e:b1:47": {????? "ECHO_REPLY": 426,????? "ECHO_REQUEST": 423,????? "FEATURES_REPLY": 1,????? "HELLO": 1??? }? },? "tx": {??? "Total": {????? "ECHO_REPLY": 423,????? "ECHO_REQUEST": 426,????? "FEATURES_REQUEST": 1,????? "FLOW_MOD": 1,????? "HELLO": 1??? },??? "classifier-dpid=00:00:1e:e3:d3:5e:b1:47": {????? "ECHO_REPLY": 423,????? "ECHO_REQUEST": 426,????? "FEATURES_REQUEST": 1,????? "FLOW_MOD": 1,????? "HELLO": 1??? }? }}?4.list-slices: Displays the configured slices輸入:fvctl -p 8081 list-slices輸出:fvadmin???????? --> enableds1????????????? --> enableds2??????????? ??--> enabled?5.list-slice-info:Displays slice information輸入:fvctl -p 8081 list-slice-info s1輸出:{? "admin-contact": "hyd@126.com",? "admin-status": true,? "controller-url": "tcp:127.0.0.1:6636",? "current-flowmod-usage": 0,? "current-rate": 0,? "drop-policy": "exact",? "recv-lldp": false,? "slice-name": "s1"}?6.list-slice-stats:Displays statistics about a slice輸入:fvctl -p 8081 list-slice-stats s1fvctl -p 8081 list-slice-stats s2fvctl -p 8081 list-slice-stats fvadmin輸出:Internal Error -> list-slice-stats: No stats exist for this slice : s1Internal Error -> list-slice-stats: No stats exist for this slice : s2Internal Error -> list-slice-stats: No stats exist for this slice : fvadmin?7.list-flowspace:fvctl list-flowspace [options]????? ? -s SLICE, --slice-name=SLICE Fetch flowspace for specified slice.????? ? -x, --output-hex????? Displays relevant fields in hex????? ? -p, --pretty-print??? Pretty print output????? ? --show-disabled?????? Display flowspace for disabled slices輸入1:fvctl -p 8081 list-flowspace輸出1:{"force-enqueue": -1, "name": "fs1", "slice-action": [{"slice-name": "s1", "permission": 5}], "queues": [], "priority": 100, "dpid": "all_dpids", "id": 1, "match": {"wildcards": 4194263, "nw_proto": 0, "dl_dst": "78:45:c4:2d:72:51"}}輸入2:fvctl -p 8081 list-flowspace? -s s1輸出:符合結(jié)果輸入3:fvctl -p 8081 list-flowspace? -x (可輸入slice-name)輸入3:fvctl -p 8081 list-flowspace -p:以列表形式輸出?8.list-datapath-flowdb:Displays the contents of the flow db if flow tracking is enabled(跟蹤從slice push到switch的flow)輸入:fvctl -p 8081 list-datapath-flowdb 00:00:1e:e3:d3:5e:b1:47輸出:Flows seen at FlowVisor:?9. list-datapath-flowrewritedb:Displays the rewrites (or expansions) FlowVisor has applied(當(dāng)controller把一個(gè)flow向flowvisor push的時(shí)候,flowvisor可能會(huì)擴(kuò)展該流,次命令查閱該擴(kuò)展)命令格式:fvctl list-datapath-flowrewritedb slice-name dpid輸入:fvctl -p 8081 list-datapath-flowrewritedb s1 00:00:36:f1:bb:00:67:47輸出:Rewrites applied by FlowVisor:輸入:fvctl -p 8081 list-datapath-flowrewritedb s1 000036f1bb006747輸出:同上ps:dpid的格式如果錯(cuò)誤,會(huì)報(bào)錯(cuò),詳情如下:輸入:fvctl -p 8081 list-datapath-flowrewritedb s2 0000-3a02-5569-824c輸出:HTTP Error 500: Server ErrorRewrites applied by FlowVisor:Traceback (most recent call last):? File "/usr/local/bin/fvctl", line 1103, in <module>??? do_func(gopts, opts, args)? File "/usr/local/bin/fvctl", line 702, in do_listrewritedb??? for fbe in ret:TypeError: 'NoneType' object is not iterable?10:list-fs-status:命令格式: fvctl list-fs-status <fs-id>命令作用:查看添加flowspace的請(qǐng)求是否被處理或者請(qǐng)求,返回值有UNKNOWN,PENDING,SUCCESS,或者錯(cuò)誤信息輸入:fvctl -p 8081 list-fs-status 1輸出:FlowSpace Request id 1 : SUCCESS輸入:?? fvctl -p 8081 list-fs-status 10輸出:FlowSpace Request id 10 : UNKNOWN?11:list-fv-health:呈現(xiàn)一些參數(shù)輸入:fvctl -p 8081? list-fv-health輸出:{? "average-delay": 0,? "instant-delay": 0}?12:list-links:輸入:fvctl -p 8081 list-links輸出:[? {??? "attributes": "fakeLink=true",??? "dstDPID": "00:00:42:49:a6:41:b1:41",??? "dstPort": "1",??? "srcDPID": "00:00:3a:02:55:69:82:4c",??? "srcPort": "0"? },? {??? "attributes": "fakeLink=true",??? "dstDPID": "00:00:62:0b:89:0d:f5:46",??? "dstPort": "1",??? "srcDPID": "00:00:42:49:a6:41:b1:41",??? "srcPort": "0"? },? {??? "attributes": "fakeLink=true",??? "dstDPID": "00:00:36:f1:bb:00:67:47",??? "dstPort": "1",??? "srcDPID": "00:00:62:0b:89:0d:f5:46",??? "srcPort": "0"? },? {??? "attributes": "fakeLink=true",??? "dstDPID": "00:00:3a:02:55:69:82:4c",??? "dstPort": "1",??? "srcDPID": "00:00:36:f1:bb:00:67:47",??? "srcPort": "0"? }]?三:配置1.get-config:fvctl -p 8081 get-config結(jié)果:Password:{? "api_jetty_webserver_port": 8081,? "api_webserver_port": 8080,? "checkpointing": false,? "config_name": "default",? "db_version": "2",? "enable-topo-ctrl": false,? "flood-perm": {??? "dpid": "all",??? "slice-name": "fvadmin"? },? "flow-stats-cache": 30,? "flowmod-limit": {??? "fvadmin": {????? "00:00:1e:e3:d3:5e:b1:47": -1,????? "00:00:4a:e6:f6:f2:1e:4c": -1,????? "00:00:72:cf:98:c4:27:41": -1,????? "00:00:ee:95:d7:4d:0f:49": -1,????? "any": null??? },??? "s1": {????? "00:00:1e:e3:d3:5e:b1:47": -1,????? "00:00:4a:e6:f6:f2:1e:4c": -1,????? "00:00:72:cf:98:c4:27:41": -1,????? "00:00:ee:95:d7:4d:0f:49": -1,????? "any": null??? },??? "s2": {????? "00:00:1e:e3:d3:5e:b1:47": -1,????? "00:00:4a:e6:f6:f2:1e:4c": -1,????? "00:00:72:cf:98:c4:27:41": -1,????? "00:00:ee:95:d7:4d:0f:49": -1,????? "any": null??? }? },? "host": "localhost",? "log_facility": "LOG_LOCAL7",? "log_ident": "flowvisor",? "logging": "NOTE",? "stats-desc": false,? "track-flows": false,? "version": "flowvisor-1.4.0"}?2.set-config:設(shè)置flowvisor的參數(shù):For flood permissions, if both the dpid and theslice are given, then that slice is given permission for that dpid. Otherwise,the given slice is set as the slice global flood permissions. For flowmodlimits, the limit is set per slice per dpid. The dpid in case could be 'any'.語法規(guī)則:fvctl set-config [options]Options:? -h, --help??????????? show this help message and exit? -f SLICE[,DPID], --flood-perm=SLICE[,DPID]??????????????????????? Set the floodperm? -l SLICE,DPID,LIMIT, --flowmod-limit=SLICE,DPID,LIMIT??????????????????????? Set the flowmod limit.? --enable-tracking???? Enable flow tracking.? --disable-tracking??? Disable flow tracking.? --enable-stats-desc?? Enable stats description hijacking.? --disable-stats-desc? Disable stats description hijacking.? --enable-topo-ctrl??? Enable topology controller.? --disable-topo-ctrl?? Disable topology controller.? -c CACHE, --flow-stats-cache=CACHE??????????????????????? Set the aging timer for the flow stats cache.輸入:fvctl -p 8081 set-config -f s1 -- enable-tracking輸出:Configuration has been updated(調(diào)用get-config后可以看到的確成功修改)輸入:fvctl -p 8081 set-config -l s1,00:00:36:f1:bb:00:67:47,10輸出:(修改成功)root@icecamel-virtual-machine:~# fvctl -p 8081 get-config -s s1 -d 00:00:36:f1:bb:00:67:47Password:{? "api_jetty_webserver_port": 8081,? "api_webserver_port": 8080,? "checkpointing": false,? "config_name": "default",? "db_version": "2",? "enable-topo-ctrl": false,? "flood-perm": {?? ?"dpid": "00:00:36:f1:bb:00:67:47",??? "slice-name": ""? },? "flow-stats-cache": 30,? "flowmod-limit": {??? "s1": {????? "00:00:36:f1:bb:00:67:47": 10??? }? },? "host": "localhost",? "log_facility": "LOG_LOCAL7",? "log_ident": "flowvisor",? "logging": "NOTE",? "stats-desc": false,? "track-flows": true,? "version": "flowvisor-1.4.0"}?3.save-config:語法規(guī)則:fvctl save-config <file>輸入:?fvctl -p 8081 save-config /home/icecamel/nv/config_test.json輸出:Config file written to /home/icecamel/nv/config_test.json.root@icecamel-virtual-machine:/home/icecamel/nv# lsconfig_test.json?四:remove與update1.remove-slice輸入:fvctl -p 8081 remove-slice s4輸出:(正常刪除)?2.remove-flowspace輸入:fvctl -p 8081 remove-flowspace fs4輸出:(正常刪除)ps:之前在add-flowspace時(shí)通過命令fvctl -p 8081 add-flowspace all 100 all s1=5,s2=5同時(shí)生成的兩個(gè)一模一樣的flowspace通過該命令會(huì)被同時(shí)刪除?3.update-admin-password語法規(guī)則:fvctl update-admin-password [options]Update the admin password.Options:? -h, --help??????????? show this help message and exit? -p PASSWD, --password=PASSWD??????????????????????? New password for admin.輸入:fvctl update-admin-password -p 123正常更改輸入:fvctl -p 8081 update-admin-password -p 123輸出:前面的更改生效且這次也成功更改ps:在修改過后重啟,密碼修改失效?4.update-flowspace語法規(guī)則:fvctl update-flowspace [options] <flowspace-name>Options:? -h, --help??????????? show this help message and exit? -d DPID, --dpid=DPID? Set the dpid for flowspace entry.? -p PRIO, --priority=PRIO??????????????????????? Set the priority for flowspace entry.? -m MATCH, --match=MATCH? ??????????????????????Set the match for flowspace entry.? -s SACT, --slice-action=SACT??????????????????????? Set the slice(s) for flowspace entry.? -q QUEUES, --queues=QUEUES??????????????????????? Define list of queues permitted on this flowspace.? -f FQUEUE, --forced-queue=FQUEUE??????????????????????? Force a queue id upon output action.輸入:fvctl -p 8081 update-flowspace fs6 -m?dl_src=0a:a1:f9:da:26:13,nw_proto=0x1輸出:Flowspace fs6 was updated with request id 10{?"dpid": "all_dpids",?"force-enqueue": -1,?"id": 10,?"match": {? "dl_src": "0a:a1:f9:da:26:13",? "nw_proto": 1,? "wildcards": 4194267?},?"name": "fs6",?"priority": 101,?"queues": [? 2,? 3,? 4?],?"slice-action": [? {?? "permission": 5,?? "slice-name": "s2"? }?]}(成功修改,且無論是添加flowspace還是修改flowspace,均會(huì)使id增加,修改id為x的flowspace,其輸出結(jié)果id=x+n,且該flowspace 的id變?yōu)閤)輸入:fvctl -p 8081 update-flowspace fs6 -s s2=5輸出:Flowspace fs6 was updated with request id 11?5.update-slice-password語法規(guī)則:fvctl update-slice-password slice-name -p NewPasswd\輸入:fvctl update-slice-password s2 -p 123輸出:Slice password for s2 has been updated.?6.update-slice語法規(guī)則:fvctl update-slice [options] <slicename>輸入:fvctl -p 8081 update-slice s1 -n 192.168.1.133輸出:Slice s1 has been successfully updated{? "admin-contact": "hyd@126.com",? "admin-status": true,? "controller-url": "tcp:192.168.1.133:6636",? "current-flowmod-usage": 0,? "current-rate": 0,? "drop-policy": "exact",? "recv-lldp": false,? "slice-name": "s1"}輸入: fvctl -p 8081 update-slice s1 -d rule輸出:Slice s1 has been successfully updatedroot@icecamel-virtual-machine:/home/icecamel/nv# fvctl -p 8081 list-slice-info s1Password:{? "admin-contact": "hyd@126.com",? "admin-status": true,? "controller-url": "tcp:192.168.1.133:6636",? "current-flowmod-usage": 0,? "current-rate": 0,? "drop-policy": "rule",? "recv-lldp": false,? "slice-name": "s1"}?7.register-event-callback:Registers for events from FlowVisor. Possible events are: DEVICE_CONNECTED,SLICE_CONNECTED, SLICE_DISCONNECTED and FLOWTABLE_CALLBACK. ForFLOWTABLE_CALLBACK event type dpid has to be input with -d option. More eventsmay be added later.語法規(guī)則:fvctl register-event-callback <url> <methodname> <eventtype> <name>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容