[ovs-discuss] DP_Packet Payload Modification [Solved I think]
Gregory Rose
gvrose8192 at gmail.com
Tue Jun 9 15:43:15 UTC 2020
On 6/6/2020 7:16 AM, Luca Mancini wrote:
> Sorry for making a mess of this thread but I think I solved the issue.
> I noticed by doing some pointer prints that I was overwriting the whole l4 space including the header causing a mess with packet allignment so I used memcpy instead of dp_packet_put:
>
> memcpy((char *) dp_packet_l4(packetAggr) + UDP_HEADER_LEN, dp_packet_buff1, sizeof(dp_packet_buff1));
>
> packet is now complete and extraction of payload works, now I’ll start working on the sending part which is probably not as easy as I think.
>
> Thanks for the help!
>
I'm not sure how much help I was but I'm glad you've got it figured out.
Good luck!
- Greg
> Luca
>
> From: Luca Mancini<mailto:luca.mancini at outlook.com>
> Sent: Saturday, June 6, 2020 15:40
> To: Luca Mancini<mailto:luca.mancini at outlook.com>; ovs-discuss at openvswitch.org<mailto:ovs-discuss at openvswitch.org>; Gregory Rose<mailto:gvrose8192 at gmail.com>
> Subject: RE: [ovs-discuss] DP_Packet Payload Modification
>
>
> 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
>
>
>
>
More information about the discuss
mailing list