Thanks Murphy!! It works just like I wanted it to.

Chris

On Sat, Sep 3, 2011 at 6:50 AM, Murphy McCauley <jam...@nau.edu> wrote:

> Starting with the second error...
> NameError: global name 'bufid' is not defined
>
> This is because you're using the variable name "bufid", but there's no such
> variable.  You have this in a packet-in handler because it's one of the
> parameters to the event handler.  For a stats-in, there's obviously no
> associated packet, so there's no bufid parameter, so using bufid doesn't
> make sense here.
>
>
> The first error is...
> ERR:received Openflow error packet from dpid=000000000001: type=1, code=8,
> 128 bytes of data
>
> Looking that up, we see that type 1 code 8 is BAD_REQUEST, BUFFER_UNKNOWN.
>
> We can see why if we look at install_datapath_flow()'s definition versus
> your call to it.
>
> install_datapath_flow:
> self, # Passed implicitly
> dp_id, # You pass "dpid"
> attrs, # You pass "flow" (the match dict)
> idle_timeout,  # You pass CACHE_TIMEOUT
> hard_timeout, # You pass DROP_TIMEOUT
> actions, # You pass "actions" (which is [])
> buffer_id=None, # You pass openflow.OFP_DEFAULT_PRIORITY
> priority=openflow.OFP_DEFAULT_PRIORITY, # You pass "inport"
> inport=None, # You pass nothing
> packet=None # You pass nothing
>
> As you can see, you 're passing openflow.OFP_DEFAULT_PRIORITY as if it were
> the buffer ID.  No wonder the buffer is unknown!  I don't think you need the
> inport here anyway, so you probably just want to do something like:
>
> self.install_datapath_flow(dpid, flow, CACHE_TIMEOUT, DROP_TIMEOUT, [])
>
>
> Also, note that you are always operating on the first flow even if it was
> some other flow that went over your threshold (because you are using
> flows[0] to pick out the port/match later).  You probably want to not just
> keep track of the winning byte_count, but also the index of the flow with
> the winning byte_count.
>
> temp = 0
> temp_index = None
> for index, item in enumerate(flows):
>   val = int(item['byte_count']) # byte_count is probably a bigint... do you
> need the int?
>   if val > temp:
>     temp = val
>     temp_index = index
> ...
> flow = flows[temp_index]['match']
>
>
> Hope that helps.
>
> -- Murphy
>
> On Sep 2, 2011, at 10:21 PM, chris oleke wrote:
>
>
> Well it does make some sense and should be able to work but when I try it
> in my application like shown below, I get the following errors
>
> def handle_flow_stats_in(self, dpid, flows, more, xid):
>
>         print "Flow stats in from datapath", longlong_to_octstr(dpid)[6:]
>
>         temp = 0
>
>         for item in flows:
>
>             val = item['byte_count']
>
>             z =  int(val)
>
>             if z > temp:
>
>                 temp = z
>
>
>         print "highest", temp
>
>         if temp > 1000:
>
>             inport = flows[0]['match']['in_port']
>
>             flow = flows[0]['match']
>
>             print inport
>
>             #print flow
>
>             actions = []
>
>             self.install_datapath_flow(dpid, flow, CACHE_TIMEOUT,
> DROP_TIMEOUT,
>
>                                          actions,
> openflow.OFP_DEFAULT_PRIORITY,
>
>                                          inport)
>
>
> First error:
>
> 00006|openflow-event|ERR:received Openflow error packet from
> dpid=000000000001: type=1, code=8, 128 bytes of data
>
>
> When I change the command for installing a flow to contain the bufid and
> buf:
>
> self.install_datapath_flow(dpid, flow, CACHE_TIMEOUT, DROP_TIMEOUT,
>
>                                          actions, bufid,
> openflow.OFP_DEFAULT_PRIORITY,
>
>                                          inport, buf)
> I get this error:
>
>
> 00006|pyrt|ERR:unable to invoke a Python event handler:
>
> Traceback (most recent call last):
>
>   File "./nox/lib/util.py", line 192, in f
>
>     ret = f.cb(event.datapath_id, event.flows, event.more, event.xid)
>
>   File "./nox/netapps/routing/samplerouting.py", line 181, in
> handle_flow_stats_in
>
>     actions, bufid, openflow.OFP_DEFAULT_PRIORITY,
>
> NameError: global name 'bufid' is not defined
>
>
> Where could the problem be?
>
>
> Thanks,
>
> Chris
>
>
> On Sat, Sep 3, 2011 at 1:47 AM, Murphy McCauley <jam...@nau.edu> wrote:
>
>> Yes.  From the flow stats event, you should be able to do something like:
>> e.flows[0]["match"] to get the match dictionary to use with
>> install_datapath_flow(), send_flow_command(), etc. for that flow.
>>
>> -- Murphy
>>
>> On Sep 2, 2011, at 3:16 PM, chris oleke wrote:
>>
>> > Hi,
>> >
>> > I am trying to create a rate-limiting functionality in my application
>> using the flow statistics that I obtain from the switch. I'm using the
>> byte_count from the flows to match against a threshold value that when
>> exceeded will be used to prompt flows to be dropped.  Is it possible to
>> create a packet within NOX that I would use to install a flow just like the
>> case in a packet_in_event? In other words I'd like to know if I can use the
>> details obtained from a particular flow statistic to create a packet and
>> consequently have a flow sent to the switch that will be used to drop the
>> packets that match the flow.
>> >
>> >
>> > Thanks,
>> > Chris
>> > _______________________________________________
>> > 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

Reply via email to