<div dir="ltr"><div><p>Dear DPDK Team,</p><p>I am using DPDK 23.11 with an X540-AT (ixgbe) NIC.</p><p>I am facing an issue where this card is not compatible with a combination of two flow rules. To work around this, I attempted to create a single rule to redirect packets that match specific criteria to, let's say, queue 5. Initially, this works for a few packets, but after that, no more packets are received.</p><p>I am unsure whether this issue is related to the interrupts (though I’ve tested without interrupts and the problem persists) or not. I also thought that if queue 0 is full (since the drop rule is not functioning), the filter might stop working, so I tried clearing the queue to see if it would resolve the issue. However, even after that, the problem remains.</p><p>I am new to DPDK, so please let me know if I am doing something wrong or if there are any suggestions to address this issue.</p><p>Below is the code I have implemented:</p><br><div style="color:rgb(204,204,204);background-color:rgb(31,31,31);font-family:"Droid Sans Mono","monospace",monospace;font-weight:normal;font-size:14px;line-height:19px;white-space:pre"><div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)">"../include/flow.h"</span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)">"../include/port.h"</span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><stdio.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><string.h></span></div><br><div><span style="color:rgb(86,156,214)">int</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">flow_filtering</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(78,201,176)">uint32_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">ip_addr</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">udp_port</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_error</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">error</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_attr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">attr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> { .</span><span style="color:rgb(156,220,254)">ingress</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">, .</span><span style="color:rgb(156,220,254)">priority</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)"> };</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_item</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">4</span><span style="color:rgb(204,204,204)">];</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_action</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">2</span><span style="color:rgb(204,204,204)">];</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">flow</span><span style="color:rgb(204,204,204)">;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Définir le motif Ethernet</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">memset</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">sizeof</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">));</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(79,193,255)">RTE_FLOW_ITEM_TYPE_ETH</span><span style="color:rgb(204,204,204)">;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Définir le motif IPv4</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_item_ipv4</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">ipv4_spec</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> { .</span><span style="color:rgb(156,220,254)">hdr</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">dst_addr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">RTE_BE32</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">ip_addr</span><span style="color:rgb(204,204,204)">) };</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_item_ipv4</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">ipv4_mask</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> { .</span><span style="color:rgb(156,220,254)">hdr</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">dst_addr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">RTE_BE32</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(181,206,168)">0xFFFFFFFF</span><span style="color:rgb(204,204,204)">) };</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(79,193,255)">RTE_FLOW_ITEM_TYPE_IPV4</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">spec</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">ipv4_spec</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">mask</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">ipv4_mask</span><span style="color:rgb(204,204,204)">;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Définir le motif UDP</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_item_udp</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">udp_spec</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> { .</span><span style="color:rgb(156,220,254)">hdr</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">dst_port</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">RTE_BE16</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">udp_port</span><span style="color:rgb(204,204,204)">) };</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_item_udp</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">udp_mask</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> { .</span><span style="color:rgb(156,220,254)">hdr</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">dst_port</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">RTE_BE16</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(181,206,168)">0xFFFF</span><span style="color:rgb(204,204,204)">) };</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">2</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(79,193,255)">RTE_FLOW_ITEM_TYPE_UDP</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">2</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">spec</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">udp_spec</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">2</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">mask</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">udp_mask</span><span style="color:rgb(204,204,204)">;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Terminer le motif</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">3</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(79,193,255)">RTE_FLOW_ITEM_TYPE_END</span><span style="color:rgb(204,204,204)">;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Définir l'action</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(79,193,255)">RTE_FLOW_ACTION_TYPE_QUEUE</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_action_queue</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">queue_action</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> { .</span><span style="color:rgb(156,220,254)">index</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">RX_ID</span><span style="color:rgb(204,204,204)">   };</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">conf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">queue_action</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(79,193,255)">RTE_FLOW_ACTION_TYPE_END</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(220,220,170)">rte_flow_validate</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">attr</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">error</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">!=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Échec validation: </span><span style="color:rgb(156,220,254)">%s</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">error</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">message</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">-</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><div><span style="color:rgb(204,204,204)">    </span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Créer la règle de flux</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">flow</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_flow_create</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">attr</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">error</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">flow</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">==</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">NULL</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Erreur lors de la création de la règle de flux : </span><span style="color:rgb(156,220,254)">%s</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">error</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">message</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">-</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Règle de flux créée avec succès pour IP </span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)">.</span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)">.</span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)">.</span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)"> et port UDP </span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">           (</span><span style="color:rgb(156,220,254)">ip_addr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">>></span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">24</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0xFF</span><span style="color:rgb(204,204,204)">, (</span><span style="color:rgb(156,220,254)">ip_addr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">>></span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">16</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0xFF</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">           (</span><span style="color:rgb(156,220,254)">ip_addr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">>></span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">8</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0xFF</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">ip_addr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0xFF</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">udp_port</span><span style="color:rgb(204,204,204)">);</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">}</span></div><br><div><span style="color:rgb(86,156,214)">int</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">create_drop_all_rule</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow_error error;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow_attr attr </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> { .ingress </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">, .priority </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)"> };</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow_item </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">4</span><span style="color:rgb(204,204,204)">];</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow_action </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">2</span><span style="color:rgb(204,204,204)">];</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(204,204,204)">flow;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Définir le motif Ethernet</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">memset</span><span style="color:rgb(204,204,204)">(pattern, </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">sizeof</span><span style="color:rgb(204,204,204)">(pattern));</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> RTE_FLOW_ITEM_TYPE_ETH;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Définir le motif IPv4</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow_item_ipv4 ipv4_spec;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow_item_ipv4 ipv4_mask;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> RTE_FLOW_ITEM_TYPE_IPV4;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">spec</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)">ipv4_spec;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">mask</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)">ipv4_mask;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Définir le motif UDP</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow_item_udp udp_spec;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow_item_udp udp_mask;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">2</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> RTE_FLOW_ITEM_TYPE_UDP;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">2</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">spec</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)">udp_spec;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">2</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">mask</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)">udp_mask;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Terminer le motif</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">pattern</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">3</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> RTE_FLOW_ITEM_TYPE_END;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Définir l'action</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> RTE_FLOW_ACTION_TYPE_DROP;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_flow_action_queue queue_action;</span><span style="color:rgb(106,153,85)"> // temporary</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">conf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)">queue_action;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">action</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">].</span><span style="color:rgb(156,220,254)">type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> RTE_FLOW_ACTION_TYPE_END;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Validation & Création</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(220,220,170)">rte_flow_validate</span><span style="color:rgb(204,204,204)">(port_id, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)">attr, pattern, action, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)">error) </span><span style="color:rgb(212,212,212)">!=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Échec validation: </span><span style="color:rgb(156,220,254)">%s</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">error</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">message</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">-</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    flow </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_flow_create</span><span style="color:rgb(204,204,204)">(port_id, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)">attr, pattern, action, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(204,204,204)">error);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (flow </span><span style="color:rgb(212,212,212)">==</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">NULL</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Échec création: </span><span style="color:rgb(156,220,254)">%s</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">error</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">message</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">-</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Règle DROP créée.</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">}</span></div></div><div><span style="color:rgb(197,134,192)"><br></span></div><div><span style="color:rgb(197,134,192)"><br></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)">"../include/port.h"</span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><stdio.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><rte_arp.h></span></div><br><div><span style="color:rgb(106,153,85)">// Configuration par défaut du port</span></div><div><span style="color:rgb(86,156,214)">static</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_eth_conf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">port_conf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> {</span></div><div><span style="color:rgb(204,204,204)">    .</span><span style="color:rgb(156,220,254)">txmode</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> {</span></div><div><span style="color:rgb(204,204,204)">        .</span><span style="color:rgb(156,220,254)">mq_mode</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(79,193,255)">RTE_ETH_MQ_TX_NONE</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">    },</span></div><div><span style="color:rgb(204,204,204)">    .</span><span style="color:rgb(156,220,254)">rxmode</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> {</span></div><div><span style="color:rgb(204,204,204)">        .</span><span style="color:rgb(156,220,254)">offloads</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">RTE_ETH_RX_OFFLOAD_UDP_CKSUM</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">|</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">RTE_ETH_RX_OFFLOAD_IPV4_CKSUM</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">        .</span><span style="color:rgb(156,220,254)">mq_mode</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(79,193,255)">RTE_ETH_MQ_RX_NONE</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">        .</span><span style="color:rgb(156,220,254)">max_lro_pkt_size</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">9000</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">    },</span></div><div><span style="color:rgb(204,204,204)">    .</span><span style="color:rgb(156,220,254)">intr_conf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> {</span></div><div><span style="color:rgb(204,204,204)">        .</span><span style="color:rgb(156,220,254)">rxq</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><div><span style="color:rgb(204,204,204)">};</span></div><br><div><span style="color:rgb(86,156,214)">int</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">port_init</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_mempool</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">mbuf_pool</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">int</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_eth_dev_info</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">dev_info</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_eth_rxconf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">rxq_conf</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_eth_txconf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">txq_conf</span><span style="color:rgb(204,204,204)">;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Obtenir les informations sur le périphérique</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_dev_info_get</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">dev_info</span><span style="color:rgb(204,204,204)">);</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">!=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(86,156,214)">NUM_RX</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">></span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">dev_info</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">max_rx_queues</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Erreur: NUM_RX dépasse le maximum supporté (</span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)">)</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">dev_info</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">max_rx_queues</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">-</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Configurer le périphérique Ethernet</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_dev_configure</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">NUM_RX</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">NUM_TX</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">port_conf</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">!=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Configurer les queues RX</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">rxq_conf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">dev_info</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">default_rxconf</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">rxq_conf</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">offloads</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">port_conf</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">rxmode</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">offloads</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">for</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">int</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">; </span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">NUM_RX</span><span style="color:rgb(204,204,204)">; </span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(212,212,212)">++</span><span style="color:rgb(204,204,204)">){</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_rx_queue_setup</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">128</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(220,220,170)">rte_eth_dev_socket_id</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">), </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">rxq_conf</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">mbuf_pool</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">            </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">        }</span></div><br><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Configurer les queues TX</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">txq_conf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">dev_info</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">default_txconf</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">txq_conf</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">offloads</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">port_conf</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">txmode</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">offloads</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_tx_queue_setup</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">TX_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">128</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(220,220,170)">rte_eth_dev_socket_id</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">), </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">txq_conf</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Démarrer le périphérique Ethernet</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_dev_start</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">retval</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Activer le mode promiscuous (facultatif)</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// rte_eth_promiscuous_enable(port_id);</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Port </span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)"> initialisé avec succès</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">}</span></div><br><div><span style="color:rgb(86,156,214)">void</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">port_cleanup</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">rte_eth_dev_stop</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">rte_eth_dev_close</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Port </span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)"> arrêté et nettoyé</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">}</span></div><br><br><div><span style="color:rgb(86,156,214)">void</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">send_gratuitous_arp</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_mempool</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">mbuf_pool</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">const</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_ether_addr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">local_mac</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(78,201,176)">uint32_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">local_ip</span><span style="color:rgb(204,204,204)">)</span></div><div><span style="color:rgb(204,204,204)">{</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_mbuf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">mbuf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_pktmbuf_alloc</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">mbuf_pool</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(212,212,212)">!</span><span style="color:rgb(156,220,254)">mbuf</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">fprintf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">stderr</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Failed to allocate mbuf</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">const</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">pkt_size</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">sizeof</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_ether_hdr</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">+</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">sizeof</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_arp_hdr</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">const</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">min_frame_size</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">60</span><span style="color:rgb(204,204,204)">;</span><span style="color:rgb(106,153,85)"> // Minimum Ethernet frame size without FCS</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">padding</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">pkt_size</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">min_frame_size</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">?</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">min_frame_size</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">-</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">pkt_size</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">:</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">char</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">pkt_data</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_pktmbuf_append</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">mbuf</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">pkt_size</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">+</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">padding</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(212,212,212)">!</span><span style="color:rgb(156,220,254)">pkt_data</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">fprintf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">stderr</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Failed to append data in mbuf</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_pktmbuf_free</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">mbuf</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Zero out padding space</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">padding</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">></span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">memset</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">pkt_data</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">+</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">pkt_size</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">padding</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Ethernet Header</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_ether_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">eth_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_ether_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(204,204,204)">)</span><span style="color:rgb(156,220,254)">pkt_data</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">rte_ether_addr_copy</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">local_mac</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">eth_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">src_addr</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">memset</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">eth_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">dst_addr</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">0xFF</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">RTE_ETHER_ADDR_LEN</span><span style="color:rgb(204,204,204)">);</span><span style="color:rgb(106,153,85)"> // Broadcast MAC</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">eth_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">ether_type</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">rte_cpu_to_be_16</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">RTE_ETHER_TYPE_ARP</span><span style="color:rgb(204,204,204)">);</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// ARP Header</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_arp_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_arp_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(204,204,204)">)(</span><span style="color:rgb(156,220,254)">pkt_data</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">+</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">sizeof</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_ether_hdr</span><span style="color:rgb(204,204,204)">));</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">arp_hardware</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">rte_cpu_to_be_16</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">RTE_ARP_HRD_ETHER</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">arp_protocol</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">rte_cpu_to_be_16</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">RTE_ETHER_TYPE_IPV4</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">arp_hlen</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">RTE_ETHER_ADDR_LEN</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">arp_plen</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">4</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">arp_opcode</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">rte_cpu_to_be_16</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">RTE_ARP_OP_REQUEST</span><span style="color:rgb(204,204,204)">);</span><span style="color:rgb(106,153,85)">  // Correcting this to request</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Sender MAC/IP</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">rte_ether_addr_copy</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">local_mac</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">arp_data</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">arp_sha</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">arp_data</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">arp_sip</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">rte_cpu_to_be_32</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">local_ip</span><span style="color:rgb(204,204,204)">);</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Target MAC/IP (ARP request with the same IP as source)</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">memset</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">arp_data</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">arp_tha</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">RTE_ETHER_ADDR_LEN</span><span style="color:rgb(204,204,204)">);</span><span style="color:rgb(106,153,85)"> // Unknown target MAC</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">arp_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">arp_data</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">arp_tip</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">rte_cpu_to_be_32</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">local_ip</span><span style="color:rgb(204,204,204)">);</span><span style="color:rgb(106,153,85)">    // Target IP = Our own IP</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Transmit</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_mbuf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">tx_pkts</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">];</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">tx_pkts</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">] </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">mbuf</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">nb_tx</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_tx_burst</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">TX_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">tx_pkts</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">);</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">nb_tx</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">rte_pktmbuf_free</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">mbuf</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Failed to send Gratuitous ARP</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    } </span><span style="color:rgb(197,134,192)">else</span><span style="color:rgb(204,204,204)"> {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Gratuitous ARP sent successfully</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><div><span style="color:rgb(204,204,204)">}<br><br><br></span><div style="color:rgb(204,204,204);background-color:rgb(31,31,31);font-family:"Droid Sans Mono","monospace",monospace;font-weight:normal;font-size:14px;line-height:19px;white-space:pre"><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)">"../include/flow.h"</span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)">"../include/port.h"</span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><unistd.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><rte_eal.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><rte_mbuf.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><rte_ethdev.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><rte_ether.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><rte_ip.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><arpa/inet.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><sys/epoll.h></span></div><br><div><span style="color:rgb(197,134,192)">#define</span><span style="color:rgb(86,156,214)"> MAX_PKT_BURST </span><span style="color:rgb(181,206,168)">32</span></div><div><span style="color:rgb(197,134,192)">#define</span><span style="color:rgb(86,156,214)"> IP_ADDR </span><span style="color:rgb(220,220,170)">RTE_IPV4</span><span style="color:rgb(86,156,214)">(</span><span style="color:rgb(181,206,168)">10</span><span style="color:rgb(86,156,214)">, </span><span style="color:rgb(181,206,168)">81</span><span style="color:rgb(86,156,214)">, </span><span style="color:rgb(181,206,168)">16</span><span style="color:rgb(86,156,214)">, </span><span style="color:rgb(181,206,168)">111</span><span style="color:rgb(86,156,214)">)</span></div><div><span style="color:rgb(197,134,192)">#define</span><span style="color:rgb(86,156,214)"> UDP_PORT </span><span style="color:rgb(181,206,168)">1234</span></div><br><div><span style="color:rgb(86,156,214)">void</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">clear_rx_queue</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">port_id</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">rx_id</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_mbuf </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">bufs</span><span style="color:rgb(204,204,204)">[MAX_PKT_BURST];</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">uint16_t</span><span style="color:rgb(204,204,204)"> nb_rx;</span></div><br><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">while</span><span style="color:rgb(204,204,204)"> ((nb_rx </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_rx_burst</span><span style="color:rgb(204,204,204)">(port_id, rx_id, bufs, MAX_PKT_BURST)) </span><span style="color:rgb(212,212,212)">></span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">for</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(86,156,214)">uint16_t</span><span style="color:rgb(204,204,204)"> i </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">; i </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> nb_rx; i</span><span style="color:rgb(212,212,212)">++</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">            </span><span style="color:rgb(220,220,170)">rte_pktmbuf_free</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">bufs</span><span style="color:rgb(204,204,204)">[i]);</span></div><div><span style="color:rgb(204,204,204)">        }</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><div><span style="color:rgb(204,204,204)">}</span></div><br><div><span style="color:rgb(86,156,214)">int</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">main</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">int</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">argc</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">char</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">**</span><span style="color:rgb(156,220,254)">argv</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_mempool</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">mbuf_pool</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_ether_addr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">local_mac</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_epoll_event</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">event</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">];</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_flow_error</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">error</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">int</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">n</span><span style="color:rgb(204,204,204)">;</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Initialize EAL</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eal_init</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">argc</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">argv</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"EAL initialization failed</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Create mbuf pool</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">mbuf_pool</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_pktmbuf_pool_create</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"MBUF_POOL"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">NUM_MBUFS</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">MBUF_CACHE_SIZE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">                                        </span><span style="color:rgb(86,156,214)">RTE_MBUF_DEFAULT_BUF_SIZE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(220,220,170)">rte_socket_id</span><span style="color:rgb(204,204,204)">());</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">mbuf_pool</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">==</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">NULL</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Cannot create mbuf pool</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Initialize port</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(220,220,170)">port_init</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">mbuf_pool</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">!=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Port initialization failed</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// Get MAC address</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_macaddr_get</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">local_mac</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">!=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Failed to get MAC address</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">send_gratuitous_arp</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">mbuf_pool</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">local_mac</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">IP_ADDR</span><span style="color:rgb(204,204,204)">);</span></div><br><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(220,220,170)">flow_filtering</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">IP_ADDR</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">UDP_PORT</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">!=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Flow rule creation failed</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// // Créer la règle drop-all</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// if (create_drop_all_rule(PORT_ID) != 0) {</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">//     rte_exit(EXIT_FAILURE, "Erreur création règle drop-all\n");</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(106,153,85)">// }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_dev_rx_intr_enable</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">RX_ID</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Failed to enable RX interrupts</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">int</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">intr_fd</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_dev_rx_intr_ctl_q_get_fd</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">RX_ID</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">intr_fd</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Failed to get interrupt fd</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_epoll_event</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">ev</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> {</span></div><div><span style="color:rgb(204,204,204)">        .</span><span style="color:rgb(156,220,254)">epdata</span><span style="color:rgb(204,204,204)">.</span><span style="color:rgb(156,220,254)">event</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">EPOLLIN</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">|</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">EPOLLET</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">        .</span><span style="color:rgb(156,220,254)">fd</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">intr_fd</span></div><div><span style="color:rgb(204,204,204)">    };</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_epoll_ctl</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">RTE_EPOLL_PER_THREAD</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">EPOLL_CTL_ADD</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">intr_fd</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">ev</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Failed to add fd to epoll</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Processing packets...</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_mbuf</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">bufs</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(86,156,214)">MAX_PKT_BURST</span><span style="color:rgb(204,204,204)">];</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">while</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">) {        </span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">rx_count</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_rx_queue_count</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Paquets dans la RX queue 0: </span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">rx_count</span><span style="color:rgb(204,204,204)">);</span></div><br><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(156,220,254)">rx_count</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_rx_queue_count</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">RX_ID</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Paquets dans la RX queue 5: </span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">rx_count</span><span style="color:rgb(204,204,204)">);</span></div><br><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(106,153,85)">// Wait for interrupt</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(156,220,254)">n</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_epoll_wait</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">RTE_EPOLL_PER_THREAD</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">event</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">5000</span><span style="color:rgb(204,204,204)">);</span><span style="color:rgb(106,153,85)"> // 5 secondes</span></div><br><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">n</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">             </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(86,156,214)">errno</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">==</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">EINTR</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">                </span><span style="color:rgb(197,134,192)">continue</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">            }</span></div><div><span style="color:rgb(204,204,204)">            </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Epoll wait failed: </span><span style="color:rgb(156,220,254)">%s</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(220,220,170)">strerror</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">errno</span><span style="color:rgb(204,204,204)">));</span></div><div><span style="color:rgb(204,204,204)">        }</span></div><br><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(106,153,85)">// Clear any pending interrupts</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">rte_eth_dev_rx_intr_disable</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">RX_ID</span><span style="color:rgb(204,204,204)">);</span></div><br><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(106,153,85)">// Process packets</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">do</span><span style="color:rgb(204,204,204)"> {</span></div><div><span style="color:rgb(204,204,204)">            </span></div><div><span style="color:rgb(204,204,204)">            </span><span style="color:rgb(86,156,214)">const</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">nb_rx</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_rx_burst</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">RX_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">bufs</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">MAX_PKT_BURST</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">            </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">nb_rx</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">==</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(197,134,192)">break</span><span style="color:rgb(204,204,204)">;</span></div><br><br><div><span style="color:rgb(204,204,204)">            </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Received </span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)"> packet(s)</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">nb_rx</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">            </span><span style="color:rgb(197,134,192)">for</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(78,201,176)">uint16_t</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">; </span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">nb_rx</span><span style="color:rgb(204,204,204)">; </span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(212,212,212)">++</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">                </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_ether_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">eth_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">rte_pktmbuf_mtod</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">bufs</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(204,204,204)">], </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> rte_ether_hdr </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">                </span></div><div><span style="color:rgb(204,204,204)">                </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(86,156,214)">rte_be_to_cpu_16</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">eth_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">ether_type</span><span style="color:rgb(204,204,204)">) </span><span style="color:rgb(212,212,212)">==</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(86,156,214)">RTE_ETHER_TYPE_IPV4</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">                    </span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_ipv4_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(156,220,254)">ip_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(86,156,214)">struct</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(78,201,176)">rte_ipv4_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">*</span><span style="color:rgb(204,204,204)">)(</span><span style="color:rgb(156,220,254)">eth_hdr</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">+</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">                    </span><span style="color:rgb(86,156,214)">char</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">src_str</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(86,156,214)">INET_ADDRSTRLEN</span><span style="color:rgb(204,204,204)">];</span></div><div><span style="color:rgb(204,204,204)">                    </span><span style="color:rgb(86,156,214)">char</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(156,220,254)">dst_str</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(86,156,214)">INET_ADDRSTRLEN</span><span style="color:rgb(204,204,204)">];</span></div><div><span style="color:rgb(204,204,204)">                    </span></div><div><span style="color:rgb(204,204,204)">                    </span><span style="color:rgb(220,220,170)">inet_ntop</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">AF_INET</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">ip_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">src_addr</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">src_str</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">INET_ADDRSTRLEN</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">                    </span><span style="color:rgb(220,220,170)">inet_ntop</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">AF_INET</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">ip_hdr</span><span style="color:rgb(204,204,204)">-></span><span style="color:rgb(156,220,254)">dst_addr</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">dst_str</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">INET_ADDRSTRLEN</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">                    </span></div><div><span style="color:rgb(204,204,204)">                    </span><span style="color:rgb(220,220,170)">printf</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(206,145,120)">"Received IPv4 packet: </span><span style="color:rgb(156,220,254)">%s</span><span style="color:rgb(206,145,120)"> -> </span><span style="color:rgb(156,220,254)">%s</span><span style="color:rgb(206,145,120)">, Size: </span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)"> bytes</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">,</span></div><div><span style="color:rgb(204,204,204)">                           </span><span style="color:rgb(156,220,254)">src_str</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(156,220,254)">dst_str</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">rte_pktmbuf_pkt_len</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">bufs</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(204,204,204)">]));</span></div><div><span style="color:rgb(204,204,204)">                }</span></div><div><span style="color:rgb(204,204,204)">                </span></div><div><span style="color:rgb(204,204,204)">                </span><span style="color:rgb(220,220,170)">rte_pktmbuf_free</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(156,220,254)">bufs</span><span style="color:rgb(204,204,204)">[</span><span style="color:rgb(156,220,254)">i</span><span style="color:rgb(204,204,204)">]);</span></div><div><span style="color:rgb(204,204,204)">            }</span></div><div><span style="color:rgb(204,204,204)">        } </span><span style="color:rgb(197,134,192)">while</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(181,206,168)">1</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(220,220,170)">clear_rx_queue</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">);</span></div><br><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)">=</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(220,220,170)">rte_eth_dev_rx_intr_enable</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(86,156,214)">RX_ID</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(204,204,204)"> (</span><span style="color:rgb(156,220,254)">ret</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(212,212,212)"><</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">) {</span></div><div><span style="color:rgb(204,204,204)">            </span><span style="color:rgb(220,220,170)">rte_exit</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">EXIT_FAILURE</span><span style="color:rgb(204,204,204)">, </span><span style="color:rgb(206,145,120)">"Failed to re-enable RX interrupts</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">        }</span></div><div><span style="color:rgb(204,204,204)">    }</span></div><br><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">rte_flow_flush</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">,  </span><span style="color:rgb(212,212,212)">&</span><span style="color:rgb(156,220,254)">error</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">port_cleanup</span><span style="color:rgb(204,204,204)">(</span><span style="color:rgb(86,156,214)">PORT_ID</span><span style="color:rgb(204,204,204)">);</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(220,220,170)">rte_eal_cleanup</span><span style="color:rgb(204,204,204)">();</span></div><div><span style="color:rgb(204,204,204)">    </span><span style="color:rgb(197,134,192)">return</span><span style="color:rgb(204,204,204)"> </span><span style="color:rgb(181,206,168)">0</span><span style="color:rgb(204,204,204)">;</span></div><div><span style="color:rgb(204,204,204)">}</span></div></div></div></div></div><div><br></div><div>Best regards,<br></div><div>SidAli<br></div></div>