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