Python local variable losing reference -


i'm developing sdn controller ryu framework in python.

i'm facing strange problem, maybe easy 1 since it's first time programming in python. have following sentence:

@set_ev_cls(ofp_event.eventofppacketin, main_dispatcher)    def _packet_in_handler(self, ev):         # if hit might want increase         # "miss_send_length" of switch         if ev.msg.msg_len < ev.msg.total_len:             self.logger.debug("packet truncated: %s of %s bytes",                           ev.msg.msg_len, ev.msg.total_len)         msg = ev.msg         datapath = msg.datapath         ofproto = datapath.ofproto         parser = datapath.ofproto_parser         in_port = msg.match['in_port']          pkt = packet.packet(msg.data)         eth = pkt.get_protocols(ethernet.ethernet)[0]          pkt_ip = pkt.get_protocol(ipv4.ipv4)         ipv4_src = none         ipv4_dst = none          if pkt_ip not none:             print "pkt_ip not none"             ipv4_src = pkt_ip.src             ipv4_dst = pkt_ip.dst             print ipv4_src             print ipv4_dst          if eth.ethertype == ether_types.eth_type_lldp:             # ignore lldp packet             return         dst = eth.dst         src = eth.src          dpid = datapath.id         self.mac_to_port.setdefault(dpid, {})          self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port)         self.logger.info("learn mac address")         # learn mac address avoid flood next time.         self.mac_to_port[dpid][src] = in_port          if dst in self.mac_to_port[dpid]:             out_port = self.mac_to_port[dpid][dst]         else:             out_port = ofproto.ofpp_flood          actions = [parser.ofpactionoutput(out_port)]          #print "before avoid packet_in"         #print ipv4_src          # install flow avoid packet_in next time         self.logger.info("install flow avoid packet_in next time")         if out_port != ofproto.ofpp_flood:            print "into if out_port"            print ipv4_src            print in_port            print dst            match = parser.ofpmatch(in_port=in_port, eth_dst=dst)            # verify if have valid buffer_id, if yes avoid send both            # flow_mod & packet_out         if msg.buffer_id != ofproto.ofp_no_buffer:             self.add_flow(datapath, 1, match, actions, msg.buffer_id)             return         else:             self.add_flow(datapath, 1, match, actions)     data = none     if msg.buffer_id == ofproto.ofp_no_buffer:         data = msg.data      out = parser.ofppacketout(datapath=datapath,buffer_id=msg.buffer_id, in_port=in_port, actions=actions, data=data)      self.logger.info("send_msg_out")     print out     datapath.send_msg(out)     self.logger.info("sent send_msg_out in packet_in") 

when not passing ipv4_src parameter ( match = parser.ofpmatch(in_port=in_port, eth_dst=dst) ), code runs ok. variables printed , no errors.

however, when i'm passing ipv4_src parameter ( match = parser.ofpmatch(in_port=in_port, eth_dst=dst ipv4_src=ipv4_src) ), 'none' in print dst , parser.ofpmatch returns me length error (of course, getting 'none').

independently of using ipv4_src parameter in parser.ofpmatch, in_port , dst printed succesfully.

does have python characteristic i'm skipping?

edited:

see 2 output examples:

  • not using ipv4_src parameter:

    into if out_port 192.168.1.200 2 00:00:00:00:00:01

  • using ipv4_src parameter:

    into if out_port none 2 00:00:00:00:00:01

when use ipv4_src following (because method getting 'none' cannot length, suppose):

into if out_port none 1 00:00:00:00:00:02 simpleswitch13: exception occurred during handler processing. backtrace offending handler [_packet_in_handler] servicing event [eventofppacketin] follows. traceback (most recent call last):   file "/home/ryu/ryu/ryu/base/app_manager.py", line 290, in _event_loop handler(ev)   file "/home/ryu/ryu/ryu/app/simple_switch_13.py", line 134, in _packet_in_handler self.add_flow(datapath, 1, match, actions, msg.buffer_id)   file "/home/ryu/ryu/ryu/app/simple_switch_13.py", line 68, in add_flow datapath.send_msg(mod)       file "/home/ryu/ryu/ryu/controller/controller.py", line 289, in send_msg msg.serialize()   file "/home/ryu/ryu/ryu/ofproto/ofproto_parser.py", line 211, in serialize self._serialize_body()   file "/home/ryu/ryu/ryu/ofproto/ofproto_v1_3_parser.py", line 2655, in _serialize_body match_len = self.match.serialize(self.buf, offset)   file "/home/ryu/ryu/ryu/ofproto/ofproto_v1_3_parser.py", line 1008, in serialize field_offset)   file "/home/ryu/ryu/ryu/ofproto/oxx_fields.py", line 250, in _serialize value_len = len(value) typeerror: object of type 'nonetype' has no len() 


Comments