From fc2db7561577f682f79152182fb90667460ef6c0 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Thu, 18 Jun 2026 22:35:19 +0300 Subject: [PATCH 1/3] fix: fix tap port --- worker/src/dpdk_filter/main.c | 2 +- worker/src/dpdk_filter/net_port.c | 4 ++-- worker/src/worker.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/worker/src/dpdk_filter/main.c b/worker/src/dpdk_filter/main.c index ea54728..e9fc8a5 100644 --- a/worker/src/dpdk_filter/main.c +++ b/worker/src/dpdk_filter/main.c @@ -112,7 +112,7 @@ int main(int argc, char **argv) { forward_to_out(port_exception, port_in, queue_number); pakage_processing(port_in, port_out, port_exception, queue_number, nb_pkts, pkts, &policy, false); - forward_to_out(port_out, port_in, queue_number); + forward_to_out(port_out, port_exception, queue_number); if (++timer_check_counter >= timer_check_interval) { rte_timer_manage(); diff --git a/worker/src/dpdk_filter/net_port.c b/worker/src/dpdk_filter/net_port.c index 21390ed..e281a3f 100644 --- a/worker/src/dpdk_filter/net_port.c +++ b/worker/src/dpdk_filter/net_port.c @@ -49,8 +49,8 @@ struct net_port *init_struct_tap_port(const char *tap_iface_name, return NULL; } - snprintf(port->dev_args, sizeof(port->dev_args), "iface=%s, remote=%s", - tap_iface_name, tap_iface_name); + snprintf(port->dev_args, sizeof(port->dev_args), "iface=%s", + tap_iface_name); snprintf(port->dev_name, sizeof(port->dev_name), "net_tap_%s", tap_iface_name); strncpy(port->iface_name, tap_iface_name, sizeof(port->iface_name) - 1); diff --git a/worker/src/worker.cpp b/worker/src/worker.cpp index bd03edd..f1b4139 100644 --- a/worker/src/worker.cpp +++ b/worker/src/worker.cpp @@ -396,7 +396,7 @@ void Worker::MainLoop() { forward_to_out(port_exception, port_in, queue_number); pakage_processing(port_in, port_out, port_exception, queue_number, nb_pkts, pkts, &local_policy, !enable); - forward_to_out(port_out, port_in, queue_number); + forward_to_out(port_out, port_exception, queue_number); if (++timer_check_counter >= timer_check_interval) { rte_timer_manage(); timer_check_counter = 0; From 74452824093ab862fedf84729596f76289bc40b7 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Tue, 23 Jun 2026 20:23:12 +0300 Subject: [PATCH 2/3] feat: added offload --- worker/src/dpdk_filter/net_port.c | 3 +++ worker/src/dpdk_filter/proc_packets.c | 34 ++++++++++++++++++--------- worker/src/worker.cpp | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/worker/src/dpdk_filter/net_port.c b/worker/src/dpdk_filter/net_port.c index e281a3f..0e6d607 100644 --- a/worker/src/dpdk_filter/net_port.c +++ b/worker/src/dpdk_filter/net_port.c @@ -83,6 +83,9 @@ struct net_port *init_struct_af_xdp_port(const char *iface_name, int net_port_init(struct net_port *port) { int ret; struct rte_eth_conf port_conf = {0}; + port_conf.txmode.offloads = RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | + RTE_ETH_TX_OFFLOAD_TCP_CKSUM | + RTE_ETH_TX_OFFLOAD_UDP_CKSUM; const char *dev_name = port->dev_name; uint16_t port_id; diff --git a/worker/src/dpdk_filter/proc_packets.c b/worker/src/dpdk_filter/proc_packets.c index 19bb286..f2891ee 100644 --- a/worker/src/dpdk_filter/proc_packets.c +++ b/worker/src/dpdk_filter/proc_packets.c @@ -11,20 +11,32 @@ const uint16_t LIST_EXCEPTION_PORTS[LEN_LIST_EXCEPTION_PORTS] = {22}; void package_sending_decision(bool solution_is_send, struct rte_mbuf *pkt, struct net_port *port_out, uint16_t queue_number) { - if (solution_is_send) { - struct rte_mbuf *tx_pkt[1] = {pkt}; - uint16_t ret = rte_eth_tx_burst(port_out->port_id, queue_number, tx_pkt, 1); - - if (ret < 1) { - LOG_ERROR("Failed to send packet"); - // PLUG (to be added later) - need to add processing for this case - rte_pktmbuf_free(pkt); + if (solution_is_send) { + struct rte_ipv4_hdr *ipv4_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr)); + + pkt->l2_len = RTE_ETHER_HDR_LEN; + pkt->l3_len = (ipv4_hdr->version_ihl & 0x0F) * 4; + + pkt->ol_flags |= RTE_MBUF_F_TX_IPV4 | RTE_MBUF_F_TX_IP_CKSUM; + + if (pkt->packet_type & RTE_PTYPE_L4_TCP) { + pkt->ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM; + } else if (pkt->packet_type & RTE_PTYPE_L4_UDP) { + pkt->ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM; + } + + struct rte_mbuf *tx_pkt[1] = {pkt}; + uint16_t ret = rte_eth_tx_burst(port_out->port_id, queue_number, tx_pkt, 1); + if (ret < 1) { + LOG_ERROR("Failed to send packet"); + rte_pktmbuf_free(pkt); + } + return; } - return; - } - rte_pktmbuf_free(pkt); + rte_pktmbuf_free(pkt); } + bool check_is_exception(uint16_t *port) { for (int i = 0; i < LEN_LIST_EXCEPTION_PORTS; i++) { if (*port == LIST_EXCEPTION_PORTS[i]) { diff --git a/worker/src/worker.cpp b/worker/src/worker.cpp index f1b4139..bd03edd 100644 --- a/worker/src/worker.cpp +++ b/worker/src/worker.cpp @@ -396,7 +396,7 @@ void Worker::MainLoop() { forward_to_out(port_exception, port_in, queue_number); pakage_processing(port_in, port_out, port_exception, queue_number, nb_pkts, pkts, &local_policy, !enable); - forward_to_out(port_out, port_exception, queue_number); + forward_to_out(port_out, port_in, queue_number); if (++timer_check_counter >= timer_check_interval) { rte_timer_manage(); timer_check_counter = 0; From 6a7b8601dd6127adf429135bc5ba44955c1f8a07 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Thu, 25 Jun 2026 16:40:43 +0300 Subject: [PATCH 3/3] feat: prog checksum and test --- worker/SCRIPT_PC 1.sh | 7 +++ worker/SCRIPT_PC 2.sh | 6 ++ worker/SCRIPT_PLATA_IP.sh | 7 +++ worker/SCRIPT_PLATA_OFFLOAD.sh | 9 +++ worker/src/dpdk_filter/main.c | 2 +- worker/src/dpdk_filter/proc_packets.c | 87 ++++++++++++++++++++------- worker/src/worker.cpp | 41 ++++++++++--- 7 files changed, 126 insertions(+), 33 deletions(-) create mode 100644 worker/SCRIPT_PC 1.sh create mode 100644 worker/SCRIPT_PC 2.sh create mode 100644 worker/SCRIPT_PLATA_IP.sh create mode 100644 worker/SCRIPT_PLATA_OFFLOAD.sh diff --git a/worker/SCRIPT_PC 1.sh b/worker/SCRIPT_PC 1.sh new file mode 100644 index 0000000..7753bed --- /dev/null +++ b/worker/SCRIPT_PC 1.sh @@ -0,0 +1,7 @@ +INTERFACE="eth0" + +sudo ip link set $INTERFACE up +sudo ip addr add 10.0.0.2/24 dev $INTERFACE +sudo ip route add default via $GATEWAY dev $INTERFACE + +sudo ip route add 10.0.0.0/24 via 10.0.1.1 dev $INTERFACE diff --git a/worker/SCRIPT_PC 2.sh b/worker/SCRIPT_PC 2.sh new file mode 100644 index 0000000..cd72255 --- /dev/null +++ b/worker/SCRIPT_PC 2.sh @@ -0,0 +1,6 @@ +INTERFACE="enp3s0" + +sudo ip addr add 10.0.1.2/24 dev $INTERFACE +sudo ip link set dev $INTERFACE up +sudo ip route add 10.0.1.0/24 via 10.0.1.1 dev $INTERFACE +sudo ip addr set dev $INTERFACE up \ No newline at end of file diff --git a/worker/SCRIPT_PLATA_IP.sh b/worker/SCRIPT_PLATA_IP.sh new file mode 100644 index 0000000..808934c --- /dev/null +++ b/worker/SCRIPT_PLATA_IP.sh @@ -0,0 +1,7 @@ +ip link set eth0 up +ip link set eth1 up + +ip addr add 10.0.0.1/24 dev eth0 #подключен к ПК 1 +ip addr add 10.0.0.2/24 dev eth1 #подключен к ПК 2 + +sysctl -w net.ipv4.ip_forward=1 diff --git a/worker/SCRIPT_PLATA_OFFLOAD.sh b/worker/SCRIPT_PLATA_OFFLOAD.sh new file mode 100644 index 0000000..024f6c2 --- /dev/null +++ b/worker/SCRIPT_PLATA_OFFLOAD.sh @@ -0,0 +1,9 @@ + +sudo ethtool -K eth0 tx off rx off +sudo ethtool -K eth1 tx off rx off +sudo ethtool -K eth0 tx-checksum-ip-generic off +sudo ethtool -K eth1 tx-checksum-ip-generic off + + +sudo ethtool -k eth0 | grep checksum +sudo ethtool -k eth1 | grep checksum diff --git a/worker/src/dpdk_filter/main.c b/worker/src/dpdk_filter/main.c index e9fc8a5..ea54728 100644 --- a/worker/src/dpdk_filter/main.c +++ b/worker/src/dpdk_filter/main.c @@ -112,7 +112,7 @@ int main(int argc, char **argv) { forward_to_out(port_exception, port_in, queue_number); pakage_processing(port_in, port_out, port_exception, queue_number, nb_pkts, pkts, &policy, false); - forward_to_out(port_out, port_exception, queue_number); + forward_to_out(port_out, port_in, queue_number); if (++timer_check_counter >= timer_check_interval) { rte_timer_manage(); diff --git a/worker/src/dpdk_filter/proc_packets.c b/worker/src/dpdk_filter/proc_packets.c index f2891ee..39662d2 100644 --- a/worker/src/dpdk_filter/proc_packets.c +++ b/worker/src/dpdk_filter/proc_packets.c @@ -2,38 +2,81 @@ #include "domain_cache.h" #include "ip_cache.h" #include +#include +#include +#include +#include +#include +#include + extern bool worker_classify(const char *type, const char *target, struct requested_classification *out_req); const uint16_t LIST_EXCEPTION_PORTS[LEN_LIST_EXCEPTION_PORTS] = {22}; +static inline uint16_t checksum(void *data, uint16_t len) { + uint32_t sum = 0; + uint16_t *ptr = data; + + while (len > 1) { + sum += *ptr++; + len -= 2; + } + + if (len) { + sum += *((uint8_t *)ptr); + } + + while (sum >> 16) { + sum = (sum & 0xffff) + (sum >> 16); + } + + return (uint16_t)(~sum); +} + void package_sending_decision(bool solution_is_send, struct rte_mbuf *pkt, struct net_port *port_out, uint16_t queue_number) { - if (solution_is_send) { - struct rte_ipv4_hdr *ipv4_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr)); - - pkt->l2_len = RTE_ETHER_HDR_LEN; - pkt->l3_len = (ipv4_hdr->version_ihl & 0x0F) * 4; - - pkt->ol_flags |= RTE_MBUF_F_TX_IPV4 | RTE_MBUF_F_TX_IP_CKSUM; - - if (pkt->packet_type & RTE_PTYPE_L4_TCP) { - pkt->ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM; - } else if (pkt->packet_type & RTE_PTYPE_L4_UDP) { - pkt->ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM; - } - - struct rte_mbuf *tx_pkt[1] = {pkt}; - uint16_t ret = rte_eth_tx_burst(port_out->port_id, queue_number, tx_pkt, 1); - if (ret < 1) { - LOG_ERROR("Failed to send packet"); - rte_pktmbuf_free(pkt); - } - return; + if (solution_is_send) { + struct rte_ether_hdr *eth = rte_pktmbuf_mtod(pkt, struct rte_ether_hdr *); + + if (eth->ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4)) { + struct rte_ipv4_hdr *ip = (struct rte_ipv4_hdr *)(eth + 1); + uint16_t ip_hdr_len = (ip->version_ihl & 0x0F) * 4; + uint16_t ip_len = rte_be_to_cpu_16(ip->total_length); + uint16_t l4_len = ip_len - ip_hdr_len; + + if (ip->next_proto_id == IPPROTO_ICMP) { + struct rte_icmp_hdr *icmp = (struct rte_icmp_hdr *)((char *)ip + ip_hdr_len); + icmp->icmp_cksum = 0; + icmp->icmp_cksum = checksum(icmp, l4_len); + } + + else if (ip->next_proto_id == IPPROTO_TCP) { + struct rte_tcp_hdr *tcp = (struct rte_tcp_hdr *)((char *)ip + ip_hdr_len); + tcp->cksum = 0; + tcp->cksum = rte_ipv4_udptcp_cksum(ip, tcp); + } + + else if (ip->next_proto_id == IPPROTO_UDP) { + struct rte_udp_hdr *udp = (struct rte_udp_hdr *)((char *)ip + ip_hdr_len); + udp->dgram_cksum = 0; + udp->dgram_cksum = rte_ipv4_udptcp_cksum(ip, udp); + } } - rte_pktmbuf_free(pkt); + + struct rte_mbuf *tx_pkt[1] = {pkt}; + uint16_t ret = rte_eth_tx_burst(port_out->port_id, queue_number, tx_pkt, 1); + + if (ret < 1) { + LOG_ERROR("Failed to send packet"); + // PLUG (to be added later) - need to add processing for this case + rte_pktmbuf_free(pkt); + } + return; + } + rte_pktmbuf_free(pkt); } diff --git a/worker/src/worker.cpp b/worker/src/worker.cpp index bd03edd..eee68c5 100644 --- a/worker/src/worker.cpp +++ b/worker/src/worker.cpp @@ -92,17 +92,38 @@ void Worker::initDPDK(int argc, char **argv) { void Worker::forward_to_out(struct net_port *incoming_port, struct net_port *outgoing_port, uint16_t queue_number) { - struct rte_mbuf *tap_pkts[32]; - uint16_t nb_tap = - rte_eth_rx_burst(incoming_port->port_id, queue_number, tap_pkts, 32); + struct rte_mbuf *tap_pkts[FORWARD_TO_OUT_BURST_SIZE]; + uint16_t nb_tap = rte_eth_rx_burst(incoming_port->port_id, queue_number, + tap_pkts, FORWARD_TO_OUT_BURST_SIZE); for (int i = 0; i < nb_tap; i++) { - int ret = - rte_eth_tx_burst(outgoing_port->port_id, queue_number, &tap_pkts[i], 1); - if (ret < 1) { - spdlog::warn("Failed to send packet"); - // PLUG (to be added later) - need to add processing for this case - rte_pktmbuf_free(tap_pkts[i]); - } + struct rte_ether_hdr *eth = rte_pktmbuf_mtod(tap_pkts[i], struct rte_ether_hdr *); + + if (eth->ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4)) { + struct rte_ipv4_hdr *ip = (struct rte_ipv4_hdr *)(eth + 1); + uint16_t ip_hdr_len = (ip->version_ihl & 0x0F) * 4; + uint16_t ip_len = rte_be_to_cpu_16(ip->total_length); + uint16_t l4_len = ip_len - ip_hdr_len; + + if (ip->next_proto_id == IPPROTO_ICMP) { + struct rte_icmp_hdr *icmp = (struct rte_icmp_hdr *)((char *)ip + ip_hdr_len); + icmp->icmp_cksum = 0; + icmp->icmp_cksum = checksum(icmp, l4_len); + } else if (ip->next_proto_id == IPPROTO_TCP) { + struct rte_tcp_hdr *tcp = (struct rte_tcp_hdr *)((char *)ip + ip_hdr_len); + tcp->cksum = 0; + tcp->cksum = rte_ipv4_udptcp_cksum(ip, tcp); + } else if (ip->next_proto_id == IPPROTO_UDP) { + struct rte_udp_hdr *udp = (struct rte_udp_hdr *)((char *)ip + ip_hdr_len); + udp->dgram_cksum = 0; + udp->dgram_cksum = rte_ipv4_udptcp_cksum(ip, udp); + } + } + + int ret = rte_eth_tx_burst(outgoing_port->port_id, queue_number, &tap_pkts[i], 1); + if (ret < 1) { + LOG_ERROR("Failed to send packet"); + rte_pktmbuf_free(tap_pkts[i]); + } } }