DPDK is a set of libraries and drivers for fast packet processing. It supports many processor architectures and both FreeBSD and Linux. The DPDK uses the Open Source BSD-3-Clause license for the core libraries and drivers. The kernel components are GPL-2.0 licensed. Please check the doc directory for release notes, API documentation, and sample application information. For questions and usage discussions, subscribe to: [email protected] Report bugs and issues to the development mailing list: [email protected]
Data Plane Development Kit
Overview
Comments
-
GitHub Workflows security hardening
This PR adds explicit permissions section to workflows. This is a security best practice because by default workflows run with extended set of permissions (except from
on: pull_request
from external forks). By specifying any permission explicitly all others are set to none. By using the principle of least privilege the damage a compromised workflow can do (because of an injection or compromised third party tool or action) is restricted. It is recommended to have most strict permissions on the top level and grant write permissions on job level case by case. -
net/kni: set packet input port in eth_kni_rx()
Store port_id in pmd_internals when eth kni device is created. Then set packet port of rte_mbuf in function eth_kni_rx.
Signed-off-by: Jecky Pei [email protected]
-
ICE driver EEPROM bug fix
Fix issue with final word being dropped when retrieving module EEPROM data for ICE driver.
Take for simplicity the case when
info->offset
is zero andinfo->len
is equal toSFF_READ_BLOCK_SIZE
. In this case, memcpy would not be called despite there presumably being room in the buffer (as we have requested 8 bytes of data and the memcpy would write precisely 8 bytes). The same edge case will be hit on the final iteration of the for loop whenever a multiple of 8 bytes is requested, as the final word will not be written to the data buffer. -
ACL trie splitting
Problem
I was trying out the test-acl example on some large input files (> 10k ACL rules) to do a performance comparison, but no matter how large the input, it seems to always build 1 trie.
If I understand correctly, it is supposed to split when there are 2048 nodes (this macro #define NODE_MIN 0x800 in
acl_bld.c:20
) , but when I stepped through with a debugger thenode_count
is negative, sonode_count > context->cur_node_max
never actually runs, so all the nodes created from the rules end up being in one trie.This is the specific command I used to run test-acl.sh:
/bin/bash app/test-acl/test-acl.sh build/app/dpdk-test-acl app/test-acl/input scalar 32
I have also attached the rule/trace files which I modified to have 2k ACL rules (they are from app/test-acl/input/) acl1v4_5_rule.txt acl1v4_5_trace.txt
Attempted Fix
In this PR I have changed the condition to
context->num_nodes > (context->cur_node_max * context->num_tries)
and the outer loop to updatecontext->num_tries
. Using the same rules file, this time it generated 10k nodes and split into 5 tries as shown below, which is the expected behavior I think. -
doc: fix and add some message
- Fixup the suffix of the PCI ID to consistent with the code: from wwww:xx:yy.z_port_n to wwww:xx:yy.z_portn
- Add specification of using Mac address to identify port.
Signed-off-by: Chaoyong.He [email protected]
-
Allow C++ source code as well a C source in projects.
Hi. We are working on a project with C and C++ source code. This change allows all the Makefile infrastructure to correctly work with C++ source files too. Please include it. Much thanks!
-
About pdump and dumpcap
- dpdk-dump and dpdk-dumpcap support multi process Rx / TX
- dpdk-dumpcap cleanup before exit
- sort mempool_ops table (rte_mempool_ops_table). the table has inconsistent values in different processes, which will cause MemPool to crash. (detail see : https://bugs.dpdk.org/show_bug.cgi?id=1073 ) the gdb values:
myapp:
(gdb) p rte_mempool_ops_table $4 = {sl = {locked = 0}, num_ops = 11, ops = {{name = "bucket", '\000' <repeats 25 times>, alloc = 0x7b64a9
dpdk-pdump:
(gdb) p rte_mempool_ops_table $1 = {sl = {locked = 0}, num_ops = 11, ops = {{name = "ring_mp_mc", '\000' <repeats 21 times>, alloc = 0x76ed58
detail:
Thread 17 "lcore-slave-79" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7fffee4e2700 (LWP 46107)] 0x00000000007b2064 in bucket_stack_pop_unsafe (stack=0x14f37cc80) at /dpdk/dpdk-src/drivers/mempool/bucket/rte_mempool_bucket.c:89 89 return stack->objects[--stack->top]; (gdb) p rte_mempool_ops_table
$4 = {sl = {locked = 0}, num_ops = 11, ops = {{name = "bucket", '\000' <repeats 25 times>, alloc = 0x7b64a9 <bucket_alloc>, free = 0x7b6934 <bucket_free>, enqueue = 0x7b2df1 <bucket_enqueue>, dequeue = 0x7b555d <bucket_dequeue>, get_count = 0x7b63df <bucket_get_count>, calc_mem_size = 0x7b69c5 <bucket_calc_mem_size>, populate = 0x7b6a4a <bucket_populate>, get_info = 0x7b6c0c <bucket_get_info>, dequeue_contig_blocks = 0x7b5bf7 <bucket_dequeue_contig_blocks>}, {name = "dpaa", '\000' <repeats 27 times>, alloc = 0x7b6f69 <dpaa_mbuf_create_pool>, free = 0x7b885b <dpaa_mbuf_free_pool>, enqueue = 0x7b8982 <dpaa_mbuf_free_bulk>, dequeue = 0x7b8ad9 <dpaa_mbuf_alloc_bulk>, get_count = 0x7b8ce2 <dpaa_mbuf_get_count>, calc_mem_size = 0x0, populate = 0x7b8d69 <dpaa_populate>, get_info = 0x0, dequeue_contig_blocks = 0x0}, { name = "dpaa2", '\000' <repeats 26 times>, alloc = 0x7b91d0 <rte_hw_mbuf_create_pool>, free = 0x7baaa3 <rte_hw_mbuf_free_pool>, enqueue = 0x7bb07b <rte_hw_mbuf_free_bulk>, dequeue = 0x7baeba <rte_dpaa2_mbuf_alloc_bulk>, get_count = 0x7bb0f4 <rte_hw_mbuf_get_count>, calc_mem_size = 0x0, populate = 0x7bb1b6 <dpaa2_populate>, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "octeontx_fpavf", '\000' <repeats 17 times>, alloc = 0x7bcea1 <octeontx_fpavf_alloc>, free = 0x7bcfd3 <octeontx_fpavf_free>, enqueue = 0x7bd003 <octeontx_fpavf_enqueue>, dequeue = 0x7bd085 <octeontx_fpavf_dequeue>, get_count = 0x7bd158 <octeontx_fpavf_get_count>, calc_mem_size = 0x7bd17e <octeontx_fpavf_calc_mem_size>, populate = 0x7bd1f7 <octeontx_fpavf_populate>, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "octeontx2_npa", '\000' <repeats 18 times>, alloc = 0x7beb4d <otx2_npa_alloc>, free = 0x7bedcd <otx2_npa_free>, enqueue = 0x7bdea5 <otx2_npa_enq>, dequeue = 0x7bdfd0 <otx2_npa_deq>, get_count = 0x7be08f <otx2_npa_get_count>, calc_mem_size = 0x7bee7f <otx2_npa_calc_mem_size>, populate = 0x7beede <otx2_npa_populate>, get_info = 0x0, dequeue_contig_blocks = 0x0}, { name = "ring_mp_mc", '\000' <repeats 21 times>, alloc = 0x7c2fb1 <common_ring_alloc>, free = 0x7c3099 <common_ring_free>, enqueue = 0x7c19c7 <common_ring_mp_enqueue>, dequeue = 0x7c24bf <common_ring_mc_dequeue>, get_count = 0x7c2f93 <common_ring_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "ring_sp_sc", '\000' <repeats 21 times>, alloc = 0x7c2fb1 <common_ring_alloc>, free = 0x7c3099 <common_ring_free>, enqueue = 0x7c1f43 <common_ring_sp_enqueue>, dequeue = 0x7c2a29 <common_ring_sc_dequeue>, get_count = 0x7c2f93 <common_ring_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "ring_mp_sc", '\000' <repeats 21 times>, alloc = 0x7c2fb1 <common_ring_alloc>, free = 0x7c3099 <common_ring_free>, enqueue = 0x7c19c7 <common_ring_mp_enqueue>, dequeue = 0x7c2a29 <common_ring_sc_dequeue>, get_count = 0x7c2f93 <common_ring_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "ring_sp_mc", '\000' <repeats 21 times>, alloc = 0x7c2fb1 <common_ring_alloc>, free = 0x7c3099 <common_ring_free>, enqueue = 0x7c1f43 <common_ring_sp_enqueue>, dequeue = 0x7c24bf <common_ring_mc_dequeue>, get_count = 0x7c2f93 <common_ring_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "stack", '\000' <repeats 26 times>, alloc = 0x7c325d <stack_alloc>, free = 0x7c3c0d <stack_free>, enqueue = 0x7c329b <stack_enqueue>, dequeue = 0x7c3759 <stack_dequeue>, get_count = 0x7c3bb3 <stack_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "lf_stack", '\000' <repeats 23 times>, alloc = 0x7c327c <lf_stack_alloc>, free = 0x7c3c0d <stack_free>, enqueue = 0x7c329b <stack_enqueue>, dequeue = 0x7c3759 <stack_dequeue>, get_count = 0x7c3bb3 <stack_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}}}
dpdk-pdump:
Thread 1 "dpdk-pdump" received signal SIGINT, Interrupt. __rte_ring_move_cons_head (entries=0x7fffffffdb64, new_head=0x7fffffffdb68, old_head=0x7fffffffdb6c, behavior=RTE_RING_QUEUE_VARIABLE, n=0, is_sc=0, r=0x14f348680) at /dpdk/dpdk-src/build/x86_64-cascadelake-linuxapp-gcc/include/rte_ring_generic.h:157 157 if (unlikely(n == 0)) (gdb) p rte_mempool_ops_table
$1 = {sl = {locked = 0}, num_ops = 11, ops = {{name = "ring_mp_mc", '\000' <repeats 21 times>, alloc = 0x76ed58 <common_ring_alloc>, free = 0x76ee40 <common_ring_free>, enqueue = 0x76d76e <common_ring_mp_enqueue>, dequeue = 0x76e266 <common_ring_mc_dequeue>, get_count = 0x76ed3a <common_ring_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "ring_sp_sc", '\000' <repeats 21 times>, alloc = 0x76ed58 <common_ring_alloc>, free = 0x76ee40 <common_ring_free>, enqueue = 0x76dcea <common_ring_sp_enqueue>, dequeue = 0x76e7d0 <common_ring_sc_dequeue>, get_count = 0x76ed3a <common_ring_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "ring_mp_sc", '\000' <repeats 21 times>, alloc = 0x76ed58 <common_ring_alloc>, free = 0x76ee40 <common_ring_free>, enqueue = 0x76d76e <common_ring_mp_enqueue>, dequeue = 0x76e7d0 <common_ring_sc_dequeue>, get_count = 0x76ed3a <common_ring_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "ring_sp_mc", '\000' <repeats 21 times>, alloc = 0x76ed58 <common_ring_alloc>, free = 0x76ee40 <common_ring_free>, enqueue = 0x76dcea <common_ring_sp_enqueue>, dequeue = 0x76e266 <common_ring_mc_dequeue>, get_count = 0x76ed3a <common_ring_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "octeontx2_npa", '\000' <repeats 18 times>, alloc = 0x7706d1 <otx2_npa_alloc>, free = 0x770951 <otx2_npa_free>, enqueue = 0x76fa29 <otx2_npa_enq>, dequeue = 0x76fb54 <otx2_npa_deq>, get_count = 0x76fc13 <otx2_npa_get_count>, calc_mem_size = 0x770a03 <otx2_npa_calc_mem_size>, populate = 0x770a62 <otx2_npa_populate>, get_info = 0x0, dequeue_contig_blocks = 0x0}, { name = "bucket", '\000' <repeats 25 times>, alloc = 0x7ef4f4 <bucket_alloc>, free = 0x7ef97f <bucket_free>, enqueue = 0x7ebe3c <bucket_enqueue>, dequeue = 0x7ee5a8 <bucket_dequeue>, get_count = 0x7ef42a <bucket_get_count>, calc_mem_size = 0x7efa10 <bucket_calc_mem_size>, populate = 0x7efa95 <bucket_populate>, get_info = 0x7efc57 <bucket_get_info>, dequeue_contig_blocks = 0x7eec42 <bucket_dequeue_contig_blocks>}, {name = "stack", '\000' <repeats 26 times>, alloc = 0x7efdf5 <stack_alloc>, free = 0x7f07a5 <stack_free>, enqueue = 0x7efe33 <stack_enqueue>, dequeue = 0x7f02f1 <stack_dequeue>, get_count = 0x7f074b <stack_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "lf_stack", '\000' <repeats 23 times>, alloc = 0x7efe14 <lf_stack_alloc>, free = 0x7f07a5 <stack_free>, enqueue = 0x7efe33 <stack_enqueue>, dequeue = 0x7f02f1 <stack_dequeue>, get_count = 0x7f074b <stack_get_count>, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "dpaa", '\000' <repeats 27 times>, alloc = 0x7f0b77 <dpaa_mbuf_create_pool>, free = 0x7f2469 <dpaa_mbuf_free_pool>, enqueue = 0x7f2590 <dpaa_mbuf_free_bulk>, dequeue = 0x7f26e7 <dpaa_mbuf_alloc_bulk>, get_count = 0x7f28f0 <dpaa_mbuf_get_count>, calc_mem_size = 0x0, populate = 0x7f2977 <dpaa_populate>, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "dpaa2", '\000' <repeats 26 times>, alloc = 0x7f2dde <rte_hw_mbuf_create_pool>, free = 0x7f46b1 <rte_hw_mbuf_free_pool>, enqueue = 0x7f4c89 <rte_hw_mbuf_free_bulk>, dequeue = 0x7f4ac8 <rte_dpaa2_mbuf_alloc_bulk>, get_count = 0x7f4d02 <rte_hw_mbuf_get_count>, calc_mem_size = 0x0, populate = 0x7f4dc4 <dpaa2_populate>, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = "octeontx_fpavf", '\000' <repeats 17 times>, alloc = 0x130695e <octeontx_fpavf_alloc>, free = 0x1306a90 <octeontx_fpavf_free>, enqueue = 0x1306ac0 <octeontx_fpavf_enqueue>, dequeue = 0x1306b42 <octeontx_fpavf_dequeue>, get_count = 0x1306c15 <octeontx_fpavf_get_count>, calc_mem_size = 0x1306c3b <octeontx_fpavf_calc_mem_size>, populate = 0x1306cb4 <octeontx_fpavf_populate>, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}, {name = '\000' <repeats 31 times>, alloc = 0x0, free = 0x0, enqueue = 0x0, dequeue = 0x0, get_count = 0x0, calc_mem_size = 0x0, populate = 0x0, get_info = 0x0, dequeue_contig_blocks = 0x0}}} (gdb)
-
net/ice: null field checks in ice_{r,t}x_queue_release
In case rte_eth_dma_zone_reserve fails in ice_tx_queue_setup ice_tx_queue_release is called on 0 allocated but not initialized txq struct. This may happen on ENOMEM condition, size exhaustion of memconfig->memzones array as well as some others.
-
Add proper support for the IPv4 UDP mode for the netvsc driver
The current netvsc driver does not really support the IPv4 UDP RSS mode, as it does not handle the NDIS_HASH_UDP_IPV4 constant. Therefore trying to use that mode fails:
hn_rndis_set(): RNDIS set 0x10204 failed: status 0xc000000d hn_rndis_conf_rss(): RSS config num queues=8 failed: 5 hn_rss_hash_update(): rss reconfig failed (RSS disabled)
This change aims at defining the NDIS constant and using it so that the RSS update can work properly.
-
Cannot initialize tailq: UIO_RESOURCE_LIST
Problem: Cannot initialize tailq: UIO_RESOURCE_LIST the terminal output is as follow:
[root@iZuf690tpru1h6508oc4jrZ helloworld]# build/helloworld -l 0-3 -n 2 EAL: Detected CPU lcores: 32 EAL: Detected NUMA nodes: 1 EAL: Detected shared linkage of DPDK EAL: UIO_RESOURCE_LIST tailq is already registered PANIC in tailqinitfn_rte_uio_tailq(): Cannot initialize tailq: UIO_RESOURCE_LIST 16: [build/helloworld() [0x400770]] 15: [/lib64/libc.so.6(__libc_start_main+0xf5) [0x7f04d7d1f555]] 14: [build/helloworld() [0x4006c6]] 13: [librte_eal.so.22(rte_eal_init+0x726) [0x7f04d80f8476]] 12: [librte_eal.so.22(+0x19628) [0x7f04d80e4628]] 11: [/lib64/libdl.so.2(dlopen+0x31) [0x7f04d77f8041]] 10: [/lib64/libdl.so.2(+0x15ad) [0x7f04d77f85ad]] 9: [/lib64/ld-linux-x86-64.so.2(+0xf7d4) [0x7f04d83e27d4]] 8: [/lib64/libdl.so.2(+0xfab) [0x7f04d77f7fab]] 7: [/lib64/ld-linux-x86-64.so.2(+0x13b8b) [0x7f04d83e6b8b]] 6: [/lib64/ld-linux-x86-64.so.2(+0xf7d4) [0x7f04d83e27d4]] 5: [/lib64/ld-linux-x86-64.so.2(+0x1459e) [0x7f04d83e759e]] 4: [/lib64/ld-linux-x86-64.so.2(+0xf9c3) [0x7f04d83e29c3]] 3: [/usr/local/lib64/dpdk/pmds-22.1/librte_bus_pci.so.22.1(+0x2a9c) [0x7f04c94a6a9c]] 2: [librte_eal.so.22(__rte_panic+0xba) [0x7f04d80d807a]] 1: [librte_eal.so.22(rte_dump_stack+0x1a) [0x7f04d80f9fea]] Aborted
I search the problem online, and find the solution, but still confused about the operation: -> 把静态链接librte_.a都改成动态链接librte_.so. I wonder if there are some more specific operations ? Thanks!
-
Adds include inttypes.h
Without this type def we get a compiler error: error: expected ')' before 'PRId64' Similar to the errors here: http://mails.dpdk.org/archives/test-report/2022-February/256520.html
This is when being compiled on Cent7 using gcc version 4.8.5
The little C kit
ckit The little C kit bin/ckit — tool for building and testing projects (calls cmake & ninja) pkg/ — directory of some packages The main thing here is
A Linux reference software for building the Demo Core-Image on Renesas RZ/V2M Evaluation Kit
Introduction This repository is a Linux reference software for building the Demo Core-Image on Renesas RZ/V2M Evaluation Kit . You have to get the pro
Warp speed Data Transfer (WDT) is an embeddedable library (and command line tool) aiming to transfer data between 2 systems as fast as possible over multiple TCP paths.
WDT Warp speed Data Transfer Design philosophy/Overview Goal: Lowest possible total transfer time - to be only hardware limited (disc or network bandw
AREG IoT SDK (or AREG SDK) is a real-time asynchronous communication framework written in C++ for embedded development that enables thin servers run on connected Things and provide device specific services at the edge of IoT network.
AREG IoT SDK to simplify multitasking programming Bring your product to live service enabled Introduction AREG IoT SDK (or AREG SDK) is an Object Remo
ESP-IDF is the development framework for Espressif SoCs supported on Windows, Linux and macOS.
Espressif IoT Development Framework 中文版 ESP-IDF is the development framework for Espressif SoCs supported on Windows, Linux and macOS. ESP-IDF Release
Steve's Persistent Unreal Data library
SPUD: Steve's Persistent Unreal Data library What is it? SPUD is a save game and streaming level persistence solution for Unreal Engine 4. The 2 main
Steve's Unreal Quest System: data-driven quest system for UE4
Steve's Unreal Quest System (SUQS) What Is It? SUQS is a simple, data-driven quest system for UE4. It helps you define quest structures for your game,
Realtime Client/Server app for Linux allowing joystick (and other HID) data to be transferred over a local network
netstick What is it? Netstick enables HID devices to be remotely connected between a "client" and "server" over a network connection. It allows the ke
Upload arbitrary data via Apple's Find My network.
Send My allows you to to upload abritrary data from devices without an internet connection by (ab)using Apple's Find My network. The data is broadcasted via Bluetooth Low Energy and forwarded by nearby Apple devices.
Wifi MQTT Data Logging via an esp8266 for the Ikea VINDRIKTNING PM2.5 air quality sensor
MQTT connectivity for the Ikea VINDRIKTNING This repository contains an ESP8266 firmware, which adds MQTT to the Ikea VINDRIKTNING PM2.5 air quality s
Tool for Preventing Data Exfiltration with eBPF
bouheki: Tool for Preventing Data Exfiltration with eBPF bouheki is a KSRI implementation using LSM Hook by eBPF. Flexibility to apply restricted netw
WDT Warp speed Data Transfer
Warp speed Data Transfer (WDT) is an embeddedable library (and command line tool) aiming to transfer data between 2 systems as fast as possible over multiple TCP paths.
Data-oriented networking playground for the reliable UDP transports
NetDynamics is a data-oriented networking playground for the reliable UDP transports. The application was created for stress testing and debugging a p
A small data-oriented and SIMD-optimized 3D rigid body physics library.
nudge Nudge is a small data-oriented and SIMD-optimized 3D rigid body physics library. For more information, see: http://rasmusbarr.github.io/blog/dod
A software C library designed to extract data attributes from network packets, server logs, and from structured events in general, in order to make them available for analysis
MMT-DPI A software C library desinged to extract data attributes from network packets, server logs, and from structured events in general, in odrder t
KVDK (Key-Value Development Kit) is a key-value store library implemented in C++ language
KVDK (Key-Value Development Kit) is a key-value store library implemented in C++ language. It is designed for persistent memory and provides unified APIs for both volatile and persistent scenarios. It also demonstrates several optimization methods for high performance with persistent memory. Besides providing the basic APIs of key-value store, it offers several advanced features, like transaction, snapshot as well.
Internal Software Development Kit for Battlefield 2042
battlefield-2042-internal-sdk Internal Software Development Kit for Battlefield 2042 SDK Includes the following: Entity Classes Player Classes Vehicle
🎮 Cross platform development kit for Z80 and SM83 based consoles.
cdk ?? Cross platform development kit for Z80 and SM83 based consoles. Platform We planned to support the following consoles: Nintendo Game Boy Ninten
bl_mcu_sdk is MCU software development kit provided by Bouffalo Lab Team for BL602/BL604, BL702/BL704/BL706 and other series of RISC-V based chips in the future.
bl mcu sdk is an MCU software development kit provided by the Bouffalo Lab Team for BL602/BL604, BL702/BL704/BL706 and other series of chips in the future
Kit: a magical, high performance programming language, designed for game development
Kit: a magical, high performance programming language, designed for game development