flowforwarding / linc-switch Goto Github PK
View Code? Open in Web Editor NEWOpenFlow Software Switch written in Erlang
Home Page: http://flowforwarding.org
License: Other
OpenFlow Software Switch written in Erlang
Home Page: http://flowforwarding.org
License: Other
According to the spec an add flow request that matches with old entries match fields and priority, should replace the old one.
While testing the ping example I sent the FlowMod message twice. Querying the switch flow table it shows both flows.
If LINC switch code is installed on a new machine, it is possible that SSL CA certificates may not be available. It is worthwhile to to include:
% git config --global http.sslVerify false
in the make files so that user does not get an error to download the necessary files from Github?
As Zoltan noticed ofs_userspace_port_sup
is spawned by ofs_sup
regardless of the backend. This should be moved inside the userspace implementation.
First, I followed the OF-Config demo at https://github.com/FlowForwarding/LINC-Switch/wiki/OF-Config-Demo and was successful. However, while experimenting I tried the get_config command when the controller was not running, and no controllers are listed. From the switch, using the command linc_ofconfig:get_switch_state(0), returns the same result. I also tried the test with the controller configured in the sys.config file and get the same result, so it is not related to adding the controller using OF-Config. I'll provide version and example output below.
I can't tell for certain is this is a bug, but in the OF-Config 1.1.1 doc, section 9.2.2 says "When issuing a NETCONF get request all elements in the requested sub-tree must be returned in the result." The current behavior makes checking configuration difficult, since you have to have a controller running to see if it is configured properly.
I'm running LINC-Switch with commit 35a56de on Mac OS X.
Xml output with no controller running:
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="0">
<data>
<capable-switch xmlns="urn:onf:of111:config:yang">
<id>CapableSwitch0</id>
<resources/>
<logical-switches>
<switch>
<id>LogicalSwitch0</id>
<datapath-id>00:23:DF:DE:24:B2:00:00</datapath-id>
<controllers/>
</switch>
</logical-switches>
</capable-switch>
</data>
</rpc-reply>
Xml output with a controller running:
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="0">
<data>
<capable-switch xmlns="urn:onf:of111:config:yang">
<id>CapableSwitch0</id>
<resources/>
<logical-switches>
<switch>
<id>LogicalSwitch0</id>
<datapath-id>00:23:DF:DE:24:B2:00:00</datapath-id>
<controllers>
<controller>
<id>Switch0-DefaultController</id>
<ip-address>127.0.0.1</ip-address>
<port>6633</port>
<protocol>tcp</protocol>
</controller>
</controllers>
</switch>
</logical-switches>
</capable-switch>
</data>
</rpc-reply>
linc_ofconfig:get_switch_state(0) output with no controller running:
{[],
[#logical_switch{
id = "LogicalSwitch0",
capabilities =
#capabilities{
max_buffered_packets = 0,max_tables = 255,
max_ports = 16777216,flow_statistics = true,
table_statistics = true,port_statistics = true,
group_statistics = true,queue_statistics = true,
reassemble_ip_fragments = false,block_looping_ports = false,
reserved_port_types = [all,controller,table,inport,any],
group_types = [all,select,indirect,'fast-failover'],
group_capabilities =
['select-weight','select-liveness',chaining],
action_types =
[output,group,'set-queue','set-mpls-ttl','dec-mpls-ttl',
'set-nw-ttl','dec-nw-ttl','copy-ttl-out'|...],
instruction_types =
['goto-table','write-metadata','write-actions',
'apply-actions','clear-actions',meter]},
datapath_id = "00:23:DF:DE:24:B2:00:00",enabled = true,
check_controller_certificate = false,
lost_connection_behavior = failSecureMode,controllers = [],
resources = []}]}
linc_ofconfig:get_switch_state(0) output with a controller running:
{[],
[#logical_switch{
id = "LogicalSwitch0",
capabilities =
#capabilities{
max_buffered_packets = 0,max_tables = 255,
max_ports = 16777216,flow_statistics = true,
table_statistics = true,port_statistics = true,
group_statistics = true,queue_statistics = true,
reassemble_ip_fragments = false,block_looping_ports = false,
reserved_port_types = [all,controller,table,inport,any],
group_types = [all,select,indirect,'fast-failover'],
group_capabilities =
['select-weight','select-liveness',chaining],
action_types =
[output,group,'set-queue','set-mpls-ttl','dec-mpls-ttl',
'set-nw-ttl','dec-nw-ttl','copy-ttl-out'|...],
instruction_types =
['goto-table','write-metadata','write-actions',
'apply-actions','clear-actions',meter]},
datapath_id = "00:23:DF:DE:24:B2:00:00",enabled = true,
check_controller_certificate = false,
lost_connection_behavior = failSecureMode,
controllers =
[#controller{
operation = undefined,id = "Switch0-DefaultController",
role = equal,ip_address = "127.0.0.1",port = 6633,
local_ip_address = "127.0.0.1",local_port = 52130,
protocol = tcp,
state =
#controller_state{
connection_state = up,current_version = '1.3',
supported_versions = ['1.3']}}],
resources = []}]}
The sorting of instructions in create_flow_entry is wrong, should be sorting on element 2.
Whenever OF-Config related commands are sent via Netconf clients to LINC, for each logical switch available (in case of get-config) or for that corresponding logical switch (in case of edit-config for logical switch x), on the LINC console I get the below errors. Note that LINC ports are tied directly to eth interfaces.
02:06:03.667 [debug] Failed lookup: 0 linc_port_queue
02:06:03.667 [debug] Failed lookup: 0 linc_port_queue
02:06:03.667 [debug] Failed lookup: 0 linc_port_queue
02:06:03.667 [debug] Failed lookup: 0 linc_port_queue
02:06:03.667 [debug] Failed lookup: 0 linc_port_queue
02:06:03.667 [debug] Failed lookup: 0 linc_port_queue
02:06:03.667 [debug] Failed lookup: 0 linc_port_queue
02:06:03.667 [debug] Failed lookup: 1 linc_port_queue
02:06:03.667 [debug] Failed lookup: 1 linc_port_queue
02:06:03.668 [debug] Failed lookup: 1 linc_port_queue
02:06:03.668 [debug] Failed lookup: 1 linc_port_queue
02:06:03.668 [debug] Failed lookup: 1 linc_port_queue
02:06:03.668 [debug] Failed lookup: 1 linc_port_queue
02:06:03.668 [debug] Failed lookup: 1 linc_port_queue
02:06:03.668 [debug] Failed lookup: 1 linc_port_queue
When running in ethernet mode (no taps and bridges), LINC uses epcap library. It captures both incoming packets, and outgoing, sent by LINC. The routing works (I see correct ICMP requests and responses coming through), but it creates a flood of re-captured, re-processed and repeatedly re-transmitted packets.
I checked rebar.config in deps directory, which has
{require_otp_vsn, "R1[56]B"}, but I get the following error:
ERROR: OTP release R16B does not match required regex R15B
ERROR: compile failed while processing /home/snarayan/Documents/codes/git/LINC-Switch/deps/of_protocol: rebar_abort
When a flow is delete there is no flow deleted message sent to the controllers
The OXM VLAN VID and VLAN PCP fields hould only match on the outermost VLAN tags. P 36.: "If not explictely specified in the field description, each field type refer the the outermost occurrence of the field in the packet headers."
The problem with the code is that currently the pkt:decode will push all vlan tags into the pkt packet structure, and I suppose all of those will be converted into OXM fields. So the OFS packet structure will contain multiple VID and PCP fields. AFAICS, the ofs_userspace_routing:match_flow_entry basically works as "all flow entry fields must match any of the packet fields". As a consequence flow entries will accept a multi-tagged frame even if it is the inner tags that have the proper VID and/or PCP fields.
I tried using Floodlight controller with LINC by changing the hostname in sys.config. But i get the following error:
[root@xenovs LINC-Switch]# rel/openflow/bin/openflow console
Exec: /root/LINC-Switch/rel/openflow/erts-5.9.1/bin/erlexec -boot /root/LINC-Switch/rel/openflow/releases/0.1/openflow -mode embedded -config /root/LINC-Switch/rel/openflow/releases/0.1/sys.config -args_file /root/LINC-Switch/rel/openflow/releases/0.1/vm.args -- console
Root: /root/LINC-Switch/rel/openflow
{"could not start kernel pid",application_controller,"error in config file "/root/LINC-Switch/rel/openflow/releases/0.1/sys.config" (52): syntax error before: ?"}
Now when i change sys.config to revert back to the default controller, it is still giving the same error as above.
How do i use Floodlight or any other controller with LINC?
Hi there, this bug applies to most of the FlowForwarding projects -- the rebar.config required_otp_version is too strict and disallows building with R16B+.
Something like {require_otp_vsn, "R1[56789]B"}.
covers R15+ somewhat conveniently.
Hi just downloaded a clean copy and got the following compile issue:
bash-3.2$ rebar compile
Stu's Erlang Environment
==> of_switch (compile)
src/sliding_window.erl:none: error in parse transform 'lager_transform': {undef,
[{lager_transform,
parse_transform,
...
[{file,"compile.erl"},
{line,271}]},
{compile,internal,3,
[{file,"compile.erl"},
{line,246}]}]}
I'm guess we don't want "fail_on_warning" in rebar.config?
{erl_opts, [fail_on_warning,
{parse_transform, lager_transform}]}.
When a flow is deleted the flow entry counters are not deleted.
Reported by a user:
In an interoperability test between LINC and XXX controller with OF1.3 mode.
It does not seem that LINC responds to multi_part request with OFPMP_PORT_DESC.
Our controller disconnects secure channel cause of no multi_part reply.
We need multi_part relpy with OFPMP_PORT_DESC for discovering port status.
When checking the flows for modify or delete operations, if outport is specified in the flow_mod message a check must be done to see that an output operation with the specified port is present.
It seems that each and every datapath frame is routed by a separate process. I understand that processing packets of the same flow should require the very same number of reductions, and the Erlang scheduler being very precise, packets of the same flow should not get reordered.
However, given there is no explicit guarantee for this, and I see no countermeasures made (like an ordering-buffer on output), has there been any measurement made to see if packets get reordered or not?
When a flow is modified and the flag reset_counts is set the flow entry counters shall be reset.
Switch doesn't return queue stats reply in v3 and v4 when queues subsystem is disabled.
ofp_parser throws bad_enum during response packet encoding.
Hi,
I followed the install instructions but I'm having the following error when I try to start the switch:
{"init terminating in do_boot",{'cannot load',eenum,get_file}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
This repeats multiple times for several tests.
Error and crash logs can be found on test machine, or I can quote parts of them per request.
LINC version - the one supplied with test Suse image, not latest release.
{errors log removed}
gandhi mathi wrote:
I am new to LINC switch.I tried the testbed set up and ping .I didn't understand the tap interfaces creation explained in testbed setup. When I run the switch after editing sys.config in rel folder , it is giving me error as " no function clause matching linc_us4_port:init([{ofs_port_no,1},{interface,"tap0"},{ip,"fe80::216:3eff:fe39:c3fe"}]) line 247 in gen_server:init_it/6 line 328" . Do I need to assign the ip addresses manually or shall I use the IPV6 address.
Please paste your sys.config
file and provide us with some basic informations:
Hi,
We ( Luxoft Twister team ) tried a few OpenFlow 1.3.1 conformance tests against LINC and noticed some issues.
Here is one test scenario:
The controller insert a flow mod that has 2 actions against a matched packet.
First action is to change the IPv4 TCP destination port.
Second action is to forward the packet to an egress port.
Injected a packet to match the flow mod and we noticed that we do not receive it at the egress port.
Here are some quick logs:
Packet injected:
dst = 00:01:02:03:04:05
src = 00:06:07:08:09:0a
type = 0x800
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = tcp
chksum = None
src = 192.168.0.1
dst = 192.168.0.2
\options \
sport = 1234
dport = http
seq = 0
ack = 0
dataofs = None
reserved = 0
flags = S
window = 8192
chksum = None
urgptr = 0
options = {}
load = 'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD'
Flowmod:
flow_mod (OFPT_FLOW_MOD)
ofp header
version: 4
type: 14
length: 0
xid: 0
cookie: 0
cookie_mask: 0
table_id: 0
command: 0
idle_timeout: 0
hard_timeout: 0
priority: 1
buffer_id: 4294967295
out_port: 4294967295
out_group: 4294967295
flags: 0
match:
type: 1
length: 4
matchlist with 4 items
match 1:
eth_type
oxm_tlv_class=32768
oxm_tlv_field=0x5
oxm_tlv_hasmask=False
oxm_tlv_length: 0x2
value: 32303438 match 2:
in_port
oxm_tlv_class=32768
oxm_tlv_field=0x0
oxm_tlv_hasmask=False
oxm_tlv_length: 0x4
value: 31 match 3:
eth_src
oxm_tlv_class=32768
oxm_tlv_field=0x4
oxm_tlv_hasmask=False
oxm_tlv_length: 0x6
value: 5b302c20362c20372c20382c20392c2031305d match 4:
eth_dst
oxm_tlv_class=32768
oxm_tlv_field=0x3
oxm_tlv_hasmask=False
oxm_tlv_length: 0x6
value: 5b302c20312c20322c20332c20342c20355d List instructions
instructionlist with 1 items
instruction 1:
instruction_apply_actions
type: 4
len: 8
actionlist with 2 items
action 1:
action_set_field
type: 25
len: 8
field: <ce_libs.openflow.of_13.match.tcp_dst instance at 0x961770c>
action 2:
action_output
type: 0
len: 16
port: 2
max_len: 0
I am curious as to if anyone has done any performance testing of LINC-Switch? What kind of throughput numbers have people seen? I am especially curious about what order of magnitude of throughput I could expect to see on XEN.
Experimenter message, action, instruction, match field should have an opaque body. Message is handled properly, but action and instruction mapping seem to assume they always have a zero-length body.
The OXM Ethertype field originates from the DL_TYPE field in OF 1.1, and its purpose is to identify the payload above layer 2 (MPLS, IPv4, IPv6, …).
The description in Table 8. (p 36.) says: "Ethernet type of the OpenFlow packet payload, after VLAN tags."
So if an incoming frame has no vlan tags, the ethertype of the ethernet header should be used. Otherwise, the ethertype of the last vlan tag (this includes B-Tags in OF 1.3) must be matched against the
value specified in OXM ethertype field of the Flow Entry.
When the pkt packet is converted into an ofs packet, the ofs_userspace_convert:packet_fields function simply maps the ethertype of the ethernet frame to this OXM field; whereas it should update the field whenever it encounters a later VLAN tag.
hi
i'm totally new here.
I followed all instructions from here: https://github.com/FlowForwarding/LINC-Switch
i cloned with git the LINC-Switch.git
git clone https://github.com/FlowForwarding/LINC-Switch.git
there was one error, as I'm behind a proxy so i changed deps/of_protocol/rebar.config to use http: and not git: when getting eenum
once done, the make fails with:
==> of_switch (compile)
src/gen_switch.erl:43: type ofp_flow_mod() undefined
src/gen_switch.erl:49: type ofp_table_mod() undefined
src/gen_switch.erl:55: type ofp_port_mod() undefined
and more
any suggestions?
Thanks,
Doron
Hi maintainer,
Thanks a lot for opensource LINC, it's a great product for learning openflow.
I want to know does OF-Config is well supported by LINC or not, seems that it's disabled by default.
Besides, I think the schema provided in OF-Config spec is not quite accurate, I note that LINC support validate the schema, does the example like example in OF-Config spec can be validated succesfully?
Thanks in advance.
I feel hard with Zen hyper visor. Can I use VMs on the VMware, in that case can I use the network configuration as we did for openvswitch.
Thanks
Gandhi
I was able to connect 1 LINC switch to the Floodlight Controller.
Simultaneously, I also tried connecting another LINC switch to the same Floodlight controller but then the previous switch crashes & the second switch gets connected.
So does that mean that i can only control 1 LINC switch at a time.
I noticed that the controller notes same dpid 00:00:00:00:00:00 for both of them.
Then i tried this with 2 ovs switches & they seem to connect showing different dpid's.
So can you tell me how can i change the dpid of the LINC switch?
Thanks,
Anand
Flow entries in the flow tables are sorted by increasing priority. This leads to that the search for matching flows in linc_us3_routing tries the flows in order of increasing priority instead of decreasing priority, so the lowest instead of the highest priority flow that matches is selected.
Hi,
We ( Luxoft Twister team ) tried a few OpenFlow 1.3.1 conformance tests against LINC and noticed some issues.
Here is one test scenario:
The controller insert a flow mod that has 2 actions against a matched packet.
First action is to change the IPv4 destination field.
Second action is to forward the packet to an egress port.
Injected a packet to match the flow mod and we noticed that the egress port was applied by LINC, so the second action is followed. The issue is that LINC didn't change the IPv4 destination address.
Here are some quick logs:
Flow mod message sent to LINC:
flow_mod (OFPT_FLOW_MOD)
ofp header
version: 4
type: 14
length: 0
xid: 0
cookie: 0
cookie_mask: 0
table_id: 0
command: 0
idle_timeout: 0
hard_timeout: 0
priority: 1
buffer_id: 4294967295
out_port: 4294967295
out_group: 4294967295
flags: 0
match:
type: 1
length: 4
matchlist with 3 items
match 1:
in_port
oxm_tlv_class=32768
oxm_tlv_field=0x0
oxm_tlv_hasmask=False
oxm_tlv_length: 0x4
value: 31 match 2:
eth_src
oxm_tlv_class=32768
oxm_tlv_field=0x4
oxm_tlv_hasmask=False
oxm_tlv_length: 0x6
value: 5b302c20362c20372c20382c20392c2031305d match 3:
eth_dst
oxm_tlv_class=32768
oxm_tlv_field=0x3
oxm_tlv_hasmask=False
oxm_tlv_length: 0x6
value: 5b302c20312c20322c20332c20342c20355d List instructions
instructionlist with 1 items
instruction 1:
instruction_apply_actions
type: 4
len: 8
actionlist with 2 items
action 1:
action_set_field
type: 25
len: 8
field: <oftest.match.ipv4_dst instance at 0xa7e74ec>
action 2:
action_output
type: 0
len: 16
port: 2
max_len: 0
Packet injected ( IPv4 dst is 192.168.0.2 ):
dst = 00:01:02:03:04:05
src = 00:06:07:08:09:0a
type = 0x800
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = tcp
chksum = None
src = 192.168.0.1
dst = 192.168.0.2
\options \
sport = 1234
dport = http
seq = 0
ack = 0
dataofs = None
reserved = 0
flags = S
window = 8192
chksum = None
urgptr = 0
options = {}
load = 'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD'
Packet at egress port ( IPv4 dst address is still 192.168.0.2 ):
dst = 00:01:02:03:04:05
src = 00:06:07:08:09:0a
type = 0x800
version = 4L
ihl = 5L
tos = 0x0
len = 86
id = 1
flags =
frag = 0L
ttl = 64
proto = tcp
chksum = 0xf94d
src = 192.168.0.1
dst = 192.168.0.2 -- should be 10.0.0.2
\options \
sport = 1234
dport = http
seq = 0
ack = 0
dataofs = 5L
reserved = 0L
flags = S
window = 8192
chksum = 0xe71c
urgptr = 0
options = []
load = 'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD'
I tried to use floodlight controller with LINC switch. As soon as the switch is started, after the two tap-link-ports were created messages, it is giving the message as "Connection to controller localhost:6633/0 closed because of bad_initial_message". I would like to know how to fix this.
Also I want to know more about Link switch, Is there any documents available to read?
Thanks
Mathi
In both v3 and v4 when field miss_send_len is set to 'no_buffer' packets are not correctly encoded/decoded by the parser, but bad_enum is returned instead.
Currently ofp_features_reply response https://github.com/FlowForwarding/LINC-Switch/blob/master/apps/of_switch/src/ofs_logic.erl#L173 does not return ports=Ports (empty list).
This should be moved to the backend.
Failing test "basic.PortConfigMod" of OFtest12 https://github.com/CPqD/oftest12
The intention of the Apply actions instructions is to mimic the original OpenFlow 1.0 behavior of flow entry actions. At that time the only possible way to do multicasting was to do multiple outputs in the action list. Something like: [… modify packet for output 1 …, output on port X, … modify packet for output 2, … output on port Y, … ]. In essence, whenever an output or group action is called from an apply actions instruction, a clone of the packet should be made, processed through the relevant port or group; and at the same time the original packet should continue its way in the pipeline.
In contrast, the ofs_userspace_routing:apply_action_list function stops processing, whenever it encounters an output or group action, while it should continue. (Note that that is the correct behavior for processing the action set at the end of the pipeline, but not for the apply actions.)
The flow entry counters contain the operations in the key.Currently the counters key is not updated when a flow is modified. This leads to a crash when a packet is processed.
Even if the key is modified when a flow is modified there is a race between the update of the flow tables and the counters table can be updated.
Hi all,
I tried the Test-bed set up described in www.flowforwarding.org, I did the following steps:
1.Edited the /etc/network/interfaces file in VM2 and VM3 as
VM2
Auto lo
Iface lo inet loopback
Auto eth0
Iface eth0 inet static
Address 192.168.1.5 for VM3 address 192.168.1.6
Netmask 255.255.255.0
and restarted using sudo /etc/init.d/networking restart
[ I didn't edit any thing in the /etc/network/interfaces file of domain 0. It contains only these lines: auto lo
iface lo inet loopback ]
Edited the line vif=[‘ip=192.168.1.5’] in vm2.cfg and vif=[‘ip=192.168.1.6’] in vm3.cfg in the domain0
Started the VM2 and VM3. Brctl has showed tmpbridge with vif2.0 and vif 3.0.
root@roadrunner:/home/flow# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 6776 8 r----- 122.4
vm2 2 500 1 -b---- 173.8
vm3 3 500 1 -b---- 1.8
root@roadrunner:/home/flow# brctl show
bridge name bridge id STP enabled interfaces
tmpbridge 8000.feffffffffff no vif2.0 vif3.0
4.Removed vif3.0 and vif4.0 from tmpbridge using brctl delif tmpbridge vif3.0
5.A shell script named createport.sh was made run to create tap interfaces, bridges and to connect tap interfaces with vifs.
tunctl -t tap-linc-port1
ifconfig tap-linc-port1 0.0.0.0 promisc up
ifconfig vif2.0 0.0.0.0 promisc up
brctl addbr br-linc1
brctl addif br-linc1 tap-linc-port1
brctl addif br-linc1 vif2.0
ifconfig br-linc1 192.168.1.2 promisc up
tunctl -t tap-linc-port2
ifconfig tap-linc-port2 0.0.0.0 promisc up
ifconfig vif3.0 0.0.0.0 promisc up
brctl addbr br-linc2
brctl addif br-linc2 tap-linc-port2
brctl addif br-linc2 vif3.0
ifconfig br-linc2 192.168.1.3 promisc up
Now the brctl show output is:
bridge name bridge id STP enabled interfaces
br-linc1 8000.feffffffffff no tap-linc-port1 vif2.0
br-linc2 8000.feffffffffff no tap-linc-port2 vif3.0
tmpbridge 8000.000000000000 no
The ifconfig -a output contains eth0, lo, br-linc1, br-linc2, tmpbridge, tap-link-port1, tap-linc-port2,vif2.0, vif 3.0 and wlan info.
6.ryu-manager simple_switch_v1_2.py was run in a terminal on dom0.
root@roadrunner:/home/flow/ryu/ryu/app# ryu-manager simple_switch_v1_2.py
loading app ryu.controller.ofp_handler
l oading app simple_switch_v1_2.py
instantiating app simple_switch_v1_2.py
instantiating app ryu.controller.ofp_handler
7.LINC_Switch was started
root@roadrunner:/home/flow/LINC-Switch# rel/linc/bin/linc console
Exec: /home/flow/LINC-Switch/rel/linc/erts-5.9.3.1/bin/erlexec -boot /home/flow/LINC-Switch/rel/linc/releases/1.0/linc -mode embedded -config /home/flow/LINC-Switch/rel/linc/releases/1.0/sys.config -args_file /home/flow/LINC-Switch/rel/linc/releases/1.0/vm.args -- console
Root: /home/flow/LINC-Switch/rel/linc
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]
14:36:54.640 [info] Application lager started on node linc@roadrunner
14:36:54.641 [info] Application linc started on node linc@roadrunner
Eshell V5.9.3.1 (abort with ^G)
(linc@roadrunner)1> 14:36:54.663 [info] Created port: {1,[{interface,"tap-linc-port1"}]}
14:36:54.684 [info] Created port: {2,[{interface,"tap-linc-port2"}]}
14:36:54.691 [info] Connected to controller localhost:6633/0 using OFP v4
8.When ping from VM2 to VM3, it is saying destination unreachable.
root@vm3:~# ping 192.168.1.5
PING 192.168.1.5 (192.168.1.5) 56(84) bytes of data.
From 192.168.1.6 icmp_seq=1 Destination Host Unreachable
From 192.168.1.6 icmp_seq=2 Destination Host Unreachable
From 192.168.1.6 icmp_seq=3 Destination Host Unreachable
I tried to disable ipv6 by editing the sysctl.conf file and started again.
root@roadrunner:/etc# sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
iptables -L output is:
root@roadrunner:/etc# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere PHYSDEV match --physdev-out vif3.0 --physdev-is-bridged
ACCEPT udp -- anywhere anywhere PHYSDEV match --physdev-in vif3.0 --physdev-is-bridged udp spt:bootpc dpt:bootps
ACCEPT all -- anywhere anywhere PHYSDEV match --physdev-out vif3.0 --physdev-is-bridged
ACCEPT all -- 192.168.1.6 anywhere PHYSDEV match --physdev-in vif3.0 --physdev-is-bridged
ACCEPT all -- anywhere anywhere PHYSDEV match --physdev-out vif2.0 --physdev-is-bridged
ACCEPT udp -- anywhere anywhere PHYSDEV match --physdev-in vif2.0 --physdev-is-bridged udp spt:bootpc dpt:bootps
ACCEPT all -- anywhere anywhere PHYSDEV match --physdev-out vif2.0 --physdev-is-bridged
ACCEPT all -- 192.168.1.5 anywhere PHYSDEV match --physdev-in vif2.0 --physdev-is-bridged
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
root@roadrunner:/etc#
ACCEPT all -- 192.168.1.5 anywhere PHYSDEV match --physdev-in vif2.0 --physdev-is-bridged
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
root@roadrunner:/etc#
Please, correct me where I am wrong.
Thanks
Gandhi
With numerous collaborators, we need to have a coding guidelines document. Most of it could be from Erlang standard coding guidelines and we can probably add a section for FlowForwarding specific. The following topics must be covered:
Use Netconf console utility to get configuration.
# netconf-console --host=10.48.11.200 --port=1830 --user=linc --password=linc --get-config
This works. I get a the OF Capable Switch configuration.
Now, I want to edit the Controller IP address.
# netconf-console --host=10.48.11.200 --port=1830 --user=linc --password=linc --edit-config=carl.xml
# more carl.xml
<capable-switch xmlns="urn:onf:of111:config:yang">
<id>CapableSwitch0</id>
<logical-switches>
<switch>
<id>LogicalSwitch0</id>
<datapath-id>7A:AC:DF:F0:3A:F2:00:00</datapath-id>
<controllers>
<controller>
<id>Switch0-DefaultController</id>
<ip-address>10.48.11.200</ip-address>
<port>6633</port>
<protocol>tcp</protocol>
</controller>
</controllers>
</switch>
</logical-switches>
</capable-switch>
#
LINC crashes: Console output
02:13:09.171 [error] gen_server linc_ofconfig terminated with reason: no function clause matching linc_ofconfig:'-get_controllers/1-fun-0-'(ok, []) line 1123
02:13:09.326 [error] CRASH REPORT Process linc_ofconfig with 0 neighbours exited with reason: no function clause matching linc_ofconfig:'-get_controllers/1-fun-0-'(ok, []) line 1123 in gen_server:terminate/6 line 747
02:13:09.357 [error] Supervisor linc_capable_sup had child linc_ofconfig started with linc_ofconfig:start_link() at <0.119.0> exit with reason no function clause matching linc_ofconfig:'-get_controllers/1-fun-0-'(ok, []) line 1123 in context child_terminated
02:13:09.368 [info] SSH connection with subsystem: enetconf_ssh terminated with state: {state,<0.2493.0>,0,5,enetconf_fm_chunked,{chunk_parser,<<>>},linc_ofconfig}
02:13:09.368 [error] gen_server <0.2495.0> terminated with reason: {{function_clause,[{linc_ofconfig,'-get_controllers/1-fun-0-',[ok,[]],[{file,"src/linc_ofconfig.erl"},{line,1123}]},{lists,foldl,3,[{file,"lists.erl"},{line,1197}]},{linc_ofconfig,get_config,1,[{file,"src/linc_ofconfig.erl"},{line,180}]},{linc_ofconfig,'-get_capable_switch_config/1-lc$^0/1-0-',1,[{file,"src/linc_ofconfig.erl"},{line,611}]},{linc_ofconfig,get_capable_switch_config,1,[{file,"src/linc_ofconfig.erl"},{line,611}]},{linc_ofconfig,handle_call,3,[{file,"src/linc_ofconfig.erl"},{line,...}]},...]},...}
02:13:09.379 [error] CRASH REPORT Process <0.2495.0> with 0 neighbours exited with reason: {{function_clause,[{linc_ofconfig,'-get_controllers/1-fun-0-',[ok,[]],[{file,"src/linc_ofconfig.erl"},{line,1123}]},{lists,foldl,3,[{file,"lists.erl"},{line,1197}]},{linc_ofconfig,get_config,1,[{file,"src/linc_ofconfig.erl"},{line,180}]},{linc_ofconfig,'-get_capable_switch_config/1-lc$^0/1-0-',1,[{file,"src/linc_ofconfig.erl"},{line,611}]},{linc_ofconfig,get_capable_switch_config,1,[{file,"src/linc_ofconfig.erl"},{line,611}]},{linc_ofconfig,handle_call,3,[{file,"src/linc_ofconfig.erl"},{line,...}]},...]},...} in gen_server:terminate/6 line 747
02:13:09.390 [error] Supervisor ssh_channel_sup had child #Ref<0.0.0.1223> started with {ssh_channel,start_link,undefined} at <0.2495.0> exit with reason {{function_clause,[{linc_ofconfig,'-get_controllers/1-fun-0-',[ok,[]],[{file,"src/linc_ofconfig.erl"},{line,1123}]},{lists,foldl,3,[{file,"lists.erl"},{line,1197}]},{linc_ofconfig,get_config,1,[{file,"src/linc_ofconfig.erl"},{line,180}]},{linc_ofconfig,'-get_capable_switch_config/1-lc$^0/1-0-',1,[{file,"src/linc_ofconfig.erl"},{line,611}]},{linc_ofconfig,get_capable_switch_config,1,[{file,"src/linc_ofconfig.erl"},{line,611}]},{linc_ofconfig,handle_call,3,[{file,"src/linc_ofconfig.erl"},{line,...}]},...]},...} in context child_terminated
02:13:09.401 [debug] Supervisor linc_capable_sup started linc_ofconfig:start_link() at pid <0.2496.0>
Project dependencies downloaded by rebar are fetched, but not merged. This means that if of_config was updated and one goes to deps/of_config, it's still in the old revision, thus false impression that one runs the latest switch version may be created, leading to confusion.
Need help please for this bug on https://github.com/FlowForwarding/LINC-Switch/blob/master/docs/example-ping.md
Firstly. this is my Linc config from "git diff" (only the switch is modified) :
https://gist.github.com/mikefaille/5472249
This is my flow activation command (using table 1) :
https://gist.github.com/mikefaille/5472251
(not showing all step there.. ) After creating my flow we can see from my switch (ping pass using prebuild one : pcap.data/ping.pcap ) :
IP (tos 0x0, ttl 64, id 39324, offset 0, flags [none], proto ICMP (1), length 84) 10.152.0.118 > sg1.any.onet.pl: ICMP echo request, id 12814, seq 0, length 6
Flow list from table one on my swich :
(linc@linux-ke2m)17> ets:tab2list(linc:lookup(0, flow_table_1)). [{flow_entry,{1,#Ref<0.0.0.399>}, 1, {ofp_match,[{ofp_field,openflow_basic,in_port,false, <<0,0,0,1>>, undefined}]}, <<0,0,0,0,0,0,0,0>>, [], {1367,47307,639324}, {infinity,0,0}, {infinity,0,0}, [{ofp_instruction_write_actions,4, [{ofp_action_output,16,2,64}]}]}]
This my flow deletion command (using table 1) :
https://gist.github.com/mikefaille/5472253
I try to disable the flow (from controler) :
of_controller_v4:send(CtrlPid, Conn, RemoveFlows).
but, when I try to list config from the switch, I see the see output that show flow activation..
Thank you
During some interoperability testing between a client implementation and the LINC NETCONF server, we found a way to crash the server with an edit-config operation with an empty subtree filter.
We managed to provoke a crash by doing a get-config using an empty filter statement. The first RPC content that triggered it is this:
<get-config>
<source>
<running/>
</source>
<filter/>
</get-config>
</rpc>
We then removed the filter element:
<get-config>
<source>
<running/>
</source>
</get-config>
</rpc>
...and it didn't crash.
We then added a non-empty filter:
<get-config>
<source>
<running/>
</source>
<filter type="subtree">
<top xmlns="urn:onf:of111:config:yang"/>
</filter>
</get-config>
...and it didn't crash.
We then added another version of empty filter:
<get-config>
<source>
<running/>
</source>
<filter type="subtree">
<filter></filter>
</get-config>
...and it crashed.
So, in summary. It is likely that an empty filter element is the reason for the behaviour.
When LINC is connected to hardware interrface such as eth0, one can observe duplicated packets delivered by epcap application.
It looks like epcap delivers again packets that it itself injects to the network stack.
There is a -I option in epcap that should in theory solve this issue, but apparenty it doesn't work.
All went well until "make rel", make fails and I get this error:
ERROR: Unable to generate spec: read file info /usr/lib/erlang/man/man1/parldyn.1p failed
Any suggestions please?
Thanks,
Deniz
When starting LINC on a eth-only setup (without taps and bridges), epcap does not start if interface doesn't have ipv4 address assigned (even a fake one). If you copy the command line and run it manually with -v (verbose) option, it prints something like "ethX: ipv4 address not assigned" and quits.
We ( Luxoft Twister team ) tried a few OpenFlow 1.3.1 conformance tests against LINC and noticed some issues.
Here is one test scenario:
Results:
Debug info:
Flow_mod that output to port:
Openflow Protocol
Header
Version: 0x04
Type: Flow mod (CSM) - OFPT_FLOW_MOD (14)
Length: 88
Transaction ID: 2169900000
Flow Mod
Cookie: 0x0000000000000000
Cookie Mask: 0x0000000000000000
Table ID: 0
Command: New flow - OFPFC_ADD (0x00)
Idle Timeout: 0
Hard Timeout: 0
Priority: 4000
Buffer ID: 0xffffffff
Output Port: 4294967295
Output Group: 4294967295
Flags: 0x0000
0000 0000 0000 0... = Reserved: Not set
.... .... .... ...0 = Send flow removed message when flow expires or is deleted: Not set
.... .... .... ..0. = Check for overlapping entries first: Not set
.... .... .... .0.. = Reset flow packet and byte counts: Not set
Padding
Match
Type: OpenFlow Extensible Match - OFPMT_OXM (0x0001)
Length: 10
OXM field
Class: Basic class for OpenFlow - OFPXMC_OPENFLOW_BASIC (0x8000)
0000 101. = Field: Ethernet frame type - OFPXMT_OFB_ETH_TYPE (0x05)
0 = Has mask: No
Length: 2
Value: 0800
Padding
Instruction
Type: Applies the action(s) immediately - OFPIT_APPLY_ACTIONS (0x0004)
Length: 24
Padding
Action
Type: Output to switch port - OFPAT_OUTPUT (0x0000)
Length: 16
Port: 4294967293
Max Length: 65535
Padding
Flow_mod with delete command:
Openflow Protocol
Header
Version: 0x04
Type: Flow mod (CSM) - OFPT_FLOW_MOD (14)
Length: 56
Transaction ID: 970498230
Flow Mod
Cookie: 0x0000000000000000
Cookie Mask: 0x0000000000000000
Table ID: 255
Command: Delete all matching flows - OFPFC_DELETE (0x03)
Idle Timeout: 0
Hard Timeout: 0
Priority: 32768
Buffer ID: 0xffffffff
Output Port: 4294967295
Output Group: 4294967295
Flags: 0x0000
0000 0000 0000 0... = Reserved: Not set
.... .... .... ...0 = Send flow removed message when flow expires or is deleted: Not set
.... .... .... ..0. = Check for overlapping entries first: Not set
.... .... .... .0.. = Reset flow packet and byte counts: Not set
Padding
Match
Type: OpenFlow Extensible Match - OFPMT_OXM (0x0001)
Length: 8
Padding
Multipart flow_stats requested to switch:
Openflow Protocol
Header
Version: 0x04
Type: Multipart request (CSM) - OFPT_MULTIPART_REQUEST (18)
Length: 56
Transaction ID: 342499105
Multipart request
Type: Individual flow statistics - OFPMP_FLOW (1)
Flags: 0x0000
.... .... .... ...0 = More requests to follow: Not set
Padding
Body: ff000000ffffffffffffffff000000000000000000000000...
Tested with Luxoft's Twister framework, OpenFlow 1.3.1 module:
Test scenario:
Test results:
Switch did not reply.
Debug info:
Multipart request:
Openflow Protocol
Header
Version: 0x04
Type: Multipart request (CSM) - OFPT_MULTIPART_REQUEST (18)
Length: 16
Transaction ID: 2112248390
Multipart request
Type: Unknown (90)
Flags: 0x0000
.... .... .... ...0 = More requests to follow: Not set
Padding
Add Makefile targets - srcrpm and srczip so that one can create a Source package with all dependencies so that one can build LINC offline.
Also, the default build target must be building offline and only when forced, they should get/update all dependencies and source.
I am trying to setup the basic ping test. I have two tap interfaces on one Ubuntu Server 12.04 VM and both tap interfaces are added to the sys.config file. Here is the sys.config that I am using
[
{of_switch,
[
{controllers,
[
{"localhost", 6633}
]},
{ports,
[
{1, [
{rate, {100, mbps}},
{queues, []}
]},
{2, [
{rate, {100, mbps}},
{queues, []}
]}
]},
{backends,
[
{userspace, [
{ports,
[
{1, [{interface, "tap0"}]},
{2, [{interface, "tap1"}]}
]}
]}
]}
]},
{lager,
[
{handlers,
[
{lager_console_backend, info},
{lager_file_backend,
[
{"log/error.log", error, 10485760, "$D0", 5},
{"log/console.log", info, 10485760, "$D0", 5}
]}
]}
]},
{sasl,
[
{sasl_error_logger, {file, "log/sasl-error.log"}},
{errlog_type, error},
{error_logger_mf_dir, "log/sasl"}, % Log directory
{error_logger_mf_maxbytes, 10485760}, % 10 MB max file size
{error_logger_mf_maxfiles, 5} % 5 files max
]}
].
When running "make test" from command line port test in of_switch(eunit)
reports failure.
Here is the output from "make test"
@ubu-vm3:~/linc-testing/LINC-Switch$ make test
git config --global http.sslVerify false
./rebar get-deps compile
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/lager'
==> lager (get-deps)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/lager'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/of_protocol'
==> of_protocol (get-deps)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/of_protocol'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/meck'
==> meck (get-deps)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/meck'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/pkt'
==> pkt (get-deps)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/pkt'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/procket'
==> procket (get-deps)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/procket'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/epcap'
==> epcap (get-deps)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/epcap'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/tunctl'
==> tunctl (get-deps)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/tunctl'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/apps/of_switch'
==> of_switch (get-deps)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/apps/of_switch'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/rel'
==> rel (get-deps)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/rel'
==> LINC-Switch (get-deps)
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/lager'
==> lager (compile)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/lager'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/of_protocol'
==> of_protocol (compile)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/of_protocol'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/meck'
==> meck (compile)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/meck'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/pkt'
==> pkt (compile)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/pkt'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/procket'
==> procket (compile)
make[1]: Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/procket/c_src'
gcc -m64 -g -Wall -o ../priv/procket -L. procket_cmd.c -lancillary
make[1]: Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/procket/c_src'
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/procket'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/epcap'
==> epcap (compile)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/epcap'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/tunctl'
==> tunctl (compile)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/tunctl'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/apps/of_switch'
==> of_switch (compile)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/apps/of_switch'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/rel'
==> rel (compile)
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/rel'
==> LINC-Switch (compile)
./rebar skip_deps=true eunit
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/lager'
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/lager'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/of_protocol'
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/of_protocol'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/meck'
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/meck'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/pkt'
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/pkt'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/procket'
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/procket'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/epcap'
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/epcap'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/deps/tunctl'
==> Leaving directory `/home/mcladmin/linc-testing/LINC-Switch/deps/tunctl'
==> Entering directory `/home/mcladmin/linc-testing/LINC-Switch/apps/of_switch'
==> of_switch (eunit)
10:45:39.490 [error] CRASH REPORT Process <0.513.0> with 0 neighbours exited with reason: no function clause matching ofs_userspace_port:init([{interface,"zxc5"},{ip,"10.0.0.0.1"},{ofs_port_no,1},{rate,{10,kbps}},{queues,[{0,[]}]}]) line 210 in gen_server:init_it/6 line 328
switch_tests: port_test...*failed*
::{case_clause,
{error,
{function_clause,
[{ofs_userspace_port,init,
[[{interface,"zxc5"},
{ip,"10.0.0.0.1"},
{ofs_port_no,1},
{rate,{10,kbps}},
{queues,[{...}]}]],
[{file,"src/ofs_userspace_port.erl"},{line,210}]},
{gen_server,init_it,6,[{file,"gen_server.erl"},{line,304}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,227}]}]}}}
=======================================================
Failed: 1. Skipped: 0. Passed: 20.
10:45:39.549 [error] gen_server ofs_userspace_port_procket_meck terminated with reason: no match of right hand value {error,{cant_open_file,"ofs_userspace_port_procket_meck_original.coverdata",enoent}} in meck:import_original_cover/2 line 726
10:45:39.593 [error] CRASH REPORT Process ofs_userspace_port_procket_meck with 0 neighbours exited with reason: no match of right hand value {error,{cant_open_file,"ofs_userspace_port_procket_meck_original.coverdata",enoent}} in meck:import_original_cover/2 line 726 in gen_server:terminate/6 line 725
Cover analysis: /home/mcladmin/linc-testing/LINC-Switch/apps/of_switch/.eunit/index.html
Code Coverage:
gen_switch : not
of_controller : 69%
ofs_app : 100
ofs_logic : 37%
ofs_receiver : 50%
ofs_receiver_sup : 100
ofs_sup : 100
ofs_tests : 89%
ofs_userspace : 69%
ofs_userspace_convert : 0%
ofs_userspace_flow : 16%
ofs_userspace_port : 5%
ofs_userspace_port_procket : 0%
ofs_userspace_port_sup : 100
ofs_userspace_queue : 0%
ofs_userspace_queue_sup : 75%
ofs_userspace_routing : 67%
ofs_userspace_stats : 21%
sliding_window : 0%
switch_tests : 81%
Total : 51%
=INFO REPORT==== 12-Aug-2012::10:45:41 ===
application: lager
exited: stopped
type: permanent
=INFO REPORT==== 12-Aug-2012::10:45:41 ===
application: syntax_tools
exited: stopped
type: permanent
=INFO REPORT==== 12-Aug-2012::10:45:41 ===
application: compiler
exited: stopped
type: permanent
ERROR: One or more eunit tests failed.
make: *** [test] Error 1
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.