diff options
author | Isaku Yamahata <yamahata@valinux.co.jp> | 2012-01-30 18:30:55 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2012-01-30 18:32:47 +0900 |
commit | 104436157a7e161d6090054da892519170777192 (patch) | |
tree | 61b750622ac045775f95f4810c7c468b66e9c119 | |
parent | 2d3a5106350662e76ab40aed1db3d89e6c65e835 (diff) |
xid: improve xid handling
Generate xid for ofp message instead of always 0.
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r-- | ryu/controller/controller.py | 10 | ||||
-rw-r--r-- | ryu/controller/handler.py | 1 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_parser.py | 8 |
3 files changed, 17 insertions, 2 deletions
diff --git a/ryu/controller/controller.py b/ryu/controller/controller.py index 518106ad..f395e73a 100644 --- a/ryu/controller/controller.py +++ b/ryu/controller/controller.py @@ -16,6 +16,7 @@ import gflags import logging import gevent +import random from gevent.server import StreamServer from gevent.queue import Queue @@ -86,6 +87,7 @@ class Datapath(object): self.version_recv = None self.version_used = None self.set_version(max(self.supported_ofp_version)) + self.xid = random.randint(0, self.ofproto.MAX_XID) self.id = None # datapath_id is unknown yet self.ports = None @@ -128,8 +130,16 @@ class Datapath(object): def send(self, buf): self.send_q.put(buf) + def set_xid(self, msg): + self.xid += 1 + self.xid &= self.ofproto.MAX_XID + msg.set_xid(self.xid) + return self.xid + def send_msg(self, msg): assert isinstance(msg, self.ofproto_parser.MsgBase) + if msg.xid is None: + self.set_xid(msg) msg.serialize() # LOG.debug('send_msg %s', msg) self.send(msg.buf) diff --git a/ryu/controller/handler.py b/ryu/controller/handler.py index b60b6fa6..a56080b4 100644 --- a/ryu/controller/handler.py +++ b/ryu/controller/handler.py @@ -106,6 +106,7 @@ class EchoHandler(object): # LOG.debug('echo request msg %s %s', msg, str(msg.data)) datapath = msg.datapath echo_reply = datapath.ofproto_parser.OFPEchoReply(datapath) + echo_reply.xid = msg.xid echo_reply.data = msg.data datapath.send_msg(echo_reply) diff --git a/ryu/ofproto/ofproto_parser.py b/ryu/ofproto/ofproto_parser.py index 252fcc9e..96c732bc 100644 --- a/ryu/ofproto/ofproto_parser.py +++ b/ryu/ofproto/ofproto_parser.py @@ -66,6 +66,10 @@ class MsgBase(object): self.msg_len = msg_len self.xid = xid + def set_xid(self, xid): + assert self.xid is None + self.xid = xid + def set_buf(self, buf): self.buf = buffer(buf) @@ -95,12 +99,12 @@ class MsgBase(object): assert self.version is not None assert self.msg_type is not None assert self.msg_len is None - assert self.xid is None assert self.buf is not None assert len(self.buf) >= self.datapath.ofproto.OFP_HEADER_SIZE self.msg_len = len(self.buf) - self.xid = 0 # TODO:XXX + if self.xid is None: + self.xid = 0 struct.pack_into(self.datapath.ofproto.OFP_HEADER_PACK_STR, self.buf, 0, self.version, self.msg_type, self.msg_len, self.xid) |