module openconfig-openflow-types {
  yang-version 1;
  namespace "http://openconfig.net/yang/openflow/types";
  prefix openflow-types;

  import openconfig-extensions {
    prefix oc-ext;
  }

  organization
    "OpenConfig working group";
  contact
    "OpenConfig working group
     www.openconfig.net";
  description
    "This module defines types related to the Openflow configuration
     and operational state model.";

  revision 2022-05-24 {
    description
      "Remove module extension oc-ext:regexp-posix by making pattern regexes
       conform to RFC6020/7950.

       Types impacted:
       - datapath-id";
    reference
      "0.2.0";
  }
  revision 2020-06-30 {
    description
      "Add OpenConfig POSIX pattern extensions.";
    reference
      "0.1.3";
  }
  revision 2018-11-21 {
    description
      "Add OpenConfig module metadata extensions.";
    reference
      "0.1.2";
  }
  revision 2017-08-24 {
    description
      "Minor formatting fixes.";
    reference
      "0.1.1";
  }
  revision 2017-06-01 {
    description
      "Initial revision";
    reference
      "0.1.0";
  }

  oc-ext:openconfig-version "0.2.0";
  oc-ext:catalog-organization "openconfig";
  oc-ext:origin "openconfig";

  typedef failure-mode {
    type enumeration {
      enum "SECURE" {
        description
          "Packets and messages destined to the controllers are
           dropped. Flow entries continue to expire according to
           their timeouts.";
      }
      enum "STANDALONE" {
        description
          "Processes all packets using the OFPP_NORMAL reserved
           port. The switch acts as a legacy Ethernet switch or
           router.";
      }
    }
    description
      "Type to define Openflow failure mode.";
  }

  typedef transport {
    type enumeration {
      enum "TCP" {
        description
          "Transmission Control Protocol (TCP).";
      }
      enum "TLS" {
        description
          "Transport Layer Security (TLS).";
      }
    }
    description
      "Type to define Openflow transport protocol.";
  }

  typedef auxiliary-id {
    type uint8 {
      range "0..15";
    }
    description
      "A Controller may have multiple auxiliary connections as
       specified by the Openflow protocol. The main Controller
       connection should always have the auxiliary-id set to zero.
       All other connections must have an auxiliary-id different
       from 0.";
  }

  typedef datapath-id {
    type string {
      oc-ext:posix-pattern "^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){7}$";
      pattern "[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){7}";
    }
    description
      "The datapath-id type represents an OpenFlow
       datapath identifier. The lower 48-bits are for
       a MAC address, while the upper 16-bits are
       implementer-defined.";
  }
}