Hi Neil. I'm on vacation until next Monday, so I'll read your message in detail and get back to you sometime next week. Sorry for the delay. On Jan 3, 2014 7:39 PM, "Neil McKee" <neil.mc...@inmon.com> wrote:
> > On Mon, Dec 30, 2013 at 4:08 PM, Ben Pfaff <b...@nicira.com> wrote: > >> On Fri, Dec 20, 2013 at 03:45:37PM -0800, Neil McKee wrote: >> > Sorry. Grappling with a new email client. Here it as an attachment, if >> > that's OK. Let me know if I need to rebase again. >> >> This patch provokes one warning from GCC (and Clang): >> >> ../lib/odp-util.c: In function 'parse_odp_action': >> ../lib/odp-util.c:515:27: error: format '%lli' expects argument of >> type 'long long int *', but argument 3 has type 'uint32_t *' >> [-Werror=format] >> >> (It looks like you want %"SCNi32" instead of %lli.) >> >> This patch provokes several warnings from "sparse": >> >> ../ofproto/ofproto-dpif-sflow.c:156:31: warning: cast to restricted >> ofp_port_t >> ../ofproto/ofproto-dpif-sflow.c:405:44: warning: cast from restricted >> ofp_port_t >> ../ofproto/ofproto-dpif-sflow.c:431:68: warning: cast from restricted >> ofp_port_t >> ../tests/test-sflow.c:255:19: warning: incorrect type in assignment >> (different base types) >> ../tests/test-sflow.c:255:19: expected unsigned int [unsigned] >> [usertype] all >> ../tests/test-sflow.c:255:19: got restricted __be32 >> ../tests/test-sflow.c:308:9: warning: incorrect type in assignment >> (different base types) >> ../tests/test-sflow.c:308:9: expected unsigned int [unsigned] >> [usertype] src >> ../tests/test-sflow.c:308:9: got restricted __be32 >> ../tests/test-sflow.c:309:9: warning: incorrect type in assignment >> (different base types) >> ../tests/test-sflow.c:309:9: expected unsigned int [unsigned] >> [usertype] dst >> ../tests/test-sflow.c:309:9: got restricted __be32 >> ../tests/test-sflow.c:310:45: warning: incorrect type in argument 1 >> (different base types) >> ../tests/test-sflow.c:310:45: expected restricted __be32 >> [usertype] x >> ../tests/test-sflow.c:310:45: got unsigned int [unsigned] >> [usertype] src >> ../tests/test-sflow.c:310:45: warning: incorrect type in argument 1 >> (different base types) >> ../tests/test-sflow.c:310:45: expected restricted __be32 >> [usertype] x >> ../tests/test-sflow.c:310:45: got unsigned int [unsigned] >> [usertype] src >> ../tests/test-sflow.c:310:45: warning: incorrect type in argument 1 >> (different base types) >> ../tests/test-sflow.c:310:45: expected restricted __be32 >> [usertype] x >> ../tests/test-sflow.c:310:45: got unsigned int [unsigned] >> [usertype] src >> ../tests/test-sflow.c:310:45: warning: incorrect type in argument 1 >> (different base types) >> ../tests/test-sflow.c:310:45: expected restricted __be32 >> [usertype] x >> ../tests/test-sflow.c:310:45: got unsigned int [unsigned] >> [usertype] src >> ../tests/test-sflow.c:311:45: warning: incorrect type in argument 1 >> (different base types) >> ../tests/test-sflow.c:311:45: expected restricted __be32 >> [usertype] x >> ../tests/test-sflow.c:311:45: got unsigned int [unsigned] >> [usertype] dst >> ../tests/test-sflow.c:311:45: warning: incorrect type in argument 1 >> (different base types) >> ../tests/test-sflow.c:311:45: expected restricted __be32 >> [usertype] x >> ../tests/test-sflow.c:311:45: got unsigned int [unsigned] >> [usertype] dst >> ../tests/test-sflow.c:311:45: warning: incorrect type in argument 1 >> (different base types) >> ../tests/test-sflow.c:311:45: expected restricted __be32 >> [usertype] x >> ../tests/test-sflow.c:311:45: got unsigned int [unsigned] >> [usertype] dst >> ../tests/test-sflow.c:311:45: warning: incorrect type in argument 1 >> (different base types) >> ../tests/test-sflow.c:311:45: expected restricted __be32 >> [usertype] x >> ../tests/test-sflow.c:311:45: got unsigned int [unsigned] >> [usertype] dst >> ../ofproto/ofproto-dpif.c:1495:49: warning: incorrect type in >> argument 2 (different base types) >> ../ofproto/ofproto-dpif.c:1495:49: expected restricted ofp_port_t >> [usertype] ofp_port >> ../ofproto/ofproto-dpif.c:1495:49: got restricted odp_port_t >> [usertype] odp_port >> ../ofproto/ofproto-dpif-sflow.c:623:33: error: undefined identifier >> 'IPPROTO_GRE' >> ../ofproto/ofproto-dpif-sflow.c:631:33: error: undefined identifier >> 'IPPROTO_ESP' >> >> (The two just above mean that we need to add IPPROTO_* declarations to >> include/sparse/netinet/in.h.) >> >> Please limit lines to 79 characters. >> >> Please put a space after the 'if' keyword. >> >> I'm not sure why this adds an unnamed sub-struct to struct slave in >> lacp.c. I'd just put those members right in struct slave. >> >> In parse_odp_action(), please use ovs_scanf() instead of sscanf(), as >> the existing code does. >> >> In a couple of places, >> } else { >> instead of >> } >> else { >> >> In union user_action_cookie, padding should not be necessary. (I see >> that there is an obsolete comment there; I'll fix it.) >> >> Also in union user_action_cookie, the doubly nested union looks odd to >> me. Let's just use one level. You can name the outer member >> sflow_single and sflow_multi, or some other appropriate names. >> >> In ofproto/ofproto-dpif-sflow.c, please write >> #include "byte-order.h" >> instead of >> #include "lib/byte-order.h". >> (I see that there's a bad example in that file; I'll fix it.) >> Also, please keep the list of #includes in alphabetical order. >> >> > OK to all that. > > >> I'm not a fan of callbacks because of the surprising inversion of >> control that they cause, and especially not of layered callbacks like >> the one that this introduces. Instead of calling back into >> dpif_sflow_port_lookup_callback() from sflow_agent_get_counters(), I >> think that it would be better to provide the necessary information in >> the call to dpif_sflow_add_port(). >> >> > I wasn't expecting you to say that. The purpose of the callback is > really just to access the state held within ofproto-dpif, but in an > encapsulated way so that the exposure is limited and controlled. > The alternatives were (1) to make those private structure fields > visible to the ofproto-dpif-sflow module so it could just read them > directly, or (2) to copy all the relevant state into a separate > hash-table just for ofproto-dpif-sflow to use when processing packet > samples. It sounds like you prefer (2)? To understand why I think > I just need to know what you mean by "surprising inversion of control". > Are you referring to the possibility of mutex contention/deadlock > if the data-structures within ofproto-dpif are interrogated from > within the packet-processing path (i.e. when processing an > sFlow packet sample)? > > I'm pretty nervous about all the code added at the end of >> ofproto-dpif-sflow.c that checks netdev types based on strings, etc. >> It seems brittle: no one is going to remember to update it. It would >> be better to integrate it into the netdev code by adding appropriate >> netdev_*() functions for returning the information you need (such as >> the IP protocol used for tunneling, the ports, the keys, and so on). >> Did you consider that? >> >> > Agreed. I just try to avoid making changes to files that don't match > *sflow*. I confess I was half-expecting you to refactor all that > yourself, but I'm happy to have a go at it once I understand the > callback issue above. > > Neil > > > >> Thanks, >> >> Ben. >> > >
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev