<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I believe it might be fixed by adding payload parameters to flow_compose() instead of setting it to null like I did</p>
<p class="MsoNormal"><span style="font-size:12.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="border:none;padding:0in"><b>From: </b><a href="mailto:luca.mancini@outlook.com">Luca Mancini</a><br>
<b>Sent: </b>Tuesday, June 9, 2020 11:39<br>
<b>To: </b><a href="mailto:ovs-discuss@openvswitch.org">ovs-discuss@openvswitch.org</a><br>
<b>Subject: </b>strange behavior when i send DP_PACKET from userspace</p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hello,<o:p></o:p></p>
<p class="MsoNormal">I’m having problems with sending custom packets using the ofproto_dpif_send_packet().
<o:p></o:p></p>
<p class="MsoNormal">As said in the previoius thread <a href="https://mail.openvswitch.org/pipermail/ovs-discuss/2020-June/050204.html">
https://mail.openvswitch.org/pipermail/ovs-discuss/2020-June/050204.html</a> I thought to have correctly created a custom udp packet that contains as a payload a buffer of dp_packets this is the code:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">struct my_captured_packet<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    struct dp_packet packet;<o:p></o:p></p>
<p class="MsoNormal">    int sizeofpayload;<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal">static struct my_captured_packet dp_packet_buff1[PACKET_BUFF_ELEMENTS];<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//function to copy incoming packets to dp_packet_buff1<o:p></o:p></p>
<p class="MsoNormal">//…..<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//function part to send the buffer of packets as payload of new udp packet<o:p></o:p></p>
<p class="MsoNormal">struct dp_packet *packetAggr;<o:p></o:p></p>
<p class="MsoNormal">packetAggr = dp_packet_new(65535);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">struct flow flow;<o:p></o:p></p>
<p class="MsoNormal">//extract a flow from a buffed pkt<o:p></o:p></p>
<p class="MsoNormal">flow_extract(&dp_packet_buff1[0].packet, &flow);<o:p></o:p></p>
<p class="MsoNormal">//use the flow to build a new packet<o:p></o:p></p>
<p class="MsoNormal">flow_compose(packetAggr, &flow, NULL, 0);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//copy buffer as udp payload<o:p></o:p></p>
<p class="MsoNormal">memcpy((char *) dp_packet_l4(packetAggr) + UDP_HEADER_LEN, dp_packet_buff1, sizeof(dp_packet_buff1));<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//Then I reversed the procedure to see if I could extract the single packets from the payload of my custom packet<o:p></o:p></p>
<p class="MsoNormal">//struct my_captured_packet *recvdpackets = (struct my_captured_packet *) dp_packet_get_udp_payload(packetAggr);<o:p></o:p></p>
<p class="MsoNormal">//print dp_packet payloads extracted<o:p></o:p></p>
<p class="MsoNormal">        <o:p></o:p></p>
<p class="MsoNormal">for(int j=0; j<PACKET_BUFF_ELEMENTS; j++)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">            VLOG_ERR("payload #%d: %.*s with size of packet %d", j, recvdpackets[j].sizeofpayload, (char *) dp_packet_get_udp_payload(&recvdpackets[j].packet),<o:p></o:p></p>
<p class="MsoNormal">           (int) dp_packet_size(&recvdpackets[j].packet) );<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">const struct ofproto_dpif *ofproto = ctx->xin->ofproto;<o:p></o:p></p>
<p class="MsoNormal">const struct ofport_dpif *portAggr;<o:p></o:p></p>
<p class="MsoNormal">ofp_port_t out_port = 2;<o:p></o:p></p>
<p class="MsoNormal">portAggr = ofp_port_to_ofport(ofproto, out_port);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">ofproto_dpif_send_packet(portAggr, false,  packetAggr);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The above code works as intended, meaning after creating packetAggr and setting its payload to dp_packet_buff1 I can cast it back to its original type after retrieving it with dp_packet_get_udp_payload, and print the single packets.<o:p></o:p></p>
<p class="MsoNormal">However after I send this packet and do this same exact procedure as part of a new action that is intended to just extract the payload and single packets, the cast to struct my_captured_packet * doesn’t seem to work. The following is what
 gets printed on GDB:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//upon packet arrival, check the mac to see if it’s the packet intended for extraction<o:p></o:p></p>
<p class="MsoNormal">//print the packet<o:p></o:p></p>
<p class="MsoNormal">packet_recvd = dp_packet_clone (ctx->xin->packet);<o:p></o:p></p>
<p class="MsoNormal">VLOG_ERR("structure of pkt received: %s ", ofp_dp_packet_to_string(packet_recvd))<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Gdb <span style="font-family:Wingdings">à</span> structure of pkt received by deaggr: udp,vlan_tci=0x0000,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02,nw_src=10.0.0.1,nw_dst=10.0.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=47981,tp_dst=444
 udp_csum:2eb2<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//Extract the payload by casting<o:p></o:p></p>
<p class="MsoNormal">struct my_captured_packet *checkrecvd = (struct my_captured_packet *) dp_packet_get_udp_payload(packet_recvd);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">VLOG_ERR("structure of first packet extracted from buffer: %s with size_ of %d", ofp_dp_packet_to_string(&checkrecvdAggr[0].packet),  checkrecvdAggr[0].packet.size_);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Gdb<span style="font-family:Wingdings">à</span> structure of first packet extracted from buffer:  packet_type=(0x302c,0x646c) //this should be a normal structured dp_packet<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">with size_ of 21299712 //size seems abnormal<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I’ve tried this whole algorithm by sending a normal packet received without creating a new one and it works, so I’m guessing the problem is still in how I structure my custom packet, so my question is what am I missing in order to create
 a valid custom UDP packet that is sendable from OVS? Can I find examples anywhere in the codebase? I haven’t seen anything to be honest.
<o:p></o:p></p>
<p class="MsoNormal">Help is really needed! <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Luca<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>