Our of curiosity what would be the case when flow_mods fail to install? (I would just guess, only if the switch has a full flow table?, I'm sure there are probably other reasons).
Thanks, Aaron 2011/9/14 Zoltán Lajos Kis <zoltan.lajos....@ericsson.com>: > Well, I wasn't being over pedantic. In fact I'm setting up MPLS LSPs, which > involves sending a number of flow entries to different switches. In this > case I don't want to blindly install flows, as if one of them fails I would > have to explicitly remove the successful ones (with yet another flow_mods > :). > > Regards, > Zoltan. > > ________________________________ > From: Murphy McCauley [mailto:jam...@nau.edu] > Sent: Tuesday, September 13, 2011 7:58 AM > To: Zoltán Lajos Kis > Cc: nox-dev@noxrepo.org > Subject: Re: [nox-dev] Cooperative threading vs. blocking send > > I'd just send both commands regardless and only ever look at pendingFlow > again in the barrier and error handlers. I think that sidesteps the need to > worry about synchronization. > At any rate, good luck. :) > -- Murphy > > On Sep 12, 2011, at 10:44 PM, Zoltán Lajos Kis wrote: > > I could do that, but it probably gets me into the territory of volatiles - > and perhaps locks: > > ... > pendingFlow = new PendingFlow(mod->header->xid, barrier->xid); > send_openflow_command(datapath_id, &mod->header, true); > if (pendingFlow != NULL) { > send_openflow_command(datapath_id, barrier, true); > } > ... > > Anyway, thanks for the confirmation. > > Regards, > Zoltan. > > > ________________________________ > From: Murphy McCauley [mailto:jam...@nau.edu] > Sent: Monday, September 12, 2011 8:42 PM > To: Zoltán Lajos Kis > Cc: nox-dev@noxrepo.org > Subject: Re: [nox-dev] Cooperative threading vs. blocking send > > I'd have to look into it to be sure, but I think the scenario you describe > may well be possible. > However... couldn't you just put the creation/registration of the > PendingFlow *before* sending either of the commands? > > -- Murphy > On Sep 12, 2011, at 7:10 AM, Zoltán Lajos Kis wrote: > > Hi, > > In my C++ NOX (Zaku) app I would like to make sure that a flow is installed > on the switch. Having no better solution, I send a barrier request right > after the flow_mod, and then wait for either an error, or a barrier reply. > For this I register the flow_mod's and barrier's xids, and then compare > incoming events against those. See the pseudoish code below for an example. > > Could someone familiar with the cooperative thread implementation in NOX > tell me, whether it is possible that a blocking send_openflow_command() > result in the current thread actually blocking and yielding to another one? > Particularly in this code, can it happen that sending the flow_mod > completes, but then the second call to send blocks, yielding to another > thread. Then on this other thread the incoming error message is received and > dispatched to the handler method? Resulting in the error being discarded as > at that time the PendingFlow was not even registered… > > And if so, is there a way to temporarily disable this yielding, or do I > better start making the code more complex? > > Thank you, > Zoltan. > > > ------------------------------ > > > struct PendingFlow { > uint32_t modXid; > uint32_t barrierXid; > ... > } > > class Example { > > PendingFlow *pendingFlow; > ... > > void > Example::install_flow(ofp_flow_mod *mod) { > ofp_header *barrier = make_barrier(); > > mod->header->xid = generate_xid(); > barrier->xid = generate_xid(); > > send_openflow_command(pi.datapath_id, &mod->header, true); > send_openflow_command(pi.datapath_id, barrier, true); > > pendingFlow = new PendingFlow(mod->header->xid, barrier->xid); > ... > } > > > Disposition > Example::handleError(const Event &e) { > const Error_event& err = assert_cast<const Error_event&>(e); > > if (pendingFlow != NULL && pendingFlow.modXid == getErrorXid(err)) { > delete pendingFlow; pendingFlow = NULL; > // Process error > } > … > return CONTINUE; > } > > Disposition > Example::handleBarrier(const Event &e) { > const Barrier_reply_event& barrier = assert_cast<const > Barrier_reply_event>(e); > > if (pendingFlow != NULL && pendingFlow.barrierXid == > getBarrierXid(barrier)) { > delete pendingFlow; pendingFlow = NULL; > // Process completion > } > .. > return CONTINUE; > } > > … > } > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > > > _______________________________________________ > nox-dev mailing list > nox-dev@noxrepo.org > http://noxrepo.org/mailman/listinfo/nox-dev > > -- Aaron O. Rosen Masters Student - Network Communication 306B Fluor Daniel _______________________________________________ nox-dev mailing list nox-dev@noxrepo.org http://noxrepo.org/mailman/listinfo/nox-dev