DPDK usage discussions
 help / color / mirror / Atom feed
* [dpdk-users] IP PIPELINE tap device
@ 2017-10-30 11:09 longtb5
  2017-11-01 18:11 ` Dumitrescu, Cristian
  0 siblings, 1 reply; 3+ messages in thread
From: longtb5 @ 2017-10-30 11:09 UTC (permalink / raw)
  To: users; +Cc: cristian.dumitrescu

Hi,
I'm writing a new pipeline type called pipeline_tap, which has one input and
two outputs. The outputs are simply duplications of the input, so basically
like a l2fwd but with two outputs. There has already been great suggestions
[1] on the mailing list to use the l2fwd sample app as a starting point, but
I want to implement this using IP pipeline/packet framework as I would like
to use this device in my IP pipeline application.

As I understand here's what I must provide in order to make my pipeline_tap:
an input port, at least one table, and two output ports.

I have a couple of questions:
First, according to the doc [2], my input port can only be connected to one
table. Moreover, a packet coming from my input port can only hit one table
entry. However it's not clear whether that one table entry can be connected
to TWO output ports. 
Second, I'm having trouble understanding the implementation for table user
actions and table reserved actions in rte_pipeline_run() [3], with all the
mask thingy. Any pointers would be highly appreciated!

Regards,
BL

[1] http://dpdk.org/ml/archives/dev/2015-July/021293.html
[2]
http://dpdk.org/doc/guides/prog_guide/packet_framework.html#connectivity-of-
ports-and-tables
[3]
http://dpdk.org/browse/dpdk/tree/lib/librte_pipeline/rte_pipeline.c?h=v17.11
-rc2#n1344

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [dpdk-users] IP PIPELINE tap device
  2017-10-30 11:09 [dpdk-users] IP PIPELINE tap device longtb5
@ 2017-11-01 18:11 ` Dumitrescu, Cristian
  2017-11-02  3:47   ` longtb5
  0 siblings, 1 reply; 3+ messages in thread
From: Dumitrescu, Cristian @ 2017-11-01 18:11 UTC (permalink / raw)
  To: longtb5, users

Hi BL,


> -----Original Message-----
> From: longtb5@viettel.com.vn [mailto:longtb5@viettel.com.vn]
> Sent: Monday, October 30, 2017 11:09 AM
> To: users@dpdk.org
> Cc: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> Subject: IP PIPELINE tap device
> 
> Hi,
> I'm writing a new pipeline type called pipeline_tap, which has one input and
> two outputs. The outputs are simply duplications of the input, so basically
> like a l2fwd but with two outputs. There has already been great suggestions
> [1] on the mailing list to use the l2fwd sample app as a starting point, but
> I want to implement this using IP pipeline/packet framework as I would like
> to use this device in my IP pipeline application.
> 
> As I understand here's what I must provide in order to make my
> pipeline_tap:
> an input port, at least one table, and two output ports.

Well, you have multiple options, depending on how statefull/stateless your tap/probe/mirror device is.

What do you want to mirror?
(A) all input traffic
(B) just some packet types or pkts meeting a certain condition
(B) or just some selected flows (C)

Options (A) and (B) could be implemented without any internal table, while (C) most likely needs a table to be managed.

One solution could be to create a "mirror"pipeline that does a sort of broadcast: assuming N output ports, the input packet is:
1. Removed from the pipeline using rte_pipeline_hijack() API function
2. Clone every input packet is cloned (N-1) times
3. All N packets are sent out to an output port using rte_pipeline_port_out_packet_insert()
See pipeline_passthrough_be.c as example.

Another solution could be to create a "mirror" device similar to single producer multiple consumer queues that clones each input packet to N SWQs.


> 
> I have a couple of questions:
> First, according to the doc [2], my input port can only be connected to one
> table. Moreover, a packet coming from my input port can only hit one table
> entry. However it's not clear whether that one table entry can be connected
> to TWO output ports.
> Second, I'm having trouble understanding the implementation for table user
> actions and table reserved actions in rte_pipeline_run() [3], with all the
> mask thingy. Any pointers would be highly appreciated!
> 
> Regards,
> BL
> 
> [1] http://dpdk.org/ml/archives/dev/2015-July/021293.html
> [2]
> http://dpdk.org/doc/guides/prog_guide/packet_framework.html#connectiv
> ity-of-
> ports-and-tables
> [3]
> http://dpdk.org/browse/dpdk/tree/lib/librte_pipeline/rte_pipeline.c?h=v17
> .11
> -rc2#n1344
> 
> 

Regards,
Cristian

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [dpdk-users] IP PIPELINE tap device
  2017-11-01 18:11 ` Dumitrescu, Cristian
@ 2017-11-02  3:47   ` longtb5
  0 siblings, 0 replies; 3+ messages in thread
From: longtb5 @ 2017-11-02  3:47 UTC (permalink / raw)
  To: cristian.dumitrescu, users

Hi Cristian,

Thanks for the reply. I have some follow up questions:

First, I had tried rte_pipeline_port_out_packet_insert() before you pointed
it out to me that I needed to rte_pipeline_ah_packet_hijack() first (which
didn't work, should have read the API more carefully, my bad). From the
source code it looks like hijack() simply reset the pkts_mask to 0. But
inside port_out_packet_insert(), I didn't see any manipulation involving
pkts_mask; it called port_out->ops.f_tx() directly. In my case the tx
function is rte_port_ethdev_writer_tx(), which I'm assuming would perform
packet tx. In short, why would I need to hijack() first, if all I'm doing is
sending packet out right after rx without letting the packet reach the table
(we're still inside port_in_action_handler)?

My second question, how do I change the dst mac address of each packet?
Currently I'm using rte_pktmbuf_mtod() following the l2fwd sample app. The
function seems to work correctly but my pktgen couldn't capture any output
packet from pipeline_tap. 

Thanks and best regards,
BL 

> -----Original Message-----
> From: cristian.dumitrescu@intel.com [mailto:cristian.dumitrescu@intel.com]
> Sent: Thursday, November 2, 2017 1:12 AM
> To: longtb5@viettel.com.vn; users@dpdk.org
> Subject: RE: IP PIPELINE tap device
> 
> Hi BL,
> 
> 
> > -----Original Message-----
> > From: longtb5@viettel.com.vn [mailto:longtb5@viettel.com.vn]
> > Sent: Monday, October 30, 2017 11:09 AM
> > To: users@dpdk.org
> > Cc: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> > Subject: IP PIPELINE tap device
> >
> > Hi,
> > I'm writing a new pipeline type called pipeline_tap, which has one
> > input and two outputs. The outputs are simply duplications of the
> > input, so basically like a l2fwd but with two outputs. There has
> > already been great suggestions [1] on the mailing list to use the
> > l2fwd sample app as a starting point, but I want to implement this
> > using IP pipeline/packet framework as I would like to use this device in
my
> IP pipeline application.
> >
> > As I understand here's what I must provide in order to make my
> > pipeline_tap:
> > an input port, at least one table, and two output ports.
> 
> Well, you have multiple options, depending on how statefull/stateless your
> tap/probe/mirror device is.
> 
> What do you want to mirror?
> (A) all input traffic
> (B) just some packet types or pkts meeting a certain condition
> (B) or just some selected flows (C)
> 
> Options (A) and (B) could be implemented without any internal table, while
> (C) most likely needs a table to be managed.
> 
> One solution could be to create a "mirror"pipeline that does a sort of
> broadcast: assuming N output ports, the input packet is:
> 1. Removed from the pipeline using rte_pipeline_hijack() API function 2.
> Clone every input packet is cloned (N-1) times 3. All N packets are sent
out to
> an output port using rte_pipeline_port_out_packet_insert()
> See pipeline_passthrough_be.c as example.
> 
> Another solution could be to create a "mirror" device similar to single
> producer multiple consumer queues that clones each input packet to N
> SWQs.
> 
> 
> >
> > I have a couple of questions:
> > First, according to the doc [2], my input port can only be connected
> > to one table. Moreover, a packet coming from my input port can only
> > hit one table entry. However it's not clear whether that one table
> > entry can be connected to TWO output ports.
> > Second, I'm having trouble understanding the implementation for table
> > user actions and table reserved actions in rte_pipeline_run() [3],
> > with all the mask thingy. Any pointers would be highly appreciated!
> >
> > Regards,
> > BL
> >
> > [1] http://dpdk.org/ml/archives/dev/2015-July/021293.html
> > [2]
> >
> http://dpdk.org/doc/guides/prog_guide/packet_framework.html#connectiv
> > ity-of-
> > ports-and-tables
> > [3]
> > http://dpdk.org/browse/dpdk/tree/lib/librte_pipeline/rte_pipeline.c?h=
> > v17
> > .11
> > -rc2#n1344
> >
> >
> 
> Regards,
> Cristian

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-11-02  3:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-30 11:09 [dpdk-users] IP PIPELINE tap device longtb5
2017-11-01 18:11 ` Dumitrescu, Cristian
2017-11-02  3:47   ` longtb5

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).