summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ryu/ofproto/ofproto_v1_5.py5
-rw-r--r--ryu/ofproto/ofproto_v1_5_parser.py34
2 files changed, 25 insertions, 14 deletions
diff --git a/ryu/ofproto/ofproto_v1_5.py b/ryu/ofproto/ofproto_v1_5.py
index e93a820d..ce5667d1 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 24ab8c4c..fd9ef079 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)