# OpenFlow v1.4 Messages and Structures

## Controller-to-Switch Messages

### Handshake

class `ryu.ofproto.ofproto_v1_4_parser.``OFPFeaturesRequest`(datapath)

  Features request message

  The controller sends a feature request to the switch upon session establishment.

  This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.

  Example:

      def send_features_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPFeaturesRequest(datapath)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPFeaturesRequest": {}
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPSwitchFeatures`(datapath, datapath_id=None, n_buffers=None, n_tables=None, auxiliary_id=None, capabilities=None)

  Features reply message

  The switch responds with a features reply message to a features request.

  This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.

  Example:

      @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
      def switch_features_handler(self, ev):
          msg = ev.msg

          self.logger.debug('OFPSwitchFeatures received: '
                            'datapath_id=0x%016x n_buffers=%d '
                            'n_tables=%d auxiliary_id=%d '
                            'capabilities=0x%08x',
                            msg.datapath_id, msg.n_buffers, msg.n_tables,
                            msg.auxiliary_id, msg.capabilities)

  JSON Example:

      {
         "OFPSwitchFeatures": {
            "auxiliary_id": 99,
            "capabilities": 79,
            "datapath_id": 9210263729383,
            "n_buffers": 0,
            "n_tables": 255
         }
      }

### Switch Configuration

class `ryu.ofproto.ofproto_v1_4_parser.``OFPSetConfig`(datapath, flags=0, miss_send_len=0)

  Set config request message

  The controller sends a set config request message to set configuraion parameters.

  Attribute | Description
  --- | ---
  flags | Bitmap of the following flags. OFPC_FRAG_NORMAL OFPC_FRAG_DROP OFPC_FRAG_REASM
  miss_send_len | Max bytes of new flow that datapath should send to the controller

  Example:

      def send_set_config(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPSetConfig(datapath, ofp.OFPC_FRAG_NORMAL, 256)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPSetConfig": {
            "flags": 0,
            "miss_send_len": 128
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGetConfigRequest`(datapath)

  Get config request message

  The controller sends a get config request to query configuration parameters in the switch.

  Example:

      def send_get_config_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPGetConfigRequest(datapath)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPGetConfigRequest": {}
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGetConfigReply`(datapath, flags=None, miss_send_len=None)

  Get config reply message

  The switch responds to a configuration request with a get config reply message.

  Attribute | Description
  --- | ---
  flags | Bitmap of the following flags. OFPC_FRAG_NORMAL OFPC_FRAG_DROP OFPC_FRAG_REASM
  miss_send_len | Max bytes of new flow that datapath should send to the controller

  Example:

      @set_ev_cls(ofp_event.EventOFPGetConfigReply, MAIN_DISPATCHER)
      def get_config_reply_handler(self, ev):
          msg = ev.msg
          dp = msg.datapath
          ofp = dp.ofproto
          flags = []

          if msg.flags & ofp.OFPC_FRAG_NORMAL:
              flags.append('NORMAL')
          if msg.flags & ofp.OFPC_FRAG_DROP:
              flags.append('DROP')
          if msg.flags & ofp.OFPC_FRAG_REASM:
              flags.append('REASM')
          self.logger.debug('OFPGetConfigReply received: '
                            'flags=%s miss_send_len=%d',
                            ','.join(flags), msg.miss_send_len)

  JSON Example:

      {
         "OFPGetConfigReply": {
            "flags": 0,
            "miss_send_len": 128
         }
      }

### Modify State Messages

class `ryu.ofproto.ofproto_v1_4_parser.``OFPTableMod`(datapath, table_id, config, properties)

  Flow table configuration message

  The controller sends this message to configure table state.

  Attribute | Description
  --- | ---
  table_id | ID of the table (OFPTT_ALL indicates all tables)
  config | Bitmap of configuration flags. OFPTC_EVICTION OFPTC_VACANCY_EVENTS
  properties | List of `OFPTableModProp` subclass instance

  Example:

      def send_table_mod(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPTableMod(datapath, 1, 3)
          flags = ofp.OFPTC_VACANCY_EVENTS
          properties = [ofp_parser.OFPTableModPropEviction(flags)]
          req = ofp_parser.OFPTableMod(datapath, 1, 3, properties)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPTableMod": {
            "config": 0,
            "properties": [
               {
                  "OFPTableModPropEviction": {
                     "flags": 0,
                     "length": 8,
                     "type": 2
                  }
               },
               {
                  "OFPTableModPropVacancy": {
                     "length": 8,
                     "type": 3,
                     "vacancy": 0,
                     "vacancy_down": 0,
                     "vacancy_up": 0
                  }
               },
               {
                  "OFPTableModPropExperimenter": {
                     "data": [],
                     "exp_type": 0,
                     "experimenter": 101,
                     "length": 12,
                     "type": 65535
                  }
               },
               {
                  "OFPTableModPropExperimenter": {
                     "data": [
                        1
                     ],
                     "exp_type": 1,
                     "experimenter": 101,
                     "length": 16,
                     "type": 65535
                  }
               },
               {
                  "OFPTableModPropExperimenter": {
                     "data": [
                        1,
                        2
                     ],
                     "exp_type": 2,
                     "experimenter": 101,
                     "length": 20,
                     "type": 65535
                  }
               }
            ],
            "table_id": 255
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPFlowMod`(datapath, cookie=0, cookie_mask=0, table_id=0, command=0, idle_timeout=0, hard_timeout=0, priority=32768, buffer_id=4294967295, out_port=0, out_group=0, flags=0, importance=0, match=None, instructions=None)

  Modify Flow entry message

  The controller sends this message to modify the flow table.

  Attribute | Description
  --- | ---
  cookie | Opaque controller-issued identifier
  cookie_mask | Mask used to restrict the cookie bits that must match when the command is `OPFFC_MODIFY*` or `OFPFC_DELETE*`
  table_id | ID of the table to put the flow in
  command | One of the following values. OFPFC_ADD OFPFC_MODIFY OFPFC_MODIFY_STRICT OFPFC_DELETE OFPFC_DELETE_STRICT
  idle_timeout | Idle time before discarding (seconds)
  hard_timeout | Max time before discarding (seconds)
  priority | Priority level of flow entry
  buffer_id | Buffered packet to apply to (or OFP_NO_BUFFER)
  out_port | For `OFPFC_DELETE*` commands, require matching entries to include this as an output port
  out_group | For `OFPFC_DELETE*` commands, require matching entries to include this as an output group
  flags | Bitmap of the following flags. OFPFF_SEND_FLOW_REM OFPFF_CHECK_OVERLAP OFPFF_RESET_COUNTS OFPFF_NO_PKT_COUNTS OFPFF_NO_BYT_COUNTS
  importance | Eviction precedence
  match | Instance of `OFPMatch`
  instructions | list of `OFPInstruction*` instance

  Example:

      def send_flow_mod(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          cookie = cookie_mask = 0
          table_id = 0
          idle_timeout = hard_timeout = 0
          priority = 32768
          buffer_id = ofp.OFP_NO_BUFFER
          importance = 0
          match = ofp_parser.OFPMatch(in_port=1, eth_dst='ff:ff:ff:ff:ff:ff')
          actions = [ofp_parser.OFPActionOutput(ofp.OFPP_NORMAL, 0)]
          inst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS,
                                                   actions)]
          req = ofp_parser.OFPFlowMod(datapath, cookie, cookie_mask,
                                      table_id, ofp.OFPFC_ADD,
                                      idle_timeout, hard_timeout,
                                      priority, buffer_id,
                                      ofp.OFPP_ANY, ofp.OFPG_ANY,
                                      ofp.OFPFF_SEND_FLOW_REM,
                                      importance,
                                      match, inst)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPFlowMod": {
            "buffer_id": 65535,
            "command": 0,
            "cookie": 0,
            "cookie_mask": 0,
            "flags": 0,
            "hard_timeout": 0,
            "idle_timeout": 0,
            "importance": 0,
            "instructions": [
               {
                  "OFPInstructionActions": {
                     "actions": [
                        {
                           "OFPActionSetField": {
                              "field": {
                                 "OXMTlv": {
                                    "field": "vlan_vid",
                                    "mask": null,
                                    "value": 258
                                 }
                              },
                              "len": 16,
                              "type": 25
                           }
                        },
                        {
                           "OFPActionCopyTtlOut": {
                              "len": 8,
                              "type": 11
                           }
                        },
                        {
                           "OFPActionCopyTtlIn": {
                              "len": 8,
                              "type": 12
                           }
                        },
                        {
                           "OFPActionCopyTtlIn": {
                              "len": 8,
                              "type": 12
                           }
                        },
                        {
                           "OFPActionPopPbb": {
                              "len": 8,
                              "type": 27
                           }
                        },
                        {
                           "OFPActionPushPbb": {
                              "ethertype": 4660,
                              "len": 8,
                              "type": 26
                           }
                        },
                        {
                           "OFPActionPopMpls": {
                              "ethertype": 39030,
                              "len": 8,
                              "type": 20
                           }
                        },
                        {
                           "OFPActionPushMpls": {
                              "ethertype": 34887,
                              "len": 8,
                              "type": 19
                           }
                        },
                        {
                           "OFPActionPopVlan": {
                              "len": 8,
                              "type": 18
                           }
                        },
                        {
                           "OFPActionPushVlan": {
                              "ethertype": 33024,
                              "len": 8,
                              "type": 17
                           }
                        },
                        {
                           "OFPActionDecMplsTtl": {
                              "len": 8,
                              "type": 16
                           }
                        },
                        {
                           "OFPActionSetMplsTtl": {
                              "len": 8,
                              "mpls_ttl": 10,
                              "type": 15
                           }
                        },
                        {
                           "OFPActionDecNwTtl": {
                              "len": 8,
                              "type": 24
                           }
                        },
                        {
                           "OFPActionSetNwTtl": {
                              "len": 8,
                              "nw_ttl": 10,
                              "type": 23
                           }
                        },
                        {
                           "OFPActionExperimenterUnknown": {
                              "data": "AAECAwQFBgc=",
                              "experimenter": 101,
                              "len": 16,
                              "type": 65535
                           }
                        },
                        {
                           "OFPActionSetQueue": {
                              "len": 8,
                              "queue_id": 3,
                              "type": 21
                           }
                        },
                        {
                           "OFPActionGroup": {
                              "group_id": 99,
                              "len": 8,
                              "type": 22
                           }
                        },
                        {
                           "OFPActionOutput": {
                              "len": 16,
                              "max_len": 65535,
                              "port": 6,
                              "type": 0
                           }
                        }
                     ],
                     "len": 176,
                     "type": 3
                  }
               },
               {
                  "OFPInstructionActions": {
                     "actions": [
                        {
                           "OFPActionSetField": {
                              "field": {
                                 "OXMTlv": {
                                    "field": "eth_src",
                                    "mask": null,
                                    "value": "01:02:03:04:05:06"
                                 }
                              },
                              "len": 16,
                              "type": 25
                           }
                        },
                        {
                           "OFPActionSetField": {
                              "field": {
                                 "OXMTlv": {
                                    "field": "pbb_uca",
                                    "mask": null,
                                    "value": 1
                                 }
                              },
                              "len": 16,
                              "type": 25
                           }
                        }
                     ],
                     "len": 40,
                     "type": 4
                  }
               }
            ],
            "match": {
               "OFPMatch": {
                  "length": 14,
                  "oxm_fields": [
                     {
                        "OXMTlv": {
                           "field": "eth_dst",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     }
                  ],
                  "type": 1
               }
            },
            "out_group": 4294967295,
            "out_port": 4294967295,
            "priority": 123,
            "table_id": 1
         }
      }

      {
         "OFPFlowMod": {
            "buffer_id": 65535,
            "command": 0,
            "cookie": 0,
            "cookie_mask": 0,
            "flags": 0,
            "hard_timeout": 0,
            "idle_timeout": 0,
            "importance": 0,
            "instructions": [
               {
                  "OFPInstructionGotoTable": {
                     "len": 8,
                     "table_id": 1,
                     "type": 1
                  }
               }
            ],
            "match": {
               "OFPMatch": {
                  "length": 22,
                  "oxm_fields": [
                     {
                        "OXMTlv": {
                           "field": "in_port",
                           "mask": null,
                           "value": 6
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_src",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     }
                  ],
                  "type": 1
               }
            },
            "out_group": 4294967295,
            "out_port": 4294967295,
            "priority": 123,
            "table_id": 0
         }
      }

      {
         "OFPFlowMod": {
            "buffer_id": 65535,
            "command": 0,
            "cookie": 0,
            "cookie_mask": 0,
            "flags": 0,
            "hard_timeout": 0,
            "idle_timeout": 0,
            "importance": 0,
            "instructions": [
               {
                  "OFPInstructionMeter": {
                     "len": 8,
                     "meter_id": 1,
                     "type": 6
                  }
               },
               {
                  "OFPInstructionActions": {
                     "actions": [
                        {
                           "OFPActionOutput": {
                              "len": 16,
                              "max_len": 65535,
                              "port": 6,
                              "type": 0
                           }
                        }
                     ],
                     "len": 24,
                     "type": 3
                  }
               }
            ],
            "match": {
               "OFPMatch": {
                  "length": 14,
                  "oxm_fields": [
                     {
                        "OXMTlv": {
                           "field": "eth_dst",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     }
                  ],
                  "type": 1
               }
            },
            "out_group": 4294967295,
            "out_port": 4294967295,
            "priority": 123,
            "table_id": 1
         }
      }

      {
         "OFPFlowMod": {
            "buffer_id": 65535,
            "command": 0,
            "cookie": 0,
            "cookie_mask": 0,
            "flags": 0,
            "hard_timeout": 0,
            "idle_timeout": 0,
            "importance": 0,
            "instructions": [],
            "match": {
               "OFPMatch": {
                  "length": 329,
                  "oxm_fields": [
                     {
                        "OXMTlv": {
                           "field": "in_port",
                           "mask": null,
                           "value": 84281096
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "in_phy_port",
                           "mask": null,
                           "value": 16909060
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "metadata",
                           "mask": null,
                           "value": 283686952306183
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_type",
                           "mask": null,
                           "value": 2054
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_dst",
                           "mask": null,
                           "value": "ff:ff:ff:ff:ff:ff"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_src",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "vlan_vid",
                           "mask": null,
                           "value": 999
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ip_dscp",
                           "mask": null,
                           "value": 9
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ip_ecn",
                           "mask": null,
                           "value": 3
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ip_proto",
                           "mask": null,
                           "value": 99
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv4_src",
                           "mask": null,
                           "value": "1.2.3.4"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv4_dst",
                           "mask": null,
                           "value": "1.2.3.4"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "tcp_src",
                           "mask": null,
                           "value": 8080
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "tcp_dst",
                           "mask": null,
                           "value": 18080
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "udp_src",
                           "mask": null,
                           "value": 28080
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "udp_dst",
                           "mask": null,
                           "value": 55936
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "sctp_src",
                           "mask": null,
                           "value": 48080
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "sctp_dst",
                           "mask": null,
                           "value": 59328
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "icmpv4_type",
                           "mask": null,
                           "value": 100
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "icmpv4_code",
                           "mask": null,
                           "value": 101
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_op",
                           "mask": null,
                           "value": 1
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_spa",
                           "mask": null,
                           "value": "10.0.0.1"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_tpa",
                           "mask": null,
                           "value": "10.0.0.3"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_sha",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_tha",
                           "mask": null,
                           "value": "00:00:00:00:00:00"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_src",
                           "mask": null,
                           "value": "fe80::f00b:a4ff:fe48:28a5"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_dst",
                           "mask": null,
                           "value": "fe80::f00b:a4ff:fe05:b7dc"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_flabel",
                           "mask": null,
                           "value": 541473
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "icmpv6_type",
                           "mask": null,
                           "value": 200
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "icmpv6_code",
                           "mask": null,
                           "value": 201
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_nd_target",
                           "mask": null,
                           "value": "fe80::a60:6eff:fe7f:74e7"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_nd_sll",
                           "mask": null,
                           "value": "00:00:00:00:02:9a"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_nd_tll",
                           "mask": null,
                           "value": "00:00:00:00:02:2b"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "mpls_label",
                           "mask": null,
                           "value": 624485
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "mpls_tc",
                           "mask": null,
                           "value": 5
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "mpls_bos",
                           "mask": null,
                           "value": 1
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "pbb_isid",
                           "mask": null,
                           "value": 11259375
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "tunnel_id",
                           "mask": null,
                           "value": 651061555542690057
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_exthdr",
                           "mask": null,
                           "value": 500
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "pbb_uca",
                           "mask": null,
                           "value": 1
                        }
                     }
                  ],
                  "type": 1
               }
            },
            "out_group": 4294967295,
            "out_port": 4294967295,
            "priority": 123,
            "table_id": 1
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGroupMod`(datapath, command=0, type_=0, group_id=0, buckets=None)

  Modify group entry message

  The controller sends this message to modify the group table.

  Attribute | Description
  --- | ---
  command | One of the following values. OFPGC_ADD OFPGC_MODIFY OFPGC_DELETE
  type | One of the following values. OFPGT_ALL OFPGT_SELECT OFPGT_INDIRECT OFPGT_FF
  group_id | Group identifier
  buckets | list of `OFPBucket`

  `type` attribute corresponds to `type_` parameter of __init__.

  Example:

      def send_group_mod(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          port = 1
          max_len = 2000
          actions = [ofp_parser.OFPActionOutput(port, max_len)]

          weight = 100
          watch_port = 0
          watch_group = 0
          buckets = [ofp_parser.OFPBucket(weight, watch_port, watch_group,
                                          actions)]

          group_id = 1
          req = ofp_parser.OFPGroupMod(datapath, ofp.OFPGC_ADD,
                                       ofp.OFPGT_SELECT, group_id, buckets)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPGroupMod": {
            "buckets": [
               {
                  "OFPBucket": {
                     "actions": [
                        {
                           "OFPActionOutput": {
                              "len": 16,
                              "max_len": 65535,
                              "port": 2,
                              "type": 0
                           }
                        }
                     ],
                     "len": 32,
                     "watch_group": 1,
                     "watch_port": 1,
                     "weight": 1
                  }
               }
            ],
            "command": 0,
            "group_id": 1,
            "type": 0
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPPortMod`(datapath, port_no=0, hw_addr='00:00:00:00:00:00', config=0, mask=0, properties=None)

  Port modification message

  The controller sneds this message to modify the behavior of the port.

  Attribute | Description
  --- | ---
  port_no | Port number to modify
  hw_addr | The hardware address that must be the same as hw_addr of `OFPPort` of `OFPSwitchFeatures`
  config | Bitmap of configuration flags. OFPPC_PORT_DOWN OFPPC_NO_RECV OFPPC_NO_FWD OFPPC_NO_PACKET_IN
  mask | Bitmap of configuration flags above to be changed
  properties | List of `OFPPortModProp` subclass instance

  Example:

      def send_port_mod(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          port_no = 3
          hw_addr = 'fa:c8:e8:76:1d:7e'
          config = 0
          mask = (ofp.OFPPC_PORT_DOWN | ofp.OFPPC_NO_RECV |
                  ofp.OFPPC_NO_FWD | ofp.OFPPC_NO_PACKET_IN)
          advertise = (ofp.OFPPF_10MB_HD | ofp.OFPPF_100MB_FD |
                       ofp.OFPPF_1GB_FD | ofp.OFPPF_COPPER |
                       ofp.OFPPF_AUTONEG | ofp.OFPPF_PAUSE |
                       ofp.OFPPF_PAUSE_ASYM)
          properties = [ofp_parser.OFPPortModPropEthernet(advertise)]
          req = ofp_parser.OFPPortMod(datapath, port_no, hw_addr, config,
                                      mask, properties)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPPortMod": {
            "config": 0,
            "hw_addr": "00:11:00:00:11:11",
            "mask": 0,
            "port_no": 1,
            "properties": [
               {
                  "OFPPortModPropEthernet": {
                     "advertise": 4096,
                     "length": 8,
                     "type": 0
                  }
               },
               {
                  "OFPPortModPropOptical": {
                     "configure": 3,
                     "fl_offset": 2000,
                     "freq_lmda": 1500,
                     "grid_span": 3000,
                     "length": 24,
                     "tx_pwr": 300,
                     "type": 1
                  }
               },
               {
                  "OFPPortModPropExperimenter": {
                     "data": [],
                     "exp_type": 0,
                     "experimenter": 101,
                     "length": 12,
                     "type": 65535
                  }
               },
               {
                  "OFPPortModPropExperimenter": {
                     "data": [
                        1
                     ],
                     "exp_type": 1,
                     "experimenter": 101,
                     "length": 16,
                     "type": 65535
                  }
               },
               {
                  "OFPPortModPropExperimenter": {
                     "data": [
                        1,
                        2
                     ],
                     "exp_type": 2,
                     "experimenter": 101,
                     "length": 20,
                     "type": 65535
                  }
               }
            ]
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPMeterMod`(datapath, command=0, flags=1, meter_id=1, bands=None)

  Meter modification message

  The controller sends this message to modify the meter.

  Attribute | Description
  --- | ---
  command | One of the following values. OFPMC_ADD OFPMC_MODIFY OFPMC_DELETE
  flags | Bitmap of the following flags. OFPMF_KBPS OFPMF_PKTPS OFPMF_BURST OFPMF_STATS
  meter_id | Meter instance
  bands | list of the following class instance. OFPMeterBandDrop OFPMeterBandDscpRemark OFPMeterBandExperimenter

  JSON Example:

      {
         "OFPMeterMod": {
            "bands": [
               {
                  "OFPMeterBandDrop": {
                     "burst_size": 10,
                     "len": 16,
                     "rate": 1000,
                     "type": 1
                  }
               },
               {
                  "OFPMeterBandDscpRemark": {
                     "burst_size": 10,
                     "len": 16,
                     "prec_level": 1,
                     "rate": 1000,
                     "type": 2
                  }
               },
               {
                  "OFPMeterBandExperimenter": {
                     "burst_size": 10,
                     "experimenter": 999,
                     "len": 16,
                     "rate": 1000,
                     "type": 65535
                  }
               }
            ],
            "command": 0,
            "flags": 14,
            "meter_id": 100
         }
      }

### Multipart Messages

class `ryu.ofproto.ofproto_v1_4_parser.``OFPDescStatsRequest`(datapath, flags=0, type_=None)

  Description statistics request message

  The controller uses this message to query description of the switch.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`

  Example:

      def send_desc_stats_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPDescStatsRequest(datapath, 0)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPDescStatsRequest": {
            "flags": 0,
            "type": 0
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPDescStatsReply`(datapath, type_=None, **kwargs)

  Description statistics reply message

  The switch responds with this message to a description statistics request.

  Attribute | Description
  --- | ---
  body | Instance of `OFPDescStats`

  Example:

      @set_ev_cls(ofp_event.EventOFPDescStatsReply, MAIN_DISPATCHER)
      def desc_stats_reply_handler(self, ev):
          body = ev.msg.body

          self.logger.debug('DescStats: mfr_desc=%s hw_desc=%s sw_desc=%s '
                            'serial_num=%s dp_desc=%s',
                            body.mfr_desc, body.hw_desc, body.sw_desc,
                            body.serial_num, body.dp_desc)

  JSON Example:

      {
         "OFPDescStatsReply": {
            "body": {
               "OFPDescStats": {
                  "dp_desc": "dp",
                  "hw_desc": "hw",
                  "mfr_desc": "mfr",
                  "serial_num": "serial",
                  "sw_desc": "sw"
               }
            },
            "flags": 0,
            "type": 0
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPFlowStatsRequest`(datapath, flags=0, table_id=255, out_port=4294967295, out_group=4294967295, cookie=0, cookie_mask=0, match=None, type_=None)

  Individual flow statistics request message

  The controller uses this message to query individual flow statistics.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  table_id | ID of table to read
  out_port | Require matching entries to include this as an output port
  out_group | Require matching entries to include this as an output group
  cookie | Require matching entries to contain this cookie value
  cookie_mask | Mask used to restrict the cookie bits that must match
  match | Instance of `OFPMatch`

  Example:

      def send_flow_stats_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          cookie = cookie_mask = 0
          match = ofp_parser.OFPMatch(in_port=1)
          req = ofp_parser.OFPFlowStatsRequest(datapath, 0,
                                               ofp.OFPTT_ALL,
                                               ofp.OFPP_ANY, ofp.OFPG_ANY,
                                               cookie, cookie_mask,
                                               match)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPFlowStatsRequest": {
            "cookie": 0,
            "cookie_mask": 0,
            "flags": 0,
            "match": {
               "OFPMatch": {
                  "length": 4,
                  "oxm_fields": [],
                  "type": 1
               }
            },
            "out_group": 4294967295,
            "out_port": 4294967295,
            "table_id": 0,
            "type": 1
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPFlowStatsReply`(datapath, type_=None, **kwargs)

  Individual flow statistics reply message

  The switch responds with this message to an individual flow statistics request.

  Attribute | Description
  --- | ---
  body | List of `OFPFlowStats` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
      def flow_stats_reply_handler(self, ev):
          flows = []
          for stat in ev.msg.body:
              flows.append('table_id=%s '
                           'duration_sec=%d duration_nsec=%d '
                           'priority=%d '
                           'idle_timeout=%d hard_timeout=%d flags=0x%04x '
                           'importance=%d cookie=%d packet_count=%d '
                           'byte_count=%d match=%s instructions=%s' %
                           (stat.table_id,
                            stat.duration_sec, stat.duration_nsec,
                            stat.priority,
                            stat.idle_timeout, stat.hard_timeout,
                            stat.flags, stat.importance,
                            stat.cookie, stat.packet_count, stat.byte_count,
                            stat.match, stat.instructions))
          self.logger.debug('FlowStats: %s', flows)

  JSON Example:

      {
         "OFPFlowStatsReply": {
            "body": [
               {
                  "OFPFlowStats": {
                     "byte_count": 0,
                     "cookie": 0,
                     "duration_nsec": 115277000,
                     "duration_sec": 358,
                     "flags": 0,
                     "hard_timeout": 0,
                     "idle_timeout": 0,
                     "importance": 0,
                     "instructions": [],
                     "length": 56,
                     "match": {
                        "OFPMatch": {
                           "length": 4,
                           "oxm_fields": [],
                           "type": 1
                        }
                     },
                     "packet_count": 0,
                     "priority": 65535,
                     "table_id": 0
                  }
               },
               {
                  "OFPFlowStats": {
                     "byte_count": 0,
                     "cookie": 0,
                     "duration_nsec": 115055000,
                     "duration_sec": 358,
                     "flags": 0,
                     "hard_timeout": 0,
                     "idle_timeout": 0,
                     "importance": 0,
                     "instructions": [
                        {
                           "OFPInstructionActions": {
                              "actions": [
                                 {
                                    "OFPActionOutput": {
                                       "len": 16,
                                       "max_len": 0,
                                       "port": 4294967290,
                                       "type": 0
                                    }
                                 }
                              ],
                              "len": 24,
                              "type": 4
                           }
                        }
                     ],
                     "length": 88,
                     "match": {
                        "OFPMatch": {
                           "length": 10,
                           "oxm_fields": [
                              {
                                 "OXMTlv": {
                                    "field": "eth_type",
                                    "mask": null,
                                    "value": 2054
                                 }
                              }
                           ],
                           "type": 1
                        }
                     },
                     "packet_count": 0,
                     "priority": 65534,
                     "table_id": 0
                  }
               },
               {
                  "OFPFlowStats": {
                     "byte_count": 238,
                     "cookie": 0,
                     "duration_nsec": 511582000,
                     "duration_sec": 316220,
                     "flags": 0,
                     "hard_timeout": 0,
                     "idle_timeout": 0,
                     "importance": 0,
                     "instructions": [
                        {
                           "OFPInstructionGotoTable": {
                              "len": 8,
                              "table_id": 1,
                              "type": 1
                           }
                        }
                     ],
                     "length": 80,
                     "match": {
                        "OFPMatch": {
                           "length": 22,
                           "oxm_fields": [
                              {
                                 "OXMTlv": {
                                    "field": "in_port",
                                    "mask": null,
                                    "value": 6
                                 }
                              },
                              {
                                 "OXMTlv": {
                                    "field": "eth_src",
                                    "mask": null,
                                    "value": "f2:0b:a4:7d:f8:ea"
                                 }
                              }
                           ],
                           "type": 1
                        }
                     },
                     "packet_count": 3,
                     "priority": 123,
                     "table_id": 0
                  }
               },
               {
                  "OFPFlowStats": {
                     "byte_count": 98,
                     "cookie": 0,
                     "duration_nsec": 980901000,
                     "duration_sec": 313499,
                     "flags": 0,
                     "hard_timeout": 0,
                     "idle_timeout": 0,
                     "importance": 0,
                     "instructions": [
                        {
                           "OFPInstructionActions": {
                              "actions": [
                                 {
                                    "OFPActionSetField": {
                                       "field": {
                                          "OXMTlv": {
                                             "field": "vlan_vid",
                                             "mask": null,
                                             "value": 258
                                          }
                                       },
                                       "len": 16,
                                       "type": 25
                                    }
                                 },
                                 {
                                    "OFPActionCopyTtlOut": {
                                       "len": 8,
                                       "type": 11
                                    }
                                 },
                                 {
                                    "OFPActionCopyTtlIn": {
                                       "len": 8,
                                       "type": 12
                                    }
                                 },
                                 {
                                    "OFPActionCopyTtlIn": {
                                       "len": 8,
                                       "type": 12
                                    }
                                 },
                                 {
                                    "OFPActionPopPbb": {
                                       "len": 8,
                                       "type": 27
                                    }
                                 },
                                 {
                                    "OFPActionPushPbb": {
                                       "ethertype": 4660,
                                       "len": 8,
                                       "type": 26
                                    }
                                 },
                                 {
                                    "OFPActionPopMpls": {
                                       "ethertype": 39030,
                                       "len": 8,
                                       "type": 20
                                    }
                                 },
                                 {
                                    "OFPActionPushMpls": {
                                       "ethertype": 34887,
                                       "len": 8,
                                       "type": 19
                                    }
                                 },
                                 {
                                    "OFPActionPopVlan": {
                                       "len": 8,
                                       "type": 18
                                    }
                                 },
                                 {
                                    "OFPActionPushVlan": {
                                       "ethertype": 33024,
                                       "len": 8,
                                       "type": 17
                                    }
                                 },
                                 {
                                    "OFPActionDecMplsTtl": {
                                       "len": 8,
                                       "type": 16
                                    }
                                 },
                                 {
                                    "OFPActionSetMplsTtl": {
                                       "len": 8,
                                       "mpls_ttl": 10,
                                       "type": 15
                                    }
                                 },
                                 {
                                    "OFPActionDecNwTtl": {
                                       "len": 8,
                                       "type": 24
                                    }
                                 },
                                 {
                                    "OFPActionSetNwTtl": {
                                       "len": 8,
                                       "nw_ttl": 10,
                                       "type": 23
                                    }
                                 },
                                 {
                                    "OFPActionSetQueue": {
                                       "len": 8,
                                       "queue_id": 3,
                                       "type": 21
                                    }
                                 },
                                 {
                                    "OFPActionGroup": {
                                       "group_id": 99,
                                       "len": 8,
                                       "type": 22
                                    }
                                 },
                                 {
                                    "OFPActionOutput": {
                                       "len": 16,
                                       "max_len": 65535,
                                       "port": 6,
                                       "type": 0
                                    }
                                 },
                                 {
                                    "OFPActionExperimenterUnknown": {
                                       "len": 16,
                                       "data": "ZXhwX2RhdGE=",
                                       "experimenter": 98765432,
                                       "type": 65535
                                    }
                                 },
                                 {
                                    "NXActionUnknown": {
                                       "len": 16,
                                       "data": "cF9kYXRh",
                                       "experimenter": 8992,
                                       "type": 65535,
                                       "subtype": 25976
                                    }
                                 }
                              ],
                              "len": 192,
                              "type": 3
                           }
                        },
                        {
                           "OFPInstructionActions": {
                              "actions": [
                                 {
                                    "OFPActionSetField": {
                                       "field": {
                                          "OXMTlv": {
                                             "field": "eth_src",
                                             "mask": null,
                                             "value": "01:02:03:04:05:06"
                                          }
                                       },
                                       "len": 16,
                                       "type": 25
                                    }
                                 },
                                 {
                                    "OFPActionSetField": {
                                       "field": {
                                          "OXMTlv": {
                                             "field": "pbb_uca",
                                             "mask": null,
                                             "value": 1
                                          }
                                       },
                                       "len": 16,
                                       "type": 25
                                    }
                                 }
                              ],
                              "len": 40,
                              "type": 4
                           }
                        },
                        {
                           "OFPInstructionActions": {
                              "actions": [
                                 {
                                    "OFPActionOutput": {
                                       "len": 16,
                                       "max_len": 65535,
                                       "port": 4294967293,
                                       "type": 0
                                    }
                                 }
                              ],
                              "len": 24,
                              "type": 3
                           }
                        }
                     ],
                     "length": 312,
                     "match": {
                        "OFPMatch": {
                           "length": 4,
                           "oxm_fields": [],
                           "type": 1
                        }
                     },
                     "packet_count": 1,
                     "priority": 0,
                     "table_id": 0
                  }
               }
            ],
            "flags": 0,
            "type": 1
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPAggregateStatsRequest`(datapath, flags, table_id, out_port, out_group, cookie, cookie_mask, match, type_=None)

  Aggregate flow statistics request message

  The controller uses this message to query aggregate flow statictics.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  table_id | ID of table to read
  out_port | Require matching entries to include this as an output port
  out_group | Require matching entries to include this as an output group
  cookie | Require matching entries to contain this cookie value
  cookie_mask | Mask used to restrict the cookie bits that must match
  match | Instance of `OFPMatch`

  Example:

      def send_aggregate_stats_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          cookie = cookie_mask = 0
          match = ofp_parser.OFPMatch(in_port=1)
          req = ofp_parser.OFPAggregateStatsRequest(datapath, 0,
                                                    ofp.OFPTT_ALL,
                                                    ofp.OFPP_ANY,
                                                    ofp.OFPG_ANY,
                                                    cookie, cookie_mask,
                                                    match)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPAggregateStatsRequest": {
            "cookie": 0,
            "cookie_mask": 0,
            "flags": 0,
            "match": {
               "OFPMatch": {
                  "length": 4,
                  "oxm_fields": [],
                  "type": 1
               }
            },
            "out_group": 4294967295,
            "out_port": 4294967295,
            "table_id": 255,
            "type": 2
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPAggregateStatsReply`(datapath, type_=None, **kwargs)

  Aggregate flow statistics reply message

  The switch responds with this message to an aggregate flow statistics request.

  Attribute | Description
  --- | ---
  body | Instance of `OFPAggregateStats`

  Example:

      @set_ev_cls(ofp_event.EventOFPAggregateStatsReply, MAIN_DISPATCHER)
      def aggregate_stats_reply_handler(self, ev):
          body = ev.msg.body

          self.logger.debug('AggregateStats: packet_count=%d byte_count=%d '
                            'flow_count=%d',
                            body.packet_count, body.byte_count,
                            body.flow_count)

  JSON Example:

      {
         "OFPAggregateStatsReply": {
            "body": {
               "OFPAggregateStats": {
                  "byte_count": 574,
                  "flow_count": 6,
                  "packet_count": 7
               }
            },
            "flags": 0,
            "type": 2
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPTableStatsRequest`(datapath, flags, type_=None)

  Table statistics request message

  The controller uses this message to query flow table statictics.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`

  Example:

      def send_table_stats_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPTableStatsRequest(datapath, 0)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPTableStatsRequest": {
            "flags": 0,
            "type": 3
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPTableStatsReply`(datapath, type_=None, **kwargs)

  Table statistics reply message

  The switch responds with this message to a table statistics request.

  Attribute | Description
  --- | ---
  body | List of `OFPTableStats` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPTableStatsReply, MAIN_DISPATCHER)
      def table_stats_reply_handler(self, ev):
          tables = []
          for stat in ev.msg.body:
              tables.append('table_id=%d active_count=%d lookup_count=%d '
                            ' matched_count=%d' %
                            (stat.table_id, stat.active_count,
                             stat.lookup_count, stat.matched_count))
          self.logger.debug('TableStats: %s', tables)

  JSON Example:

      {
         "OFPTableStatsReply": {
            "body": [
               {
                  "OFPTableStats": {
                     "active_count": 4,
                     "lookup_count": 4,
                     "matched_count": 4,
                     "table_id": 0
                  }
               },
               {
                  "OFPTableStats": {
                     "active_count": 4,
                     "lookup_count": 4,
                     "matched_count": 4,
                     "table_id": 1
                  }
               }
            ],
            "flags": 0,
            "type": 3
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPTableDescStatsRequest`(datapath, flags=0, type_=None)

  Table description request message

  The controller uses this message to query description of all the tables.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`

  Example:

      def send_table_desc_stats_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPTableDescStatsRequest(datapath, 0)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPTableDescStatsRequest": {
            "flags": 0,
            "type": 14
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPTableDescStatsReply`(datapath, type_=None, **kwargs)

  Table description reply message

  The switch responds with this message to a table description request.

  Attribute | Description
  --- | ---
  body | List of `OFPTableDesc` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPTableDescStatsReply, MAIN_DISPATCHER)
      def table_desc_stats_reply_handler(self, ev):
          tables = []
          for p in ev.msg.body:
              tables.append('table_id=%d config=0x%08x properties=%s' %
                           (p.table_id, p.config, repr(p.properties)))
          self.logger.debug('OFPTableDescStatsReply received: %s', tables)

  JSON Example:

      {
         "OFPTableDescStatsReply": {
            "body": [
               {
                  "OFPTableDesc": {
                     "config": 0,
                     "length": 24,
                     "properties": [
                        {
                           "OFPTableModPropExperimenter": {
                              "data": [],
                              "exp_type": 0,
                              "experimenter": 101,
                              "length": 12,
                              "type": 65535
                           }
                        }
                     ],
                     "table_id": 7
                  }
               },
               {
                  "OFPTableDesc": {
                     "config": 0,
                     "length": 80,
                     "properties": [
                        {
                           "OFPTableModPropEviction": {
                              "flags": 0,
                              "length": 8,
                              "type": 2
                           }
                        },
                        {
                           "OFPTableModPropVacancy": {
                              "length": 8,
                              "type": 3,
                              "vacancy": 0,
                              "vacancy_down": 0,
                              "vacancy_up": 0
                           }
                        },
                        {
                           "OFPTableModPropExperimenter": {
                              "data": [],
                              "exp_type": 0,
                              "experimenter": 101,
                              "length": 12,
                              "type": 65535
                           }
                        },
                        {
                           "OFPTableModPropExperimenter": {
                              "data": [
                                 1
                              ],
                              "exp_type": 1,
                              "experimenter": 101,
                              "length": 16,
                              "type": 65535
                           }
                        },
                        {
                           "OFPTableModPropExperimenter": {
                              "data": [
                                 1,
                                 2
                              ],
                              "exp_type": 2,
                              "experimenter": 101,
                              "length": 20,
                              "type": 65535
                           }
                        }
                     ],
                     "table_id": 8
                  }
               }
            ],
            "flags": 0,
            "type": 14
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPTableFeaturesStatsRequest`(datapath, flags=0, body=None, type_=None)

  Table features statistics request message

  The controller uses this message to query table features.

  Attribute | Description
  --- | ---
  body | List of `OFPTableFeaturesStats` instances. The default is [].

  JSON Example:

  > See an example in:

  > `ryu/tests/unit/ofproto/json/of14/5-53-ofp_table_features_request.packet.json`

class `ryu.ofproto.ofproto_v1_4_parser.``OFPTableFeaturesStatsReply`(datapath, type_=None, **kwargs)

  Table features statistics reply message

  The switch responds with this message to a table features statistics request.

  Attribute | Description
  --- | ---
  body | List of `OFPTableFeaturesStats` instance

  JSON Example:

  > See an example in:

  > `ryu/tests/unit/ofproto/json/of14/5-54-ofp_table_features_reply.packet.json`

class `ryu.ofproto.ofproto_v1_4_parser.``OFPPortStatsRequest`(datapath, flags, port_no, type_=None)

  Port statistics request message

  The controller uses this message to query information about ports statistics.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  port_no | Port number to read (OFPP_ANY to all ports)

  Example:

      def send_port_stats_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPPortStatsRequest(datapath, 0, ofp.OFPP_ANY)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPPortStatsRequest": {
            "flags": 0,
            "port_no": 4294967295,
            "type": 4
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPPortStatsReply`(datapath, type_=None, **kwargs)

  Port statistics reply message

  The switch responds with this message to a port statistics request.

  Attribute | Description
  --- | ---
  body | List of `OFPPortStats` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
      def port_stats_reply_handler(self, ev):
          ports = []
          for stat in ev.msg.body:
              ports.append(stat.length, stat.port_no,
                           stat.duration_sec, stat.duration_nsec,
                           stat.rx_packets, stat.tx_packets,
                           stat.rx_bytes, stat.tx_bytes,
                           stat.rx_dropped, stat.tx_dropped,
                           stat.rx_errors, stat.tx_errors,
                           repr(stat.properties))
          self.logger.debug('PortStats: %s', ports)

  JSON Example:

      {
         "OFPPortStatsReply": {
            "body": [
               {
                  "OFPPortStats": {
                     "duration_nsec": 0,
                     "duration_sec": 0,
                     "length": 224,
                     "port_no": 7,
                     "properties": [
                        {
                           "OFPPortStatsPropEthernet": {
                              "collisions": 0,
                              "length": 40,
                              "rx_crc_err": 0,
                              "rx_frame_err": 0,
                              "rx_over_err": 0,
                              "type": 0
                           }
                        },
                        {
                           "OFPPortStatsPropOptical": {
                              "bias_current": 300,
                              "flags": 3,
                              "length": 44,
                              "rx_freq_lmda": 1500,
                              "rx_grid_span": 500,
                              "rx_offset": 700,
                              "rx_pwr": 2000,
                              "temperature": 273,
                              "tx_freq_lmda": 1500,
                              "tx_grid_span": 500,
                              "tx_offset": 700,
                              "tx_pwr": 2000,
                              "type": 1
                           }
                        },
                        {
                           "OFPPortStatsPropExperimenter": {
                              "data": [],
                              "exp_type": 0,
                              "experimenter": 101,
                              "length": 12,
                              "type": 65535
                           }
                        },
                        {
                           "OFPPortStatsPropExperimenter": {
                              "data": [
                                 1
                              ],
                              "exp_type": 1,
                              "experimenter": 101,
                              "length": 16,
                              "type": 65535
                           }
                        },
                        {
                           "OFPPortStatsPropExperimenter": {
                              "data": [
                                 1,
                                 2
                              ],
                              "exp_type": 2,
                              "experimenter": 101,
                              "length": 20,
                              "type": 65535
                           }
                        }
                     ],
                     "rx_bytes": 0,
                     "rx_dropped": 0,
                     "rx_errors": 0,
                     "rx_packets": 0,
                     "tx_bytes": 336,
                     "tx_dropped": 0,
                     "tx_errors": 0,
                     "tx_packets": 4
                  }
               },
               {
                  "OFPPortStats": {
                     "duration_nsec": 0,
                     "duration_sec": 0,
                     "length": 120,
                     "port_no": 6,
                     "properties": [
                        {
                           "OFPPortStatsPropEthernet": {
                              "collisions": 0,
                              "length": 40,
                              "rx_crc_err": 0,
                              "rx_frame_err": 0,
                              "rx_over_err": 0,
                              "type": 0
                           }
                        }
                     ],
                     "rx_bytes": 336,
                     "rx_dropped": 0,
                     "rx_errors": 0,
                     "rx_packets": 4,
                     "tx_bytes": 336,
                     "tx_dropped": 0,
                     "tx_errors": 0,
                     "tx_packets": 4
                  }
               }
            ],
            "flags": 0,
            "type": 4
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPPortDescStatsRequest`(datapath, flags=0, type_=None)

  Port description request message

  The controller uses this message to query description of all the ports.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`

  Example:

      def send_port_desc_stats_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPPortDescStatsRequest(datapath, 0)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPPortDescStatsRequest": {
            "flags": 0,
            "type": 13
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPPortDescStatsReply`(datapath, type_=None, **kwargs)

  Port description reply message

  The switch responds with this message to a port description request.

  Attribute | Description
  --- | ---
  body | List of `OFPPort` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPPortDescStatsReply, MAIN_DISPATCHER)
      def port_desc_stats_reply_handler(self, ev):
          ports = []
          for p in ev.msg.body:
              ports.append('port_no=%d hw_addr=%s name=%s config=0x%08x '
                           'state=0x%08x properties=%s' %
                           (p.port_no, p.hw_addr,
                            p.name, p.config, p.state, repr(p.properties)))
          self.logger.debug('OFPPortDescStatsReply received: %s', ports)

  JSON Example:

      {
         "OFPPortDescStatsReply": {
            "body": [
               {
                  "OFPPort": {
                     "config": 0,
                     "hw_addr": "f2:0b:a4:d0:3f:70",
                     "length": 168,
                     "name": "Port7",
                     "port_no": 7,
                     "properties": [
                        {
                           "OFPPortDescPropEthernet": {
                              "advertised": 10240,
                              "curr": 10248,
                              "curr_speed": 5000,
                              "length": 32,
                              "max_speed": 5000,
                              "peer": 10248,
                              "supported": 10248,
                              "type": 0
                           }
                        },
                        {
                           "OFPPortDescPropOptical": {
                              "length": 40,
                              "rx_grid_freq_lmda": 1500,
                              "rx_max_freq_lmda": 2000,
                              "rx_min_freq_lmda": 1000,
                              "supported": 1,
                              "tx_grid_freq_lmda": 1500,
                              "tx_max_freq_lmda": 2000,
                              "tx_min_freq_lmda": 1000,
                              "tx_pwr_max": 2000,
                              "tx_pwr_min": 1000,
                              "type": 1
                           }
                        },
                        {
                           "OFPPortDescPropExperimenter": {
                              "data": [],
                              "exp_type": 0,
                              "experimenter": 101,
                              "length": 12,
                              "type": 65535
                           }
                        },
                        {
                           "OFPPortDescPropExperimenter": {
                              "data": [
                                 1
                              ],
                              "exp_type": 1,
                              "experimenter": 101,
                              "length": 16,
                              "type": 65535
                           }
                        },
                        {
                           "OFPPortDescPropExperimenter": {
                              "data": [
                                 1,
                                 2
                              ],
                              "exp_type": 2,
                              "experimenter": 101,
                              "length": 20,
                              "type": 65535
                           }
                        }
                     ],
                     "state": 4
                  }
               },
               {
                  "OFPPort": {
                     "config": 0,
                     "hw_addr": "f2:0b:a4:7d:f8:ea",
                     "length": 72,
                     "name": "Port6",
                     "port_no": 6,
                     "properties": [
                        {
                           "OFPPortDescPropEthernet": {
                              "advertised": 10240,
                              "curr": 10248,
                              "curr_speed": 5000,
                              "length": 32,
                              "max_speed": 5000,
                              "peer": 10248,
                              "supported": 10248,
                              "type": 0
                           }
                        }
                     ],
                     "state": 4
                  }
               }
            ],
            "flags": 0,
            "type": 13
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPQueueStatsRequest`(datapath, flags=0, port_no=4294967295, queue_id=4294967295, type_=None)

  Queue statistics request message

  The controller uses this message to query queue statictics.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  port_no | Port number to read
  queue_id | ID of queue to read

  Example:

      def send_queue_stats_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPQueueStatsRequest(datapath, 0, ofp.OFPP_ANY,
                                                ofp.OFPQ_ALL)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPQueueStatsRequest": {
            "flags": 0,
            "port_no": 4294967295,
            "queue_id": 4294967295,
            "type": 5
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPQueueStatsReply`(datapath, type_=None, **kwargs)

  Queue statistics reply message

  The switch responds with this message to an aggregate flow statistics request.

  Attribute | Description
  --- | ---
  body | List of `OFPQueueStats` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPQueueStatsReply, MAIN_DISPATCHER)
      def queue_stats_reply_handler(self, ev):
          queues = []
          for stat in ev.msg.body:
              queues.append('port_no=%d queue_id=%d '
                            'tx_bytes=%d tx_packets=%d tx_errors=%d '
                            'duration_sec=%d duration_nsec=%d'
                            'properties=%s' %
                            (stat.port_no, stat.queue_id,
                             stat.tx_bytes, stat.tx_packets, stat.tx_errors,
                             stat.duration_sec, stat.duration_nsec,
                             repr(stat.properties)))
          self.logger.debug('QueueStats: %s', queues)

  JSON Example:

      {
         "OFPQueueStatsReply": {
            "body": [
               {
                  "OFPQueueStats": {
                     "duration_nsec": 0,
                     "duration_sec": 0,
                     "length": 104,
                     "port_no": 7,
                     "properties": [
                        {
                           "OFPQueueStatsPropExperimenter": {
                              "data": [],
                              "exp_type": 0,
                              "experimenter": 101,
                              "length": 12,
                              "type": 65535
                           }
                        },
                        {
                           "OFPQueueStatsPropExperimenter": {
                              "data": [
                                 1
                              ],
                              "exp_type": 1,
                              "experimenter": 101,
                              "length": 16,
                              "type": 65535
                           }
                        },
                        {
                           "OFPQueueStatsPropExperimenter": {
                              "data": [
                                 1,
                                 2
                              ],
                              "exp_type": 2,
                              "experimenter": 101,
                              "length": 20,
                              "type": 65535
                           }
                        }
                     ],
                     "queue_id": 1,
                     "tx_bytes": 0,
                     "tx_errors": 0,
                     "tx_packets": 0
                  }
               },
               {
                  "OFPQueueStats": {
                     "duration_nsec": 0,
                     "duration_sec": 0,
                     "length": 48,
                     "port_no": 6,
                     "properties": [],
                     "queue_id": 1,
                     "tx_bytes": 0,
                     "tx_errors": 0,
                     "tx_packets": 0
                  }
               },
               {
                  "OFPQueueStats": {
                     "duration_nsec": 0,
                     "duration_sec": 0,
                     "length": 48,
                     "port_no": 7,
                     "properties": [],
                     "queue_id": 2,
                     "tx_bytes": 0,
                     "tx_errors": 0,
                     "tx_packets": 0
                  }
               }
            ],
            "flags": 0,
            "type": 5
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPQueueDescStatsRequest`(datapath, flags=0, port_no=4294967295, queue_id=4294967295, type_=None)

  Queue description request message

  The controller uses this message to query description of all the queues.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  port_no | Port number to read (OFPP_ANY for all ports)
  queue_id | ID of queue to read (OFPQ_ALL for all queues)

  Example:

      def send_queue_desc_stats_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser
          req = ofp_parser.OFPQueueDescStatsRequest(datapath, 0,
                                                    ofp.OFPP_ANY,
                                                    ofp.OFPQ_ALL)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPQueueDescStatsRequest": {
            "flags": 0,
            "port_no": 7,
            "queue_id": 4294967295,
            "type": 15
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPQueueDescStatsReply`(datapath, type_=None, **kwargs)

  Queue description reply message

  The switch responds with this message to a queue description request.

  Attribute | Description
  --- | ---
  body | List of `OFPQueueDesc` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPQueueDescStatsReply, MAIN_DISPATCHER)
      def queue_desc_stats_reply_handler(self, ev):
          queues = []
          for q in ev.msg.body:
              queues.append('port_no=%d queue_id=0x%08x properties=%s' %
                           (q.port_no, q.queue_id, repr(q.properties)))
          self.logger.debug('OFPQueueDescStatsReply received: %s', queues)

  JSON Example:

      {
         "OFPQueueDescStatsReply": {
            "body": [
               {
                  "OFPQueueDesc": {
                     "len": 32,
                     "port_no": 7,
                     "properties": [
                        {
                           "OFPQueueDescPropExperimenter": {
                              "data": [],
                              "exp_type": 0,
                              "experimenter": 101,
                              "length": 12,
                              "type": 65535
                           }
                        }
                     ],
                     "queue_id": 0
                  }
               },
               {
                  "OFPQueueDesc": {
                     "len": 88,
                     "port_no": 8,
                     "properties": [
                        {
                           "OFPQueueDescPropMinRate": {
                              "length": 8,
                              "rate": 300,
                              "type": 1
                           }
                        },
                        {
                           "OFPQueueDescPropMaxRate": {
                              "length": 8,
                              "rate": 900,
                              "type": 2
                           }
                        },
                        {
                           "OFPQueueDescPropExperimenter": {
                              "data": [],
                              "exp_type": 0,
                              "experimenter": 101,
                              "length": 12,
                              "type": 65535
                           }
                        },
                        {
                           "OFPQueueDescPropExperimenter": {
                              "data": [
                                 1
                              ],
                              "exp_type": 1,
                              "experimenter": 101,
                              "length": 16,
                              "type": 65535
                           }
                        },
                        {
                           "OFPQueueDescPropExperimenter": {
                              "data": [
                                 1,
                                 2
                              ],
                              "exp_type": 2,
                              "experimenter": 101,
                              "length": 20,
                              "type": 65535
                           }
                        }
                     ],
                     "queue_id": 1
                  }
               }
            ],
            "flags": 0,
            "type": 15
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGroupStatsRequest`(datapath, flags=0, group_id=4294967292, type_=None)

  Group statistics request message

  The controller uses this message to query statistics of one or more groups.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  group_id | ID of group to read (OFPG_ALL to all groups)

  Example:

      def send_group_stats_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPGroupStatsRequest(datapath, 0, ofp.OFPG_ALL)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPGroupStatsRequest": {
            "flags": 0,
            "group_id": 4294967292,
            "type": 6
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGroupStatsReply`(datapath, type_=None, **kwargs)

  Group statistics reply message

  The switch responds with this message to a group statistics request.

  Attribute | Description
  --- | ---
  body | List of `OFPGroupStats` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPGroupStatsReply, MAIN_DISPATCHER)
      def group_stats_reply_handler(self, ev):
          groups = []
          for stat in ev.msg.body:
              groups.append('length=%d group_id=%d '
                            'ref_count=%d packet_count=%d byte_count=%d '
                            'duration_sec=%d duration_nsec=%d' %
                            (stat.length, stat.group_id,
                             stat.ref_count, stat.packet_count,
                             stat.byte_count, stat.duration_sec,
                             stat.duration_nsec))
          self.logger.debug('GroupStats: %s', groups)

  JSON Example:

      {
         "OFPGroupStatsReply": {
            "body": [
               {
                  "OFPGroupStats": {
                     "bucket_stats": [
                        {
                           "OFPBucketCounter": {
                              "byte_count": 2345,
                              "packet_count": 234
                           }
                        }
                     ],
                     "byte_count": 12345,
                     "duration_nsec": 609036000,
                     "duration_sec": 9,
                     "group_id": 1,
                     "length": 56,
                     "packet_count": 123,
                     "ref_count": 2
                  }
               }
            ],
            "flags": 0,
            "type": 6
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGroupDescStatsRequest`(datapath, flags=0, type_=None)

  Group description request message

  The controller uses this message to list the set of groups on a switch.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`

  Example:

      def send_group_desc_stats_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPGroupDescStatsRequest(datapath, 0)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPGroupDescStatsRequest": {
            "flags": 0,
            "type": 7
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGroupDescStatsReply`(datapath, type_=None, **kwargs)

  Group description reply message

  The switch responds with this message to a group description request.

  Attribute | Description
  --- | ---
  body | List of `OFPGroupDescStats` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPGroupDescStatsReply, MAIN_DISPATCHER)
      def group_desc_stats_reply_handler(self, ev):
          descs = []
          for stat in ev.msg.body:
              descs.append('length=%d type=%d group_id=%d '
                           'buckets=%s' %
                           (stat.length, stat.type, stat.group_id,
                            stat.bucket))
          self.logger.debug('GroupDescStats: %s', descs)

  JSON Example:

      {
         "OFPGroupDescStatsReply": {
            "body": [
               {
                  "OFPGroupDescStats": {
                     "buckets": [
                        {
                           "OFPBucket": {
                              "actions": [
                                 {
                                    "OFPActionOutput": {
                                       "len": 16,
                                       "max_len": 65535,
                                       "port": 2,
                                       "type": 0
                                    }
                                 }
                              ],
                              "len": 32,
                              "watch_group": 1,
                              "watch_port": 1,
                              "weight": 1
                           }
                        }
                     ],
                     "group_id": 1,
                     "length": 40,
                     "type": 0
                  }
               }
            ],
            "flags": 0,
            "type": 7
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGroupFeaturesStatsRequest`(datapath, flags=0, type_=None)

  Group features request message

  The controller uses this message to list the capabilities of groups on a switch.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`

  Example:

      def send_group_features_stats_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPGroupFeaturesStatsRequest(datapath, 0)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPGroupFeaturesStatsRequest": {
            "flags": 0,
            "type": 8
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGroupFeaturesStatsReply`(datapath, type_=None, **kwargs)

  Group features reply message

  The switch responds with this message to a group features request.

  Attribute | Description
  --- | ---
  body | Instance of `OFPGroupFeaturesStats`

  Example:

      @set_ev_cls(ofp_event.EventOFPGroupFeaturesStatsReply, MAIN_DISPATCHER)
      def group_features_stats_reply_handler(self, ev):
          body = ev.msg.body

          self.logger.debug('GroupFeaturesStats: types=%d '
                            'capabilities=0x%08x max_groups=%s '
                            'actions=%s',
                            body.types, body.capabilities,
                            body.max_groups, body.actions)

  JSON Example:

      {
         "OFPGroupFeaturesStatsReply": {
            "body": {
               "OFPGroupFeaturesStats": {
                  "actions": [
                     67082241,
                     67082241,
                     67082241,
                     67082241
                  ],
                  "capabilities": 5,
                  "max_groups": [
                     16777216,
                     16777216,
                     16777216,
                     16777216
                  ],
                  "types": 15
               }
            },
            "flags": 0,
            "type": 8
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPMeterStatsRequest`(datapath, flags=0, meter_id=4294967295, type_=None)

  Meter statistics request message

  The controller uses this message to query statistics for one or more meters.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  meter_id | ID of meter to read (OFPM_ALL to all meters)

  Example:

      def send_meter_stats_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPMeterStatsRequest(datapath, 0, ofp.OFPM_ALL)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPMeterStatsRequest": {
            "flags": 0,
            "meter_id": 4294967295,
            "type": 9
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPMeterStatsReply`(datapath, type_=None, **kwargs)

  Meter statistics reply message

  The switch responds with this message to a meter statistics request.

  Attribute | Description
  --- | ---
  body | List of `OFPMeterStats` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPMeterStatsReply, MAIN_DISPATCHER)
      def meter_stats_reply_handler(self, ev):
          meters = []
          for stat in ev.msg.body:
              meters.append('meter_id=0x%08x len=%d flow_count=%d '
                            'packet_in_count=%d byte_in_count=%d '
                            'duration_sec=%d duration_nsec=%d '
                            'band_stats=%s' %
                            (stat.meter_id, stat.len, stat.flow_count,
                             stat.packet_in_count, stat.byte_in_count,
                             stat.duration_sec, stat.duration_nsec,
                             stat.band_stats))
          self.logger.debug('MeterStats: %s', meters)

  JSON Example:

      {
         "OFPMeterStatsReply": {
            "body": [
               {
                  "OFPMeterStats": {
                     "band_stats": [
                        {
                           "OFPMeterBandStats": {
                              "byte_band_count": 0,
                              "packet_band_count": 0
                           }
                        }
                     ],
                     "byte_in_count": 0,
                     "duration_nsec": 480000,
                     "duration_sec": 0,
                     "flow_count": 0,
                     "len": 56,
                     "meter_id": 100,
                     "packet_in_count": 0
                  }
               }
            ],
            "flags": 0,
            "type": 9
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPMeterConfigStatsRequest`(datapath, flags=0, meter_id=4294967295, type_=None)

  Meter configuration statistics request message

  The controller uses this message to query configuration for one or more meters.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  meter_id | ID of meter to read (OFPM_ALL to all meters)

  Example:

      def send_meter_config_stats_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPMeterConfigStatsRequest(datapath, 0,
                                                      ofp.OFPM_ALL)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPMeterConfigStatsRequest": {
            "flags": 0,
            "meter_id": 4294967295,
            "type": 10
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPMeterConfigStatsReply`(datapath, type_=None, **kwargs)

  Meter configuration statistics reply message

  The switch responds with this message to a meter configuration statistics request.

  Attribute | Description
  --- | ---
  body | List of `OFPMeterConfigStats` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPMeterConfigStatsReply, MAIN_DISPATCHER)
      def meter_config_stats_reply_handler(self, ev):
          configs = []
          for stat in ev.msg.body:
              configs.append('length=%d flags=0x%04x meter_id=0x%08x '
                             'bands=%s' %
                             (stat.length, stat.flags, stat.meter_id,
                              stat.bands))
          self.logger.debug('MeterConfigStats: %s', configs)

  JSON Example:

      {
         "OFPMeterConfigStatsReply": {
            "body": [
               {
                  "OFPMeterConfigStats": {
                     "bands": [
                        {
                           "OFPMeterBandDrop": {
                              "burst_size": 10,
                              "len": 16,
                              "rate": 1000,
                              "type": 1
                           }
                        }
                     ],
                     "flags": 14,
                     "length": 24,
                     "meter_id": 100
                  }
               }
            ],
            "flags": 0,
            "type": 10
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPMeterFeaturesStatsRequest`(datapath, flags=0, type_=None)

  Meter features statistics request message

  The controller uses this message to query the set of features of the metering subsystem.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`

  Example:

      def send_meter_features_stats_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPMeterFeaturesStatsRequest(datapath, 0)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPMeterFeaturesStatsRequest": {
            "flags": 0,
            "type": 11
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPMeterFeaturesStatsReply`(datapath, type_=None, **kwargs)

  Meter features statistics reply message

  The switch responds with this message to a meter features statistics request.

  Attribute | Description
  --- | ---
  body | List of `OFPMeterFeaturesStats` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPMeterFeaturesStatsReply, MAIN_DISPATCHER)
      def meter_features_stats_reply_handler(self, ev):
          features = []
          for stat in ev.msg.body:
              features.append('max_meter=%d band_types=0x%08x '
                              'capabilities=0x%08x max_bands=%d '
                              'max_color=%d' %
                              (stat.max_meter, stat.band_types,
                               stat.capabilities, stat.max_bands,
                               stat.max_color))
          self.logger.debug('MeterFeaturesStats: %s', features)

  JSON Example:

      {
         "OFPMeterFeaturesStatsReply": {
            "body": [
               {
                  "OFPMeterFeaturesStats": {
                     "band_types": 2147483654,
                     "capabilities": 15,
                     "max_bands": 255,
                     "max_color": 0,
                     "max_meter": 16777216
                  }
               }
            ],
            "flags": 0,
            "type": 11
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPFlowMonitorRequest`(datapath, flags=0, monitor_id=0, out_port=4294967295, out_group=4294967295, monitor_flags=0, table_id=255, command=0, match=None, type_=None)

  Flow monitor request message

  The controller uses this message to query flow monitors.

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  monitor_id | Controller-assigned ID for this monitor
  out_port | Require matching entries to include this as an output port
  out_group | Require matching entries to include this as an output group
  monitor_flags | Bitmap of the following flags. OFPFMF_INITIAL OFPFMF_ADD OFPFMF_REMOVED OFPFMF_MODIFY OFPFMF_INSTRUCTIONS OFPFMF_NO_ABBREV OFPFMF_ONLY_OWN
  table_id | ID of table to monitor
  command | One of the following values. OFPFMC_ADD OFPFMC_MODIFY OFPFMC_DELETE
  match | Instance of `OFPMatch`

  Example:

      def send_flow_monitor_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          monitor_flags = [ofp.OFPFMF_INITIAL, ofp.OFPFMF_ONLY_OWN]
          match = ofp_parser.OFPMatch(in_port=1)
          req = ofp_parser.OFPFlowMonitorRequest(datapath, 0, 10000,
                                                 ofp.OFPP_ANY, ofp.OFPG_ANY,
                                                 monitor_flags,
                                                 ofp.OFPTT_ALL,
                                                 ofp.OFPFMC_ADD, match)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPFlowMonitorRequest": {
            "command": 0,
            "flags": 0,
            "match": {
               "OFPMatch": {
                  "length": 14,
                  "oxm_fields": [
                     {
                        "OXMTlv": {
                           "field": "eth_dst",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     }
                  ],
                  "type": 1
               }
            },
            "monitor_flags": 15,
            "monitor_id": 100000000,
            "out_group": 4294967295,
            "out_port": 22,
            "table_id": 33,
            "type": 16
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPFlowMonitorReply`(datapath, type_=None, **kwargs)

  Flow monitor reply message

  The switch responds with this message to a flow monitor request.

  Attribute | Description
  --- | ---
  body | List of list of the following class instance. OFPFlowMonitorFull OFPFlowMonitorAbbrev OFPFlowMonitorPaused

  Example:

      @set_ev_cls(ofp_event.EventOFPFlowMonitorReply, MAIN_DISPATCHER)
      def flow_monitor_reply_handler(self, ev):
          msg = ev.msg
          dp = msg.datapath
          ofp = dp.ofproto
          flow_updates = []

          for update in msg.body:
              update_str = 'length=%d event=%d' %
                           (update.length, update.event)
              if (update.event == ofp.OFPFME_INITIAL or
                  update.event == ofp.OFPFME_ADDED or
                  update.event == ofp.OFPFME_REMOVED or
                  update.event == ofp.OFPFME_MODIFIED):
                  update_str += 'table_id=%d reason=%d idle_timeout=%d '
                                'hard_timeout=%d priority=%d cookie=%d '
                                'match=%d instructions=%s' %
                                (update.table_id, update.reason,
                                 update.idle_timeout, update.hard_timeout,
                                 update.priority, update.cookie,
                                 update.match, update.instructions)
              elif update.event == ofp.OFPFME_ABBREV:
                  update_str += 'xid=%d' % (update.xid)
              flow_updates.append(update_str)
          self.logger.debug('FlowUpdates: %s', flow_updates)

  JSON Example:

      {
         "OFPFlowMonitorReply": {
            "body": [
               {
                  "OFPFlowUpdateFull": {
                     "cookie": 0,
                     "event": 0,
                     "hard_timeout": 700,
                     "idle_timeout": 600,
                     "instructions": [
                        {
                           "OFPInstructionActions": {
                              "actions": [
                                 {
                                    "OFPActionOutput": {
                                       "len": 16,
                                       "max_len": 0,
                                       "port": 4294967290,
                                       "type": 0
                                    }
                                 }
                              ],
                              "len": 24,
                              "type": 4
                           }
                        }
                     ],
                     "length": 64,
                     "match": {
                        "OFPMatch": {
                           "length": 10,
                           "oxm_fields": [
                              {
                                 "OXMTlv": {
                                    "field": "eth_type",
                                    "mask": null,
                                    "value": 2054
                                 }
                              }
                           ],
                           "type": 1
                        }
                     },
                     "priority": 3,
                     "reason": 0,
                     "table_id": 0
                  }
               },
               {
                  "OFPFlowUpdateAbbrev": {
                     "event": 4,
                     "length": 8,
                     "xid": 1234
                  }
               },
               {
                  "OFPFlowUpdatePaused": {
                     "event": 5,
                     "length": 8
                  }
               }
            ],
            "flags": 0,
            "type": 16
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPExperimenterStatsRequest`(datapath, flags, experimenter, exp_type, data, type_=None)

  Experimenter multipart request message

  Attribute | Description
  --- | ---
  flags | Zero or `OFPMPF_REQ_MORE`
  experimenter | Experimenter ID
  exp_type | Experimenter defined
  data | Experimenter defined additional data

  JSON Example:

      {
         "OFPExperimenterStatsRequest": {
            "data": "aG9nZWhvZ2U=",
            "exp_type": 3405678728,
            "experimenter": 3735928495,
            "flags": 0,
            "type": 65535
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPExperimenterStatsReply`(datapath, type_=None, **kwargs)

  Experimenter multipart reply message

  Attribute | Description
  --- | ---
  body | An `OFPExperimenterMultipart` instance

  JSON Example:

      {
         "OFPExperimenterStatsReply": {
            "body": {
               "OFPExperimenterMultipart": {
                  "data": "dGVzdGRhdGE5OTk5OTk5OQ==",
                  "exp_type": 3405674359,
                  "experimenter": 3735928495
               }
            },
            "flags": 0,
            "type": 65535
         }
      }

### Packet-Out Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPPacketOut`(datapath, buffer_id=None, in_port=None, actions=None, data=None, actions_len=None)

  Packet-Out message

  The controller uses this message to send a packet out throught the switch.

  Attribute | Description
  --- | ---
  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 of a binary type value or an instances of packet.Packet.

  Example:

      def send_packet_out(self, datapath, buffer_id, in_port):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD, 0)]
          req = ofp_parser.OFPPacketOut(datapath, buffer_id,
                                        in_port, actions)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPPacketOut": {
            "actions": [
               {
                  "OFPActionOutput": {
                     "len": 16,
                     "max_len": 65535,
                     "port": 4294967292,
                     "type": 0
                  }
               }
            ],
            "actions_len": 16,
            "buffer_id": 4294967295,
            "data": "8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
            "in_port": 4294967293
         }
      }

### Barrier Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPBarrierRequest`(datapath)

  Barrier request message

  The controller sends this message to ensure message dependencies have been met or receive notifications for completed operations.

  Example:

      def send_barrier_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPBarrierRequest(datapath)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPBarrierRequest": {}
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPBarrierReply`(datapath)

  Barrier reply message

  The switch responds with this message to a barrier request.

  Example:

      @set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
      def barrier_reply_handler(self, ev):
          self.logger.debug('OFPBarrierReply received')

  JSON Example:

      {
         "OFPBarrierReply": {}
      }

### Role Request Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPRoleRequest`(datapath, role=None, generation_id=None)

  Role request message

  The controller uses this message to change its role.

  Attribute | Description
  --- | ---
  role | One of the following values. OFPCR_ROLE_NOCHANGE OFPCR_ROLE_EQUAL OFPCR_ROLE_MASTER OFPCR_ROLE_SLAVE
  generation_id | Master Election Generation ID

  Example:

      def send_role_request(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPRoleRequest(datapath, ofp.OFPCR_ROLE_EQUAL, 0)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPRoleRequest": {
            "generation_id": 17294086455919964160,
            "role": 2
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPRoleReply`(datapath, role=None, generation_id=None)

  Role reply message

  The switch responds with this message to a role request.

  Attribute | Description
  --- | ---
  role | One of the following values. OFPCR_ROLE_NOCHANGE OFPCR_ROLE_EQUAL OFPCR_ROLE_MASTER OFPCR_ROLE_SLAVE
  generation_id | Master Election Generation ID

  Example:

      @set_ev_cls(ofp_event.EventOFPRoleReply, MAIN_DISPATCHER)
      def role_reply_handler(self, ev):
          msg = ev.msg
          dp = msg.datapath
          ofp = dp.ofproto

          if msg.role == ofp.OFPCR_ROLE_NOCHANGE:
              role = 'NOCHANGE'
          elif msg.role == ofp.OFPCR_ROLE_EQUAL:
              role = 'EQUAL'
          elif msg.role == ofp.OFPCR_ROLE_MASTER:
              role = 'MASTER'
          elif msg.role == ofp.OFPCR_ROLE_SLAVE:
              role = 'SLAVE'
          else:
              role = 'unknown'

          self.logger.debug('OFPRoleReply received: '
                            'role=%s generation_id=%d',
                            role, msg.generation_id)

  JSON Example:

      {
         "OFPRoleReply": {
            "generation_id": 17294086455919964160,
            "role": 3
         }
      }

### Bundle Messages

class `ryu.ofproto.ofproto_v1_4_parser.``OFPBundleCtrlMsg`(datapath, bundle_id=None, type_=None, flags=None, properties=None)

  Bundle control message

  The controller uses this message to create, destroy and commit bundles

  Attribute | Description
  --- | ---
  bundle_id | Id of the bundle
  type | One of the following values. OFPBCT_OPEN_REQUEST OFPBCT_OPEN_REPLY OFPBCT_CLOSE_REQUEST OFPBCT_CLOSE_REPLY OFPBCT_COMMIT_REQUEST OFPBCT_COMMIT_REPLY OFPBCT_DISCARD_REQUEST OFPBCT_DISCARD_REPLY
  flags | Bitmap of the following flags. OFPBF_ATOMIC OFPBF_ORDERED
  properties | List of `OFPBundleProp` subclass instance

  Example:

      def send_bundle_control(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPBundleCtrlMsg(datapath, 7,
                                            ofp.OFPBCT_OPEN_REQUEST,
                                            ofp.OFPBF_ATOMIC, [])
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPBundleCtrlMsg": {
            "bundle_id": 1234,
            "flags": 1,
            "properties": [
               {
                  "OFPBundlePropExperimenter": {
                     "data": [],
                     "exp_type": 0,
                     "experimenter": 101,
                     "length": 12,
                     "type": 65535
                  }
               },
               {
                  "OFPBundlePropExperimenter": {
                     "data": [
                        1
                     ],
                     "exp_type": 1,
                     "experimenter": 101,
                     "length": 16,
                     "type": 65535
                  }
               },
               {
                  "OFPBundlePropExperimenter": {
                     "data": [
                        1,
                        2
                     ],
                     "exp_type": 2,
                     "experimenter": 101,
                     "length": 20,
                     "type": 65535
                  }
               }
            ],
            "type": 0
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPBundleAddMsg`(datapath, bundle_id, flags, message, properties)

  Bundle add message

  The controller uses this message to add a message to a bundle

  Attribute | Description
  --- | ---
  bundle_id | Id of the bundle
  flags | Bitmap of the following flags. OFPBF_ATOMIC OFPBF_ORDERED
  message | `MsgBase` subclass instance
  properties | List of `OFPBundleProp` subclass instance

  Example:

      def send_bundle_add_message(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          msg = ofp_parser.OFPRoleRequest(datapath, ofp.OFPCR_ROLE_EQUAL, 0)

          req = ofp_parser.OFPBundleAddMsg(datapath, 7, ofp.OFPBF_ATOMIC,
                                           msg, [])
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPBundleAddMsg": {
            "bundle_id": 1234,
            "flags": 1,
            "message": {
               "OFPEchoRequest": {
                  "data": null
               }
            },
            "properties": [
               {
                  "OFPBundlePropExperimenter": {
                     "data": [],
                     "exp_type": 0,
                     "experimenter": 101,
                     "length": 12,
                     "type": 65535
                  }
               },
               {
                  "OFPBundlePropExperimenter": {
                     "data": [
                        1
                     ],
                     "exp_type": 1,
                     "experimenter": 101,
                     "length": 16,
                     "type": 65535
                  }
               },
               {
                  "OFPBundlePropExperimenter": {
                     "data": [
                        1,
                        2
                     ],
                     "exp_type": 2,
                     "experimenter": 101,
                     "length": 20,
                     "type": 65535
                  }
               }
            ]
         }
      }

### Set Asynchronous Configuration Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPSetAsync`(datapath, properties=None)

  Set asynchronous configuration message

  The controller sends this message to set the asynchronous messages that it wants to receive on a given OpneFlow channel.

  Attribute | Description
  --- | ---
  properties | List of `OFPAsyncConfigProp` subclass instances

  Example:

      def send_set_async(self, datapath):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          properties = [
              ofp_parser.OFPAsyncConfigPropReasons(
                  ofp.OFPACPT_PACKET_IN_SLAVE, 8,
                  (1 << ofp.OFPR_APPLY_ACTION
                   | 1 << ofp.OFPR_INVALID_TTL))]
          req = ofp_parser.OFPSetAsync(datapath, properties)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPSetAsync": {
            "properties": [
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 0
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 1
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 2
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 3
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 4
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 5
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 6
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 7
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 24,
                     "type": 8
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 24,
                     "type": 9
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 10
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 11
                  }
               },
               {
                  "OFPAsyncConfigPropExperimenter": {
                     "data": [],
                     "exp_type": 0,
                     "experimenter": 101,
                     "length": 12,
                     "type": 65534
                  }
               },
               {
                  "OFPAsyncConfigPropExperimenter": {
                     "data": [
                        1
                     ],
                     "exp_type": 1,
                     "experimenter": 101,
                     "length": 16,
                     "type": 65535
                  }
               },
               {
                  "OFPAsyncConfigPropExperimenter": {
                     "data": [
                        1,
                        2
                     ],
                     "exp_type": 2,
                     "experimenter": 101,
                     "length": 20,
                     "type": 65535
                  }
               }
            ]
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGetAsyncRequest`(datapath)

  Get asynchronous configuration request message

  The controller uses this message to query the asynchronous message.

  Example:

      def send_get_async_request(self, datapath):
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPGetAsyncRequest(datapath)
          datapath.send_msg(req)

  JSON Example:

      {
         "OFPGetAsyncRequest": {}
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPGetAsyncReply`(datapath, properties=None)

  Get asynchronous configuration reply message

  The switch responds with this message to a get asynchronous configuration request.

  Attribute | Description
  --- | ---
  properties | List of `OFPAsyncConfigProp` subclass instances

  Example:

      @set_ev_cls(ofp_event.EventOFPGetAsyncReply, MAIN_DISPATCHER)
      def get_async_reply_handler(self, ev):
          msg = ev.msg

          self.logger.debug('OFPGetAsyncReply received: '
                            'properties=%s', repr(msg.properties))

  JSON Example:

      {
         "OFPGetAsyncReply": {
            "properties": [
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 0
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 1
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 2
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 3
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 4
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 5
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 6
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 7
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 24,
                     "type": 8
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 24,
                     "type": 9
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 10
                  }
               },
               {
                  "OFPAsyncConfigPropReasons": {
                     "length": 8,
                     "mask": 3,
                     "type": 11
                  }
               },
               {
                  "OFPAsyncConfigPropExperimenter": {
                     "data": [],
                     "exp_type": 0,
                     "experimenter": 101,
                     "length": 12,
                     "type": 65534
                  }
               },
               {
                  "OFPAsyncConfigPropExperimenter": {
                     "data": [
                        1
                     ],
                     "exp_type": 1,
                     "experimenter": 101,
                     "length": 16,
                     "type": 65535
                  }
               },
               {
                  "OFPAsyncConfigPropExperimenter": {
                     "data": [
                        1,
                        2
                     ],
                     "exp_type": 2,
                     "experimenter": 101,
                     "length": 20,
                     "type": 65535
                  }
               }
            ]
         }
      }

## Asynchronous Messages

### Packet-In Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPPacketIn`(datapath, buffer_id=None, total_len=None, reason=None, table_id=None, cookie=None, match=None, data=None)

  Packet-In message

  The switch sends the packet that received to the controller by this message.

  Attribute | Description
  --- | ---
  buffer_id | ID assigned by datapath
  total_len | Full length of frame
  reason | Reason packet is being sent. OFPR_TABLE_MISS OFPR_APPLY_ACTION OFPR_INVALID_TTL OFPR_ACTION_SET OFPR_GROUP OFPR_PACKET_OUT
  table_id | ID of the table that was looked up
  cookie | Cookie of the flow entry that was looked up
  match | Instance of `OFPMatch`
  data | Ethernet frame

  Example:

      @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
      def packet_in_handler(self, ev):
          msg = ev.msg
          dp = msg.datapath
          ofp = dp.ofproto

          if msg.reason == ofp.TABLE_MISS:
              reason = 'TABLE MISS'
          elif msg.reason == ofp.OFPR_APPLY_ACTION:
              reason = 'APPLY ACTION'
          elif msg.reason == ofp.OFPR_INVALID_TTL:
              reason = 'INVALID TTL'
          elif msg.reason == ofp.OFPR_ACTION_SET:
              reason = 'ACTION SET'
          elif msg.reason == ofp.OFPR_GROUP:
              reason = 'GROUP'
          elif msg.reason == ofp.OFPR_PACKET_OUT:
              reason = 'PACKET OUT'
          else:
              reason = 'unknown'

          self.logger.debug('OFPPacketIn received: '
                            'buffer_id=%x total_len=%d reason=%s '
                            'table_id=%d cookie=%d match=%s data=%s',
                            msg.buffer_id, msg.total_len, reason,
                            msg.table_id, msg.cookie, msg.match,
                            utils.hex_array(msg.data))

  JSON Example:

      {
         "OFPPacketIn": {
            "buffer_id": 2,
            "cookie": 283686884868096,
            "data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
            "match": {
               "OFPMatch": {
                  "length": 80,
                  "oxm_fields": [
                     {
                        "OXMTlv": {
                           "field": "in_port",
                           "mask": null,
                           "value": 6
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_type",
                           "mask": null,
                           "value": 2054
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_dst",
                           "mask": null,
                           "value": "ff:ff:ff:ff:ff:ff"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_src",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_op",
                           "mask": null,
                           "value": 1
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_spa",
                           "mask": null,
                           "value": "10.0.0.1"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_tpa",
                           "mask": null,
                           "value": "10.0.0.3"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_sha",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_tha",
                           "mask": null,
                           "value": "00:00:00:00:00:00"
                        }
                     }
                  ],
                  "type": 1
               }
            },
            "reason": 3,
            "table_id": 1,
            "total_len": 42
         }
      }

      {
         "OFPPacketIn": {
            "buffer_id": 4026531840,
            "cookie": 283686884868096,
            "data": "",
            "match": {
               "OFPMatch": {
                  "length": 329,
                  "oxm_fields": [
                     {
                        "OXMTlv": {
                           "field": "in_port",
                           "mask": null,
                           "value": 84281096
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "in_phy_port",
                           "mask": null,
                           "value": 16909060
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "metadata",
                           "mask": null,
                           "value": 283686952306183
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_type",
                           "mask": null,
                           "value": 2054
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_dst",
                           "mask": null,
                           "value": "ff:ff:ff:ff:ff:ff"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "eth_src",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "vlan_vid",
                           "mask": null,
                           "value": 999
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ip_dscp",
                           "mask": null,
                           "value": 9
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ip_ecn",
                           "mask": null,
                           "value": 3
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ip_proto",
                           "mask": null,
                           "value": 99
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv4_src",
                           "mask": null,
                           "value": "1.2.3.4"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv4_dst",
                           "mask": null,
                           "value": "1.2.3.4"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "tcp_src",
                           "mask": null,
                           "value": 8080
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "tcp_dst",
                           "mask": null,
                           "value": 18080
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "udp_src",
                           "mask": null,
                           "value": 28080
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "udp_dst",
                           "mask": null,
                           "value": 55936
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "sctp_src",
                           "mask": null,
                           "value": 48080
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "sctp_dst",
                           "mask": null,
                           "value": 59328
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "icmpv4_type",
                           "mask": null,
                           "value": 100
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "icmpv4_code",
                           "mask": null,
                           "value": 101
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_op",
                           "mask": null,
                           "value": 1
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_spa",
                           "mask": null,
                           "value": "10.0.0.1"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_tpa",
                           "mask": null,
                           "value": "10.0.0.3"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_sha",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "arp_tha",
                           "mask": null,
                           "value": "00:00:00:00:00:00"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_src",
                           "mask": null,
                           "value": "fe80::f00b:a4ff:fe48:28a5"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_dst",
                           "mask": null,
                           "value": "fe80::f00b:a4ff:fe05:b7dc"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_flabel",
                           "mask": null,
                           "value": 541473
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "icmpv6_type",
                           "mask": null,
                           "value": 200
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "icmpv6_code",
                           "mask": null,
                           "value": 201
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_nd_target",
                           "mask": null,
                           "value": "fe80::a60:6eff:fe7f:74e7"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_nd_sll",
                           "mask": null,
                           "value": "00:00:00:00:02:9a"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_nd_tll",
                           "mask": null,
                           "value": "00:00:00:00:02:2b"
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "mpls_label",
                           "mask": null,
                           "value": 624485
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "mpls_tc",
                           "mask": null,
                           "value": 5
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "mpls_bos",
                           "mask": null,
                           "value": 1
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "pbb_isid",
                           "mask": null,
                           "value": 11259375
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "tunnel_id",
                           "mask": null,
                           "value": 651061555542690057
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "ipv6_exthdr",
                           "mask": null,
                           "value": 500
                        }
                     },
                     {
                        "OXMTlv": {
                           "field": "pbb_uca",
                           "mask": null,
                           "value": 1
                        }
                     }
                  ],
                  "type": 1
               }
            },
            "reason": 0,
            "table_id": 200,
            "total_len": 0
         }
      }

### Flow Removed Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPFlowRemoved`(datapath, cookie=None, priority=None, reason=None, table_id=None, duration_sec=None, duration_nsec=None, idle_timeout=None, hard_timeout=None, packet_count=None, byte_count=None, match=None)

  Flow removed message

  When flow entries time out or are deleted, the switch notifies controller with this message.

  Attribute | Description
  --- | ---
  cookie | Opaque controller-issued identifier
  priority | Priority level of flow entry
  reason | One of the following values. OFPRR_IDLE_TIMEOUT OFPRR_HARD_TIMEOUT OFPRR_DELETE OFPRR_GROUP_DELETE OFPRR_METER_DELETE OFPRR_EVICTION
  table_id | ID of the table
  duration_sec | Time flow was alive in seconds
  duration_nsec | Time flow was alive in nanoseconds beyond duration_sec
  idle_timeout | Idle timeout from original flow mod
  hard_timeout | Hard timeout from original flow mod
  packet_count | Number of packets that was associated with the flow
  byte_count | Number of bytes that was associated with the flow
  match | Instance of `OFPMatch`

  Example:

      @set_ev_cls(ofp_event.EventOFPFlowRemoved, MAIN_DISPATCHER)
      def flow_removed_handler(self, ev):
          msg = ev.msg
          dp = msg.datapath
          ofp = dp.ofproto

          if msg.reason == ofp.OFPRR_IDLE_TIMEOUT:
              reason = 'IDLE TIMEOUT'
          elif msg.reason == ofp.OFPRR_HARD_TIMEOUT:
              reason = 'HARD TIMEOUT'
          elif msg.reason == ofp.OFPRR_DELETE:
              reason = 'DELETE'
          elif msg.reason == ofp.OFPRR_GROUP_DELETE:
              reason = 'GROUP DELETE'
          else:
              reason = 'unknown'

          self.logger.debug('OFPFlowRemoved received: '
                            'cookie=%d priority=%d reason=%s table_id=%d '
                            'duration_sec=%d duration_nsec=%d '
                            'idle_timeout=%d hard_timeout=%d '
                            'packet_count=%d byte_count=%d match.fields=%s',
                            msg.cookie, msg.priority, reason, msg.table_id,
                            msg.duration_sec, msg.duration_nsec,
                            msg.idle_timeout, msg.hard_timeout,
                            msg.packet_count, msg.byte_count, msg.match)

  JSON Example:

      {
         "OFPFlowRemoved": {
            "byte_count": 86,
            "cookie": 0,
            "duration_nsec": 48825000,
            "duration_sec": 3,
            "hard_timeout": 0,
            "idle_timeout": 3,
            "match": {
               "OFPMatch": {
                  "length": 14,
                  "oxm_fields": [
                     {
                        "OXMTlv": {
                           "field": "eth_dst",
                           "mask": null,
                           "value": "f2:0b:a4:7d:f8:ea"
                        }
                     }
                  ],
                  "type": 1
               }
            },
            "packet_count": 1,
            "priority": 65535,
            "reason": 0,
            "table_id": 0
         }
      }

### Port Status Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPPortStatus`(datapath, reason=None, desc=None)

  Port status message

  The switch notifies controller of change of ports.

  Attribute | Description
  --- | ---
  reason | One of the following values. OFPPR_ADD OFPPR_DELETE OFPPR_MODIFY
  desc | instance of `OFPPort`

  Example:

      @set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
      def port_status_handler(self, ev):
          msg = ev.msg
          dp = msg.datapath
          ofp = dp.ofproto

          if msg.reason == ofp.OFPPR_ADD:
              reason = 'ADD'
          elif msg.reason == ofp.OFPPR_DELETE:
              reason = 'DELETE'
          elif msg.reason == ofp.OFPPR_MODIFY:
              reason = 'MODIFY'
          else:
              reason = 'unknown'

          self.logger.debug('OFPPortStatus received: reason=%s desc=%s',
                            reason, msg.desc)

  JSON Example:

      {
         "OFPPortStatus": {
            "desc": {
               "OFPPort": {
                  "config": 0,
                  "hw_addr": "f2:0b:a4:d0:3f:70",
                  "length": 168,
                  "name": "\u79c1\u306e\u30dd\u30fc\u30c8",
                  "port_no": 7,
                  "properties": [
                     {
                        "OFPPortDescPropEthernet": {
                           "advertised": 10240,
                           "curr": 10248,
                           "curr_speed": 5000,
                           "length": 32,
                           "max_speed": 5000,
                           "peer": 10248,
                           "supported": 10248,
                           "type": 0
                        }
                     },
                     {
                        "OFPPortDescPropOptical": {
                           "length": 40,
                           "rx_grid_freq_lmda": 1500,
                           "rx_max_freq_lmda": 2000,
                           "rx_min_freq_lmda": 1000,
                           "supported": 1,
                           "tx_grid_freq_lmda": 1500,
                           "tx_max_freq_lmda": 2000,
                           "tx_min_freq_lmda": 1000,
                           "tx_pwr_max": 2000,
                           "tx_pwr_min": 1000,
                           "type": 1
                        }
                     },
                     {
                        "OFPPortDescPropExperimenter": {
                           "data": [],
                           "exp_type": 0,
                           "experimenter": 101,
                           "length": 12,
                           "type": 65535
                        }
                     },
                     {
                        "OFPPortDescPropExperimenter": {
                           "data": [
                              1
                           ],
                           "exp_type": 1,
                           "experimenter": 101,
                           "length": 16,
                           "type": 65535
                        }
                     },
                     {
                        "OFPPortDescPropExperimenter": {
                           "data": [
                              1,
                              2
                           ],
                           "exp_type": 2,
                           "experimenter": 101,
                           "length": 20,
                           "type": 65535
                        }
                     }
                  ],
                  "state": 4
               }
            },
            "reason": 0
         }
      }

### Controller Role Status Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPRoleStatus`(datapath, role=None, reason=None, generation_id=None, properties=None)

  Role status message

  The switch notifies controller of change of role.

  Attribute | Description
  --- | ---
  role | One of the following values. OFPCR_ROLE_NOCHANGE OFPCR_ROLE_EQUAL OFPCR_ROLE_MASTER
  reason | One of the following values. OFPCRR_MASTER_REQUEST OFPCRR_CONFIG OFPCRR_EXPERIMENTER
  generation_id | Master Election Generation ID
  properties | List of `OFPRoleProp` subclass instance

  Example:

      @set_ev_cls(ofp_event.EventOFPRoleStatus, MAIN_DISPATCHER)
      def role_status_handler(self, ev):
          msg = ev.msg
          dp = msg.datapath
          ofp = dp.ofproto

          if msg.role == ofp.OFPCR_ROLE_NOCHANGE:
              role = 'ROLE NOCHANGE'
          elif msg.role == ofp.OFPCR_ROLE_EQUAL:
              role = 'ROLE EQUAL'
          elif msg.role == ofp.OFPCR_ROLE_MASTER:
              role = 'ROLE MASTER'
          else:
              role = 'unknown'

          if msg.reason == ofp.OFPCRR_MASTER_REQUEST:
              reason = 'MASTER REQUEST'
          elif msg.reason == ofp.OFPCRR_CONFIG:
              reason = 'CONFIG'
          elif msg.reason == ofp.OFPCRR_EXPERIMENTER:
              reason = 'EXPERIMENTER'
          else:
              reason = 'unknown'

          self.logger.debug('OFPRoleStatus received: role=%s reason=%s '
                            'generation_id=%d properties=%s', role, reason,
                            msg.generation_id, repr(msg.properties))

  JSON Example:

      {
         "OFPRoleStatus": {
            "generation_id": 7,
            "properties": [
               {
                  "OFPRolePropExperimenter": {
                     "data": [],
                     "exp_type": 0,
                     "experimenter": 101,
                     "length": 12,
                     "type": 65535
                  }
               },
               {
                  "OFPRolePropExperimenter": {
                     "data": [
                        1
                     ],
                     "exp_type": 1,
                     "experimenter": 101,
                     "length": 16,
                     "type": 65535
                  }
               },
               {
                  "OFPRolePropExperimenter": {
                     "data": [
                        1,
                        2
                     ],
                     "exp_type": 2,
                     "experimenter": 101,
                     "length": 20,
                     "type": 65535
                  }
               }
            ],
            "reason": 0,
            "role": 2
         }
      }

### Table Status Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPTableStatus`(datapath, reason=None, table=None)

  Table status message

  The switch notifies controller of change of table status.

  Attribute | Description
  --- | ---
  reason | One of the following values. OFPTR_VACANCY_DOWN OFPTR_VACANCY_UP
  table | `OFPTableDesc` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPTableStatus, MAIN_DISPATCHER)
      def table(self, ev):
          msg = ev.msg
          dp = msg.datapath
          ofp = dp.ofproto

          if msg.reason == ofp.OFPTR_VACANCY_DOWN:
              reason = 'VACANCY_DOWN'
          elif msg.reason == ofp.OFPTR_VACANCY_UP:
              reason = 'VACANCY_UP'
          else:
              reason = 'unknown'

          self.logger.debug('OFPTableStatus received: reason=%s '
                            'table_id=%d config=0x%08x properties=%s',
                            reason, msg.table.table_id, msg.table.config,
                            repr(msg.table.properties))

  JSON Example:

      {
         "OFPTableStatus": {
            "reason": 3,
            "table": {
               "OFPTableDesc": {
                  "config": 0,
                  "length": 80,
                  "properties": [
                     {
                        "OFPTableModPropEviction": {
                           "flags": 0,
                           "length": 8,
                           "type": 2
                        }
                     },
                     {
                        "OFPTableModPropVacancy": {
                           "length": 8,
                           "type": 3,
                           "vacancy": 0,
                           "vacancy_down": 0,
                           "vacancy_up": 0
                        }
                     },
                     {
                        "OFPTableModPropExperimenter": {
                           "data": [],
                           "exp_type": 0,
                           "experimenter": 101,
                           "length": 12,
                           "type": 65535
                        }
                     },
                     {
                        "OFPTableModPropExperimenter": {
                           "data": [
                              1
                           ],
                           "exp_type": 1,
                           "experimenter": 101,
                           "length": 16,
                           "type": 65535
                        }
                     },
                     {
                        "OFPTableModPropExperimenter": {
                           "data": [
                              1,
                              2
                           ],
                           "exp_type": 2,
                           "experimenter": 101,
                           "length": 20,
                           "type": 65535
                        }
                     }
                  ],
                  "table_id": 8
               }
            }
         }
      }

### Request Forward Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPRequestForward`(datapath, request=None)

  Forwarded request message

  The swtich forwards request messages from one controller to other controllers.

  Attribute | Description
  --- | ---
  request | `OFPGroupMod` or `OFPMeterMod` instance

  Example:

      @set_ev_cls(ofp_event.EventOFPRequestForward, MAIN_DISPATCHER)
      def request_forward_handler(self, ev):
          msg = ev.msg
          dp = msg.datapath
          ofp = dp.ofproto

          if msg.request.msg_type == ofp.OFPT_GROUP_MOD:
              self.logger.debug(
                  'OFPRequestForward received: request=OFPGroupMod('
                  'command=%d, type=%d, group_id=%d, buckets=%s)',
                  msg.request.command, msg.request.type,
                  msg.request.group_id, msg.request.buckets)
          elif msg.request.msg_type == ofp.OFPT_METER_MOD:
              self.logger.debug(
                  'OFPRequestForward received: request=OFPMeterMod('
                  'command=%d, flags=%d, meter_id=%d, bands=%s)',
                  msg.request.command, msg.request.flags,
                  msg.request.meter_id, msg.request.bands)
          else:
              self.logger.debug(
                  'OFPRequestForward received: request=Unknown')

  JSON Example:

      {
         "OFPRequestForward": {
            "request": {
               "OFPGroupMod": {
                  "buckets": [
                     {
                        "OFPBucket": {
                           "actions": [
                              {
                                 "OFPActionOutput": {
                                    "len": 16,
                                    "max_len": 65535,
                                    "port": 2,
                                    "type": 0
                                 }
                              }
                           ],
                           "len": 32,
                           "watch_group": 1,
                           "watch_port": 1,
                           "weight": 1
                        }
                     }
                  ],
                  "command": 0,
                  "group_id": 1,
                  "type": 0
               }
            }
         }
      }

## Symmetric Messages

### Hello

class `ryu.ofproto.ofproto_v1_4_parser.``OFPHello`(datapath, elements=None)

  Hello message

  When connection is started, the hello message is exchanged between a switch and a controller.

  This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.

  Attribute | Description
  --- | ---
  elements | list of `OFPHelloElemVersionBitmap` instance

  JSON Example:

      {
         "OFPHello": {
            "elements": [
               {
                  "OFPHelloElemVersionBitmap": {
                     "length": 8,
                     "type": 1,
                     "versions": [
                        1,
                        2,
                        3,
                        9,
                        10,
                        30
                     ]
                  }
               }
            ]
         }
      }

class `ryu.ofproto.ofproto_v1_4_parser.``OFPHelloElemVersionBitmap`(versions, type_=None, length=None)

  Version bitmap Hello Element

  Attribute | Description
  --- | ---
  versions | list of versions of OpenFlow protocol a device supports

### Echo Request

class `ryu.ofproto.ofproto_v1_4_parser.``OFPEchoRequest`(datapath, data=None)

  Echo request message

  This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.

  Attribute | Description
  --- | ---
  data | An arbitrary length data

  Example:

      def send_echo_request(self, datapath, data):
          ofp = datapath.ofproto
          ofp_parser = datapath.ofproto_parser

          req = ofp_parser.OFPEchoRequest(datapath, data)
          datapath.send_msg(req)

      @set_ev_cls(ofp_event.EventOFPEchoRequest,
                  [HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
      def echo_request_handler(self, ev):
          self.logger.debug('OFPEchoRequest received: data=%s',
                            utils.hex_array(ev.msg.data))

  JSON Example:

      {
         "OFPEchoRequest": {
            "data": "aG9nZQ=="
         }
      }

### Echo Reply

class `ryu.ofproto.ofproto_v1_4_parser.``OFPEchoReply`(datapath, data=None)

  Echo reply message

  This message is handled by the Ryu framework, so the Ryu application do not need to process this typically.

  Attribute | Description
  --- | ---
  data | An arbitrary length data

  Example:

      def send_echo_reply(self, datapath, data):
          ofp_parser = datapath.ofproto_parser

          reply = ofp_parser.OFPEchoReply(datapath, data)
          datapath.send_msg(reply)

      @set_ev_cls(ofp_event.EventOFPEchoReply,
                  [HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
      def echo_reply_handler(self, ev):
          self.logger.debug('OFPEchoReply received: data=%s',
                            utils.hex_array(ev.msg.data))

  JSON Example:

      {
         "OFPEchoReply": {
            "data": "aG9nZQ=="
         }
      }

### Error Message

class `ryu.ofproto.ofproto_v1_4_parser.``OFPErrorMsg`(datapath, type_=None, code=None, data=None, **kwargs)

  Error message

  The switch notifies controller of problems by this message.

  Attribute | Description
  --- | ---
  type | High level type of error
  code | Details depending on the type
  data | Variable length data depending on the type and code

  `type` attribute corresponds to `type_` parameter of __init__.

  Types and codes are defined in `ryu.ofproto.ofproto`.

  Type | Code
  --- | ---
  OFPET_HELLO_FAILED | OFPHFC_*
  OFPET_BAD_REQUEST | OFPBRC_*
  OFPET_BAD_ACTION | OFPBAC_*
  OFPET_BAD_INSTRUCTION | OFPBIC_*
  OFPET_BAD_MATCH | OFPBMC_*
  OFPET_FLOW_MOD_FAILED | OFPFMFC_*
  OFPET_GROUP_MOD_FAILED | OFPGMFC_*
  OFPET_PORT_MOD_FAILED | OFPPMFC_*
  OFPET_TABLE_MOD_FAILED | OFPTMFC_*
  OFPET_QUEUE_OP_FAILED | OFPQOFC_*
  OFPET_SWITCH_CONFIG_FAILED | OFPSCFC_*
  OFPET_ROLE_REQUEST_FAILED | OFPRRFC_*
  OFPET_METER_MOD_FAILED | OFPMMFC_*
  OFPET_TABLE_FEATURES_FAILED | OFPTFFC_*
  OFPET_EXPERIMENTER | N/A

  If `type == OFPET_EXPERIMENTER`, this message has also the following attributes.

  Attribute | Description
  --- | ---
  exp_type | Experimenter defined type
  experimenter | Experimenter ID

  Example:

      @set_ev_cls(ofp_event.EventOFPErrorMsg,
                  [HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER])
      def error_msg_handler(self, ev):
          msg = ev.msg

          self.logger.debug('OFPErrorMsg received: type=0x%02x code=0x%02x '
                            'message=%s',
                            msg.type, msg.code, utils.hex_array(msg.data))

  JSON Example:

      {
         "OFPErrorMsg": {
            "code": 11,
            "data": "ZnVnYWZ1Z2E=",
            "type": 2
         }
      }

### Experimenter

class `ryu.ofproto.ofproto_v1_4_parser.``OFPExperimenter`(datapath, experimenter=None, exp_type=None, data=None)

  Experimenter extension message

  Attribute | Description
  --- | ---
  experimenter | Experimenter ID
  exp_type | Experimenter defined
  data | Experimenter defined arbitrary additional data

  JSON Example:

      {
         "OFPExperimenter": {
            "data": "bmF6bw==",
            "exp_type": 123456789,
            "experimenter": 98765432
         }
      }

## Port Structures

class `ryu.ofproto.ofproto_v1_4_parser.``OFPPort`(port_no=None, length=None, hw_addr=None, name=None, config=None, state=None, properties=None)

  Description of a port

  Attribute | Description
  --- | ---
  port_no | Port number and it uniquely identifies a port within a switch.
  length | Length of ofp_port (excluding padding).
  hw_addr | MAC address for the port.
  name | Null-terminated string containing a human-readable name for the interface.
  config | Bitmap of port configration flags. OFPPC_PORT_DOWN OFPPC_NO_RECV OFPPC_NO_FWD OFPPC_NO_PACKET_IN
  state | Bitmap of port state flags. OFPPS_LINK_DOWN OFPPS_BLOCKED OFPPS_LIVE
  properties | List of `OFPPortDescProp` subclass instance

## Flow Match Structure

class `ryu.ofproto.ofproto_v1_4_parser.``OFPMatch`(type_=None, length=None, _ordered_fields=None, **kwargs)

  Flow Match Structure

  This class is implementation of the flow match structure having compose/query API.

  You can define the flow match by the keyword arguments. The following arguments are available.

  Argument | Value | Description
  --- | --- | ---
  in_port | Integer 32bit | Switch input port
  in_phy_port | Integer 32bit | Switch physical input port
  metadata | Integer 64bit | Metadata passed between tables
  eth_dst | MAC address | Ethernet destination address
  eth_src | MAC address | Ethernet source address
  eth_type | Integer 16bit | Ethernet frame type
  vlan_vid | Integer 16bit | VLAN id
  vlan_pcp | Integer 8bit | VLAN priority
  ip_dscp | Integer 8bit | IP DSCP (6 bits in ToS field)
  ip_ecn | Integer 8bit | IP ECN (2 bits in ToS field)
  ip_proto | Integer 8bit | IP protocol
  ipv4_src | IPv4 address | IPv4 source address
  ipv4_dst | IPv4 address | IPv4 destination address
  tcp_src | Integer 16bit | TCP source port
  tcp_dst | Integer 16bit | TCP destination port
  udp_src | Integer 16bit | UDP source port
  udp_dst | Integer 16bit | UDP destination port
  sctp_src | Integer 16bit | SCTP source port
  sctp_dst | Integer 16bit | SCTP destination port
  icmpv4_type | Integer 8bit | ICMP type
  icmpv4_code | Integer 8bit | ICMP code
  arp_op | Integer 16bit | ARP opcode
  arp_spa | IPv4 address | ARP source IPv4 address
  arp_tpa | IPv4 address | ARP target IPv4 address
  arp_sha | MAC address | ARP source hardware address
  arp_tha | MAC address | ARP target hardware address
  ipv6_src | IPv6 address | IPv6 source address
  ipv6_dst | IPv6 address | IPv6 destination address
  ipv6_flabel | Integer 32bit | IPv6 Flow Label
  icmpv6_type | Integer 8bit | ICMPv6 type
  icmpv6_code | Integer 8bit | ICMPv6 code
  ipv6_nd_target | IPv6 address | Target address for ND
  ipv6_nd_sll | MAC address | Source link-layer for ND
  ipv6_nd_tll | MAC address | Target link-layer for ND
  mpls_label | Integer 32bit | MPLS label
  mpls_tc | Integer 8bit | MPLS TC
  mpls_bos | Integer 8bit | MPLS BoS bit
  pbb_isid | Integer 24bit | PBB I-SID
  tunnel_id | Integer 64bit | Logical Port Metadata
  ipv6_exthdr | Integer 16bit | IPv6 Extension Header pseudo-field
  pbb_uca | Integer 8bit | PBB UCA header field
  tcp_flags | Integer 16bit | TCP flags (EXT-109 ONF Extension)
  actset_output | Integer 32bit | Output port from action set metadata (EXT-233 ONF Extension)

  Example:

      >>> # compose
      >>> match = parser.OFPMatch(
      ...     in_port=1,
      ...     eth_type=0x86dd,
      ...     ipv6_src=('2001:db8:bd05:1d2:288a:1fc0:1:10ee',
      ...               'ffff:ffff:ffff:ffff::'),
      ...     ipv6_dst='2001:db8:bd05:1d2:288a:1fc0:1:10ee')
      >>> # query
      >>> if 'ipv6_src' in match:
      ...     print match['ipv6_src']
      ...
      ('2001:db8:bd05:1d2:288a:1fc0:1:10ee', 'ffff:ffff:ffff:ffff::')

  Note

  For the list of the supported Nicira experimenter matches, please refer to ryu.ofproto.nx_match.

  Note

  For VLAN id match field, special values are defined in OpenFlow Spec.

  1. Packets with and without a VLAN tag

     > - Example:

     >       match = parser.OFPMatch()

     > - Packet Matching

     >   > non-VLAN-tagged | MATCH
     >   > VLAN-tagged(vlan_id=3) | MATCH
     >   > VLAN-tagged(vlan_id=5) | MATCH

  2. Only packets without a VLAN tag

     > - Example:

     >       match = parser.OFPMatch(vlan_vid=0x0000)

     > - Packet Matching

     >   > non-VLAN-tagged | MATCH
     >   > VLAN-tagged(vlan_id=3) | x
     >   > VLAN-tagged(vlan_id=5) | x

  3. Only packets with a VLAN tag regardless of its value

     > - Example:

     >       match = parser.OFPMatch(vlan_vid=(0x1000, 0x1000))

     > - Packet Matching

     >   > non-VLAN-tagged | x
     >   > VLAN-tagged(vlan_id=3) | MATCH
     >   > VLAN-tagged(vlan_id=5) | MATCH

  4. Only packets with VLAN tag and VID equal

     > - Example:

     >       match = parser.OFPMatch(vlan_vid=(0x1000 | 3))

     > - Packet Matching

     >   > non-VLAN-tagged | x
     >   > VLAN-tagged(vlan_id=3) | MATCH
     >   > VLAN-tagged(vlan_id=5) | x

## Flow Instruction Structures

class `ryu.ofproto.ofproto_v1_4_parser.``OFPInstructionGotoTable`(table_id, type_=None, len_=None)

  Goto table instruction

  This instruction indicates the next table in the processing pipeline.

  Attribute | Description
  --- | ---
  table_id | Next table

class `ryu.ofproto.ofproto_v1_4_parser.``OFPInstructionWriteMetadata`(metadata, metadata_mask, type_=None, len_=None)

  Write metadata instruction

  This instruction writes the masked metadata value into the metadata field.

  Attribute | Description
  --- | ---
  metadata | Metadata value to write
  metadata_mask | Metadata write bitmask

class `ryu.ofproto.ofproto_v1_4_parser.``OFPInstructionActions`(type_, actions=None, len_=None)

  Actions instruction

  This instruction writes/applies/clears the actions.

  Attribute | Description
  --- | ---
  type | One of following values. OFPIT_WRITE_ACTIONS OFPIT_APPLY_ACTIONS OFPIT_CLEAR_ACTIONS
  actions | list of OpenFlow action class

  `type` attribute corresponds to `type_` parameter of __init__.

class `ryu.ofproto.ofproto_v1_4_parser.``OFPInstructionMeter`(meter_id=1, type_=None, len_=None)

  Meter instruction

  This instruction applies the meter.

  Attribute | Description
  --- | ---
  meter_id | Meter instance

## Action Structures

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionOutput`(port, max_len=65509, type_=None, len_=None)

  Output action

  This action indicates output a packet to the switch port.

  Attribute | Description
  --- | ---
  port | Output port
  max_len | Max length to send to controller

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionCopyTtlOut`(type_=None, len_=None)

  Copy TTL Out action

  This action copies the TTL from the next-to-outermost header with TTL to the outermost header with TTL.

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionCopyTtlIn`(type_=None, len_=None)

  Copy TTL In action

  This action copies the TTL from the outermost header with TTL to the next-to-outermost header with TTL.

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionSetMplsTtl`(mpls_ttl, type_=None, len_=None)

  Set MPLS TTL action

  This action sets the MPLS TTL.

  Attribute | Description
  --- | ---
  mpls_ttl | MPLS TTL

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionDecMplsTtl`(type_=None, len_=None)

  Decrement MPLS TTL action

  This action decrements the MPLS TTL.

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionPushVlan`(ethertype=33024, type_=None, len_=None)

  Push VLAN action

  This action pushes a new VLAN tag to the packet.

  Attribute | Description
  --- | ---
  ethertype | Ether type. The default is 802.1Q. (0x8100)

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionPopVlan`(type_=None, len_=None)

  Pop VLAN action

  This action pops the outermost VLAN tag from the packet.

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionPushMpls`(ethertype=34887, type_=None, len_=None)

  Push MPLS action

  This action pushes a new MPLS header to the packet.

  Attribute | Description
  --- | ---
  ethertype | Ether type

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionPopMpls`(ethertype=2048, type_=None, len_=None)

  Pop MPLS action

  This action pops the MPLS header from the packet.

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionSetQueue`(queue_id, type_=None, len_=None)

  Set queue action

  This action sets the queue id that will be used to map a flow to an already-configured queue on a port.

  Attribute | Description
  --- | ---
  queue_id | Queue ID for the packets

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionGroup`(group_id=0, type_=None, len_=None)

  Group action

  This action indicates the group used to process the packet.

  Attribute | Description
  --- | ---
  group_id | Group identifier

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionSetNwTtl`(nw_ttl, type_=None, len_=None)

  Set IP TTL action

  This action sets the IP TTL.

  Attribute | Description
  --- | ---
  nw_ttl | IP TTL

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionDecNwTtl`(type_=None, len_=None)

  Decrement IP TTL action

  This action decrements the IP TTL.

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionSetField`(field=None, **kwargs)

  Set field action

  This action modifies a header field in the packet.

  The set of keywords available for this is same as OFPMatch.

  Example:

      set_field = OFPActionSetField(eth_src="00:00:00:00:00:00")

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionPushPbb`(ethertype, type_=None, len_=None)

  Push PBB action

  This action pushes a new PBB header to the packet.

  Attribute | Description
  --- | ---
  ethertype | Ether type

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionPopPbb`(type_=None, len_=None)

  Pop PBB action

  This action pops the outermost PBB service instance header from the packet.

class `ryu.ofproto.ofproto_v1_4_parser.``OFPActionExperimenter`(experimenter)

  Experimenter action

  This action is an extensible action for the experimenter.

  Attribute | Description
  --- | ---
  experimenter | Experimenter ID

  Note

  For the list of the supported Nicira experimenter actions, please refer to ryu.ofproto.nx_actions.