Coder Social home page Coder Social logo

packet-bricks's Introduction

README

Packet Bricks is a Linux/FreeBSD daemon that is capable of receiving and distributing ingress traffic to userland applications. Its main responsibilities may include (i) load-balancing, (ii) duplicating and/or (iii) filtering ingress traffic across all registered applications. The distribution is flow-aware (i.e. packets of one connection will always end up in the same application). At the moment, packet-bricks uses netmap packet I/O framework for receiving packets. It employs netmap pipes to forward packets to end host applications.

Before running packet-bricks, please make sure that you have installed the netmap driver successfully. You should first try running the sample pkt-gen binary (that is available in the netmap's examples/) directory to see if the driver is operational. The netmap module is continuously being updated with enhancements and bug fixes (as is common for all open source tools including packet bricks). Before using packet bricks, please make sure that you have downloaded and updated the netmap kernel module with its latest version. The netmap authors suggest building the netmap module into the kernel for performance reasons. You can download the latest netmap driver from the following link: https://github.com/luigirizzo/netmap.

The following guide provides a walkthrough of the /usr/local/etc/bricks-scripts/startup-*.lua files and also explains what this system is capable of.

                    					    	     _________
                    						        |	      |
                    						        |  APP 1  |
                    						        |_________|
                    				   	  eth3}0     /
          	   	    	      	      ______________/
          	   	    	      	     |
          	   	    	      	     |		         _________
          	   	    	      	     |    eth3}1    |	      |
          	   	    	      	     |  ____________|  APP 2  |
          	   	    	      	     | |            |_________|
   1/10 Gbps link     	     	     | |	
   |||||||||||||| ------->eth3{PACKET-BRICKS}	     _________
                				     | |  eth3}2    |	      |
                				     | |____________|  APP 3  |
                    				 |  		    |_________|
                				     |
                				     |    eth3}3
                	 			     |_____________  
                    				     		   \
                        						    \_________
                        	      			        |	      |
                    	                            |  APP 4  |
                                				    |_________|

Figure 1: A sample packet-bricks instance redirecting ingress traffic from eth3 to 4 userland applications using a LoadBalancer brick

User can start the program by running the following command:

# bricks [-f startup_script_file]

To start the program as a daemon, either type:

# bricks -d [-f startup_script_file]

OR

# bricks-server [-f startup_script_file]

If the system is executed as a non-daemon, it opens a LUA-based shell. Type the following command to print the help menu:

	bricks> BRICKS.help()
	BRICKS Commands:
    	    help()
    	    print_status()
    	    show_stats()
            shutdown()
          Available subsystems within BRICKS have their own help() methods:
          pkteng

Alternatively, the user can run bricks-shell to access the interface shell to communicate with daemonized bricks-server.

You can hit Ctrl+D to exit the bricks-shell client. To gracefully turn the daemon off, the user may enter the following command to exit the program:

	bricks> BRICKS.shutdown()
	Goodbye!

Packet bricks relies on netmap pipes to distribute traffic across multiple applications. Some OSes have netmap pipes disabled by default. Please use the following command to enable netmap pipes (if needed) in a packet bricks session:

	bricks> utilObj:enable_nmpipes()

In packet-bricks, the most important component is the pkteng module. It manages the reception and distribution of ingress traffic coming through an interface. Once instantiated, the pkteng module spawns a thread that starts the packet reception process. After running packet-bricks again, use the following command to create a pkteng instance, pe:

	bricks> pe = PktEngine.new("e0")

The "e0" field is internally used by packet-bricks as pkteng's ID. You can delete the pkteng instance by running the following command:

	bricks> pe:delete()

The pkteng instance can be instantiated with the possibility of affinitizing the engine thread to an arbitrary cpu core id:

	bricks> pe = PktEngine.new("e0", 1024, 1)

The last parameter affinitizes the module to CPU 1 once the engine thread starts reading packets. In packet-bricks, ingress traffic can be manipulated with packet engine constructs called "bricks". Currently packet-bricks has the following built-in bricks that are available for use:

  1. LoadBalancer: Brick that may be used to split flow-wise traffic to different applications using netmap pipes.

  2. Duplicator: Brick that may be used to duplicate traffic across each registered netmap pipe.

  3. Merge: Brick that may be used to combine traffic between 2 or more netmap pipes.

  4. PcapReader: Brick that may be used to read ingress traffic from a pcap dump file.

  5. PcapWriter: Brick that may be used to redirect ingress traffic to a pcap dump file.

  6. Filter: Brick that can be used for traffic shaping. It accepts remote requests over the network using Bro's broker library. The message bundle is created using the NetControl protocol. This can only be used when Packet bricks is compiled with broker plugin.

A packet engine can be linked to any of these bricks with any combination/configuration of user's liking. Please see the scripts/ example directory to see how bricks can be used to run variants of such packet engines.

The succeeding text uses a simple load balancing brick ("LoadBalancer") to show how packet-bricks runs. A freshly instantiated packet engine can be used to link the LoadBalancer as:

	bricks> lb = Brick.new("LoadBalancer", 2)
	bricks> lb:connect_input("eth3")
	bricks> lb:connect_output("eth3{0", "eth3{1", 
				  "eth3{2", "eth3{3", "eth2")
	bricks> pe:link(lb)

This binds pkteng pe with LoadBalancer brick and asks the system to read ingress packets from eth3 and split them flow-wise based on the 2-tuple (src & dst IP addresses) metadata of the packet header. The "lb:connect_output(...)" command creates four netmap-specific pipes named "netmap:eth3{x" where 0 <= x < 4 and an egress interface named "eth2". The traffic is evenly split between all five channels based on the 2 tuple header as previously mentioned. Userland applications can now use packet-bricks to get their fair share of ingress traffic. The brick is finally linked with the packet engine.

One can always unlink the brick by running the following command:

	bricks> pe:unlink()

If the user is content with the packet engine setup, he/she can bypass unlinking and start the engine:

	bricks> pe:start()

The engine will start sniffing for packets from the interface promiscuously. You can use the following command to get the run-time packets-related statistics from the engine:

	bricks> pe.show_stats()

Sample applications (e.g. netmap's pkt-gen) can read ingress traffic from packet-bricks using following command line arguments:

	$ sudo ./pkt-gen -i netmap:eth3}0 -f rx &
	$ sudo ./pkt-gen -i netmap:eth3}1 -f rx &
	$ sudo ./pkt-gen -i netmap:eth3}2 -f rx &
	$ sudo ./pkt-gen -i netmap:eth3}3 -f rx &

Please note that you cannot unlink a brick from the pkteng while the engine is running. To stop the engine, please run the following command:

	bricks> pe:stop()

For user's convenience, the packet-bricks package comes with a reference LUA script file: please see scripts/startup-*.lua files for details. You can also use the following command to load the script file in packet-bricks at startup:

# bricks -f /usr/local/etc/bricks-scripts/startup-one-thread.lua

OR

# bricks-server -f /usr/local/etc/bricks-scripts/startup-one-thread.lua

The user is recommended to skim through the script file. It is heavily documented. The scripts directory also contains code for running a 4-threaded version of the pkteng (see /usr/local/etc/bricks-scripts/startup-multi-threads.lua).

New

We have created 2 new tools that can quickly set up (i) load-balancer, and (ii) duplicator.

i) The user can use bricks-load-balance to split traffic for a given interface. Example usage:

$ bricks-load-balance eth3 4

The example above will split traffic on netmap-enabled interface, eth3, to 4 netmap pipe channels named eth3}0, eth3}1, eth3}2 and eth3}3.

ii) The user can use bricks-duplicate to duplicate ingress traffic for the given interface. Example usage:

$ bricks-duplicate eth3 4

The example above will duplicate traffic on netmap-enabled interface, eth3, to 4 netmap pipe channels named eth3}0, eth3}1, eth3}2 and eth3}3.

Connecting with broker

Packet bricks can be configured to accept remote requests via the broker communication module. Users can perform simple traffic shaping tasks by issuing requests to specific Filter bricks. Packet bricks uses NetControl protocol for this purpose. A user can refer to each Filter via the output netmap pipe name of the brick.

Troubleshooting

Packet bricks is still in development stages. While we welcome feedback, we suggest that you refer to the following pointers before contacting the authors for bug reports.

  1. Please install the required libraries mentioned in INSTALL file. As the system is still under active development, the program may exhibit unexpected behavior if libraries are not installed.

  2. The README file in the netmap/ directory contains pointers on how to enhance packet I/O performance. We suggest you to follow their guide for extracting maximum performance out of packet bricks as well.

  3. Some users have reported erroneous behavior when executing tcpdump with netmap-libpcap patch. tcpdump has compatibility constraints with libpcap. Please refer to http://www.tcpdump.org/#old-releases to verify which tcpdump version should be linked with the latest netmap-libpcap release. At the time of writing, the latest netmap-libpcap version is 1.6.0. The compatible tcpdump version for this release is 4.6.0.

  4. Please report further bugs to: [email protected]

packet-bricks's People

Contributors

ajamshed avatar asifjamshed avatar emctoo avatar rsmmr avatar shirkdog avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

packet-bricks's Issues

cause system crash

Running on ix0 interface:

sudo bricks-duplicate ix0 4

Another terminal runs:

sudo ./pkt-gen -i netmap:ix0}3 -f rx

Well it works. But ctrl+c to kill pkt-gen process, system crashes.

Systme info,

uname -a
FreeBSD xd 10.2-RELEASE-p2 FreeBSD 10.2-RELEASE-p2 #0: Thu Sep 10 20:00:45 CST 2015     root@ix:/usr/obj/usr/src/sys/NETMAP  amd64

Crash info in /var/log/message:

Dec 17 16:36:35 xd kernel: ix0: permanently promiscuous mode enabled
Dec 17 16:36:48 xd kernel: 408.141691 [1233] netmap_mem_global_config  reconfiguring
Dec 17 16:38:10 xd kernel: 490.349551 [ 325] netmap_pipe_krings_create 0xfffff8000f90b400: case 1, create everything
Dec 17 16:38:10 xd kernel: 490.351018 [ 325] netmap_pipe_krings_create 0xfffff8000f850400: case 1, create everything
Dec 17 16:38:10 xd kernel: 490.352474 [ 325] netmap_pipe_krings_create 0xfffff8000f90bc00: case 1, create everything
Dec 17 16:38:10 xd kernel: 490.353934 [ 325] netmap_pipe_krings_create 0xfffff8000f90c400: case 1, create everything
Dec 17 16:43:19 xd syslogd: kernel boot file is /boot/kernel/kernel
Dec 17 16:43:19 xd kernel: 
Dec 17 16:43:19 xd kernel: 
Dec 17 16:43:19 xd kernel: Fatal trap 12: page fault while in kernel mode
Dec 17 16:43:19 xd kernel: cpuid = 7; apic id = 02
Dec 17 16:43:19 xd kernel: fault virtual address        = 0x0
Dec 17 16:43:19 xd kernel: fault code           = supervisor read instruction, page not present
Dec 17 16:43:19 xd kernel: instruction pointer  = 0x20:0x0
Dec 17 16:43:19 xd kernel: stack pointer                = 0x28:0xfffffe10483d0700
Dec 17 16:43:19 xd kernel: frame pointer                = 0x28:0xfffffe10483d0770
Dec 17 16:43:19 xd kernel: code segment         = base 0x0, limit 0xfffff, type 0x1b
Dec 17 16:43:19 xd kernel: = DPL 0, pres 1, long 1, def32 0, gran 1
Dec 17 16:43:19 xd kernel: processor eflags     = interrupt enabled, resume, IOPL = 0
Dec 17 16:43:19 xd kernel: current process              = 3267 (pkt-gen)
Dec 17 16:43:19 xd kernel: trap number          = 12
Dec 17 16:43:19 xd kernel: panic: page fault
Dec 17 16:43:19 xd kernel: cpuid = 0
Dec 17 16:43:19 xd kernel: KDB: stack backtrace:
Dec 17 16:43:19 xd kernel: #0 0xffffffff8099c650 at kdb_backtrace+0x60
Dec 17 16:43:19 xd kernel: #1 0xffffffff80960206 at vpanic+0x126
Dec 17 16:43:19 xd kernel: #2 0xffffffff809600d3 at panic+0x43
Dec 17 16:43:19 xd kernel: #3 0xffffffff80d622fb at trap_fatal+0x36b
Dec 17 16:43:19 xd kernel: #4 0xffffffff80d625fd at trap_pfault+0x2ed
Dec 17 16:43:19 xd kernel: #5 0xffffffff80d61c9a at trap+0x47a
Dec 17 16:43:19 xd kernel: #6 0xffffffff80d48012 at calltrap+0x8
Dec 17 16:43:19 xd kernel: #7 0xffffffff80680d15 at netmap_do_unregif+0xa5
Dec 17 16:43:19 xd kernel: #8 0xffffffff80680bce at netmap_dtor_locked+0x3e
Dec 17 16:43:19 xd kernel: #9 0xffffffff80680e2a at netmap_dtor+0x4a
Dec 17 16:43:19 xd kernel: #10 0xffffffff806859b3 at netmap_dev_pager_dtor+0x73
Dec 17 16:43:19 xd kernel: #11 0xffffffff80bce0f7 at dev_pager_dealloc+0x57
Dec 17 16:43:19 xd kernel: #12 0xffffffff80beb156 at vm_object_terminate+0x246
Dec 17 16:43:19 xd kernel: #13 0xffffffff80bea11e at vm_object_deallocate+0x1e
Dec 17 16:43:19 xd kernel: #14 0xffffffff80be084d at vm_map_process_deferred+0x5d
Dec 17 16:43:19 xd kernel: #15 0xffffffff80be8928 at sys_munmap+0x1a8
Dec 17 16:43:19 xd kernel: #16 0xffffffff80d62c17 at amd64_syscall+0x357
Dec 17 16:43:19 xd kernel: #17 0xffffffff80d482fb at Xfast_syscall+0xfb

SnabbSwitch

Hi Asim,
Can you please point the differences between your project and snabbswitch?
They look very similar to me, though I'm no expert!

Packet Drop cause

pe:show_stats(e0) BRICKS.show_stats()

ENGINE (e0) STATS
Byte count: 29775660119
Packet count: 25708862
Packet drop count: 25704741

ENGINE STATISTICS
Engine Packet Cnt Byte Cnt Packet Drop
e0 25708884 29775707108 25704741

Total 25708898 29775723678

Do you perhaps know what could be the cause of the Packet Drop that I am seeing on the packet engine statistics ?

Problem with multiple bnx2

Hello,
I've the following net-cards on my server:

02:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5716 Gigabit Ethernet (rev 20) 02:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5716 Gigabit Ethernet (rev 20) 04:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) 04:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)

They are called respectively enp4s0f0, enp4s0f1, eno1, eno2

If I start bricks load-balance on eno2 it works well and I read all packets using netmap pkt-gen on eno2}0 etc...

Instead when I start it on the other two interfaces (enp4s0f0/1) I have the following result checking it with netmap pkt-gen:

root@server:~# pkt-gen -i netmap:enp4s0f0}0 -f rx
309.504082 main [2234] interface is netmap:enp4s0f0}0
309.504127 main [2354] running on 1 cpus (have 4)
309.504293 extract_ip_range [364] range is 10.0.0.1:0 to 10.0.0.1:0
309.504301 extract_ip_range [364] range is 10.1.0.1:0 to 10.1.0.1:0
309.504373 main [2455] mapped 334980KB at 0x7f869c15c000
Receiving from netmap:enp4s0f0}0: 1 queues, 1 threads and 1 cpus.
309.504396 main [2554] Wait 2 secs for phy reset
311.504508 main [2556] Ready...
311.504587 receiver_body [1376] reading from netmap:enp4s0f0}0 fd 3 main_fd 3
312.504593 main_thread [2019] 0.000 pps (0.000 pkts 0.000 bps in 1000028 usec) 0.00 avg_batch 0 min_space
312.505644 receiver_body [1383] waiting for initial packets, poll returns 0 0
313.505668 main_thread [2019] 0.000 pps (0.000 pkts 0.000 bps in 1001075 usec) 0.00 avg_batch 99999 min_space
313.506697 receiver_body [1383] waiting for initial packets, poll returns 0 0
314.506743 main_thread [2019] 0.000 pps (0.000 pkts 0.000 bps in 1001075 usec) 0.00 avg_batch 99999 min_space
314.507749 receiver_body [1383] waiting for initial packets, poll returns 0 0
^C314.690944 sigint_h [401] received control-C on thread 0x7f86b1281700
314.690960 main_thread [2019] 0.000 pps (0.000 pkts 0.000 bps in 184217 usec) 0.00 avg_batch 99999 min_space
315.508825 receiver_body [1383] waiting for initial packets, poll returns 0 0
315.692035 main_thread [2019] 0.000 pps (0.000 pkts 0.000 bps in 1001075 usec) 0.00 avg_batch 0 min_space
Received nothing.

No packet received.
If I run pkt-gen on netmap:enp4s0f0 without bricks it receive packets well.

It's pretty strange.
The interfaces have the same driver and same firmware (are pretty the same).
Have you some advice or same idea can help me with this issue?

Thanks for support
Simone

veth lb support?

Does packet bricks support outputting to multi veth for loadbalancing? Or just net pipes?

I am trying to split/balance a 40Gbps TAP to 4 NTA/DPI containers

Thank you

Segmentation Fault

I'm hitting a segfault when trying to run more than 20 pipe load balancer (trying to get to 30, one for each bro process I plan on running). Using an intel x520

./bricks -f /opt/app/packetbricks/etc/bricks-scripts/load-balance.lua
[ pmain(): line 466] Executing /opt/app/packetbricks/etc/bricks-scripts/load-balance.lua
[ lb_init(): line 66] Adding brick ix0{0 to the engine
[ promisc(): line 98] Interface ix0 is already set to promiscuous mode
181.856887 nm_open [444] overriding ARG3 0
181.856903 nm_open [457] overriding ifname ix0 ringid 0x0 flags 0x1
[netmap_link_iface(): line 183] Wait for 2 secs for phy reset
[brick_link(): line 113] Linking e0 with link ix0 with batch size: 512 and qid: -1
Segmentation fault

truss ./bricks -f /opt/app/packetbricks/etc/bricks-scripts/load-balance.lua
mmap(0x0,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366218240 (0x80062e000)
issetugid() = 0 (0x0)
lstat("/etc",{ mode=drwxr-xr-x ,inode=24,size=127,blksize=8192 }) = 0 (0x0)
lstat("/etc/libmap.conf",{ mode=-rw-r--r-- ,inode=710,size=109,blksize=4096 }) = 0 (0x0)
openat(AT_FDCWD,"/etc/libmap.conf",O_CLOEXEC,00) = 3 (0x3)
fstat(3,{ mode=-rw-r--r-- ,inode=710,size=109,blksize=4096 }) = 0 (0x0)
mmap(0x0,109,PROT_READ,MAP_PRIVATE,3,0x0) = 34366251008 (0x800636000)
close(3) = 0 (0x0)
lstat("/usr",{ mode=drwxr-xr-x ,inode=22,size=16,blksize=4096 }) = 0 (0x0)
lstat("/usr/local",{ mode=drwxr-xr-x ,inode=1027,size=15,blksize=4096 }) = 0 (0x0)
lstat("/usr/local/etc",{ mode=drwxr-xr-x ,inode=15236,size=43,blksize=4096 }) = 0 (0x0)
lstat("/usr/local/etc/libmap.d",0x7fffffffcac8) ERR#2 'No such file or directory'
munmap(0x800636000,109) = 0 (0x0)
openat(AT_FDCWD,"/var/run/ld-elf.so.hints",O_CLOEXEC,00) = 3 (0x3)
read(3,"Ehnt^A\0\0\0\M^@\0\0\0}\0\0\0\0"...,128) = 128 (0x80)
fstat(3,{ mode=-r--r--r-- ,inode=466951,size=253,blksize=4096 }) = 0 (0x0)
lseek(3,0x80,SEEK_SET) = 128 (0x80)
read(3,"/lib:/usr/lib:/usr/lib/compat:/u"...,125) = 125 (0x7d)
close(3) = 0 (0x0)
access("/lib/libreadline.so.7",F_OK) ERR#2 'No such file or directory'
access("/usr/lib/libreadline.so.7",F_OK) ERR#2 'No such file or directory'
access("/usr/lib/compat/libreadline.so.7",F_OK) ERR#2 'No such file or directory'
access("/usr/local/lib/libreadline.so.7",F_OK) = 0 (0x0)
openat(AT_FDCWD,"/usr/local/lib/libreadline.so.7",O_CLOEXEC|O_VERIFY,00) = 3 (0x3)
fstat(3,{ mode=-rw-r--r-- ,inode=17518,size=325664,blksize=131072 }) = 0 (0x0)
mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34366251008 (0x800636000)
mmap(0x0,2424832,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) = 34368323584 (0x800830000)
mmap(0x800830000,294912,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|MAP_PREFAULT_READ,3,0x0) = 34368323584 (0x800830000)
mmap(0x800a77000,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_PREFAULT_READ,3,0x47000) = 34370711552 (0x800a77000)
mmap(0x800a7f000,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) = 34370744320 (0x800a7f000)
munmap(0x800636000,4096) = 0 (0x0)
__sysctl(0x7fffffffdd28,0x2,0x80082f0bc,0x7fffffffdd20,0x0,0x0) = 0 (0x0)
__sysctl(0x7fffffffdd28,0x2,0x80082f1bc,0x7fffffffdd20,0x0,0x0) = 0 (0x0)
__sysctl(0x7fffffffdd28,0x2,0x80082f2bc,0x7fffffffdd20,0x0,0x0) = 0 (0x0)
__sysctl(0x7fffffffdd28,0x2,0x80082f3bc,0x7fffffffdd20,0x0,0x0) = 0 (0x0)
__sysctl(0x7fffffffdd28,0x2,0x80082f4bc,0x7fffffffdd20,0x0,0x0) = 0 (0x0)
close(3) = 0 (0x0)
access("/lib/liblua-5.1.so",F_OK) ERR#2 'No such file or directory'
access("/usr/lib/liblua-5.1.so",F_OK) ERR#2 'No such file or directory'
access("/usr/lib/compat/liblua-5.1.so",F_OK) ERR#2 'No such file or directory'
access("/usr/local/lib/liblua-5.1.so",F_OK) = 0 (0x0)
openat(AT_FDCWD,"/usr/local/lib/liblua-5.1.so",O_CLOEXEC|O_VERIFY,00) = 3 (0x3)
fstat(3,{ mode=-rw-r--r-- ,inode=86275,size=196136,blksize=131072 }) = 0 (0x0)
mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34366251008 (0x800636000)
mmap(0x0,2293760,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) = 34370748416 (0x800a80000)
mmap(0x800a80000,188416,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|MAP_PREFAULT_READ,3,0x0) = 34370748416 (0x800a80000)
mmap(0x800cae000,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_PREFAULT_READ,3,0x2e000) = 34373033984 (0x800cae000)
munmap(0x800636000,4096) = 0 (0x0)
close(3) = 0 (0x0)
access("/lib/libthr.so.3",F_OK) = 0 (0x0)
openat(AT_FDCWD,"/lib/libthr.so.3",O_CLOEXEC|O_VERIFY,00) = 3 (0x3)
fstat(3,{ mode=-r--r--r-- ,inode=14340,size=118352,blksize=118784 }) = 0 (0x0)
mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34366251008 (0x800636000)
mmap(0x0,2256896,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) = 34373042176 (0x800cb0000)
mmap(0x800cb0000,110592,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|MAP_PREFAULT_READ,3,0x0) = 34373042176 (0x800cb0000)
mmap(0x800eca000,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_PREFAULT_READ,3,0x1a000) = 34375245824 (0x800eca000)
mmap(0x800ecc000,45056,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) = 34375254016 (0x800ecc000)
munmap(0x800636000,4096) = 0 (0x0)
close(3) = 0 (0x0)
access("/lib/libpcap.so.1",F_OK) ERR#2 'No such file or directory'
access("/usr/lib/libpcap.so.1",F_OK) ERR#2 'No such file or directory'
access("/usr/lib/compat/libpcap.so.1",F_OK) ERR#2 'No such file or directory'
access("/usr/local/lib/libpcap.so.1",F_OK) = 0 (0x0)
openat(AT_FDCWD,"/usr/local/lib/libpcap.so.1",O_CLOEXEC|O_VERIFY,00) = 3 (0x3)
fstat(3,{ mode=-r-xr-xr-x ,inode=252084,size=311608,blksize=131072 }) = 0 (0x0)
mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34366251008 (0x800636000)
mmap(0x0,2408448,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) = 34375299072 (0x800ed7000)
mmap(0x800ed7000,303104,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|MAP_PREFAULT_READ,3,0x0) = 34375299072 (0x800ed7000)
mmap(0x801121000,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_PREFAULT_READ,3,0x4a000) = 34377699328 (0x801121000)
munmap(0x800636000,4096) = 0 (0x0)
close(3) = 0 (0x0)
access("/lib/libc.so.7",F_OK) = 0 (0x0)
openat(AT_FDCWD,"/lib/libc.so.7",O_CLOEXEC|O_VERIFY,00) = 3 (0x3)
fstat(3,{ mode=-r--r--r-- ,inode=14381,size=1744304,blksize=131072 }) = 0 (0x0)
mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34366251008 (0x800636000)
mmap(0x0,3883008,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) = 34377707520 (0x801123000)
mmap(0x801123000,1634304,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|MAP_PREFAULT_READ,3,0x0) = 34377707520 (0x801123000)
mmap(0x8014b1000,49152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_PREFAULT_READ,3,0x18e000) = 34381434880 (0x8014b1000)
mmap(0x8014bd000,106496,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) = 34381484032 (0x8014bd000)
munmap(0x800636000,4096) = 0 (0x0)
close(3) = 0 (0x0)
access("/usr/local/lib/libncursesw.so.8",F_OK) ERR#2 'No such file or directory'
access("/lib/libncursesw.so.8",F_OK) = 0 (0x0)
openat(AT_FDCWD,"/lib/libncursesw.so.8",O_CLOEXEC|O_VERIFY,00) = 3 (0x3)
fstat(3,{ mode=-r--r--r-- ,inode=14352,size=375096,blksize=131072 }) = 0 (0x0)
mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34366251008 (0x800636000)
mmap(0x0,2473984,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) = 34381590528 (0x8014d7000)
mmap(0x8014d7000,356352,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|MAP_PREFAULT_READ,3,0x0) = 34381590528 (0x8014d7000)
mmap(0x80172d000,20480,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_PREFAULT_READ,3,0x56000) = 34384039936 (0x80172d000)
mmap(0x801732000,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) = 34384060416 (0x801732000)
munmap(0x800636000,4096) = 0 (0x0)
close(3) = 0 (0x0)
access("/lib/libm.so.5",F_OK) = 0 (0x0)
openat(AT_FDCWD,"/lib/libm.so.5",O_CLOEXEC|O_VERIFY,00) = 3 (0x3)
fstat(3,{ mode=-r--r--r-- ,inode=14383,size=192584,blksize=131072 }) = 0 (0x0)
mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34366251008 (0x800636000)
mmap(0x0,2273280,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) = 34384064512 (0x801733000)
mmap(0x801733000,172032,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|MAP_PREFAULT_READ,3,0x0) = 34384064512 (0x801733000)
mmap(0x80195d000,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_PREFAULT_READ,3,0x2a000) = 34386333696 (0x80195d000)
munmap(0x800636000,4096) = 0 (0x0)
close(3) = 0 (0x0)
mmap(0x0,36864,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366251008 (0x800636000)
mmap(0x0,102400,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366287872 (0x80063f000)
sysarch(AMD64_SET_FSBASE,0x7fffffffe498) = 0 (0x0)
sigprocmask(SIG_BLOCK,{ SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2 },{ }) = 0 (0x0)
sigprocmask(SIG_SETMASK,{ },0x0) = 0 (0x0)
readlink("/etc/malloc.conf",0x7fffffffdb90,1024) ERR#2 'No such file or directory'
issetugid() = 0 (0x0)
__sysctl(0x7fffffffda00,0x2,0x7fffffffda50,0x7fffffffda48,0x801282647,0xd) = 0 (0x0)
__sysctl(0x7fffffffda50,0x2,0x7fffffffdb14,0x7fffffffdb08,0x0,0x0) = 0 (0x0)
mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34386337792 (0x80195e000)
munmap(0x80195e000,2097152) = 0 (0x0)
mmap(0x0,4190208,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34386337792 (0x80195e000)
munmap(0x80195e000,663552) = 0 (0x0)
munmap(0x801c00000,1429504) = 0 (0x0)
sigprocmask(SIG_BLOCK,{ SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2 },{ }) = 0 (0x0)
sigprocmask(SIG_SETMASK,{ },0x0) = 0 (0x0)
sigprocmask(SIG_BLOCK,{ SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2 },{ }) = 0 (0x0)
sigprocmask(SIG_SETMASK,{ },0x0) = 0 (0x0)
__sysctl(0x7fffffffdfd0,0x2,0x800ed6d50,0x7fffffffdfd8,0x0,0x0) = 0 (0x0)
getrlimit(RLIMIT_STACK,{ cur=536870912,max=536870912 }) = 0 (0x0)
__sysctl(0x7fffffffded0,0x2,0x7fffffffdf20,0x7fffffffdf18,0x800cc6ddc,0xd) = 0 (0x0)
__sysctl(0x7fffffffdf20,0x3,0x800ed5370,0x7fffffffdfd8,0x0,0x0) = 0 (0x0)
mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34389098496 (0x801c00000)
thr_self(0x801c16000) = 0 (0x0)
mmap(0x7fffdfffe000,4096,PROT_NONE,MAP_ANON,-1,0x0) = 140736951476224 (0x7fffdfffe000)
rtprio_thread(0x0,0x18bc6,0x7fffffffdfa8) = 0 (0x0)
sysarch(AMD64_SET_FSBASE,0x7fffffffdfa8) = 0 (0x0)
sigaction(32,{ 0x800cbdd80 SA_SIGINFO ss_t },0x0) = 0 (0x0)
sigprocmask(SIG_UNBLOCK,{ },0x0) = 0 (0x0)
_umtx_op(0x7fffffffdf68,UMTX_OP_WAKE,0x1,0x0,0x0) = 0 (0x0)
mprotect(0x0,0,PROT_NONE) = 0 (0x0)
getpid() = 3062 (0xbf6)
getpid() = 3062 (0xbf6)
sigprocmask(SIG_BLOCK,{ SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGKILL|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2 },{ }) = 0 (0x0)
sigprocmask(SIG_SETMASK,{ },0x0) = 0 (0x0)
getcontext(0x7fffffffdab0) = 0 (0x0)
sysarch(AMD64_GET_XFPUSTATE,0x7fffffffda78) = 0 (0x0)
openat(AT_FDCWD,"/var/run/bricks.pid",O_WRONLY|O_CREAT,0644) = 3 (0x3)
fcntl(3,F_SETLK,0x7fffffffe690) = 0 (0x0)
getpid() = 3062 (0xbf6)
ftruncate(3,0x0) = 0 (0x0)
write(3,"3062\n",5) = 5 (0x5)
open("/var/run/bricks.port",O_RDWR|O_CREAT|O_TRUNC,0666) = 4 (0x4)
fstat(4,{ mode=-rw-r--r-- ,inode=467232,size=0,blksize=4096 }) = 0 (0x0)
write(4,"1111",4) = 4 (0x4)
close(4) = 0 (0x0)
fstat(1,{ mode=crw--w---- ,inode=138,size=0,blksize=4096 }) = 0 (0x0)
ioctl(1,TIOCGETA,0xffffdc60) = 0 (0x0)
[ pmain(): line 466] Executing /opt/app/packetbricks/etc/bricks-scripts/load-balance.lua
write(1,"[ pmain(): line 466] Execut"...,94) = 94 (0x5e)
stat("/opt/app/packetbricks/etc/bricks-scripts/load-balance.lua",{ mode=-rw-r--r-- ,inode=467538,size=2684,blksize=4096 }) = 0 (0x0)
open("/opt/app/packetbricks/etc/bricks-scripts/load-balance.lua",O_RDONLY,0666) = 4 (0x4)
fstat(4,{ mode=-rw-r--r-- ,inode=467538,size=2684,blksize=4096 }) = 0 (0x0)
read(4,"-- /usr/bin/lua\n---------------"...,4096) = 2684 (0xa7c)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
open("/opt/app/packetbricks/etc/bricks-scripts/utils.lua",O_RDONLY,0666) = 4 (0x4)
fstat(4,{ mode=-rw-r--r-- ,inode=467544,size=3206,blksize=4096 }) = 0 (0x0)
read(4,"-- /usr/bin/lua\n---------------"...,4096) = 3206 (0xc86)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
open("/opt/app/packetbricks/etc/bricks-scripts/configs/single-threaded-setups.lua",O_RDONLY,0666) = 4 (0x4)
fstat(4,{ mode=-rw-r--r-- ,inode=467534,size=7203,blksize=7680 }) = 0 (0x0)
read(4,"-- /usr/bin/lua\n---------------"...,7680) = 7203 (0x1c23)
read(4,0x801c7d000,7680) = 0 (0x0)
close(4) = 0 (0x0)
pipe2(0x7fffffffdf68,O_CLOEXEC) = 0 (0x0)
fcntl(4,F_GETFL,) = 2 (0x2)
vfork() = 3063 (0xbf7)
close(5) = 0 (0x0)
fcntl(4,F_SETFD,0x0) = 0 (0x0)
fstat(4,{ mode=p--------- ,inode=1,size=0,blksize=4096 }) = 0 (0x0)
read(4,"FreeBSD\n",4096) = 8 (0x8)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
wait4(3063,{ EXITED,val=0 },0x0,0x0) = 3063 (0xbf7)
pipe2(0x7fffffffdf68,O_CLOEXEC) = 0 (0x0)
fcntl(4,F_GETFL,) = 2 (0x2)
vfork() = 3064 (0xbf8)
close(5) = 0 (0x0)
fcntl(4,F_SETFD,0x0) = 0 (0x0)
fstat(4,{ mode=p--------- ,inode=1,size=0,blksize=4096 }) = 0 (0x0)
read(4,"FreeBSD\n",4096) = 8 (0x8)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
wait4(3064,{ EXITED,val=0 },0x0,0x0) = 3064 (0xbf8)
pipe2(0x7fffffffdf68,O_CLOEXEC) = 0 (0x0)
fcntl(4,F_GETFL,) = 2 (0x2)
vfork() = 3065 (0xbf9)
close(5) = 0 (0x0)
fcntl(4,F_SETFD,0x0) = 0 (0x0)
fstat(4,{ mode=p--------- ,inode=1,size=0,blksize=4096 }) = 0 (0x0)
read(4,"dev.netmap.flags: ",4096) = 18 (0x12)
read(4,"0\n",4096) = 2 (0x2)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
wait4(3065,{ EXITED,val=0 },0x0,0x0) = 3065 (0xbf9)
pipe2(0x7fffffffdf68,O_CLOEXEC) = 0 (0x0)
fcntl(4,F_GETFL,) = 2 (0x2)
vfork() = 3066 (0xbfa)
close(5) = 0 (0x0)
fcntl(4,F_SETFD,0x0) = 0 (0x0)
fstat(4,{ mode=p--------- ,inode=1,size=0,blksize=4096 }) = 0 (0x0)
read(4,"root\n",4096) = 5 (0x5)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
wait4(3066,{ EXITED,val=0 },0x0,0x0) = 3066 (0xbfa)
pipe2(0x7fffffffdf68,O_CLOEXEC) = 0 (0x0)
fcntl(4,F_GETFL,) = 2 (0x2)
vfork() = 3067 (0xbfb)
close(5) = 0 (0x0)
fcntl(4,F_SETFD,0x0) = 0 (0x0)
fstat(4,{ mode=p--------- ,inode=1,size=0,blksize=4096 }) = 0 (0x0)
read(4,"FreeBSD\n",4096) = 8 (0x8)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
wait4(3067,{ EXITED,val=0 },0x0,0x0) = 3067 (0xbfb)
pipe2(0x7fffffffdf68,O_CLOEXEC) = 0 (0x0)
fcntl(4,F_GETFL,) = 2 (0x2)
vfork() = 3068 (0xbfc)
close(5) = 0 (0x0)
fcntl(4,F_SETFD,0x0) = 0 (0x0)
fstat(4,{ mode=p--------- ,inode=1,size=0,blksize=4096 }) = 0 (0x0)
read(4,"FreeBSD\n",4096) = 8 (0x8)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
wait4(3068,{ EXITED,val=0 },0x0,0x0) = 3068 (0xbfc)
pipe2(0x7fffffffdf68,O_CLOEXEC) = 0 (0x0)
fcntl(4,F_GETFL,) = 2 (0x2)
vfork() = 3069 (0xbfd)
close(5) = 0 (0x0)
fcntl(4,F_SETFD,0x0) = 0 (0x0)
fstat(4,{ mode=p--------- ,inode=1,size=0,blksize=4096 }) = 0 (0x0)
read(4,"dev.netmap.default_pipes: ",4096) = 26 (0x1a)
read(4,"64 -> 64\n",4096) = 9 (0x9)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
wait4(3069,{ EXITED,val=0 },0x0,0x0) = 3069 (0xbfd)
open("/tmp/bricks.iface",O_RDONLY,0666) = 4 (0x4)
close(4) = 0 (0x0)
open("/tmp/bricks.iface",O_RDONLY,0666) = 4 (0x4)
fstat(4,{ mode=-rw-r--r-- ,inode=1829,size=4,blksize=4096 }) = 0 (0x0)
read(4,"ix0\n",4096) = 4 (0x4)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
open("/tmp/bricks.split",O_RDONLY,0666) = 4 (0x4)
close(4) = 0 (0x0)
open("/tmp/bricks.split",O_RDONLY,0666) = 4 (0x4)
fstat(4,{ mode=-rw-r--r-- ,inode=1830,size=3,blksize=4096 }) = 0 (0x0)
read(4,"21\n",4096) = 3 (0x3)
read(4,0x801c1d000,4096) = 0 (0x0)
close(4) = 0 (0x0)
[ lb_init(): line 66] Adding brick ix0{0 to the engine
write(1,"[ lb_init(): line 66] Adding"...,59) = 59 (0x3b)
socket(PF_INET,SOCK_STREAM,6) = 4 (0x4)
ioctl(4,SIOCGIFFLAGS,0xffffdec0) = 0 (0x0)
[ promisc(): line 98] Interface ix0 is already set to promiscuous mode
write(1,"[ promisc(): line 98] Interf"...,75) = 75 (0x4b)
close(4) = 0 (0x0)
openat(AT_FDCWD,"/dev/netmap",O_RDWR,00) = 4 (0x4)
ioctl(4,NIOCREGIF,0x1c30334) = 0 (0x0)
mmap(0x0,2100531200,PROT_READ|PROT_WRITE,MAP_SHARED,4,0x0) = 34391195648 (0x801e00000)
openat(AT_FDCWD,"/dev/netmap",O_RDWR,00) = 5 (0x5)
330.699282 nm_open [444] overriding ARG3 0
write(2,"330.699282 nm_open [444] overrid"...,43) = 43 (0x2b)
330.699321 nm_open [457] overriding ifname ix0 ringid 0x0 flags 0x1
write(2,"330.699321 nm_open [457] overrid"...,68) = 68 (0x44)
ioctl(5,NIOCREGIF,0x1c30634) = 0 (0x0)
[netmap_link_iface(): line 183] Wait for 2 secs for phy reset
write(1,"[netmap_link_iface(): line 183]"...,63) = 63 (0x3f)
nanosleep({ 2.000000000 }) = 0 (0x0)
[brick_link(): line 113] Linking e0 with link ix0 with batch size: 512 and qid: -1
write(1,"[brick_link(): line 113] Linkin"...,84) = 84 (0x54)
socket(PF_INET,SOCK_STREAM,6) = 6 (0x6)
SIGNAL 11 (SIGSEGV)
process killed, signal = 11

about Bro's filter

Hello,

How many rules is possible to insert on each filter? and how many packets per second is able to reach when use filter?

no way to keep daemon running

I've tried a bunch of ways to keep the bricks-server up and running, but it seems like as soon as it finishes running the file specific in -f it exits the bricks process (since there is no drop to bricks console).

If I toss a loop into the lua script, it pegs a core completely and the packet engine doesn't load balance.

About bricks-shell runtime error

After I installed it according to the reademe documentation.
Execute in the shell. /bricks -d /usr/local/etc/bricks-scripts/utils.lua /usr/local/etc/bricks-scripts/configs/single-threaded-setups.lua
Then execute the bricks-shell
The following error occurred
imageใ€‚

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.