diff options
-rw-r--r-- | ryu/ofproto/ofproto_v1_0_parser.py | 30 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_2_parser.py | 31 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_3_parser.py | 31 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_4_parser.py | 31 | ||||
-rw-r--r-- | ryu/ofproto/ofproto_v1_5_parser.py | 31 |
5 files changed, 139 insertions, 15 deletions
diff --git a/ryu/ofproto/ofproto_v1_0_parser.py b/ryu/ofproto/ofproto_v1_0_parser.py index a34564b5..1c10bdae 100644 --- a/ryu/ofproto/ofproto_v1_0_parser.py +++ b/ryu/ofproto/ofproto_v1_0_parser.py @@ -19,7 +19,8 @@ Decoder/Encoder implementations of OpenFlow 1.0. """ import struct -import binascii +import base64 + import six import netaddr @@ -27,6 +28,7 @@ from ryu.ofproto.ofproto_parser import StringifyMixin, MsgBase from ryu.lib import addrconv from ryu.lib import ip from ryu.lib import mac +from ryu.lib.packet import packet from ryu.lib.pack_utils import msg_pack_into from ryu.ofproto import nx_match from ryu.ofproto import ofproto_common @@ -2605,7 +2607,8 @@ class OFPPacketOut(MsgBase): buffer_id ID assigned by datapath (0xffffffff if none). in_port Packet's input port (OFPP_NONE if none). actions ist of ``OFPAction*`` instance. - data Packet data. + data Packet data of a binary type value or + an instances of packet.Packet. ================ ====================================================== Example:: @@ -2644,12 +2647,33 @@ class OFPPacketOut(MsgBase): if self.data is not None: assert self.buffer_id == 0xffffffff - self.buf += self.data + if isinstance(self.data, packet.Packet): + self.data.serialize() + self.buf += self.data.data + else: + self.buf += self.data msg_pack_into(ofproto.OFP_PACKET_OUT_PACK_STR, self.buf, ofproto.OFP_HEADER_SIZE, self.buffer_id, self.in_port, self._actions_len) + @classmethod + def from_jsondict(cls, dict_, decode_string=base64.b64decode, + **additional_args): + if isinstance(dict_['data'], dict): + data = dict_.pop('data') + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + ins.data = packet.Packet.from_jsondict(data['Packet']) + dict_['data'] = data + else: + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + + return ins + @_register_parser @_set_msg_type(ofproto.OFPT_FLOW_MOD) diff --git a/ryu/ofproto/ofproto_v1_2_parser.py b/ryu/ofproto/ofproto_v1_2_parser.py index b755499c..ddb56f3f 100644 --- a/ryu/ofproto/ofproto_v1_2_parser.py +++ b/ryu/ofproto/ofproto_v1_2_parser.py @@ -18,12 +18,15 @@ Decoder/Encoder implementations of OpenFlow 1.2. """ -import six import struct +import base64 + +import six from ryu.lib import addrconv from ryu.lib import mac from ryu.lib.pack_utils import msg_pack_into +from ryu.lib.packet import packet from ryu import utils from ryu.ofproto.ofproto_parser import StringifyMixin, MsgBase from ryu.ofproto import ether @@ -818,7 +821,8 @@ class OFPPacketOut(MsgBase): buffer_id ID assigned by datapath (OFP_NO_BUFFER if none) in_port Packet's input port or ``OFPP_CONTROLLER`` actions list of OpenFlow action class - data Packet data + data Packet data of a binary type value or + an instances of packet.Packet. ================ ====================================================== Example:: @@ -855,12 +859,33 @@ class OFPPacketOut(MsgBase): if self.data is not None: assert self.buffer_id == 0xffffffff - self.buf += self.data + if isinstance(self.data, packet.Packet): + self.data.serialize() + self.buf += self.data.data + else: + self.buf += self.data msg_pack_into(ofproto.OFP_PACKET_OUT_PACK_STR, self.buf, ofproto.OFP_HEADER_SIZE, self.buffer_id, self.in_port, self.actions_len) + @classmethod + def from_jsondict(cls, dict_, decode_string=base64.b64decode, + **additional_args): + if isinstance(dict_['data'], dict): + data = dict_.pop('data') + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + ins.data = packet.Packet.from_jsondict(data['Packet']) + dict_['data'] = data + else: + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + + return ins + @_register_parser @_set_msg_type(ofproto.OFPT_FLOW_MOD) diff --git a/ryu/ofproto/ofproto_v1_3_parser.py b/ryu/ofproto/ofproto_v1_3_parser.py index 067ae19c..99c4a47b 100644 --- a/ryu/ofproto/ofproto_v1_3_parser.py +++ b/ryu/ofproto/ofproto_v1_3_parser.py @@ -40,12 +40,15 @@ The following extensions are not implemented yet. - EXT-192-v Vacancy events Extension """ -import six import struct +import base64 + +import six from ryu.lib import addrconv from ryu.lib import mac from ryu.lib.pack_utils import msg_pack_into +from ryu.lib.packet import packet from ryu import utils from ryu.ofproto.ofproto_parser import StringifyMixin, MsgBase from ryu.ofproto import ether @@ -2503,7 +2506,8 @@ class OFPPacketOut(MsgBase): buffer_id ID assigned by datapath (OFP_NO_BUFFER if none) in_port Packet's input port or ``OFPP_CONTROLLER`` actions list of OpenFlow action class - data Packet data + data Packet data of a binary type value or + an instances of packet.Packet. ================ ====================================================== Example:: @@ -2538,12 +2542,33 @@ class OFPPacketOut(MsgBase): if self.data is not None: assert self.buffer_id == 0xffffffff - self.buf += self.data + if isinstance(self.data, packet.Packet): + self.data.serialize() + self.buf += self.data.data + else: + self.buf += self.data msg_pack_into(ofproto.OFP_PACKET_OUT_PACK_STR, self.buf, ofproto.OFP_HEADER_SIZE, self.buffer_id, self.in_port, self.actions_len) + @classmethod + def from_jsondict(cls, dict_, decode_string=base64.b64decode, + **additional_args): + if isinstance(dict_['data'], dict): + data = dict_.pop('data') + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + ins.data = packet.Packet.from_jsondict(data['Packet']) + dict_['data'] = data + else: + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + + return ins + @_register_parser @_set_msg_type(ofproto.OFPT_FLOW_MOD) diff --git a/ryu/ofproto/ofproto_v1_4_parser.py b/ryu/ofproto/ofproto_v1_4_parser.py index 50acb3b7..31379c85 100644 --- a/ryu/ofproto/ofproto_v1_4_parser.py +++ b/ryu/ofproto/ofproto_v1_4_parser.py @@ -18,11 +18,14 @@ Decoder/Encoder implementations of OpenFlow 1.4. """ -import six import struct +import base64 + +import six from ryu.lib import addrconv from ryu.lib.pack_utils import msg_pack_into +from ryu.lib.packet import packet from ryu import utils from ryu.ofproto.ofproto_parser import StringifyMixin, MsgBase, MsgInMsgBase from ryu.ofproto import ether @@ -4171,7 +4174,8 @@ class OFPPacketOut(MsgBase): buffer_id ID assigned by datapath (OFP_NO_BUFFER if none) in_port Packet's input port or ``OFPP_CONTROLLER`` actions list of OpenFlow action class - data Packet data + data Packet data of a binary type value or + an instances of packet.Packet. ================ ====================================================== Example:: @@ -4206,12 +4210,33 @@ class OFPPacketOut(MsgBase): if self.data is not None: assert self.buffer_id == 0xffffffff - self.buf += self.data + if isinstance(self.data, packet.Packet): + self.data.serialize() + self.buf += self.data.data + else: + self.buf += self.data msg_pack_into(ofproto.OFP_PACKET_OUT_PACK_STR, self.buf, ofproto.OFP_HEADER_SIZE, self.buffer_id, self.in_port, self.actions_len) + @classmethod + def from_jsondict(cls, dict_, decode_string=base64.b64decode, + **additional_args): + if isinstance(dict_['data'], dict): + data = dict_.pop('data') + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + ins.data = packet.Packet.from_jsondict(data['Packet']) + dict_['data'] = data + else: + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + + return ins + @_register_parser @_set_msg_type(ofproto.OFPT_FLOW_MOD) diff --git a/ryu/ofproto/ofproto_v1_5_parser.py b/ryu/ofproto/ofproto_v1_5_parser.py index c6fe9867..d34ae0f8 100644 --- a/ryu/ofproto/ofproto_v1_5_parser.py +++ b/ryu/ofproto/ofproto_v1_5_parser.py @@ -18,11 +18,14 @@ Decoder/Encoder implementations of OpenFlow 1.5. """ -import six import struct +import base64 + +import six from ryu.lib import addrconv from ryu.lib.pack_utils import msg_pack_into +from ryu.lib.packet import packet from ryu import utils from ryu.ofproto.ofproto_parser import StringifyMixin, MsgBase, MsgInMsgBase from ryu.ofproto import ether @@ -5015,7 +5018,8 @@ class OFPPacketOut(MsgBase): match Instance of ``OFPMatch`` (``in_port`` is mandatory in the match field) actions list of OpenFlow action class - data Packet data + data Packet data of a binary type value or + an instances of packet.Packet. ================ ====================================================== Example:: @@ -5057,7 +5061,11 @@ class OFPPacketOut(MsgBase): if self.buffer_id == ofproto.OFP_NO_BUFFER: assert self.data is not None - self.buf += self.data + if isinstance(self.data, packet.Packet): + self.data.serialize() + self.buf += self.data.data + else: + self.buf += self.data else: assert self.data is None @@ -5065,6 +5073,23 @@ class OFPPacketOut(MsgBase): self.buf, ofproto.OFP_HEADER_SIZE, self.buffer_id, self.actions_len) + @classmethod + def from_jsondict(cls, dict_, decode_string=base64.b64decode, + **additional_args): + if isinstance(dict_['data'], dict): + data = dict_.pop('data') + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + ins.data = packet.Packet.from_jsondict(data['Packet']) + dict_['data'] = data + else: + ins = super(OFPPacketOut, cls).from_jsondict(dict_, + decode_string, + **additional_args) + + return ins + @_register_parser @_set_msg_type(ofproto.OFPT_FLOW_MOD) |