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
Post a Comment