Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ docs/book/
\#*#
.#*
__pycache__
.clang-format
microkit-sdk-2.1.0/
2 changes: 1 addition & 1 deletion dep/libmicrokitco
2 changes: 1 addition & 1 deletion dep/sddf
Submodule sddf updated 73 files
+3 −3 .github/workflows/examples.yaml
+1 −0 .reuse/dep5
+11 −11 README.md
+0 −1 benchmark/benchmark.c
+1 −1 benchmark/benchmark.mk
+1 −1 build.zig
+86 −1 ci/README.md
+6 −1 ci/examples/echo_server.py
+5 −5 ci/examples/timer.py
+6 −0 ci/genmc/os/sddf.h
+7 −0 ci/matrix.py
+475 −183 drivers/blk/nvme/nvme.c
+405 −57 drivers/blk/nvme/nvme.h
+29 −9 drivers/blk/nvme/nvme_debug.h
+32 −10 drivers/blk/nvme/nvme_queue.h
+6 −5 drivers/i2c/i2c_common.c
+0 −1 drivers/i2c/opentitan/cheshire-i2c.h
+2 −5 drivers/i2c/opentitan/config.json
+59 −54 drivers/i2c/opentitan/i2c.c
+32 −7 drivers/network/dwmac-5.10a/ethernet.c
+32 −0 drivers/network/genet/config.json
+27 −0 drivers/network/genet/eth_driver.mk
+550 −0 drivers/network/genet/ethernet.c
+272 −0 drivers/network/genet/ethernet.h
+28 −6 drivers/network/imx/ethernet.c
+41 −7 drivers/network/meson/ethernet.c
+1 −1 drivers/timer/apb_timer/timer_driver.mk
+1 −1 drivers/timer/arm/timer_driver.mk
+1 −1 drivers/timer/bcm2835/timer_driver.mk
+1 −1 drivers/timer/cdns/timer_driver.mk
+1 −1 drivers/timer/goldfish/timer_driver.mk
+0 −184 drivers/timer/hpet/timer.c
+1 −1 drivers/timer/imx/timer_driver.mk
+1 −1 drivers/timer/jh7110/timer_driver.mk
+1 −1 drivers/timer/meson/timer_driver.mk
+1 −1 drivers/timer/rk3568/timer_driver.mk
+382 −0 drivers/timer/tsc_hpet/timer.c
+3 −3 drivers/timer/tsc_hpet/timer_driver.mk
+2,236 −0 dts/kria_k26.dts
+128 −128 dts/maaxboard.dts
+118 −118 dts/odroidc4.dts
+50 −50 dts/rpi4b_1gb.dts
+1 −1 dts/star64.dts
+52 −14 examples/blk/meta.py
+2 −1 examples/echo_server/echo.mk
+16 −16 examples/echo_server/meta.py
+1 −1 examples/i2c/meta.py
+1 −1 examples/i2c_bus_scan/meta.py
+1 −0 examples/serial/README.md
+12 −1 examples/serial/build.zig
+1 −1 examples/serial/meta.py
+1 −0 examples/serial/serial.mk
+1 −0 examples/timer/README.md
+13 −2 examples/timer/build.zig
+6 −5 examples/timer/client.c
+3 −14 examples/timer/meta.py
+4 −2 examples/timer/timer.mk
+7 −7 flake.lock
+7 −7 flake.nix
+6 −6 i2c/libi2c.c
+0 −4 include/sddf/network/constants.h
+27 −0 include/sddf/util/fence.h
+4 −0 include/sddf/util/util.h
+2 −2 libco/libco.mk
+4 −4 libco/riscv64.c
+5 −0 network/components/arp.c
+2 −4 network/lib_sddf_lwip/lib_sddf_lwip.mk
+12 −0 tools/make/board/kria_k26.mk
+2 −2 tools/make/board/rpi4b_1gb.mk
+1 −1 tools/make/board/x86_64_generic.mk
+32 −0 tools/make/board/x86_64_generic_vtx.mk
+40 −0 tools/meta/board.py
+16 −6 util/cache.c
124 changes: 98 additions & 26 deletions examples/firewall/filters/tcp_filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@
* SPDX-License-Identifier: BSD-2-Clause
*/

#include <stdbool.h>
#include <stdint.h>
#include <os/sddf.h>
#include <sddf/util/util.h>
#include <sddf/util/printf.h>
#include <sddf/network/queue.h>
#include <sddf/network/config.h>
#include <lions/firewall/checksum.h>
#include <lions/firewall/config.h>
#include <lions/firewall/common.h>
#include <lions/firewall/config.h>
#include <lions/firewall/filter.h>
#include <lions/firewall/ip.h>
#include <lions/firewall/tcp.h>
#include <lions/firewall/queue.h>
#include <lions/firewall/tcp.h>
#include <lions/firewall/tcp_filter.h>
#include <os/sddf.h>
#include <sddf/network/config.h>
#include <sddf/network/queue.h>
#include <sddf/util/printf.h>
#include <sddf/util/util.h>
#include <stdbool.h>
#include <stdint.h>

__attribute__((__section__(".fw_filter_config"))) fw_filter_config_t filter_config;
__attribute__((__section__(".net_client_config"))) net_client_config_t net_config;
Expand All @@ -29,11 +30,35 @@ fw_queue_t router_queue;
/* Holds filtering rules and state */
fw_filter_state_t filter_state;

static void filter(void)
{
/* Current tick, used to track aging instances */
// Courtney: This has not yet been implemented, i.e. the TCP filter does not yet
// have access to the timer driver and thus does not receive ticks.
uint64_t curr_tick = 0;

// Helper fn to allocate the tracking instance slot
static inline fw_filter_err_t fw_tcp_create_and_bind_instance(fw_filter_state_t *state, ipv4_hdr_t *ip_hdr,
tcp_hdr_t *tcp_hdr, uint16_t rule_id,
fw_tcp_instance_t **instance) {
uint32_t initial_seq = ntohl(tcp_hdr->seq);
fw_filter_err_t fw_err = fw_filter_add_instance(state, ip_hdr->src_ip, tcp_hdr->src_port, ip_hdr->dst_ip,
tcp_hdr->dst_port, rule_id, initial_seq);
// If the slot was successfully created or already existed, link the pointer
if (fw_err == FILTER_ERR_OKAY || fw_err == FILTER_ERR_DUPLICATE) {
// Dummy id used,
uint16_t dummy_rule_id;
fw_tcp_filter_find_action(state, ip_hdr->src_ip, tcp_hdr->src_port, ip_hdr->dst_ip, tcp_hdr->dst_port,
&dummy_rule_id, instance);
}

return fw_err;
}

static void filter(void) {
bool transmitted = false;
bool returned = false;
bool reprocess = true;
int enqueue_err;

while (reprocess) {
while (!net_queue_empty_active(&rx_queue)) {
net_buff_desc_t buffer;
Expand All @@ -45,14 +70,18 @@ static void filter(void)
tcp_hdr_t *tcp_hdr = (tcp_hdr_t *)(pkt_vaddr + transport_layer_offset(ip_hdr));

uint16_t rule_id = 0;
fw_action_t action = fw_filter_find_action(&filter_state, ip_hdr->src_ip, tcp_hdr->src_port, ip_hdr->dst_ip,
tcp_hdr->dst_port, &rule_id);
fw_tcp_instance_t *instance = NULL;
fw_action_t action = fw_tcp_filter_find_action(&filter_state, ip_hdr->src_ip, tcp_hdr->src_port,
ip_hdr->dst_ip, tcp_hdr->dst_port, &rule_id, &instance);

switch (action) {
case FILTER_ACT_CONNECT: {
uint32_t initial_seq = ntohl(tcp_hdr->seq);

/* Add an established connection in shared memory for corresponding filter */
fw_filter_err_t fw_err = fw_filter_add_instance(&filter_state, ip_hdr->src_ip, tcp_hdr->src_port,
ip_hdr->dst_ip, tcp_hdr->dst_port, rule_id);
fw_filter_err_t fw_err =
fw_filter_add_instance(&filter_state, ip_hdr->src_ip, tcp_hdr->src_port, ip_hdr->dst_ip,
tcp_hdr->dst_port, rule_id, initial_seq);

if ((fw_err == FILTER_ERR_OKAY || fw_err == FILTER_ERR_DUPLICATE) && FW_DEBUG_OUTPUT) {
sddf_printf(
Expand All @@ -69,6 +98,7 @@ static void filter(void)
filter_config.interface, rule_id, ipaddr_to_string(ip_hdr->src_ip, ip_addr_buf0),
htons(tcp_hdr->src_port), ipaddr_to_string(ip_hdr->dst_ip, ip_addr_buf1),
htons(tcp_hdr->dst_port), fw_filter_err_str[fw_err]);
goto drop_packet;
}
}
case FILTER_ACT_ESTABLISHED:
Expand All @@ -79,10 +109,14 @@ static void filter(void)
tcp_hdr->check = 0;
#endif

err = fw_enqueue(&router_queue, &buffer);
assert(!err);
enqueue_err = fw_enqueue(&router_queue, &buffer);
assert(!enqueue_err);
transmitted = true;

if (instance != NULL) {
instance->timestamp = curr_tick;
}

if (FW_DEBUG_OUTPUT) {
if (action == FILTER_ACT_ALLOW || action == FILTER_ACT_CONNECT) {
sddf_printf(
Expand All @@ -104,9 +138,10 @@ static void filter(void)
}
case FILTER_ACT_DROP:
default: {
drop_packet:
/* Return the buffer to the rx virtualiser */
err = net_enqueue_free(&rx_queue, buffer);
assert(!err);
enqueue_err = net_enqueue_free(&rx_queue, buffer);
assert(!enqueue_err);
returned = true;

if (FW_DEBUG_OUTPUT) {
Expand All @@ -119,6 +154,46 @@ static void filter(void)
break;
}
}

// Handle state transitions on packets that matched a tracking instances
if (instance != NULL) {
// Determine direction relative to the original connection initiator
bool is_forward = (instance->src_ip == ip_hdr->src_ip && instance->src_port == tcp_hdr->src_port);

uint32_t packet_seq = ntohl(tcp_hdr->seq);
uint8_t flags = tcp_hdr->flags;

// Payload length tracking calculations
uint16_t ip_hdr_len = ipv4_header_length(ip_hdr);
uint16_t tcp_hdr_len = (tcp_hdr->doff) * 4;
uint32_t payload_len = ntohs(ip_hdr->total_len) - ip_hdr_len - tcp_hdr_len;

if (is_forward) {
uint32_t control_adjustment = ((flags & FW_TCP_SYN_BIT) || (flags & FW_TCP_FIN_BIT)) ? 1 : 0;
instance->local_next_seq = packet_seq + payload_len + control_adjustment;
} else {
uint32_t control_adjustment = ((flags & FW_TCP_SYN_BIT) || (flags & FW_TCP_FIN_BIT)) ? 1 : 0;
instance->extern_next_seq = packet_seq + payload_len + control_adjustment;
}

fw_tcp_conn_state_t new_state = fw_tcp_next_state(instance->current_state, flags, is_forward);
if (new_state == TCP_INVALID) {
/* Flag for deletion */
action = FILTER_ACT_DROP;
} else {
instance->current_state = new_state;
if (new_state != TCP_NONE) {
// Track historical telemetry data, we don't do it if none for debugging purposes
if (is_forward) {
instance->local.flags = flags;
instance->local.seq = packet_seq;
} else {
instance->external.flags = flags;
instance->external.seq = packet_seq;
}
}
}
}
}

net_request_signal_active(&rx_queue);
Expand All @@ -139,8 +214,7 @@ static void filter(void)
}
}

microkit_msginfo protected(microkit_channel ch, microkit_msginfo msginfo)
{
microkit_msginfo protected(microkit_channel ch, microkit_msginfo msginfo) {
switch (microkit_msginfo_get_label(msginfo)) {
case FILTER_SET_DEFAULT_ACTION: {
fw_action_t action = microkit_mr_get(FILTER_SET_DEFAULT_ARG_ACTION);
Expand Down Expand Up @@ -211,8 +285,7 @@ microkit_msginfo protected(microkit_channel ch, microkit_msginfo msginfo)
return microkit_msginfo_new(0, 0);
}

void notified(microkit_channel ch)
{
void notified(microkit_channel ch) {
if (ch == net_config.rx.id) {
filter();
} else {
Expand All @@ -221,8 +294,7 @@ void notified(microkit_channel ch)
}
}

void init(void)
{
void init(void) {
assert(net_config_check_magic((void *)&net_config));

net_queue_init(&rx_queue, net_config.rx.free_queue.vaddr, net_config.rx.active_queue.vaddr,
Expand All @@ -236,4 +308,4 @@ void init(void)
filter_config.external_instances, filter_config.instances_capacity,
filter_config.initial_rules, filter_config.num_initial_rules,
filter_config.num_external_instances);
}
}
Loading
Loading