Raúl,

The dip class functions are implemented by the different dip classes. Linux and 
Windows data paths are interfaced by lib/dpif-netlink.c and the userspace 
datapath is implemented in lib/dpif-netlink.c. You’ll find a class struct with 
the local function pointers in those files, just search for “operate” in those 
files.

Hope this helps,

  Jarno

> On Mar 19, 2015, at 2:06 AM, Raul Suarez Marin <raul.suarez.ma...@gmail.com> 
> wrote:
> 
> 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.ma...@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 <b...@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().
>>> 
>> 
>> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to