[ovs-discuss] DP_Packet Payload Modification

Luca Mancini luca.mancini at outlook.com
Sat Jun 6 13:40:36 UTC 2020


UPDATE:
I made a mistake when calculating the size of the dummy string  when adding it with dp_packet_put, if I change it to
char payload [] = “hello world”
everything works fine, however if I add the actual buffer of packets as its payload (instead of the dummy string), when printing the packets some packet fields are zeroed out, even though the extraction works….

Packet structure when I do
dp_packet_put(packetAggr, dummystring, sizeof dummystring);
packetaggr: 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=33199,tp_dst=444 udp_csum:6870

Packet structure when I do
dp_packet_put(packetAggr, dp_packet_buff1, sizeof dp_packet_buff1);
packetaggr: ip,vlan_tci=0x0000,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02,nw_src=0.0.0.0,nw_dst=0.0.0.0,nw_proto=0,nw_tos=0,nw_ecn=0,nw_ttl=0

starting from nw_src everything is zeroed out, so it makes me think it’s getting overwritten, but the payload is extracted correctly with dp_packet_get_udp_paylaod meaning the payload is most likely aligned correctly. Any thoughts of what is happening?



Luca

From: Luca Mancini<mailto:luca.mancini at outlook.com>
Sent: Saturday, June 6, 2020 11:08
To: Gregory Rose<mailto:gvrose8192 at gmail.com>
Cc: ovs-discuss at openvswitch.org<mailto:ovs-discuss at openvswitch.org>
Subject: Re: [ovs-discuss] DP_Packet Payload Modification

Hi Greg,
Here’s the devil!
This is from the file ofproto-dpif-xlate.c, my whole action for now is implemented in userspace

#define UDP_MAX_PAYLOAD_SIZE 65507
#define PACKET_BUFF_ELEMENTS 5
static int index1;
static struct my_captured_packet dp_packet_buff1[PACKET_BUFF_ELEMENTS];

struct my_captured_packet
{
    struct dp_packet packet;
    int sizeofpayload;
};
compose_buffr_action(struct xlate_ctx *ctx)
{
    //creates the buffer of packet
    if(index1 < 5 && ctx->xin->packet)
    {
        //clone incoming packet
        struct dp_packet *packet_to_store = dp_packet_clone(ctx->xin->packet);

        //build my_captured_packet array using dp_packet (not the pointer) and the payload size
        dp_packet_buff1[index1].packet = *packet_to_store;
        dp_packet_buff1[index1].sizeofpayload = dp_packet_l4_size(ctx->xin->packet) - UDP_HEADER_LEN;

        //print payload taking into account its size otherwiseugly memory overlap occurs
       VLOG_ERR("%.*s",dp_packet_buff1[index1].sizeofpayload, (char *) dp_packet_get_udp_payload(&dp_packet_buff1[index1].packet));
        index1++;
    }
    //create custom packet to send
    if(index1 == 5 )
    {
        index1 = 0;
        struct dp_packet *packetAggr;
        packetAggr = dp_packet_new(UDP_MAX_PAYLOAD_SIZE);

        struct flow flow;
        flow_extract(&dp_packet_buff1[0].packet, &flow);

        char * payload = "hello world";
        flow_compose(packetAggr, &flow, NULL, 0);
        dp_packet_put(packetAggr, payload, sizeof payload);

       int s = dp_packet_l4_size(packetAggr) - UDP_HEADER_LEN; //get length of payload to print
       VLOG_ERR("udp_pay of l4 of packet aggr: %.*s", s , (char *) dp_packet_get_udp_payload(packetAggr)); //prints “hello w”

        //extract buffer from custom packet print packets after extraction to see if I can retrieve the single dp_packets, commented out for now
       /*
       struct my_captured_packet *recvdpackets = (struct my_captured_packet *) dp_packet_data(packetAggr);
        for(int j=0; j<PACKET_BUFF_ELEMENTS; j++)
        {
            VLOG_ERR("payload #%d: %.*s", j, recvdpackets[j].sizeofpayload, (char *) dp_packet_get_udp_payload(&recvdpackets[j].packet));

        }
        */
        clear_packetBuff(dp_packet_buff1);

        }

   }

Hope this helps,

Luca

From: Gregory Rose<mailto:gvrose8192 at gmail.com>
Sent: Friday, June 5, 2020 23:05
To: Luca Mancini<mailto:luca.mancini at outlook.com>; ovs-discuss at openvswitch.org<mailto:ovs-discuss at openvswitch.org>
Subject: Re: [ovs-discuss] DP_Packet Payload Modification


On 6/5/2020 11:00 AM, Luca Mancini wrote:
>
> Hi Greg,
> I realized I didn’t give a lot of context..
> Basically, I’m implementing a custom action which is meant to buffer an x amount of dp_packets that match a certain flow, and then send a new packet directly from the switch, containing the buffer of packets, as its payload. At some other switch this payload is then meant to be extracted so that I can retrieve the buffer of dp_packets and send the single packets contained in the buffer to the correct hosts.
> My action is implemented in userspace only for now since efficiency isn’t a concern for me atm. I already implemented the buffering mechanism and it works, and now I’m trying to create this custom udp packet so that I can store the buffer in it. For now I’m only trying to create a dummy udp packet with a “hello world” string as its payload just to see if I can create this custom packet however I just can’t figure out what I’m missing. My most recent attempt is the following:
>
> 1.Extract flow from one of the previously stored dp_packets
> 2.create a new dp_packet with dp_packet_new(65035)
> 3.use flow_compose() function on new packet to create a valid packet
> 4.add payload with dp_packet_put
>
> Code:
> struct flow flow;
> flow_extract(&dp_packet_buff1[0].packet, &flow);
> flow_compose(packetAggr, &flow, NULL, 0);
> char * payload = "hello world";
> dp_packet_put(packetAggr, payload, sizeof payload);

Pseudo code looks fine but the devil is in all the other details.  I
need to see a patch to put it in context.

- Greg


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-discuss/attachments/20200606/1e6cfe69/attachment.html>


More information about the discuss mailing list