[ovs-discuss] How to store the tcp_src or tcp_dst field value in a variable and then print in vlogs?

Flavio Leitner fbl at sysclose.org
Mon Feb 18 12:11:39 UTC 2019


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 <blp at 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 <blp at 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 <blp at 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
> discuss at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-discuss




More information about the discuss mailing list