def message_send(self, msg): """ Send the message to the switch @param msg A string or OpenFlow message object to be forwarded to the switch. """ if not self.switch_socket: # Sending a string indicates the message is ready to go raise Exception("no socket") #@todo If not string, try to pack if type(msg) != type(""): if msg.xid == None: msg.xid = ofutils.gen_xid() outpkt = msg.pack() else: outpkt = msg msg_version, msg_type, msg_len, msg_xid = struct.unpack_from("!BBHL", outpkt) self.logger.debug("Msg out: buf len %d. hdr.type %s. hdr.len %d hdr.version %d hdr.xid %d", len(outpkt), ofp.ofp_type_map.get(msg_type, "unknown (%d)" % msg_type), msg_len, msg_version, msg_xid) if self.switch_socket.sendall(outpkt) is not None: raise AssertionError("failed to send message to switch") return 0 # for backwards compatibility
def message_send(self, msg, zero_xid=False): """ Send the message to the switch @param msg A string or OpenFlow message object to be forwarded to the switch. @param zero_xid If msg is an OpenFlow object (not a string) and if the XID in the header is 0, then an XID will be generated for the message. Set zero_xid to override this behavior (and keep an existing 0 xid) """ if not self.switch_socket: # Sending a string indicates the message is ready to go raise Exception("no socket") #@todo If not string, try to pack if type(msg) != type(""): if msg.header.xid == 0 and not zero_xid: msg.header.xid = ofutils.gen_xid() outpkt = msg.pack() else: outpkt = msg msg_version, msg_type, msg_len, msg_xid = struct.unpack_from("!BBHL", outpkt) self.logger.debug("Msg out: buf len %d. hdr.type %s. hdr.len %d hdr.version %d hdr.xid %d", len(outpkt), ofp.cstruct.ofp_type_map.get(msg_type, "unknown (%d)" % msg_type), msg_len, msg_version, msg_xid) if self.switch_socket.sendall(outpkt) is not None: raise AssertionError("failed to send message to switch") return 0 # for backwards compatibility
def message_send(self, msg): """ Send the message to the switch @param msg A string or OpenFlow message object to be forwarded to the switch. """ if not self.switch_socket: # Sending a string indicates the message is ready to go raise Exception("no socket") if msg.xid == None: msg.xid = ofutils.gen_xid() outpkt = msg.pack() self.logger.debug("Msg out: version %d class %s len %d xid %d", msg.version, type(msg).__name__, len(outpkt), msg.xid) with self.tx_lock: if self.switch_socket.sendall(outpkt) is not None: raise AssertionError("failed to send message to switch") return 0 # for backwards compatibility
def message_send(self, msg): """ Send the message to the switch @param msg A string or OpenFlow message object to be forwarded to the switch. """ if not self.switch_socket: # Sending a string indicates the message is ready to go raise Exception("no socket") #@todo If not string, try to pack if type(msg) != type(""): if msg.xid == None: msg.xid = ofutils.gen_xid() outpkt = msg.pack() else: outpkt = msg msg_version, msg_type, msg_len, msg_xid = struct.unpack_from( "!BBHL", outpkt) self.logger.debug( "Msg out: buf len %d. hdr.type %s. hdr.len %d hdr.version %d hdr.xid %d", len(outpkt), ofp.ofp_type_map.get(msg_type, "unknown (%d)" % msg_type), msg_len, msg_version, msg_xid) with self.tx_lock: if self.switch_socket.sendall(outpkt) is not None: raise AssertionError("failed to send message to switch") return 0 # for backwards compatibility
def transact(self, msg, timeout=-1, zero_xid=False): """ Run a message transaction with the switch Send the message in msg and wait for a reply with a matching transaction id. Transactions have the highest priority in received message handling. @param msg The message object to send; must not be a string @param timeout The timeout in seconds; if -1 use default. @param zero_xid Normally, if the XID is 0 an XID will be generated for the message. Set zero_xid to override this behavior @return The matching message object or None if unsuccessful """ if not zero_xid and msg.header.xid == 0: msg.header.xid = ofutils.gen_xid() self.logger.debug("Running transaction %d" % msg.header.xid) with self.xid_cv: if self.xid: self.logger.error("Can only run one transaction at a time") return (None, None) self.xid = msg.header.xid self.xid_response = None self.message_send(msg.pack()) self.logger.debug("Waiting for transaction %d" % msg.header.xid) ofutils.timed_wait(self.xid_cv, lambda: self.xid_response, timeout=timeout) if self.xid_response: (resp, pkt) = self.xid_response self.xid_response = None else: (resp, pkt) = (None, None) if resp is None: self.logger.warning("No response for xid " + str(self.xid)) return (resp, pkt)
def transact(self, msg, timeout=-1): """ Run a message transaction with the switch Send the message in msg and wait for a reply with a matching transaction id. Transactions have the highest priority in received message handling. @param msg The message object to send; must not be a string @param timeout The timeout in seconds; if -1 use default. """ if msg.xid == None: msg.xid = ofutils.gen_xid() self.logger.debug("Running transaction %d" % msg.xid) with self.xid_cv: if self.xid: self.logger.error("Can only run one transaction at a time") return (None, None) self.xid = msg.xid self.xid_response = None self.message_send(msg) self.logger.debug("Waiting for transaction %d" % msg.xid) ofutils.timed_wait(self.xid_cv, lambda: self.xid_response, timeout=timeout) if self.xid_response: (resp, pkt) = self.xid_response self.xid_response = None else: (resp, pkt) = (None, None) if resp is None: self.logger.warning("No response for xid " + str(self.xid)) return (resp, pkt)
def transact( self, msg, timeout=-1 ): """ Run a message transaction with the switch Send the message in msg and wait for a reply with a matching transaction id. Transactions have the highest priority in received message handling. @param msg The message object to send; must not be a string @param timeout The timeout in seconds; if -1 use default. """ if msg.xid == None: msg.xid = ofutils.gen_xid( ) self.logger.debug( "Running transaction %d" % msg.xid ) with self.xid_cv: if self.xid: self.logger.error( "Can only run one transaction at a time" ) return (None, None) self.xid = msg.xid self.xid_response = None self.message_send( msg ) self.logger.debug( "Waiting for transaction %d" % msg.xid ) ofutils.timed_wait( self.xid_cv, lambda: self.xid_response, timeout=timeout ) if self.xid_response: (resp, pkt) = self.xid_response self.xid_response = None else: (resp, pkt) = (None, None) if resp is None: self.logger.warning( "No response for xid " + str( self.xid ) ) return (resp, pkt)
def message_send(self, msg): """ Send the message to the switch @param msg A string or OpenFlow message object to be forwarded to the switch. """ if not self.switch_socket: # Sending a string indicates the message is ready to go raise Exception("no socket") if msg.xid == None: msg.xid = ofutils.gen_xid() outpkt = msg.pack() self.logger.debug("Msg out: version %d class %s len %d xid %d", msg.version, type(msg).__name__, len(outpkt), msg.xid) # the following lines are modified by jungwoo q = PrettyPrinter(maxwidth=200) msg.pretty_print(q) self.logger.debug("(message type = %d)", msg.type) if msg.type not in oftest.testutils.test_step_noneStep : self.logger.info("----- Test Step %d -----", oftest.testutils.test_step_count) oftest.testutils.test_step_count+=1 else: self.logger.info("----- Message Sent By Controller (not a test step) -----") self.logger.info("%s\n", q.__str__()) with self.tx_lock: if self.switch_socket.sendall(outpkt) is not None: raise AssertionError("failed to send message to switch") return 0 # for backwards compatibility