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 > >