[ovs-dev] Is there a way to have a flow perform tbl_lookup twice?
Jesse Gross
jesse at nicira.com
Tue May 8 01:29:17 UTC 2012
datapath/vport-gre.c
On Mon, May 7, 2012 at 6:21 PM, YIMIN CHEN <ymchen.nbzj at gmail.com> wrote:
> Hi Ben,
>
> Thank you for your reply! I am newbie to openflow development, please
> pardon me if my problem description is not precise :)
>
> Could you please point me to the gre tunnel processing file, I would
> like to take a look to understand it better.
>
>
> Thanks!
> Yimin
>
> On Tue, May 8, 2012 at 12:16 AM, Ben Pfaff <blp at nicira.com> wrote:
>> With the normal way that gre tunnel processing works, you only get a
>> shot at it after decap.
>>
>> Or maybe you're just describing the way that GRE tunnel processing
>> works and don't need resubmit at all. It's hard to tell, since you
>> keep changing your description and your requirements.
>>
>> On Mon, May 07, 2012 at 08:55:36AM +0800, YIMIN CHEN wrote:
>>> I didn't quite yet understand why resubmit does not work for my case.
>>> It could be the same flow table, I just need to search it twice:
>>> -- once before decap, when hit, knows the flow needs to be decap'ed
>>> and resubmitted to the table again
>>> -- once after decap, with the destination IP of decap'ed packet.
>>>
>>> This does not work?
>>>
>>>
>>> Thanks!
>>>
>>> On Sat, May 5, 2012 at 3:40 AM, Ben Pfaff <blp at nicira.com> wrote:
>>> > The difference is that Yimin Chen wants to process the packet through
>>> > two flow tables, one before and one after decap. With the normal way
>>> > that gre tunnel processing works, you only get a shot at it after
>>> > decap.
>>> >
>>> > On Fri, May 04, 2012 at 12:35:00PM -0700, Karl Yang wrote:
>>> >> what is the difference between your this case and the "gre" tunnel
>>> >> processing case within data path code?
>>> >>
>>> >> On Fri, May 4, 2012 at 10:05 AM, Ben Pfaff <blp at nicira.com> wrote:
>>> >>
>>> >> > No.
>>> >> >
>>> >> > On Fri, May 04, 2012 at 10:16:14AM +0800, YIMIN CHEN wrote:
>>> >> > > Hi Ben,
>>> >> > >
>>> >> > > My goal is to implement a decap action that would decap a packet with
>>> >> > > external IP addresses, and then have the decapped packet, with
>>> >> > > internal IP addresses, do a flow lookup again.
>>> >> > >
>>> >> > > Can this be achieved using resubmit?
>>> >> > >
>>> >> > > Thanks!
>>> >> > > Yimin
>>> >> > >
>>> >> > > On Fri, May 4, 2012 at 9:37 AM, Ben Pfaff <blp at nicira.com> wrote:
>>> >> > > > You can read PORTING in the root of the tree.
>>> >> > > >
>>> >> > > > It would be best if you'd explain your goal first, instead of doing a
>>> >> > > > deep dive into implementation details.
>>> >> > > >
>>> >> > > > On Fri, May 04, 2012 at 09:20:38AM +0800, YIMIN CHEN wrote:
>>> >> > > >> Hi Ben,
>>> >> > > >>
>>> >> > > >> Thank you for the detailed information! I read this part of the code,
>>> >> > > >> and have some confusion. Can you please review the following to see if
>>> >> > > >> my understanding of code is correct?
>>> >> > > >>
>>> >> > > >> 1) ofproto/ code is userspace code, and datapath/ code is the actual
>>> >> > dp code.
>>> >> > > >> 2) ofproto handles the rule insertion from control plane, and datapath
>>> >> > > >> handles the actual flow lookup.
>>> >> > > >> 3) resubmit is handled in userspace? I saw the resubmit logic
>>> >> > > >> xlate_nicira_action() is in ofproto I didn't see find any code in
>>> >> > > >> datapath that handles resubmit, not even in ovs-ofctl.c. Is
>>> >> > > >> xlate_nicira_action() doing flow insertion with resubmit action or
>>> >> > > >> actually performing the dp actions? I am confused.
>>> >> > > >>
>>> >> > > >> What is the relationship between ofproto userspace and the dp code?
>>> >> > > >> what is the difference between xlate table action and odp action?
>>> >> > > >>
>>> >> > > >> I think I am very confused, if there is any documentation I can read
>>> >> > > >> to understand this design better, would you please give me a pointer?
>>> >> > > >>
>>> >> > > >> Thanks!
>>> >> > > >> Yimin
>>> >> > > >>
>>> >> > > >> On Thu, May 3, 2012 at 11:30 AM, Ben Pfaff <blp at nicira.com> wrote:
>>> >> > > >> > It's documented in nicira-ext.h:
>>> >> > > >> >
>>> >> > > >> > /* Action structures for NXAST_RESUBMIT and NXAST_RESUBMIT_TABLE.
>>> >> > > >> > *
>>> >> > > >> > * These actions search one of the switch's flow tables:
>>> >> > > >> > *
>>> >> > > >> > * - For NXAST_RESUBMIT_TABLE only, if the 'table' member is not
>>> >> > 255, then
>>> >> > > >> > * it specifies the table to search.
>>> >> > > >> > *
>>> >> > > >> > * - Otherwise (for NXAST_RESUBMIT_TABLE with a 'table' of 255,
>>> >> > or for
>>> >> > > >> > * NXAST_RESUBMIT regardless of 'table'), it searches the
>>> >> > current flow
>>> >> > > >> > * table, that is, the OpenFlow flow table that contains the
>>> >> > flow from
>>> >> > > >> > * which this action was obtained. If this action did not
>>> >> > come from a
>>> >> > > >> > * flow table (e.g. it came from an OFPT_PACKET_OUT message),
>>> >> > then table 0
>>> >> > > >> > * is the current table.
>>> >> > > >> > *
>>> >> > > >> > * The flow table lookup uses a flow that may be slightly modified
>>> >> > from the
>>> >> > > >> > * original lookup:
>>> >> > > >> > *
>>> >> > > >> > * - For NXAST_RESUBMIT, the 'in_port' member of struct
>>> >> > nx_action_resubmit
>>> >> > > >> > * is used as the flow's in_port.
>>> >> > > >> > *
>>> >> > > >> > * - For NXAST_RESUBMIT_TABLE, if the 'in_port' member is not
>>> >> > OFPP_IN_PORT,
>>> >> > > >> > * then its value is used as the flow's in_port. Otherwise,
>>> >> > the original
>>> >> > > >> > * in_port is used.
>>> >> > > >> > *
>>> >> > > >> > * - If actions that modify the flow (e.g. OFPAT_SET_VLAN_VID)
>>> >> > precede the
>>> >> > > >> > * resubmit action, then the flow is updated with the new
>>> >> > values.
>>> >> > > >> > *
>>> >> > > >> > * Following the lookup, the original in_port is restored.
>>> >> > > >> > *
>>> >> > > >> > * If the modified flow matched in the flow table, then the
>>> >> > corresponding
>>> >> > > >> > * actions are executed. Afterward, actions following the resubmit
>>> >> > in the
>>> >> > > >> > * original set of actions, if any, are executed; any changes made
>>> >> > to the
>>> >> > > >> > * packet (e.g. changes to VLAN) by secondary actions persist when
>>> >> > those
>>> >> > > >> > * actions are executed, although the original in_port is restored.
>>> >> > > >> > *
>>> >> > > >> > * Resubmit actions may be used any number of times within a set of
>>> >> > actions.
>>> >> > > >> > *
>>> >> > > >> > * Resubmit actions may nest to an implementation-defined depth.
>>> >> > Beyond this
>>> >> > > >> > * implementation-defined depth, further resubmit actions are
>>> >> > simply ignored.
>>> >> > > >> > *
>>> >> > > >> > * NXAST_RESUBMIT ignores 'table' and 'pad'. NXAST_RESUBMIT_TABLE
>>> >> > requires
>>> >> > > >> > * 'pad' to be all-bits-zero.
>>> >> > > >> > *
>>> >> > > >> > * Open vSwitch 1.0.1 and earlier did not support recursion. Open
>>> >> > vSwitch
>>> >> > > >> > * before 1.2.90 did not support NXAST_RESUBMIT_TABLE.
>>> >> > > >> > */
>>> >> > > >> > struct nx_action_resubmit {
>>> >> > > >> > ovs_be16 type; /* OFPAT_VENDOR. */
>>> >> > > >> > ovs_be16 len; /* Length is 16. */
>>> >> > > >> > ovs_be32 vendor; /* NX_VENDOR_ID. */
>>> >> > > >> > ovs_be16 subtype; /* NXAST_RESUBMIT. */
>>> >> > > >> > ovs_be16 in_port; /* New in_port for checking flow
>>> >> > table. */
>>> >> > > >> > uint8_t table; /* NXAST_RESUBMIT_TABLE: table
>>> >> > to use. */
>>> >> > > >> > uint8_t pad[3];
>>> >> > > >> > };
>>> >> > > >> > OFP_ASSERT(sizeof(struct nx_action_resubmit) == 16);
>>> >> > > >> >
>>> >> > > >> > and in ovs-ofctl(8):
>>> >> > > >> >
>>> >> > > >> > resubmit:port
>>> >> > > >> > resubmit([port],[table])
>>> >> > > >> > Re-searches this OpenFlow flow table (or the
>>> >> > table whose
>>> >> > > >> > number is specified by table) with the
>>> >> > in_port field
>>> >> > > >> > replaced by port (if port is specified) and
>>> >> > executes the
>>> >> > > >> > actions found, if any, in addition to any
>>> >> > other actions
>>> >> > > >> > in this flow entry.
>>> >> > > >> >
>>> >> > > >> > Recursive resubmit actions are obeyed up to an
>>> >> > implemen‐
>>> >> > > >> > tation-defined maximum depth. Open vSwitch
>>> >> > 1.0.1 and
>>> >> > > >> > earlier did not support recursion; Open
>>> >> > vSwitch before
>>> >> > > >> > 1.2.90 did not support table.
>>> >> > > >> >
>>> >> > > >> >
>>> >> > > >> > On Thu, May 03, 2012 at 09:54:08AM +0800, YIMIN CHEN wrote:
>>> >> > > >> >> Hi Ben,
>>> >> > > >> >>
>>> >> > > >> >> Thank you for your reply! I saw there is some code about resubmit
>>> >> > > >> >> Nicira extension action, but that seems to be in userspace
>>> >> > ofproto.c,
>>> >> > > >> >> not in datapath, so I didn't know that is related. Could you help
>>> >> > > >> >> clarify for me how does resubmit work?
>>> >> > > >> >>
>>> >> > > >> >>
>>> >> > > >> >> Thanks!
>>> >> > > >> >> Yimin
>>> >> > > >> >>
>>> >> > > >> >> On Wed, May 2, 2012 at 12:40 PM, Ben Pfaff <blp at nicira.com> wrote:
>>> >> > > >> >> > On Wed, May 02, 2012 at 10:53:10AM +0800, YIMIN CHEN wrote:
>>> >> > > >> >> >> I am looking at ovs dp code, and is looking at a correct way
>>> >> > for a
>>> >> > > >> >> >> flow to traverse the table twice. The goal is like this:
>>> >> > > >> >> >>
>>> >> > > >> >> >> flow lookup => tbl_lookup()
>>> >> > > >> >> >> perform actions => execute_actions() which changes the packet
>>> >> > > >> >> >> flow lookup using the new packet => tbl_lookup()
>>> >> > > >> >> >> perform actions on the new packet => execute_actions.
>>> >> > > >> >> >
>>> >> > > >> >> > Do you want the "resubmit" Nicira extension action?
>>> >> > _______________________________________________
>>> >> > dev mailing list
>>> >> > dev at openvswitch.org
>>> >> > http://openvswitch.org/mailman/listinfo/dev
>>> >> >
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list