summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIsaku Yamahata <yamahata@valinux.co.jp>2012-01-30 18:30:55 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-01-30 18:32:47 +0900
commit104436157a7e161d6090054da892519170777192 (patch)
tree61b750622ac045775f95f4810c7c468b66e9c119
parent2d3a5106350662e76ab40aed1db3d89e6c65e835 (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.py10
-rw-r--r--ryu/controller/handler.py1
-rw-r--r--ryu/ofproto/ofproto_parser.py8
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)