[ovs-dev] Costumoized actions

Raul Suarez Marin raul.suarez.marin at gmail.com
Thu Mar 19 09:06:10 UTC 2015


Hello again,

At lib/dpif.c in function "dpif_operate" there is a line that is being
called.
dpif->dpif_class->operate(dpif, ops, chunk);

This is possibly the actions are performed, but I have no clue how to know
what function this line leads to.

In lib/dpif-provider.h I can find the definition for these structs, but I
can only see:

/* Executes each of the 'n_ops' operations in 'ops' on 'dpif', in the order
* in which they are specified, placing each operation's results in the
* "output" members documented in comments.
*
* This function is optional.  It is only worthwhile to implement it if
 * 'dpif' can perform operations in batch faster than individually. */
 void (*operate)(struct dpif *dpif, struct dpif_op **ops, size_t n_ops);

Kind regards,
Raúl Suárez

2015-03-18 21:26 GMT+01:00 Raul Suarez Marin <raul.suarez.marin at gmail.com>:

> Hello Ben,
>
> Thank you for your answer. Let me correct myself when I said I adapated
> parts of "handle_upcalls", I realized I just added debugging lines only
> (my bad).
> I am trying to do the ovs-vswitchd ofproto/trace command but I am getting
> failed connection attempts because "address family is not supported by
> protocol". I will sort it out.
>
> My thoughts right now are:
> 1) I have done in "do_xlate_actions" the part of reading the field I want
> to apply the action to. (new case OFPACT_MY_FIELD)
> 2) I adapted "commit_odp_actions" which is called
> by "compose_output_action" which is called by "xlate_output_action" which
> is called by "do_xlate_actions" (case OFPACT_OUTPUT) and it is located in
> "lib/ofp-util.c" This function adds the actions to the ofpbuf at ctx->xout->odp_actions
> with enum ovs_key = OVS_KEY_ATTR_MY_FIELD. I think there is no way this
> fails (because it's just appending data).
> 3) Added OVS_KEY_ATTR_MY_FIELD where needed. Specially in function
> "odp_execute_set_action" at lib/ofp-execute.c, where looks like that the
> packet is actually modified. There, I do this:
>
> const struct ovs_key_STRUCTURE_MODEL my_key = nl_attr_get_unspec(a,
> sizeof(struct ovs_key_STRUCTURE_MODEL))
> struct MY_STRUCTURE *packet_to_do_action = ofpbuf_l3(packet);
> packet_to_do_action ->my_field = my_key ->my_field;
>
> This should make it.
>
> BUT, HERE is the problem!
>
> I placed this code at "odp_execute_set_action" [function in 3)]
>
> FILE *f;
> f = fopen("/home/raul/match_event2.txt", "ab+");
> fprintf(f, "->odp_execute_set_action(%d)\n", type);
> fclose(f);
>
> This is what I use for debugging. It is a very ugly way of doing it but it
> works for me. But, this line is not printed when debugging, so the code
> never arrives at this point (even if my action is not implemented).
> However, when my action is not implemented the action execution works, but
> still the said line is not printed... so maybe it executes that code but it
> is not able to print, I do not know really.
>
> I will be posting here updates so anyone trying to do this same thing can
> have a "clear" idea of what to do.
>
> Thanks again Ben for your help, hints and guidelines.
>
> Kind regards,
> Raúl Suárez
>
>
> 2015-03-12 16:06 GMT+01:00 Ben Pfaff <blp at nicira.com>:
>
>> On Thu, Mar 12, 2015 at 09:11:11AM +0100, Raul Suarez Marin wrote:
>> > I am trying to develop new actions for openvswitch, I have done all my
>> work
>> > but looks like it does not work.
>> >
>> > What I have done:
>> > -> Enable ovs to read and parse new actions, so they appear on ovs-ofctl
>> > dump-flows command.
>> > -> Adapted required parts of "handle_upcalls" function
>> > at ofproto\ofproto-dpif-upcall.c (and inside functions)
>> > -> Adapted "do_xlate_actions" function at ofproto\ofproto-dpif-xlate.c
>> >
>> > The problem is:
>> > If the new action is not programmed, everything goes as expected.
>> > If the new action is programmed, no packet forwarding is done.
>> >
>> > The last sentence means that I have done all my work, but part of it is
>> > wrong, or that I am still missing something?
>>
>> I think you've hit the right parts of the code.  Try ofproto/trace (see
>> ovs-vswitchd(8)) for some hints.
>>
>> A new action wouldn't normally need any changes in handle_upcalls().
>>
>
>



More information about the dev mailing list