Hi I have a funciton act_like_switch defined below. def act_like_switch (self, packet, packet_in): """ Implement switch-like behavior. """ # Learn the port for the source MAC #print "RECIEVED FROM PORT ",packet_in.in_port , "SOURCE ",packet.src # create a Session #Session = sessionmaker(bind=engine) #session = Session() self.mac_to_port[packet.src]=packet_in.in_port #if self.mac_to_port.get(packet.dst)!=None: #print "count for dst",session.query(SourcetoPort).filter_by(src_address=str(packet.dst)).count(),str(packet.dst) #if session.query(SourcetoPort).filter_by(src_address=str(packet.dst)).count(): if session.query(exists().where(SourcetoPort.src_address == str(packet.dst))).scalar() is not None: #send this packet print "got info from the database" q_res = session.query(SourcetoPort).filter_by(src_address=str(packet.dst)).first() self.send_packet(packet_in.buffer_id, packet_in.data,q_res.port_no, packet_in.in_port) #create a flow modification message msg = of.ofp_flow_mod() #set the fields to match from the incoming packet msg.match = of.ofp_match.from_packet(packet) #send the rule to the switch so that it does not query the controller again. msg.actions.append(of.ofp_action_output(port=q_res.port_no)) #push the rule self.connection.send(msg) else: #flood this packet out as we don't know about this node. print "flooding the first packet" self.send_packet(packet_in.buffer_id, packet_in.data, of.OFPP_FLOOD, packet_in.in_port) #self.matrix[(packet.src,packet.dst)]+=1 entry = SourcetoPort(src_address=str(packet.src) , port_no=packet_in.in_port) #add the record to the session object session.add(entry) #add the record to the session object session.commit()
I am first checking if the specified mac address exists in the database if session.query(exists().where(SourcetoPort.src_address == str(packet.dst))).scalar() is not None: If it does I am doing a query to retrieve the information as below. q_res = session.query(SourcetoPort).filter_by(src_address=str(packet.dst)).first() self.send_packet(packet_in.buffer_id, packet_in.data,q_res.port_no, packet_in.in_port) for some reason query is returning a none object.I don't know why after the if condition above succeeds.Any help is appreciated. Regards, Karthik.