Hi Flavio,

I think I got tcp_src and tcp_dst values, I can also successfully print
them.
Here is what I did:
for(numb=0;numb<cnt; numb++)
{

        uint8_t nw_proto = 0;
packet=packets->packets[numb];
size_t size = dp_packet_size(packet);
const void *data = dp_packet_data(packet);
const char *frame = (const char *)data;
dp_packet_reset_offsets(packet);
*data_pull(&data, &size, ETH_ADDR_LEN * 2);*
//dl_type = parse_ether(&data, &size);
//VLOG_DBG("parse ether type DL TYPE: 0x%4x", dl_type);
packet->l3_ofs = (char *)data - frame;
const struct ip_header *ip = dp_packet_l3(packet);
nw_proto = ip->ip_proto;
VLOG_DBG("IP proto---> %d ", nw_proto);
int ip_len;
ip_len = IP_IHL(ip->ip_ihl_ver) * 4;

                *data_pull(&data, &size, ip_len);*
packet->l4_ofs = (char *)data - frame;
                if(nw_proto == 6)
{
struct tcp_header *th = dp_packet_l4(packet);
VLOG_DBG( "tcp_src ---> %d", ntohs(th->tcp_src));
VLOG_DBG( "tcp_dst ---> %d", ntohs(th->tcp_dst));
              }
}


Can you please confirm, if this is the right approach I have used and not
seeing the old values like before?

Thank you so much,
Krish

On Tue, Feb 19, 2019 at 11:25 AM Krish <attkillro...@gmail.com> wrote:

> Flavio,
>
> Thank you for the clarification. You explained it very well.
>
> I don't want to wait for the miniflow_extraction, so I am left with
> parsing packet myself.
>
> Here is what I am doing now:
>
> for(numb=0;numb<cnt; numb++)
> {
>
>         uint8_t nw_proto;
> const char *frame;
> packet=packets->packets[numb];
> const void *data = dp_packet_data(packet);
> frame = data;
> *dp_packet_reset_offsets(packet);*
> * packet->l3_ofs = (char *)data - frame;*
> * const struct ip_header *ip = dp_packet_l3(packet);*
> nw_proto = ip->ip_proto;
> VLOG_DBG("IP proto---> %d ", nw_proto); // This is 0
>
> }
>
> I followed almost the same approach of what is going in miniflow_extract.
> nw_proto(ip protocol) is printing out to be 0.
> I am using this code just before emc_processing and inside
> dp_netdev_input__.
> Can you please help me here?
>
> Thanks
> Krish
>
>
> On Mon, Feb 18, 2019 at 8:11 PM Flavio Leitner <f...@sysclose.org> wrote:
>
>> On Mon, Feb 18, 2019 at 11:05:53AM +0800, Krish wrote:
>> > Thanks for reply Ben.
>> > Does it mean that *miniflow_extract* will also initialize the L3 header
>> > pointer?
>>
>> If you look at the miniflow_extract(), you  will see that it calls
>> dp_packet_reset_offsets(packet) which will set all the header pointers
>> to their defaults meaning that they are not pointing to anything real.
>>
>> These pointers are used by dp_packet_l3 (or 4) functions to locate
>> the header.
>>
>> Then if you continue following the function, you will notice that
>> the code parses the packet from the outer header to the inner header
>> and as the parser goes, it updates the header offsets, like this line:
>>
>> packet->l3_ofs = (char *)data - frame;
>>
>> At this point, you have the pointer to the l3 header and you could use
>> dp_packet_l3().
>>
>>
>> > But I am getting the correct values for *nw_proto* from the L3 header.
>> > struct ip_header *ip = dp_packet_l3(packet);
>> > nw_proto = ip->ip_proto;
>> >
>> > Any comments on this? Whether its right or wrong?
>>
>> When using DPDK, the packet is represented by two parts. One if the
>> rte buffer (packet data) that comes from DPDK library and the second
>> part is the packet's metadata (the offsets you need). This offsets
>> are allocated in the stack at dp_netdev_process_rxq_port(), so most
>> probably you are seeing old values from previous packets which
>> happens to work, but they are not correct.
>>
>> As I said above miniflow_extract() initializes those offsets to a
>> known state and then parse the packet to update with the correct
>> values.
>>
>> In summary, you will need to either wait for miniflow_extract() or
>> parse the packet yourself if you need the tcp port.
>>
>> HTH,
>> fbl
>>
>>
>>
>> >
>> > Thanks a lot for your patience and response.
>> >
>> > Regards
>> >
>> > Krish
>> >
>> > On Sat, Feb 16, 2019 at 10:09 AM Ben Pfaff <b...@ovn.org> wrote:
>> >
>> > > You are almost certainly dereferencing a null pointer.
>> > >
>> > > On Sat, Feb 16, 2019 at 09:02:17AM +0800, Krish wrote:
>> > > > That code I showed before. It is working fine and crashing only
>> when I
>> > > > enable debugging.
>> > > >
>> > > > As *sruct tcp_header's tcp_src* has ovs_be16 type. How to store and
>> print
>> > > > this value ?
>> > > >
>> > > > Thanks
>> > > >
>> > > > On Sat, Feb 16, 2019, 08:43 Ben Pfaff <b...@ovn.org> wrote:
>> > > >
>> > > > > Then you're going to have to work harder since miniflow_extract()
>> is
>> > > > > what initializes the L4 header pointer.
>> > > > >
>> > > > > On Sat, Feb 16, 2019 at 08:39:08AM +0800, Krish wrote:
>> > > > > > I am sorry, but I am trying not to use extracted flow.  I want
>> to use
>> > > > > this
>> > > > > > information before it goes to EMC.
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > > On Sat, Feb 16, 2019, 03:44 Ben Pfaff <b...@ovn.org> wrote:
>> > > > > >
>> > > > > > > On Fri, Feb 15, 2019 at 03:48:22PM +0800, Krish wrote:
>> > > > > > > > Hi
>> > > > > > > >
>> > > > > > > > I want to store tcp_src, dst port in a variable.
>> > > > > > > > This is what I am doing:
>> > > > > > > > 1. Retrieve packet from dp_packet_batch one by one.
>> > > > > > > > 2. Retrieving field values by extracting packets headers:
>> > > > > > > >
>> > > > > > > > struct ip_header *ip = dp_packet_l3(packet);
>> > > > > > > > nw_proto = ip->ip_proto;
>> > > > > > > > if(nw_proto == 6)
>> > > > > > > > {
>> > > > > > > > struct tcp_header *th = dp_packet_l4(packet);
>> > > > > > > > // The following are the 2 different ways I am trying to
>> print
>> > > the
>> > > > > > > tcp_src.
>> > > > > > > > I have tried it 1 and 2 separately not at the same time.
>> > > > > > > >                 //1 . Ovs crash at the below statement
>> > > > > > > >                 uint16_t src = (uint16_t)
>> ntohs(th->tcp_src);
>> > > > > > > >                 VLOG_DBG( "tcp_src ---> %d", src );
>> > > > > > > >                 //2. When I enable logging ovs crashes at
>> this
>> > > point
>> > > > > > > >                 VLOG_DBG( "tcp_src ---> %d",
>> ntohs(th->tcp_src)
>> > > );
>> > > > > > > >
>> > > > > > > >
>> > > > > > > >                  }
>> > > > > > > >
>> > > > > > > > Can anyone please help how to store tcp_src port value in a
>> > > variable
>> > > > > and
>> > > > > > > > print it in vlogs?
>> > > > > > > > Statement 2 is working fine if vlogs are disabled, but I
>> want the
>> > > > > port
>> > > > > > > > value to be stored in a variable and then print.
>> > > > > > >
>> > > > > > > I'd just get it from the extracted flow instead of inventing
>> new
>> > > code
>> > > > > to
>> > > > > > > extract it.
>> > > > > > >
>> > > > >
>> > >
>>
>> > _______________________________________________
>> > discuss mailing list
>> > disc...@openvswitch.org
>> > https://mail.openvswitch.org/mailman/listinfo/ovs-discuss
>>
>>
>>
_______________________________________________
discuss mailing list
disc...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-discuss

Reply via email to