OpenFlow 1.5 supports setting all pipeline field of the packet
in the Packet-Out message.

This patch adds match field in packet_out message and moves the
in_port field into the match field.

Signed-off-by: IWASE Yusuke <iwase.yusu...@gmail.com>
---
 ryu/ofproto/ofproto_v1_5.py        |  5 +++--
 ryu/ofproto/ofproto_v1_5_parser.py | 34 ++++++++++++++++++++++------------
 2 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/ryu/ofproto/ofproto_v1_5.py b/ryu/ofproto/ofproto_v1_5.py
index e93a820..ce5667d 100644
--- a/ryu/ofproto/ofproto_v1_5.py
+++ b/ryu/ofproto/ofproto_v1_5.py
@@ -745,9 +745,10 @@ OFPGT_FF = 3        # Fast failover group.
 OFP_NO_BUFFER = 0xffffffff  # Special buffer-id to indicate 'no buffer'
 
 # struct ofp_packet_out
-OFP_PACKET_OUT_PACK_STR = '!IH2x'
+OFP_PACKET_OUT_0_PACK_STR = '!IH2x'
+OFP_PACKET_OUT_0_SIZE = 16
 OFP_PACKET_OUT_SIZE = 24
-assert (calcsize(OFP_PACKET_OUT_PACK_STR) + OFP_MATCH_SIZE + OFP_HEADER_SIZE ==
+assert (calcsize(OFP_PACKET_OUT_0_PACK_STR) + OFP_MATCH_SIZE + OFP_HEADER_SIZE 
==
         OFP_PACKET_OUT_SIZE)
 
 # enum ofp_packet_in_reason
diff --git a/ryu/ofproto/ofproto_v1_5_parser.py 
b/ryu/ofproto/ofproto_v1_5_parser.py
index 24ab8c4..fd9ef07 100644
--- a/ryu/ofproto/ofproto_v1_5_parser.py
+++ b/ryu/ofproto/ofproto_v1_5_parser.py
@@ -5443,7 +5443,8 @@ class OFPPacketOut(MsgBase):
     Attribute        Description
     ================ ======================================================
     buffer_id        ID assigned by datapath (OFP_NO_BUFFER if none)
-    in_port          Packet's input port or ``OFPP_CONTROLLER``
+    match            Instance of ``OFPMatch``
+                     (``in_port`` is mandatory in the match field)
     actions          list of OpenFlow action class
     data             Packet data
     ================ ======================================================
@@ -5454,37 +5455,46 @@ class OFPPacketOut(MsgBase):
             ofp = datapath.ofproto
             ofp_parser = datapath.ofproto_parser
 
+            match = OFPMatch(in_port=in_port)
             actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD, 0)]
             req = ofp_parser.OFPPacketOut(datapath, buffer_id,
-                                          in_port, actions)
+                                          match, actions)
             datapath.send_msg(req)
     """
-    def __init__(self, datapath, buffer_id=None, in_port=None, actions=None,
+    def __init__(self, datapath, buffer_id=None, match=None, actions=None,
                  data=None, actions_len=None):
-        assert in_port is not None
-
         super(OFPPacketOut, self).__init__(datapath)
-        self.buffer_id = buffer_id
-        self.in_port = in_port
+        if buffer_id is None:
+            self.buffer_id = ofproto.OFP_NO_BUFFER
+        else:
+            self.buffer_id = buffer_id
         self.actions_len = 0
+        assert 'in_port' in match
+        self.match = match
         self.actions = actions
         self.data = data
 
     def _serialize_body(self):
+        # adjustment
+        offset = ofproto.OFP_PACKET_OUT_0_SIZE
+        match_len = self.match.serialize(self.buf, offset)
+        offset += match_len
+
         self.actions_len = 0
-        offset = ofproto.OFP_PACKET_OUT_SIZE
         for a in self.actions:
             a.serialize(self.buf, offset)
             offset += a.len
             self.actions_len += a.len
 
-        if self.data is not None:
-            assert self.buffer_id == 0xffffffff
+        if self.buffer_id == ofproto.OFP_NO_BUFFER:
+            assert self.data is not None
             self.buf += self.data
+        else:
+            assert self.data is None
 
-        msg_pack_into(ofproto.OFP_PACKET_OUT_PACK_STR,
+        msg_pack_into(ofproto.OFP_PACKET_OUT_0_PACK_STR,
                       self.buf, ofproto.OFP_HEADER_SIZE,
-                      self.buffer_id, self.in_port, self.actions_len)
+                      self.buffer_id, self.actions_len)
 
 
 @_set_msg_type(ofproto.OFPT_FLOW_MOD)
-- 
1.9.1



------------------------------------------------------------------------------
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to