From 586ce40943dfb4793e20e633636fb50fdc3c9519 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Tue, 7 Jul 2026 18:26:22 +0300 Subject: [PATCH 1/9] coorect af_packet --- worker/src/dpdk_filter/ip_cache.c | 6 +++--- worker/src/dpdk_filter/net_port.c | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/worker/src/dpdk_filter/ip_cache.c b/worker/src/dpdk_filter/ip_cache.c index 2359a6d..07d3127 100644 --- a/worker/src/dpdk_filter/ip_cache.c +++ b/worker/src/dpdk_filter/ip_cache.c @@ -58,7 +58,7 @@ static int ip_str_to_key(const char *ip_str, struct ip_key *key) { static int load_ip_categories(const char *ip_str, struct node_cache_ip *node_ip) { const char *sql_cat = - "SELECT certain_category FROM categories_table WHERE ip_str = ?;"; + "SELECT certain_category FROM ip_categories_table WHERE ip_str = ?;"; sqlite3_stmt *stmt_cat = NULL; int rc_cat = sqlite3_prepare_v2(ip_cache_table, sql_cat, -1, &stmt_cat, NULL); if (rc_cat != SQLITE_OK) { @@ -243,7 +243,7 @@ static int insert_ip_main_record(const char *ip_str, } static int delete_ip_categories(const char *ip_str) { - const char *sql = "DELETE FROM categories_table WHERE ip_str = ?"; + const char *sql = "DELETE FROM ip_categories_table WHERE ip_str = ?"; sqlite3_stmt *stmt = NULL; int ret = sqlite3_prepare_v2(ip_cache_table, sql, -1, &stmt, NULL); if (ret != SQLITE_OK) { @@ -260,7 +260,7 @@ static int delete_ip_categories(const char *ip_str) { static int insert_ip_categories(const char *ip_str, struct node_cache_ip *node) { - const char *sql = "INSERT INTO categories_table (ip_str, " + const char *sql = "INSERT INTO ip_categories_table (ip_str, " "certain_category) VALUES (?, ?)"; sqlite3_stmt *stmt = NULL; int ret = sqlite3_prepare_v2(ip_cache_table, sql, -1, &stmt, NULL); diff --git a/worker/src/dpdk_filter/net_port.c b/worker/src/dpdk_filter/net_port.c index 21390ed..d538e19 100644 --- a/worker/src/dpdk_filter/net_port.c +++ b/worker/src/dpdk_filter/net_port.c @@ -69,9 +69,10 @@ struct net_port *init_struct_af_xdp_port(const char *iface_name, return NULL; } + snprintf(port->dev_name, sizeof(port->dev_name), "eth_af_packet_%s", iface_name); + snprintf(port->dev_args, sizeof(port->dev_args), - "iface=%s,start_queue=0,queue_count=1", iface_name); - snprintf(port->dev_name, sizeof(port->dev_name), "net_af_xdp_%s", iface_name); + "iface=%s,qpairs=3,blocksz=16384,framesz=2048,framecnt=4096", iface_name); strncpy(port->iface_name, iface_name, sizeof(port->iface_name) - 1); port->iface_name[sizeof(port->iface_name) - 1] = '\0'; port->mbuf_pool = mbuf_pool; From d3572c59907032c0141936e54d8db1a9fa3c8338 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Wed, 8 Jul 2026 17:19:53 +0300 Subject: [PATCH 2/9] feat: add L2 L3 proc --- worker/include/dpdk_filter/proc_packets.h | 8 +- worker/include/dpdk_filter/types.h | 4 + worker/src/dpdk_filter/net_port.c | 13 +++- worker/src/dpdk_filter/proc_packets.c | 89 ++++++++++++++++++----- worker/src/worker.cpp | 14 ++-- 5 files changed, 101 insertions(+), 27 deletions(-) diff --git a/worker/include/dpdk_filter/proc_packets.h b/worker/include/dpdk_filter/proc_packets.h index 3d12e2a..3d8281a 100644 --- a/worker/include/dpdk_filter/proc_packets.h +++ b/worker/include/dpdk_filter/proc_packets.h @@ -12,8 +12,14 @@ #include #include +void forward_packet_with_rewrite(struct rte_mbuf *pkt, + struct net_port *in_port, + struct net_port *out_port, + uint16_t queue_number); + void package_sending_decision(bool solution_is_send, struct rte_mbuf *pkt, - struct net_port *port_out, uint16_t queue_number); + struct net_port *port_in, struct net_port *port_out, + uint16_t queue_number); bool check_is_exception(uint16_t *port); diff --git a/worker/include/dpdk_filter/types.h b/worker/include/dpdk_filter/types.h index edc405a..c4590d5 100644 --- a/worker/include/dpdk_filter/types.h +++ b/worker/include/dpdk_filter/types.h @@ -4,6 +4,7 @@ #include "constants.h" #include #include +#include #ifdef DEBUG #define LOG_INFO(info, ...) \ @@ -41,6 +42,9 @@ struct net_port { char dev_name[64]; char dev_args[256]; struct rte_mempool *mbuf_pool; + struct rte_ether_addr mac_addr; + struct rte_ether_addr neighbor_mac; + bool neighbor_learned; }; struct info_of_pakage { diff --git a/worker/src/dpdk_filter/net_port.c b/worker/src/dpdk_filter/net_port.c index d538e19..b1e95a2 100644 --- a/worker/src/dpdk_filter/net_port.c +++ b/worker/src/dpdk_filter/net_port.c @@ -135,8 +135,17 @@ int net_port_init(struct net_port *port) { return ret; } - LOG_INFO("Port %u initialized", port_id); - return 0; + ret = rte_eth_macaddr_get(port_id, &port->mac_addr); + if (ret < 0) { + LOG_ERROR("Failed to macaddr get: %s", strerror(-ret)); + rte_vdev_uninit(dev_name); + return ret; + } + port->neighbor_learned = false; + LOG_INFO("Port %u initialized, MAC=%02x:%02x:%02x:%02x:%02x:%02x", port_id, + port->mac_addr.addr_bytes[0], port->mac_addr.addr_bytes[1], + port->mac_addr.addr_bytes[2], port->mac_addr.addr_bytes[3], + port->mac_addr.addr_bytes[4], port->mac_addr.addr_bytes[5]); return 0; } int net_port_start(uint16_t port_id) { diff --git a/worker/src/dpdk_filter/proc_packets.c b/worker/src/dpdk_filter/proc_packets.c index 72c1508..13b5f69 100644 --- a/worker/src/dpdk_filter/proc_packets.c +++ b/worker/src/dpdk_filter/proc_packets.c @@ -14,22 +14,75 @@ extern bool worker_classify(const char *type, const char *target, 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); +void learn_neighbor_mac(struct net_port *port, struct rte_mbuf *pkt) { + struct rte_ether_hdr *eth = rte_pktmbuf_mtod(pkt, struct rte_ether_hdr *); + if (!port->neighbor_learned) { + rte_ether_addr_copy(ð->src_addr, &port->neighbor_mac); + port->neighbor_learned = true; + LOG_INFO("Learned neighbor MAC on %s: %02x:%02x:%02x:%02x:%02x:%02x", + port->iface_name, port->neighbor_mac.addr_bytes[0], + port->neighbor_mac.addr_bytes[1], + port->neighbor_mac.addr_bytes[2], + port->neighbor_mac.addr_bytes[3], + port->neighbor_mac.addr_bytes[4], + port->neighbor_mac.addr_bytes[5]); + } +} - if (ret < 1) { - LOG_ERROR("Failed to send packet"); - record_packet_dropped(); - rte_pktmbuf_free(pkt); - return; +void forward_packet_with_rewrite(struct rte_mbuf *pkt, + struct net_port *in_port, + struct net_port *out_port, + uint16_t queue_number) { + struct rte_ether_hdr *eth = rte_pktmbuf_mtod(pkt, struct rte_ether_hdr *); + + // 1. Учим MAC-адрес соседа на входном порте + learn_neighbor_mac(in_port, pkt); + + // 2. Source MAC = MAC выходного порта + rte_ether_addr_copy(&out_port->mac_addr, ð->src_addr); + + // 3. Destination MAC = MAC соседа на выходном порте (если выучен) + if (out_port->neighbor_learned) { + rte_ether_addr_copy(&out_port->neighbor_mac, ð->dst_addr); + } else { + // Если не выучен — отправляем широковещательный пакет + struct rte_ether_addr broadcast = { .addr_bytes = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} }; + rte_ether_addr_copy(&broadcast, ð->dst_addr); + LOG_WARNING("Neighbor MAC not learned yet on %s, using broadcast", out_port->iface_name); + } + + // 4. Если это IPv4 — обновить TTL и IP-контрольную сумму + if (eth->ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4)) { + struct rte_ipv4_hdr *ip = (struct rte_ipv4_hdr *)((uint8_t *)eth + sizeof(struct rte_ether_hdr)); + + if (ip->time_to_live > 1) { + ip->time_to_live--; // Уменьшаем TTL + ip->hdr_checksum = 0; + ip->hdr_checksum = rte_ipv4_cksum(ip); // Пересчитываем IP-контрольную сумму + } else { + rte_pktmbuf_free(pkt); // TTL = 0 — дроп + return; + } } + // 5. Отправить пакет + struct rte_mbuf *tx_pkt[1] = {pkt}; + uint16_t ret = rte_eth_tx_burst(out_port->port_id, queue_number, tx_pkt, 1); + if (ret < 1) { + LOG_ERROR("Failed to send packet"); + record_packet_dropped(); + rte_pktmbuf_free(pkt); + } record_packet_passed(); +} +void package_sending_decision(bool solution_is_send, struct rte_mbuf *pkt, + struct net_port *port_in, struct net_port *port_out, + uint16_t queue_number) { + if (solution_is_send) { + // struct rte_mbuf *tx_pkt[1] = {pkt}; + forward_packet_with_rewrite(pkt, port_in, port_out, queue_number); + // uint16_t ret = rte_eth_tx_burst(port_out->port_id, queue_number, tx_pkt, 1); return; } @@ -62,7 +115,7 @@ void pakage_processing(struct net_port *port_in, struct net_port *port_out, if (atomic_load(&filtring_is_turned_off)) { for (int i = 0; i < nb_rx; i++) { record_packet_received(); - package_sending_decision(true, pkts[i], port_out, queue_number); + package_sending_decision(true, pkts[i], port_in, port_out, queue_number); } return; } @@ -84,7 +137,7 @@ void pakage_processing(struct net_port *port_in, struct net_port *port_out, if (check_is_exception(&info_pac.number_port) == true) { LOG_INFO("Exception port %hu, forwarding to exception port", ntohs(info_pac.number_port)); - package_sending_decision(true, pkts[i], port_exception, queue_number); + package_sending_decision(true, pkts[i], port_in, port_exception, queue_number); continue; } @@ -103,7 +156,7 @@ void pakage_processing(struct net_port *port_in, struct net_port *port_out, if (ret >= 0 && cached_node_ip) { LOG_INFO("IP cache hit, decision: %s", cached_node_ip->solution_is_send ? "send" : "drop"); - package_sending_decision(cached_node_ip->solution_is_send, pkts[i], + package_sending_decision(cached_node_ip->solution_is_send, pkts[i], port_in, port_out, queue_number); } else if (ret == -ENOENT) { LOG_INFO("IP cache miss, applying filter"); @@ -132,7 +185,7 @@ void pakage_processing(struct net_port *port_in, struct net_port *port_out, LOG_WARNING("Classification failed for IP %s", ip_str); } - package_sending_decision(solution_is_send, pkts[i], port_out, + package_sending_decision(solution_is_send, pkts[i], port_in, port_out, queue_number); struct node_cache_ip *new_node = @@ -169,7 +222,7 @@ void pakage_processing(struct net_port *port_in, struct net_port *port_out, if (check_is_exception(&info_pac.number_port) == true) { LOG_INFO("Exception port %hu, forwarding to exception port", ntohs(info_pac.number_port)); - package_sending_decision(true, pkts[i], port_exception, queue_number); + package_sending_decision(true, pkts[i], port_in, port_exception, queue_number); continue; } @@ -178,7 +231,7 @@ void pakage_processing(struct net_port *port_in, struct net_port *port_out, if (ret >= 0 && cached_node_domain) { LOG_INFO("Domain cache hit for '%s', decision: %s", info_pac.domain, cached_node_domain->solution_is_send ? "send" : "drop"); - package_sending_decision(cached_node_domain->solution_is_send, pkts[i], + package_sending_decision(cached_node_domain->solution_is_send, pkts[i], port_in, port_out, queue_number); } else if (ret == -ENOENT) { LOG_INFO("Domain cache miss for '%s', applying filter", @@ -198,7 +251,7 @@ void pakage_processing(struct net_port *port_in, struct net_port *port_out, LOG_WARNING("Classification failed for %s", info_pac.domain); } - package_sending_decision(solution_is_send, pkts[i], port_out, + package_sending_decision(solution_is_send, pkts[i], port_in, port_out, queue_number); struct node_cache_domain *new_node = diff --git a/worker/src/worker.cpp b/worker/src/worker.cpp index c6d4526..356dcea 100644 --- a/worker/src/worker.cpp +++ b/worker/src/worker.cpp @@ -145,12 +145,14 @@ void Worker::forward_to_out(struct net_port *incoming_port, uint16_t nb_tap = rte_eth_rx_burst(incoming_port->port_id, queue_number, tap_pkts, 32); 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"); - rte_pktmbuf_free(tap_pkts[i]); - } + forward_packet_with_rewrite(tap_pkts[i], incoming_port, outgoing_port, queue_number); + + // int ret = + // rte_eth_tx_burst(outgoing_port->port_id, queue_number, , 1); + // if (ret < 1) { + // spdlog::warn("Failed to send packet"); + // rte_pktmbuf_free(tap_pkts[i]); + // } } } From f026b51da081da407365d3fc0a77f4bbea06f3ab Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Thu, 9 Jul 2026 06:46:47 +0300 Subject: [PATCH 3/9] feat: added static mac --- worker/src/worker.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/worker/src/worker.cpp b/worker/src/worker.cpp index 356dcea..4a9d0a9 100644 --- a/worker/src/worker.cpp +++ b/worker/src/worker.cpp @@ -136,6 +136,16 @@ void Worker::initDPDK(int argc, char **argv) { spdlog::info("DPDK initialized: in_port={}, out_port={}", port_in->port_id, port_out->port_id); + + // Для port_out (если известен MAC PC2) + uint8_t pc2_mac[6] = {0xd8, 0x43, 0xae, 0x0e, 0xd8, 0xf5}; // замените на реальный MAC PC2 + rte_ether_addr_copy((struct rte_ether_addr*)pc2_mac, &port_out->neighbor_mac); + port_out->neighbor_learned = true; + + // Для port_in (если известен MAC PC1) + uint8_t pc1_mac[6] = {0xe8, 0x6a, 0x64, 0x65, 0x1c, 0x90}; // замените на реальный MAC PC1 + rte_ether_addr_copy((struct rte_ether_addr*)pc1_mac, &port_in->neighbor_mac); + port_in->neighbor_learned = true; } void Worker::forward_to_out(struct net_port *incoming_port, From 4fa9138ca24e49565b7931be32604e88d2268e85 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Mon, 27 Jul 2026 15:23:10 +0300 Subject: [PATCH 4/9] log: added log to size packet --- worker/src/dpdk_filter/proc_packets.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/worker/src/dpdk_filter/proc_packets.c b/worker/src/dpdk_filter/proc_packets.c index 13b5f69..d2305eb 100644 --- a/worker/src/dpdk_filter/proc_packets.c +++ b/worker/src/dpdk_filter/proc_packets.c @@ -67,6 +67,11 @@ void forward_packet_with_rewrite(struct rte_mbuf *pkt, // 5. Отправить пакет struct rte_mbuf *tx_pkt[1] = {pkt}; + printf("pkt_len=%u data_len=%u nb_segs=%u ol_flags=%lx\n", + pkt->pkt_len, + pkt->data_len, + pkt->nb_segs, + pkt->ol_flags); uint16_t ret = rte_eth_tx_burst(out_port->port_id, queue_number, tx_pkt, 1); if (ret < 1) { LOG_ERROR("Failed to send packet"); From bbeb6a69d779a6b0b1d44e2b84753cff4d620960 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Thu, 30 Jul 2026 14:16:43 +0300 Subject: [PATCH 5/9] feat: CORRECT AF_PACKET (auto mac_addr init) --- worker/src/dpdk_filter/proc_packets.c | 14 +++----------- worker/src/worker.cpp | 16 ---------------- 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/worker/src/dpdk_filter/proc_packets.c b/worker/src/dpdk_filter/proc_packets.c index d2305eb..56bff59 100644 --- a/worker/src/dpdk_filter/proc_packets.c +++ b/worker/src/dpdk_filter/proc_packets.c @@ -35,37 +35,31 @@ void forward_packet_with_rewrite(struct rte_mbuf *pkt, uint16_t queue_number) { struct rte_ether_hdr *eth = rte_pktmbuf_mtod(pkt, struct rte_ether_hdr *); - // 1. Учим MAC-адрес соседа на входном порте learn_neighbor_mac(in_port, pkt); - // 2. Source MAC = MAC выходного порта rte_ether_addr_copy(&out_port->mac_addr, ð->src_addr); - // 3. Destination MAC = MAC соседа на выходном порте (если выучен) if (out_port->neighbor_learned) { rte_ether_addr_copy(&out_port->neighbor_mac, ð->dst_addr); } else { - // Если не выучен — отправляем широковещательный пакет struct rte_ether_addr broadcast = { .addr_bytes = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} }; rte_ether_addr_copy(&broadcast, ð->dst_addr); LOG_WARNING("Neighbor MAC not learned yet on %s, using broadcast", out_port->iface_name); } - // 4. Если это IPv4 — обновить TTL и IP-контрольную сумму if (eth->ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4)) { struct rte_ipv4_hdr *ip = (struct rte_ipv4_hdr *)((uint8_t *)eth + sizeof(struct rte_ether_hdr)); if (ip->time_to_live > 1) { - ip->time_to_live--; // Уменьшаем TTL + ip->time_to_live--; ip->hdr_checksum = 0; - ip->hdr_checksum = rte_ipv4_cksum(ip); // Пересчитываем IP-контрольную сумму + ip->hdr_checksum = rte_ipv4_cksum(ip); } else { - rte_pktmbuf_free(pkt); // TTL = 0 — дроп + rte_pktmbuf_free(pkt); return; } } - // 5. Отправить пакет struct rte_mbuf *tx_pkt[1] = {pkt}; printf("pkt_len=%u data_len=%u nb_segs=%u ol_flags=%lx\n", pkt->pkt_len, @@ -85,9 +79,7 @@ void package_sending_decision(bool solution_is_send, struct rte_mbuf *pkt, struct net_port *port_in, struct net_port *port_out, uint16_t queue_number) { if (solution_is_send) { - // struct rte_mbuf *tx_pkt[1] = {pkt}; forward_packet_with_rewrite(pkt, port_in, port_out, queue_number); - // uint16_t ret = rte_eth_tx_burst(port_out->port_id, queue_number, tx_pkt, 1); return; } diff --git a/worker/src/worker.cpp b/worker/src/worker.cpp index 4a9d0a9..938fd17 100644 --- a/worker/src/worker.cpp +++ b/worker/src/worker.cpp @@ -136,16 +136,6 @@ void Worker::initDPDK(int argc, char **argv) { spdlog::info("DPDK initialized: in_port={}, out_port={}", port_in->port_id, port_out->port_id); - - // Для port_out (если известен MAC PC2) - uint8_t pc2_mac[6] = {0xd8, 0x43, 0xae, 0x0e, 0xd8, 0xf5}; // замените на реальный MAC PC2 - rte_ether_addr_copy((struct rte_ether_addr*)pc2_mac, &port_out->neighbor_mac); - port_out->neighbor_learned = true; - - // Для port_in (если известен MAC PC1) - uint8_t pc1_mac[6] = {0xe8, 0x6a, 0x64, 0x65, 0x1c, 0x90}; // замените на реальный MAC PC1 - rte_ether_addr_copy((struct rte_ether_addr*)pc1_mac, &port_in->neighbor_mac); - port_in->neighbor_learned = true; } void Worker::forward_to_out(struct net_port *incoming_port, @@ -157,12 +147,6 @@ void Worker::forward_to_out(struct net_port *incoming_port, for (int i = 0; i < nb_tap; i++) { forward_packet_with_rewrite(tap_pkts[i], incoming_port, outgoing_port, queue_number); - // int ret = - // rte_eth_tx_burst(outgoing_port->port_id, queue_number, , 1); - // if (ret < 1) { - // spdlog::warn("Failed to send packet"); - // rte_pktmbuf_free(tap_pkts[i]); - // } } } From d9f7f4e686c072abf2408670598b9d502617e0e0 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Thu, 30 Jul 2026 23:26:36 +0300 Subject: [PATCH 6/9] fix: fix_1 for learn neighbor mac --- worker/src/dpdk_filter/proc_packets.c | 29 +++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/worker/src/dpdk_filter/proc_packets.c b/worker/src/dpdk_filter/proc_packets.c index 56bff59..f2278a4 100644 --- a/worker/src/dpdk_filter/proc_packets.c +++ b/worker/src/dpdk_filter/proc_packets.c @@ -14,18 +14,21 @@ extern bool worker_classify(const char *type, const char *target, const uint16_t LIST_EXCEPTION_PORTS[LEN_LIST_EXCEPTION_PORTS] = {22}; -void learn_neighbor_mac(struct net_port *port, struct rte_mbuf *pkt) { +void learn_neighbor_mac(struct net_port *port, struct rte_mbuf *pkt, struct net_port *port_2) { struct rte_ether_hdr *eth = rte_pktmbuf_mtod(pkt, struct rte_ether_hdr *); if (!port->neighbor_learned) { - rte_ether_addr_copy(ð->src_addr, &port->neighbor_mac); - port->neighbor_learned = true; - LOG_INFO("Learned neighbor MAC on %s: %02x:%02x:%02x:%02x:%02x:%02x", - port->iface_name, port->neighbor_mac.addr_bytes[0], - port->neighbor_mac.addr_bytes[1], - port->neighbor_mac.addr_bytes[2], - port->neighbor_mac.addr_bytes[3], - port->neighbor_mac.addr_bytes[4], - port->neighbor_mac.addr_bytes[5]); + struct rte_ether_addr *neigh_mac = ð->src_addr; + if (neigh_mac != &port_2->mac_addr){ + rte_ether_addr_copy(neigh_mac, &port->neighbor_mac); + port->neighbor_learned = true; + LOG_INFO("Learned neighbor MAC on %s: %02x:%02x:%02x:%02x:%02x:%02x", + port->iface_name, port->neighbor_mac.addr_bytes[0], + port->neighbor_mac.addr_bytes[1], + port->neighbor_mac.addr_bytes[2], + port->neighbor_mac.addr_bytes[3], + port->neighbor_mac.addr_bytes[4], + port->neighbor_mac.addr_bytes[5]); + } } } @@ -35,7 +38,7 @@ void forward_packet_with_rewrite(struct rte_mbuf *pkt, uint16_t queue_number) { struct rte_ether_hdr *eth = rte_pktmbuf_mtod(pkt, struct rte_ether_hdr *); - learn_neighbor_mac(in_port, pkt); + learn_neighbor_mac(in_port, pkt, out_port); rte_ether_addr_copy(&out_port->mac_addr, ð->src_addr); @@ -139,7 +142,7 @@ void pakage_processing(struct net_port *port_in, struct net_port *port_out, } int ret; - struct ip_key key; + struct ip_key key = {0}; if (info_pac.ip_version == IP_4) { key.version = 4; key.addr.ip4 = info_pac.ip4_dist; @@ -195,7 +198,7 @@ void pakage_processing(struct net_port *port_in, struct net_port *port_out, new_node->solution_is_send = solution_is_send; - struct ip_key key; + struct ip_key key = {0}; if (info_pac.ip_version == IP_4) { key.version = 4; key.addr.ip4 = info_pac.ip4_dist; From 80a40377374974151ccc1a57e26fdd083eb36485 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Thu, 30 Jul 2026 23:40:23 +0300 Subject: [PATCH 7/9] fix: fix_2 for learn same neighbor mac --- worker/src/dpdk_filter/proc_packets.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worker/src/dpdk_filter/proc_packets.c b/worker/src/dpdk_filter/proc_packets.c index f2278a4..f9f4cc6 100644 --- a/worker/src/dpdk_filter/proc_packets.c +++ b/worker/src/dpdk_filter/proc_packets.c @@ -18,7 +18,7 @@ void learn_neighbor_mac(struct net_port *port, struct rte_mbuf *pkt, struct net_ struct rte_ether_hdr *eth = rte_pktmbuf_mtod(pkt, struct rte_ether_hdr *); if (!port->neighbor_learned) { struct rte_ether_addr *neigh_mac = ð->src_addr; - if (neigh_mac != &port_2->mac_addr){ + if (!rte_is_same_ether_addr(neigh_mac, &port_2->mac_addr) && !rte_is_same_ether_addr(neigh_mac, &port->mac_addr)){ rte_ether_addr_copy(neigh_mac, &port->neighbor_mac); port->neighbor_learned = true; LOG_INFO("Learned neighbor MAC on %s: %02x:%02x:%02x:%02x:%02x:%02x", From aa0a8fdffdd0dae19fc3881620e304cb39f661f4 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Fri, 31 Jul 2026 00:30:07 +0300 Subject: [PATCH 8/9] fix: fix count qpairs --- worker/src/dpdk_filter/net_port.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worker/src/dpdk_filter/net_port.c b/worker/src/dpdk_filter/net_port.c index b1e95a2..02adbca 100644 --- a/worker/src/dpdk_filter/net_port.c +++ b/worker/src/dpdk_filter/net_port.c @@ -72,7 +72,7 @@ struct net_port *init_struct_af_xdp_port(const char *iface_name, snprintf(port->dev_name, sizeof(port->dev_name), "eth_af_packet_%s", iface_name); snprintf(port->dev_args, sizeof(port->dev_args), - "iface=%s,qpairs=3,blocksz=16384,framesz=2048,framecnt=4096", iface_name); + "iface=%s,qpairs=1,blocksz=16384,framesz=2048,framecnt=4096", iface_name); strncpy(port->iface_name, iface_name, sizeof(port->iface_name) - 1); port->iface_name[sizeof(port->iface_name) - 1] = '\0'; port->mbuf_pool = mbuf_pool; From 2ac5e6d39858b3b9f8d076853ef4535797a480e9 Mon Sep 17 00:00:00 2001 From: LapshinAE0 Date: Fri, 31 Jul 2026 01:59:00 +0300 Subject: [PATCH 9/9] feat: deffine for select xdp or packet --- worker/src/dpdk_filter/net_port.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/worker/src/dpdk_filter/net_port.c b/worker/src/dpdk_filter/net_port.c index 02adbca..bad906a 100644 --- a/worker/src/dpdk_filter/net_port.c +++ b/worker/src/dpdk_filter/net_port.c @@ -69,10 +69,15 @@ struct net_port *init_struct_af_xdp_port(const char *iface_name, return NULL; } + #ifdef WITH_AF_PACKET snprintf(port->dev_name, sizeof(port->dev_name), "eth_af_packet_%s", iface_name); - snprintf(port->dev_args, sizeof(port->dev_args), "iface=%s,qpairs=1,blocksz=16384,framesz=2048,framecnt=4096", iface_name); + #else + snprintf(port->dev_args, sizeof(port->dev_args), "iface=%s,start_queue=0,queue_count=1", iface_name); + snprintf(port->dev_name, sizeof(port->dev_name), "net_af_xdp_%s", iface_name); + #endif + strncpy(port->iface_name, iface_name, sizeof(port->iface_name) - 1); port->iface_name[sizeof(port->iface_name) - 1] = '\0'; port->mbuf_pool = mbuf_pool;