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