Hi.  Thanks for the report.  Does something like this work?

def dict_to_action (d):
  d = d.copy()
  if 'port' in d:
    d['port'] = _fix_of_int(d['port'])

  t = d['type'].upper()
  del d['type']
  if not t.startswith("OFPAT_"): t = "OFPAT_" + t
  t = of.ofp_action_type_rev_map[t]
  cls = of._action_type_to_class[t]
  a = cls(**d)
  if hasattr(a, 'type') and getattr(a, 'type') is None:
    a.type = t  
  return a

On Jul 22, 2014, at 11:43 PM, AlexanderLU <1990....@gmail.com> wrote:

> Dear Murphy:
> 
> Hello! 
> These days I've been doing some work using POX's REST API to add some flow 
> entries, but I have encountered some problems when I tried to add a flow 
> entry like:
> curl -i  -X POST -d 
> '{"method":"set_table","params":{"dpid":"00-00-00-00-00-01","flows":[{"actions":[{"type":"OFPAT_SET_DL_SRC","dl_addr":"11:22:33:aa:bb:cc"}],"match":{}}]}}'
>  http://localhost:8000/OF/ 
> 
> The Error information is:
> "pox/openflow/of_json.py" 331L, 8393C written                 
>   File "/home/mininet/pox/pox/lib/recoco/recoco.py", line 774, in run
>     e[0](*e[1], **e[2])
>   File "/home/mininet/pox/pox/openflow/webservice.py", line 78, in _do_init
>     self._init(*args, **kw)
>   File "/home/mininet/pox/pox/openflow/webservice.py", line 169, in _init
>     self._con.send(fm)
>   File "/home/mininet/pox/pox/openflow/of_01.py", line 692, in send
>     data = data.pack()
>   File "/home/mininet/pox/pox/openflow/libopenflow_01.py", line 2325, in pack
>     packed += i.pack()
>   File "/home/mininet/pox/pox/openflow/libopenflow_01.py", line 1942, in pack
>     packed += struct.pack("!HHH", self.type, len(self), self.tp_port)
> error: cannot convert argument to integer
> 
> The problem happens when the "type" field of "actions" in the JSON string is:
> OFPAT_SET_DL_DST
> OFPAT_SET_DL_SRC
> OFPAT_SET_NW_DST
> OFPAT_SET_NW_SRC
> OFPAT_SET_TP_DST
> OFPAT_SET_TP_SRC
> 
> These problems bothered me a lot so I try to read the source code of POX, 
> finally I found this is a bug of POX and I have solved it.
> 
> In pox/pox/openflow/of_json.py, in the definition of function dict_to_action 
> there is one line(around line 147):
> del d['type']
> 
> However, in pox/openflow/libopenflow_01.py the __init__ of the functions:
> ofp_action_dl_addr
> ofp_action_nw_addr
> ofp_action_tp_port
> needs the "type" field. As a result of that, an error occurs.
> 
> I solve the problem by modifying the pox/pox/openflow/of_json.py, in the 
> definition of function dict_to_action I add two lines of code(around line 
> 150):
> t = of.ofp_action_type_rev_map[t]
> cls = of._action_type_to_class[t]
> if t in [4,5,6,7,9,10]:
>   d['type'] = t
> return a
> 
> I wish you could fix the bug latter. Thx for your excellent work. Looking 
> forward to your reply. :)
> 
>                                                              -- Alex LU
>                        
>                        

Reply via email to