Hi, Anatoly, Vladimir - Would you be able to help with the issue regarding DROP action not being supported on X540-AT2?
Best regards, Dariusz Sosnowski > From: Sid ali cherrati <scherra...@gmail.com> > Sent: Monday, February 3, 2025 18:12 > To: Dmitry Kozlyuk <dmitry.kozl...@gmail.com> > Cc: users@dpdk.org > Subject: Re: DPDK Flow Filtering Not Working as Expected > > External email: Use caution opening links or attachments > > Here is a better version of the code : > > #include > "../include/flow.h" > > #include > <stdio.h> > > #include > <string.h> > > > > int > flow_filtering(uint16_t > port_id, > uint32_t > ip_addr, > uint16_t > udp_port) { > > struct > rte_flow_error > error; > > struct > rte_flow_attr > attr > = { .ingress > = > 1, .priority > = > 0 }; > > struct > rte_flow_item > pattern[4]; > > struct > rte_flow_action > action[2]; > > struct > rte_flow > *flow; > > > > // Définir le motif Ethernet > > memset(pattern, > 0, > sizeof(pattern)); > > pattern[0].type > = > RTE_FLOW_ITEM_TYPE_ETH; > > > > // Définir le motif IPv4 > > struct > rte_flow_item_ipv4 > ipv4_spec > = { .hdr.dst_addr > = > RTE_BE32(ip_addr) }; > > struct > rte_flow_item_ipv4 > ipv4_mask > = { .hdr.dst_addr > = > RTE_BE32(0xFFFFFFFF) }; > > pattern[1].type > = > RTE_FLOW_ITEM_TYPE_IPV4; > > pattern[1].spec > = > &ipv4_spec; > > pattern[1].mask > = > &ipv4_mask; > > > > // Définir le motif UDP > > struct > rte_flow_item_udp > udp_spec > = { .hdr.dst_port > = > RTE_BE16(udp_port) }; > > struct > rte_flow_item_udp > udp_mask > = { .hdr.dst_port > = > RTE_BE16(0xFFFF) }; > > pattern[2].type > = > RTE_FLOW_ITEM_TYPE_UDP; > > pattern[2].spec > = > &udp_spec; > > pattern[2].mask > = > &udp_mask; > > > > // Terminer le motif > > pattern[3].type > = > RTE_FLOW_ITEM_TYPE_END; > > > > // Définir l'action > > action[0].type > = > RTE_FLOW_ACTION_TYPE_QUEUE; > > struct > rte_flow_action_queue > queue_action > = { .index > = > 0 }; > > action[0].conf > = > &queue_action; > > action[1].type > = > RTE_FLOW_ACTION_TYPE_END; > > > > // Créer la règle de flux > > flow > = > rte_flow_create(port_id, > &attr, > pattern, > action, > &error); > > if (flow > == > NULL) { > > printf("Erreur lors de la création de la règle de flux : > %s\n", > error.message); > > return > -1; > > } > > > > printf("Règle de flux créée avec succès pour IP > %u.%u.%u.%u > et port UDP %u\n", > > (ip_addr > >> > 24) > & > 0xFF, (ip_addr > >> > 16) > & > 0xFF, > > (ip_addr > >> > 8) > & > 0xFF, > ip_addr > & > 0xFF, > udp_port); > > > > return > 0; > > } > > > > int > create_drop_all_rule(uint16_t > port_id) { > > struct > rte_flow_attr > attr > = { .ingress > = > 1, .priority > = > 1 }; > > struct > rte_flow_item > pattern[2]; > > struct > rte_flow_action > actions[2]; > > struct > rte_flow > *flow > = > NULL; > > struct > rte_flow_error > error; > > > > pattern[0].type > = > RTE_FLOW_ITEM_TYPE_ETH; > > pattern[1].type > = > RTE_FLOW_ITEM_TYPE_END; > > > > // Actions > > actions[0].type > = > RTE_FLOW_ACTION_TYPE_DROP; > > actions[0].conf > = > NULL; > > actions[1].type > = > RTE_FLOW_ACTION_TYPE_END; > > > > // Validation & Création > > if (rte_flow_validate(port_id, > &attr, > pattern, > actions, > &error) > != > 0) { > > printf("Échec validation: > %s\n", > error.message); > > return > -1; > > } > > > > flow > = > rte_flow_create(port_id, > &attr, > pattern, > actions, > &error); > > if (flow > == > NULL) { > > printf("Échec création: > %s\n", > error.message); > > return > -1; > > } > > > > printf("Règle DROP créée.\n"); > > return > 0; > > } > > > > > > > Le lun. 3 févr. 2025 à 16:05, Sid ali cherrati <mailto:scherra...@gmail.com> > a écrit : > I pointed where the error is occurring on the code below : > #include "../include/flow.h" > #include <stdio.h> > #include <string.h> > > int flow_filtering(uint16_t port_id, uint32_t ip_addr, uint16_t udp_port) { > struct rte_flow_error error; > struct rte_flow_attr attr = { .ingress = 1, .priority = 0 }; > struct rte_flow_item pattern[4]; > struct rte_flow_action action[2]; > struct rte_flow *flow; > > // Définir le motif Ethernet > memset(pattern, 0, sizeof(pattern)); > pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH; > > // Définir le motif IPv4 > struct rte_flow_item_ipv4 ipv4_spec = { .hdr.dst_addr = RTE_BE32(ip_addr) }; > struct rte_flow_item_ipv4 ipv4_mask = { .hdr.dst_addr = RTE_BE32(0xFFFFFFFF) > }; > pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4; > pattern[1].spec = &ipv4_spec; > pattern[1].mask = &ipv4_mask; > > // Définir le motif UDP > struct rte_flow_item_udp udp_spec = { .hdr.dst_port = RTE_BE16(udp_port) }; > struct rte_flow_item_udp udp_mask = { .hdr.dst_port = RTE_BE16(0xFFFF) }; > pattern[2].type = RTE_FLOW_ITEM_TYPE_UDP; > pattern[2].spec = &udp_spec; > pattern[2].mask = &udp_mask; > > // Terminer le motif > pattern[3].type = RTE_FLOW_ITEM_TYPE_END; > > // Définir l'action > action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE; > struct rte_flow_action_queue queue_action = { .index = 0 }; > action[0].conf = &queue_action; > action[1].type = RTE_FLOW_ACTION_TYPE_END; > > // Créer la règle de flux > flow = rte_flow_create(port_id, &attr, pattern, action, &error); > if (!flow) { > printf("Erreur lors de la création de la règle de flux : %s\n", > error.message); > return -1; > } > > printf("Règle de flux créée avec succès pour IP %u.%u.%u.%u et port UDP %u\n", > (ip_addr >> 24) & 0xFF, (ip_addr >> 16) & 0xFF, > (ip_addr >> 8) & 0xFF, ip_addr & 0xFF, udp_port); > > return 0; > } > > int create_drop_all_rule(uint16_t port_id) { > struct rte_flow_attr attr = { .ingress = 1, .priority = 1}; > struct rte_flow_item pattern[2]; > struct rte_flow_action actions[2]; > struct rte_flow *flow; > struct rte_flow_error error; > > pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH; > pattern[1].type = RTE_FLOW_ITEM_TYPE_END; > > actions[0].type = RTE_FLOW_ACTION_TYPE_DROP; > actions[1].type = RTE_FLOW_ACTION_TYPE_END; > > if (!rte_flow_validate(port_id, &attr, pattern, actions, &error)){ > flow = rte_flow_create(port_id, &attr, pattern, actions, &error); > } > > if (flow != 0) { // Its happening Here <--- !!! ---> > printf("Erreur création règle DROP: %s (Type: %d, Cause: %p)\n", > error.message, error.type, error.cause); > return -1; > } > > printf("Default drop rule created successfully.\n"); > return 0; > } > > Here is what it returns : > EAL: Detected CPU lcores: 6 > EAL: Detected NUMA nodes: 1 > EAL: Detected shared linkage of DPDK > EAL: Multi-process socket /var/run/dpdk/rte/mp_socket > EAL: Selected IOVA mode 'VA' > EAL: VFIO support initialized > EAL: Using IOMMU type 1 (Type 1) > Port 0 initialisé avec succès > Capacités de la NIC (port 0): > - Groupes supportés : 232756 > - Actions supportées : 9a69f > Règle de flux créée avec succès pour IP 10.81.16.111 et port UDP 1234 > Erreur création règle DROP: Not supported action. (Type: 16, Cause: > 0x7ffe87ef63e0) > EAL: Error - exiting with code: 1 > Erreur création règle drop-all > > Le lun. 3 févr. 2025 à 16:00, Dmitry Kozlyuk > <mailto:dmitry.kozl...@gmail.com> a écrit : > 2025-02-03 14:51 (UTC+0100), Sid ali cherrati: > > [...] > > if (!rte_flow_validate(port_id, &attr, pattern, actions, &error)){ > > flow = rte_flow_create(port_id, &attr, pattern, actions, &error); > > } > > > > if(flow != 0){ > > printf("Filed to create drop flow filter \n"); > > return -1; > > } > > [...] > > The issue is that when I implement this, I get an error on the drop filter: > > "Failed to create rule." Do you have any idea why this might be happening? > > There is no this exact error text in your code or DPDK, > I assume we're talking about the quoted fragment. > `flow` is a pointer, the correct error condition is `if (flow == NULL)`, > so your code probably misinterprets success as error. > Also `flow` is not assigned if `rte_flow_validate()` returns non-0.