AETHER-3162 Remove magma leftover iptables rule from enodebd

AETHER-3198 Add REUSE compliant to enodebd
AETHER-3196 Support identify IP from X-Real IP in enodebd
AETHER-3229 Documentation of configuration and state machine for enodebd
AETHER-3292 Adding new parameter to support in enodebd Sercomm driver
AETHER-3311 Remove unused protobuf definition from enodebd

Change-Id: Ie69f0141eff70cb3d4447cd9575c8224d42dd5e3
diff --git a/proto_files/lte/protos/BUILD.bazel b/proto_files/lte/protos/BUILD.bazel
new file mode 100644
index 0000000..8eb5ee4
--- /dev/null
+++ b/proto_files/lte/protos/BUILD.bazel
@@ -0,0 +1,222 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("@rules_proto_grpc//cpp:defs.bzl", "cpp_grpc_library", "cpp_proto_library")
+
+package(default_visibility = ["//visibility:public"])
+
+cpp_proto_library(
+    name = "mconfigs_cpp_proto",
+    protos = [":mconfigs_proto"],
+    deps = ["//orc8r/protos:common_cpp_proto"],
+)
+
+proto_library(
+    name = "mconfigs_proto",
+    srcs = ["mconfig/mconfigs.proto"],
+    deps = ["//orc8r/protos:common_proto"],
+)
+
+cpp_grpc_library(
+    name = "abort_session_cpp_grpc",
+    protos = [":abort_session_proto"],
+)
+
+cpp_proto_library(
+    name = "abort_session_cpp_proto",
+    protos = [":abort_session_proto"],
+)
+
+proto_library(
+    name = "abort_session_proto",
+    srcs = ["abort_session.proto"],
+)
+
+cpp_proto_library(
+    name = "apn_cpp_proto",
+    protos = [":apn_proto"],
+)
+
+proto_library(
+    name = "apn_proto",
+    srcs = ["apn.proto"],
+)
+
+cpp_proto_library(
+    name = "subscriberdb_cpp_proto",
+    protos = [":subscriberdb_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+        "//orc8r/protos:digest_cpp_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "subscriberdb_cpp_grpc",
+    protos = [":subscriberdb_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+        "//orc8r/protos:digest_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "subscriberdb_proto",
+    srcs = ["subscriberdb.proto"],
+    deps = [
+        ":apn_proto",
+        "//orc8r/protos:common_proto",
+        "//orc8r/protos:digest_proto",
+        "@protobuf//:field_mask_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "mobilityd_cpp_proto",
+    protos = [":mobilityd_proto"],
+    deps = [":subscriberdb_cpp_proto"],
+)
+
+cpp_grpc_library(
+    name = "mobilityd_cpp_grpc",
+    protos = [":mobilityd_proto"],
+    deps = [
+        ":subscriberdb_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "mobilityd_proto",
+    srcs = ["mobilityd.proto"],
+    deps = [
+        ":subscriberdb_proto",
+        "//orc8r/protos:common_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "policydb_cpp_proto",
+    protos = [":policydb_proto"],
+    deps = [
+        ":mobilityd_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "policydb_cpp_grpc",
+    protos = [":policydb_proto"],
+    deps = [
+        ":mobilityd_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "policydb_proto",
+    srcs = ["policydb.proto"],
+    deps = [
+        ":mobilityd_proto",
+        "//orc8r/protos:common_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "session_manager_cpp_proto",
+    protos = [":session_manager_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        ":policydb_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "session_manager_cpp_grpc",
+    protos = [":session_manager_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        ":policydb_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "session_manager_proto",
+    srcs = ["session_manager.proto"],
+    deps = [
+        ":apn_proto",
+        ":policydb_proto",
+        ":subscriberdb_proto",
+        "//orc8r/protos:common_proto",
+        "@protobuf//:timestamp_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "pipelined_cpp_proto",
+    protos = [":pipelined_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        ":policydb_cpp_proto",
+        ":session_manager_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "pipelined_cpp_grpc",
+    protos = [":pipelined_proto"],
+    deps = [
+        ":apn_cpp_proto",
+        ":policydb_cpp_proto",
+        ":session_manager_cpp_proto",
+        "//orc8r/protos:common_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "pipelined_proto",
+    srcs = ["pipelined.proto"],
+    deps = [
+        ":apn_proto",
+        ":mobilityd_proto",
+        ":policydb_proto",
+        ":session_manager_proto",
+        ":subscriberdb_proto",
+        "//orc8r/protos:common_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "spgw_service_cpp_grpc",
+    protos = [":spgw_service_proto"],
+    deps = [
+        "policydb_cpp_proto",
+        "subscriberdb_cpp_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "spgw_service_cpp_proto",
+    protos = [":spgw_service_proto"],
+    deps = [
+        ":policydb_cpp_proto",
+        ":subscriberdb_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "spgw_service_proto",
+    srcs = ["spgw_service.proto"],
+    deps = [
+        ":policydb_proto",
+        ":subscriberdb_proto",
+    ],
+)
diff --git a/proto_files/lte/protos/enodebd.proto b/proto_files/lte/protos/enodebd.proto
new file mode 100644
index 0000000..0a9385a
--- /dev/null
+++ b/proto_files/lte/protos/enodebd.proto
@@ -0,0 +1,120 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/service303.proto";
+import "orc8r/protos/common.proto";
+
+package magma.lte;
+
+option go_package = "magma/lte/cloud/go/protos";
+
+
+// --------------------------------------------------------------------------
+// Message Definitions for TR-069 message injection. This is used for manual
+// testing of the TR-069 server.
+// --------------------------------------------------------------------------
+message GetParameterRequest {
+  // Serial ID of eNodeB. Uniquely identifies the eNodeB.
+  string device_serial = 1;
+
+  // Fully qualified parameter name, e.g:
+  // InternetGatewayDevice.LANDevice.1.Hosts.
+  string parameter_name = 2;
+}
+
+message NameValue {
+  string name = 1;
+  // Note: parameter value is always passed back as string. Up to calling
+  // function to determine type
+  string value = 2;
+}
+message GetParameterResponse {
+  string device_serial = 1;
+  repeated NameValue parameters = 2;
+}
+
+message SetParameterRequest {
+  // Serial ID of eNodeB. Uniquely identifies the eNodeB.
+  string device_serial = 1;
+
+  // Fully qualified parameter name, e.g:
+  // InternetGatewayDevice.LANDevice.1.Hosts.
+  string parameter_name = 2;
+
+  // Data values for each data type
+  oneof value {
+    int32 value_int = 3;
+    string value_string = 4;
+    bool value_bool = 5;
+  }
+
+  // Key to be used at ACS discretion to determine when parameter was last
+  // updated
+  string parameter_key = 6;
+}
+
+message EnodebIdentity {
+  // Serial ID of eNodeB. Uniquely identifies the eNodeB.
+  string device_serial = 1;
+}
+
+message AllEnodebStatus {
+  repeated SingleEnodebStatus enb_status_list = 1;
+}
+
+message SingleEnodebStatus {
+  enum StatusProperty {
+    OFF = 0;
+    ON = 1;
+    UNKNOWN = 2;
+  }
+  string device_serial = 1;
+  string ip_address = 2;
+  StatusProperty connected = 3;
+  StatusProperty configured = 4;
+  StatusProperty opstate_enabled = 5;
+  StatusProperty rf_tx_on = 6;
+  StatusProperty gps_connected = 7;
+  StatusProperty ptp_connected = 8;
+  StatusProperty mme_connected = 9;
+  string gps_longitude = 10;
+  string gps_latitude = 11;
+  string fsm_state = 12;
+  StatusProperty rf_tx_desired = 13;
+}
+
+// --------------------------------------------------------------------------
+// Enodebd service definition.
+// --------------------------------------------------------------------------
+service Enodebd {
+
+  // Sends GetParameterValues message to ENodeB. TR-069 supports multiple
+  // parameter names per message, but only one is supported here.
+  rpc GetParameter (GetParameterRequest) returns (GetParameterResponse);
+
+  // Sends SetParameterValues message to ENodeB. TR-069 supports multiple
+  // parameter names per message, but only one is supported here.
+  rpc SetParameter (SetParameterRequest) returns (magma.orc8r.Void);
+
+  // Configure eNodeB based on enodebd config file
+  rpc Configure (EnodebIdentity) returns (magma.orc8r.Void);
+
+  // Reboot eNodeB
+  rpc Reboot (EnodebIdentity) returns (magma.orc8r.Void);
+
+  // Reboot every connected eNodeB
+  rpc RebootAll (magma.orc8r.Void) returns (magma.orc8r.Void);
+
+  // Get current status
+  rpc GetStatus (magma.orc8r.Void) returns (magma.orc8r.ServiceStatus);
+
+  // Get status info for all connected eNodeB devices
+  rpc GetAllEnodebStatus (magma.orc8r.Void) returns (AllEnodebStatus);
+
+  // Get status info of a single connected eNodeB device
+  rpc GetEnodebStatus (EnodebIdentity) returns (SingleEnodebStatus);
+}
diff --git a/proto_files/lte/protos/mconfig/mconfigs.proto b/proto_files/lte/protos/mconfig/mconfigs.proto
new file mode 100644
index 0000000..e3298b9
--- /dev/null
+++ b/proto_files/lte/protos/mconfig/mconfigs.proto
@@ -0,0 +1,515 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+
+package magma.mconfig;
+option go_package = "magma/lte/cloud/go/protos/mconfig";
+
+// --------------------------------------------------------------------------
+// SentryConfig stores the network-wide Sentry.io configuration
+// --------------------------------------------------------------------------
+message SentryConfig {
+    // url_python initializes the Sentry Python SDK and sets the remote URL.
+    // If set to empty string, Sentry Python SDK will not be initialized.
+    string url_python = 1;
+    // url_native initializes the Sentry Native SDK for C/C++ and sets the
+    // remote URL. If set to empty string, Sentry Native SDK will not be
+    // initialized.
+    string url_native = 2;
+    // upload_mme_log decides whether MME service log file (/var/log/mme.log)
+    // is uploaded along with MME crashreports
+    bool upload_mme_log = 3;
+    // sample_rate sets the rate at which Python error events are sampled.
+    // sample_rate should be a number between 0 (0% of errors sent) and 1 (100%
+    // of errors sent)
+    float sample_rate = 4;
+}
+
+//------------------------------------------------------------------------------
+// EnodebD configs
+//------------------------------------------------------------------------------
+message EnodebD {
+    enum CSFBRat {
+        CSFBRAT_2G = 0;
+        CSFBRAT_3G = 1;
+    }
+
+    message FDDConfig {
+        int32 earfcndl = 1;
+        int32 earfcnul = 2;
+    }
+    message TDDConfig {
+        int32 earfcndl = 1;
+        // TDD subframe config parameter. See http://niviuk.free.fr/lte_tdd.php
+        int32 subframe_assignment = 2;
+        // TDD subframe config parameter. See http://niviuk.free.fr/lte_tdd.php
+        int32 special_subframe_pattern = 3;
+    }
+    message EnodebConfig {
+        // Device-unique serial ID. Used to identify the eNodeB, and ties the
+        // config to that device
+        int32 earfcndl = 1;
+        int32 subframe_assignment = 2;
+        int32 special_subframe_pattern = 3;
+        int32 pci = 4;
+        bool transmit_enabled = 5;
+        string device_class = 6;
+        int32 bandwidth_mhz = 7;
+        int32 tac = 8;
+        int32 cell_id = 9;
+        string ip_address = 10;
+    }
+
+    orc8r.LogLevel log_level = 1;
+
+    // Physical cell ID (0-504)
+    int32 pci = 2;
+    // Frequency channel number. See niviuk.free.fr/lte_band.php for mapping to
+    // frequency
+    int32 earfcndl = 3;
+    // Bandwidth in MHz, from set {1.4, 3, 5, 10, 15, 20}
+    int32 bandwidth_mhz = 4;
+    // Network operator identifier.
+    string plmnid_list = 5;
+    // TDD subframe config parameter. See http://niviuk.free.fr/lte_tdd.php
+    int32 subframe_assignment = 6;
+    // TDD subframe config parameter. See http://niviuk.free.fr/lte_tdd.php
+    int32 special_subframe_pattern = 7;
+    // Enable eNodeB
+    bool allow_enodeb_transmit = 8;
+    // Tracking area code. 16-bit
+    int32 tac = 9;
+    // RAT type (2G/3G), used by eNB
+    CSFBRat csfb_rat = 10;
+    // 2G RAT frequencies /ARFCNs for redirection, used by eNB
+    repeated int32 arfcn_2g = 11;
+    TDDConfig tdd_config = 12;
+    FDDConfig fdd_config = 13;
+    map<string, EnodebConfig> enb_configs_by_serial = 14;
+}
+
+//------------------------------------------------------------------------------
+// PipelineD configs
+//------------------------------------------------------------------------------
+message PipelineD {
+    enum NetworkServices {
+        METERING = 0 [deprecated=true];  // deprecated
+        DPI = 1;
+        ENFORCEMENT = 2;
+    }
+    orc8r.LogLevel log_level = 1;
+    // Range of IPs allocated to UEs
+    string ue_ip_block = 2;
+    // Whether NAT is enabled
+    bool nat_enabled = 3;
+    // repeated PolicyRule policy_rules = 5; // Policies have moved to policydb.proto
+    string default_rule_id = 6; // This should match a rule id in policy_rules
+    repeated NetworkServices services = 8;
+    message AllowedGrePeer {
+      string ip = 1;
+      uint32 key = 2;
+    }
+    repeated AllowedGrePeer allowed_gre_peers = 9;
+    message IPDRExportDst {
+      string ip = 1;
+      uint32 port = 2;
+    }
+    IPDRExportDst ipdr_export_dst = 10;
+    message LiUes {
+        repeated string imsis = 1;
+        repeated string msisdns = 2;
+        repeated string macs = 3;
+        repeated string ips = 4;
+        repeated string imeis = 5;
+    }
+    LiUes li_ues = 12;
+
+    string sgi_management_iface_vlan = 13;
+    string sgi_management_iface_ip_addr = 14;
+    string sgi_management_iface_gw = 15;
+
+    message HEConfig {
+        enum EncryptionAlgorithm {
+            RC4 = 0;
+            AES256_CBC_HMAC_MD5 = 1;
+            AES256_ECB_HMAC_MD5 = 2;
+            GZIPPED_AES256_ECB_SHA1 = 3;
+        }
+        enum HashFunction{
+            MD5 = 0;
+            HEX = 1;
+            SHA256 = 2;
+        }
+        enum EncodingType {
+            BASE64 = 0;
+            HEX2BIN = 1;
+        }
+
+        // enable_header_enrichment is true if header enrichment feature is
+        // enabled for gateway
+        bool enable_header_enrichment = 1;
+        bool enable_encryption = 2;
+        // encryption/hashing/encoding information for headers
+        EncryptionAlgorithm encryptionAlgorithm = 3;
+        HashFunction hashFunction = 4;
+        EncodingType encodingType = 5;
+        string encryption_key = 6;
+        string hmac_key = 7;
+    }
+    HEConfig he_config = 17;
+
+    // Enables 5G Standalone (SA) at a network level
+    bool enable5g_features = 18;
+    string upf_node_identifier = 19;
+
+    // SGi management IPv6 address with network mask
+    string sgi_management_iface_ipv6_addr = 20;
+    // IPv6 address of SGi management network GW
+    string sgi_management_iface_ipv6_gw = 21;
+
+    // DEPRECATED
+    reserved 4, 11;
+}
+
+//------------------------------------------------------------------------------
+// SessionD configs
+//------------------------------------------------------------------------------
+message SessionD {
+    orc8r.LogLevel log_level = 1;
+    // DEPRECATED
+    // Enable forwarding S6a related requests to Federated GW
+    bool relay_enabled = 2 [deprecated = true];
+    WalletExhaustDetection wallet_exhaust_detection = 3;
+    // Enable relaying Gx/Gy messages via FeG RPC
+    bool gx_gy_relay_enabled = 4;
+    // sentry_config stores the Sentry.io configuration for this service
+    SentryConfig sentry_config = 5;
+
+    // Enables 5G Standalone (SA) at a network level
+    bool enable5g_features = 6;
+}
+
+message WalletExhaustDetection {
+    // Enable the feature where session is terminated on wallet exhaust
+    bool terminate_on_exhaust = 1;
+    enum Method {
+        // If # of Gx Tracked Rules are > 0, then the wallet is still valid
+        GxTrackedRules = 0;
+    }
+    // How wallet exhast is detected on SessionD
+    Method method = 2;
+    // How long to wait before terminating a out-of-wallet subscriber on attach
+    uint32 timeout_ms = 3;
+}
+
+//------------------------------------------------------------------------------
+// PolicyDB configs
+//------------------------------------------------------------------------------
+message PolicyDB {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// RedirectD configs
+//------------------------------------------------------------------------------
+message RedirectD {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// MobilityD configs
+//------------------------------------------------------------------------------
+message MobilityD {
+    // UE allocator type.
+    enum IpAllocatorType {
+        IP_POOL = 0;
+        DHCP = 1;
+    }
+    orc8r.LogLevel log_level = 1;
+    // An IP block is a range of IP addresses specified by a network address and
+    // a prefix-length of the netmask. For example,
+    //    IPv4 IP block:      "192.168.0.0/24"
+    string ip_block = 2;
+    // ip allocation type, either dhcp or ip_pool
+    // default is ip_pool
+    IpAllocatorType ip_allocator_type = 3;
+    // Enable Static IP from subscriberDB
+    bool static_ip_enabled = 4;
+    // Enable multi APN IP allocation
+    bool multi_apn_ip_alloc = 5;
+
+    // IPv6 block for IPv6 allocator, for example:
+    // IPv6 IP block:      "fdee:5:6c::/48"
+    string ipv6_block = 10;
+    // Select ipv6 session prefix allocation type, example:
+    // "RANDOM", "HASH"
+    string ipv6_prefix_allocation_type = 11;
+}
+
+//------------------------------------------------------------------------------
+// MME configs
+//------------------------------------------------------------------------------
+message MME {
+    // (0)Turning off NonEPS service, (1)Both CSFB and SMS, (2)only SMS
+    enum NonEPSServiceControl {
+        NON_EPS_SERVICE_CONTROL_OFF = 0;
+        NON_EPS_SERVICE_CONTROL_CSFB_SMS = 1;
+        NON_EPS_SERVICE_CONTROL_SMS = 2;
+        NON_EPS_SERVICE_CONTROL_SMS_ORC8R = 3;
+    }
+
+    orc8r.LogLevel log_level = 1;
+    // Mobile country code
+    string mcc = 2;
+    // Mobile network code
+    string mnc = 3;
+    // [deprecated] Tracking area code. 16-bit
+    // Is overrideen by field 15
+    int32 tac = 4;
+    // MME group identifier - unique within a PLMN. 16-bit
+    int32 mme_gid = 5;
+    // MME code - unique within an MME group. 8-bit
+    int32 mme_code = 6;
+    // Enable DNS Caching. Will be filled by DnsD
+    bool enable_dns_caching = 7;
+    // DEPRECATED
+    // Enable credit control tracking with OCS and forwarding S6a related
+    // requests to Federated GW
+    bool relay_enabled = 8;
+    // For indicating one of the four modes
+    NonEPSServiceControl non_eps_service_control = 9;
+    // Mobile country code for CSFB
+    string csfb_mcc = 10;
+    // Mobile network code for CSFB
+    string csfb_mnc = 11;
+    // Location area code. 16-bit
+    int32 lac = 12;
+    // If relay_enabled is false, this determines whether cloud subscriberdb
+    // or local subscriberdb is used for authentication requests.
+    bool cloud_subscriberdb_enabled = 14;
+    // The Tracking Area Code of every connected eNodeB needs to be
+    // registered the MME.
+    // Overrides field 4 if this is not empty. Field 4 is in the process of
+    // being deprecated
+    repeated int32 attached_enodeb_tacs = 15;
+    // MME relative capacity - capacity within an MME group. 8-bit
+    int32 mme_relative_capacity = 16;
+
+    // DEPRECATED
+    // Use relay_enabled instead
+    // bool s6a_relay_enabled = 13;
+
+    // Primary DNS server
+    string dns_primary = 20;
+    // Secondary DNS server
+    string dns_secondary = 21;
+    // Whether NAT is enabled
+    bool nat_enabled = 22;
+
+    // Enable relaying S6a messages via FeG RPC
+    bool hss_relay_enabled = 23;
+
+    // Apn Correction feature
+    bool enable_apn_correction = 24;
+    message ApnCorrectionMap {
+      string imsi_prefix = 1;
+      string apn_override = 2;
+    }
+    repeated ApnCorrectionMap apn_correction_map_list = 25;
+
+    // P_CSCF IP address configs
+    string ipv4_p_cscf_address = 26;
+    string ipv6_p_cscf_address = 27;
+
+    // IPv6 DNS server
+    string ipv6_dns_address = 30;
+
+    // SGW S1U endpoint on AGW
+    string ipv4_sgw_s1u_addr = 31;
+
+    // PLMN restriction configs
+    message PlmnConfig {
+        string mcc = 1;
+        string mnc = 2;
+    }
+    repeated PlmnConfig restricted_plmns = 32;
+
+    message TacList {
+        repeated uint32 tac = 1;
+    }
+    map<string, TacList> service_area_maps = 33;
+
+    FederatedModeMap federated_mode_map = 34;
+
+    // IMEI restriction configs
+    message ImeiConfig {
+        string tac = 1;
+        string snr = 2;
+    }
+    repeated ImeiConfig restricted_imeis = 35;
+
+    // MME congestion control configs
+    bool congestion_control_enabled = 40;
+
+    // sentry_config stores the Sentry.io configuration for this service
+    SentryConfig sentry_config = 45;
+
+    // Enables 5G Standalone (SA) at a network level
+    bool enable5g_features = 46;
+
+    // AMF Slice Service Type (SST)
+    string default_slice_service_type = 47;
+
+    // AMF Slice Descriptor (SD)
+    string default_slice_differentiator = 48;
+
+    // AMF Name
+    string amf_name = 50;
+
+    // AMF Region ID
+    string amf_region_id = 51;
+
+    // AMF Set ID
+    string amf_set_id = 52;
+
+    // AMF pointer
+    string amf_pointer = 53;
+}
+
+message FederatedModeMap {
+    bool enabled = 1;
+    repeated ModeMapItem mapping = 2;
+}
+
+message ModeMapItem {
+    enum FederatedMode {
+        SPGW_SUBSCRIBER = 0;           // default mode is HSS + spgw_task
+        LOCAL_SUBSCRIBER = 1;          // will use subscriberDb + policydb
+        S8_SUBSCRIBER = 2;             // will use HSS (feg) + s8_task
+    }
+    FederatedMode mode = 1;
+    string plmn = 2;
+    string imsi_range = 3;
+    string apn = 4;
+}
+
+//------------------------------------------------------------------------------
+// SubscriberDB configs
+//------------------------------------------------------------------------------
+message SubscriberDB {
+    orc8r.LogLevel log_level = 1;
+    // Operator configuration field for LTE
+    bytes lte_auth_op = 2;
+    // Authentication management field for LTE
+    bytes lte_auth_amf = 3;
+
+    message SubscriptionProfile {
+        // Maximum uplink bit rate (AMBR-UL)
+        uint64 max_ul_bit_rate = 1;
+        // Maximum downlink bit rate (AMBR-DL)
+        uint64 max_dl_bit_rate = 2;
+    }
+    map<string, SubscriptionProfile> sub_profiles = 4;
+
+    // DEPRECATED
+    // Enable forwarding S6a related requests to Federated GW
+    bool relay_enabled = 5;
+
+    // Enable relaying S6a messages via FeG RPC
+    bool hss_relay_enabled = 6;
+
+    // Interval in seconds between gateway and cloud sync
+    uint32 sync_interval = 7;
+
+    // Enables 5G Standalone (SA) at a network level
+    bool enable5g_features = 8;
+}
+
+//------------------------------------------------------------------------------
+// LighttpD configs
+//------------------------------------------------------------------------------
+message LighttpD {
+    orc8r.LogLevel log_level = 1;
+    bool enable_caching = 2;
+}
+
+//------------------------------------------------------------------------------
+// MonitorD configs
+//------------------------------------------------------------------------------
+message MonitorD {
+    orc8r.LogLevel log_level = 1;
+    int32 polling_interval = 60;
+}
+
+//------------------------------------------------------------------------------
+// DPID configs
+//------------------------------------------------------------------------------
+message DPID {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// ConnectionD configs
+//------------------------------------------------------------------------------
+message ConnectionD {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// LIAgentD configs
+//------------------------------------------------------------------------------
+message LIAgentD {
+    orc8r.LogLevel log_level = 1;
+    repeated NProbeTask nprobe_tasks = 2;
+}
+
+message NProbeTask {
+    string task_id = 1;
+    string target_id = 2;
+    string target_type = 3;
+    string delivery_type = 4;
+    uint64 correlation_id = 5;
+    string domain_id = 6;
+}
+
+//------------------------------------------------------------------------------
+// DnsD configs
+//------------------------------------------------------------------------------
+message DnsD {
+    orc8r.LogLevel log_level = 1;
+    bool enable_caching = 2;
+    int32 localTTL = 3;
+    repeated GatewayDNSConfigRecordsItems records = 4;
+    bool dhcp_server_enabled = 5;
+}
+
+message GatewayDNSConfigRecordsItems {
+  repeated string a_record = 1;
+  repeated string aaaa_record = 2;
+  repeated string cname_record = 3;
+  string domain = 4;
+}
+
+//----------------------------------------------------------------------------
+// AgwD configs
+//----------------------------------------------------------------------------
+message AgwD {
+  enum LogLevel {
+    UNSET = 0;
+    DEBUG = 1;
+    INFO = 2;
+    WARN = 3;
+    ERROR = 4;
+  }
+  LogLevel log_level = 1;
+
+  string sctpd_downstream_service_target = 2;
+  string sctpd_upstream_service_target = 3;
+  string mme_sctpd_downstream_service_target = 4;
+  string mme_sctpd_upstream_service_target = 5;
+}
diff --git a/proto_files/lte/protos/s1ap_service.proto b/proto_files/lte/protos/s1ap_service.proto
new file mode 100644
index 0000000..c649c0a
--- /dev/null
+++ b/proto_files/lte/protos/s1ap_service.proto
@@ -0,0 +1,22 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+
+package magma.lte;
+
+option go_package = "magma/lte/cloud/go/protos";
+
+service S1apService {
+    // Returns state of the S1 connected eNBs
+    rpc GetENBState (magma.orc8r.Void) returns (EnbStateResult) {}
+}
+
+// enb_state_map { eNB IDs -> # UEs connected }
+message EnbStateResult {
+    map<uint32, uint32> enb_state_map = 1;
+}
diff --git a/proto_files/orc8r/protos/BUILD.bazel b/proto_files/orc8r/protos/BUILD.bazel
new file mode 100644
index 0000000..10a1060
--- /dev/null
+++ b/proto_files/orc8r/protos/BUILD.bazel
@@ -0,0 +1,129 @@
+# SPDX-FileCopyrightText: 2020 The Magma Authors.
+# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("@rules_proto_grpc//cpp:defs.bzl", "cpp_grpc_library")
+load("@rules_proto_grpc//cpp:defs.bzl", "cpp_proto_library")
+
+package(default_visibility = ["//visibility:public"])
+
+cpp_proto_library(
+    name = "common_cpp_proto",
+    protos = [":common_proto"],
+)
+
+proto_library(
+    name = "common_proto",
+    srcs = ["common.proto"],
+)
+
+cpp_proto_library(
+    name = "digest_cpp_proto",
+    protos = [":digest_proto"],
+)
+
+proto_library(
+    name = "digest_proto",
+    srcs = ["digest.proto"],
+    deps = ["@protobuf//:any_proto"],
+)
+
+cpp_grpc_library(
+    name = "eventd_cpp_grpc",
+    protos = [":eventd_proto"],
+    deps = [":common_cpp_proto"],
+)
+
+proto_library(
+    name = "eventd_proto",
+    srcs = ["eventd.proto"],
+    deps = [":common_proto"],
+)
+
+cpp_grpc_library(
+    name = "directoryd_cpp_grpc",
+    protos = [":directoryd_proto"],
+    deps = [":common_cpp_proto"],
+)
+
+proto_library(
+    name = "directoryd_proto",
+    srcs = ["directoryd.proto"],
+    deps = [":common_proto"],
+)
+
+cpp_proto_library(
+    name = "redis_cpp_proto",
+    protos = [":redis_proto"],
+)
+
+proto_library(
+    name = "redis_proto",
+    srcs = ["redis.proto"],
+)
+
+proto_library(
+    name = "mconfigs_proto",
+    srcs = ["mconfig/mconfigs.proto"],
+    strip_import_prefix = "mconfig/",
+    deps = [":common_proto"],
+)
+
+cpp_proto_library(
+    name = "metrics_cpp_proto",
+    protos = [":metrics_proto"],
+)
+
+proto_library(
+    name = "metrics_proto",
+    srcs = ["prometheus/metrics.proto"],
+    strip_import_prefix = "prometheus/",
+)
+
+cpp_proto_library(
+    name = "metricsd_cpp_proto",
+    protos = [":metricsd_proto"],
+    deps = [
+        ":common_cpp_proto",
+        ":metrics_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "metricsd_proto",
+    srcs = ["metricsd.proto"],
+    deps = [
+        ":common_proto",
+        ":metrics_proto",
+    ],
+)
+
+cpp_grpc_library(
+    name = "service303_cpp_grpc",
+    protos = [":service303_proto"],
+    deps = [
+        ":common_cpp_proto",
+        ":metricsd_cpp_proto",
+    ],
+)
+
+cpp_proto_library(
+    name = "service303_cpp_proto",
+    protos = [":service303_proto"],
+    deps = [
+        ":common_cpp_proto",
+        ":metricsd_cpp_proto",
+    ],
+)
+
+proto_library(
+    name = "service303_proto",
+    srcs = ["service303.proto"],
+    deps = [
+        ":common_proto",
+        ":metricsd_proto",
+        "@protobuf//:wrappers_proto",
+    ],
+)
diff --git a/proto_files/orc8r/protos/common.proto b/proto_files/orc8r/protos/common.proto
new file mode 100644
index 0000000..43c153b
--- /dev/null
+++ b/proto_files/orc8r/protos/common.proto
@@ -0,0 +1,44 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+option go_package = "magma/orc8r/lib/go/protos";
+
+message Void {
+}
+
+// -------------------------------------------------------------------------------
+// Bytes is a special message type used to marshal & unmarshal unknown types as is
+// -------------------------------------------------------------------------------
+message Bytes {
+  bytes val = 1;
+}
+
+// --------------------------------------------------------------------------
+// NetworkID uniquely identifies the network
+// --------------------------------------------------------------------------
+message NetworkID {
+  string id = 1;
+}
+
+// --------------------------------------------------------------------------
+// IDList is a generic definition of an array of IDs (network, gateway, etc.)
+// --------------------------------------------------------------------------
+message IDList {
+  repeated string ids = 1;
+}
+
+// --------------------------------------------------------------------------
+// Logging levels
+// --------------------------------------------------------------------------
+enum LogLevel {
+  DEBUG = 0;
+  INFO = 1;
+  WARNING = 2;
+  ERROR = 3;
+  FATAL = 4;
+}
diff --git a/proto_files/orc8r/protos/eventd.proto b/proto_files/orc8r/protos/eventd.proto
new file mode 100644
index 0000000..eaa5288
--- /dev/null
+++ b/proto_files/orc8r/protos/eventd.proto
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+
+package magma.orc8r;
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// --------------------------------------------------------------------------
+// EventService provides an interface for structured event logging.
+// --------------------------------------------------------------------------
+service EventService {
+  // Logs an event to FluentBit.
+  rpc LogEvent (Event) returns (Void) {}
+}
+
+// --------------------------------------------------------------------------
+// An Event encapsulates all information regarding an event and it's metadata.
+// --------------------------------------------------------------------------
+message Event {
+  // A user-specified string to categorize events
+  string stream_name = 1;
+  // Denotes the way an event should be deserialized.
+  // This should correspond to an event type in swagger_eventd.v1.yml
+  string event_type = 2;
+  // A user-specified non-unique identifier for events
+  string tag = 3;
+  // The event log serialized as JSON
+  string value = 4;
+}
diff --git a/proto_files/orc8r/protos/magmad.proto b/proto_files/orc8r/protos/magmad.proto
new file mode 100644
index 0000000..41192da
--- /dev/null
+++ b/proto_files/orc8r/protos/magmad.proto
@@ -0,0 +1,147 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+import "orc8r/protos/mconfig.proto";
+import "google/protobuf/struct.proto";
+
+package magma.orc8r;
+option go_package = "magma/orc8r/lib/go/protos";
+
+
+message PingParams {
+  string host_or_ip = 1;
+  int32 num_packets = 2;
+}
+
+message TracerouteParams {
+  string host_or_ip = 1;
+  int32 max_hops = 2;
+  int32 bytes_per_packet = 3;
+}
+
+message NetworkTestRequest {
+  repeated PingParams pings = 1;
+  repeated TracerouteParams traceroutes = 2;
+}
+
+message PingResult {
+  string host_or_ip = 1;
+  int32 num_packets = 2;
+  string error = 3;
+  int32 packets_transmitted = 4;
+  int32 packets_received = 5;
+  float avg_response_ms = 6;
+}
+
+message TracerouteProbe {
+  string hostname = 1;
+  string ip = 2;
+  float rtt_ms = 3;
+}
+
+message TracerouteHop {
+  int32 idx = 1;
+  repeated TracerouteProbe probes = 2;
+}
+
+message TracerouteResult {
+  string error = 1;
+  string host_or_ip = 2;
+  repeated TracerouteHop hops = 3;
+}
+
+message NetworkTestResponse {
+  repeated PingResult pings = 1;
+  repeated TracerouteResult traceroutes = 2;
+}
+
+message GetGatewayIdResponse {
+  string gateway_id = 1;
+}
+
+message RestartServicesRequest {
+  repeated string services = 1;
+}
+
+message GenericCommandParams {
+  string command = 1;
+  google.protobuf.Struct params = 2;
+}
+
+message GenericCommandResponse {
+  google.protobuf.Struct response = 1;
+}
+
+message TailLogsRequest {
+  string service = 1;
+}
+
+message LogLine {
+  string line = 1;
+}
+
+message CheckStatelessResponse{
+  enum AGWMode {
+    INVALID = 0;
+    STATELESS = 1;
+    STATEFUL = 2;
+    CORRUPT = 3;
+  }
+  AGWMode agw_mode = 1;
+}
+
+message ConfigureStatelessRequest {
+  enum Cmd {
+    CHECK = 0;
+    DISABLE = 1;
+    ENABLE = 2;
+  }
+  Cmd config_cmd = 1;
+}
+
+// --------------------------------------------------------------------------
+// Magmad service definition.
+// --------------------------------------------------------------------------
+service Magmad {
+
+  // Starts all magma services
+  rpc StartServices (Void) returns (Void) {}
+
+  // Stops all magma services
+  rpc StopServices (Void) returns (Void) {}
+
+  // Reboot the gateway device
+  rpc Reboot (Void) returns (Void) {}
+
+  // Restart specified magma services
+  rpc RestartServices (RestartServicesRequest) returns (Void) {}
+
+  // Updates AG configs and restarts affected AG services
+  rpc SetConfigs (GatewayConfigs) returns (Void) {}
+
+  // Get current AG configs
+  rpc GetConfigs (Void) returns (GatewayConfigs) {}
+
+  // Execute some network commands to check gateway network health
+  rpc RunNetworkTests (NetworkTestRequest) returns (NetworkTestResponse) {}
+
+  // Get gateway hardware ID
+  rpc GetGatewayId (Void) returns (GetGatewayIdResponse) {}
+
+  // Execute generic command
+  rpc GenericCommand (GenericCommandParams) returns (GenericCommandResponse) {}
+
+  // Get stream of logs
+  rpc TailLogs (TailLogsRequest) returns (stream LogLine) {}
+
+  // CheckStateless returns whether AGW is stateless or stateful
+  rpc CheckStateless (Void) returns (CheckStatelessResponse) {}
+
+  // ConfigureStateless configures the stateless mode of AGW
+  rpc ConfigureStateless (ConfigureStatelessRequest) returns (Void) {}
+}
diff --git a/proto_files/orc8r/protos/mconfig.proto b/proto_files/orc8r/protos/mconfig.proto
new file mode 100644
index 0000000..740ab6a
--- /dev/null
+++ b/proto_files/orc8r/protos/mconfig.proto
@@ -0,0 +1,51 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "google/protobuf/any.proto";
+
+package magma.orc8r;
+option go_package = "magma/orc8r/lib/go/protos";
+
+// --------------------------------------------------------------------------
+// GatewayConfigs structure is a container for all Access Gateway's (AG) Cloud
+// Managed Configs (CMC). Each and every field of GatewayConfigs represents
+// one AG service config
+// --------------------------------------------------------------------------
+// NOTE: a service config field name (control_proxy, enodebd, etc.) must match
+//       the corresponding gateway service's name exactly
+message GatewayConfigs {
+    map<string, google.protobuf.Any> configs_by_key = 10;
+
+    GatewayConfigsMetadata metadata = 11;
+}
+
+// Deterministic hash of a serialized GatewayConfigs proto
+message GatewayConfigsDigest {
+    // Hexadecimal MD5 hash of the UTF-8-encoded stringified full mconfigs
+    string md5_hex_digest = 1;
+}
+
+// Metadata about the configs.
+message GatewayConfigsMetadata {
+    // Unix timestamp of Cloud at the time of config generation.
+    uint64 created_at = 11;
+    GatewayConfigsDigest digest = 12;
+}
+
+// Wraps a gateway config and a stream offset that the config was computed
+// from
+message OffsetGatewayConfigs {
+    GatewayConfigs configs = 1;
+    int64 offset = 2;
+}
+
+// Stream request passed as extra args to the streaming mconfig streamer policy.
+// Contains a single field, the offset of the mconfig currently stored on
+// the device.
+message MconfigStreamRequest {
+    int64 offset = 1;
+}
diff --git a/proto_files/orc8r/protos/mconfig/mconfigs.proto b/proto_files/orc8r/protos/mconfig/mconfigs.proto
new file mode 100644
index 0000000..9e5acb5
--- /dev/null
+++ b/proto_files/orc8r/protos/mconfig/mconfigs.proto
@@ -0,0 +1,112 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+import "orc8r/protos/common.proto";
+
+package magma.mconfig;
+option go_package = "magma/orc8r/lib/go/protos/mconfig";
+
+// ===========================================================================
+// Service-specific configs
+// ===========================================================================
+
+
+//------------------------------------------------------------------------------
+// Control Proxy configs
+//------------------------------------------------------------------------------
+message ControlProxy {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// MagmaD configs
+//------------------------------------------------------------------------------
+
+message ImageSpec {
+    string name = 1;
+    int64 order = 2;
+}
+
+message MagmaD {
+    orc8r.LogLevel log_level = 1;
+    // Interval for the gateways to send checkin rpc calls to the cloud.
+    int32 checkin_interval = 2;
+    // Checkin rpc timeout
+    int32 checkin_timeout = 3;
+    // Enables autoupgrading of the magma package
+    bool autoupgrade_enabled = 4;
+    // Interval to poll for package upgrades
+    int32 autoupgrade_poll_interval = 5;
+    // The magma package version the gateway should upgrade to
+    string package_version = 6;
+    // List of upgrade images
+    repeated ImageSpec images = 7;
+
+    // For streamer, should be left unused by gateway
+    string tier_id = 8;
+
+    map<string, bool> feature_flags = 9;
+
+    // List of dynamic_services
+    repeated string dynamic_services = 10;
+}
+
+//------------------------------------------------------------------------------
+// EventD configs
+//------------------------------------------------------------------------------
+message EventD {
+    orc8r.LogLevel log_level = 1;
+    // The verbosity level for events.
+    // All events less than or equal to this verbosity will be logged.
+    int32 event_verbosity = 2;
+}
+
+message DirectoryD {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// MetricsD configs
+//------------------------------------------------------------------------------
+message MetricsD {
+    orc8r.LogLevel log_level = 1;
+}
+
+//------------------------------------------------------------------------------
+// State configs
+//------------------------------------------------------------------------------
+message State {
+    orc8r.LogLevel log_level = 1;
+    uint32 sync_interval = 2;
+}
+
+//------------------------------------------------------------------------------
+// Fluent Bit configs
+//------------------------------------------------------------------------------
+message FluentBit {
+    map<string, string> extra_tags = 1;
+
+    uint32 throttle_rate = 10;
+    uint32 throttle_window = 11;
+    string throttle_interval = 12;
+
+    map<string, string> files_by_tag = 20;
+}
+
+//------------------------------------------------------------------------------
+// OpenVPN client configs
+//------------------------------------------------------------------------------
+message OpenVPN {
+    bool enable_shell_access = 1;
+}
+
+//------------------------------------------------------------------------------
+// CtraceD configs
+//------------------------------------------------------------------------------
+message CtraceD {
+    orc8r.LogLevel log_level = 1;
+}
diff --git a/proto_files/orc8r/protos/metricsd.proto b/proto_files/orc8r/protos/metricsd.proto
new file mode 100644
index 0000000..9542201
--- /dev/null
+++ b/proto_files/orc8r/protos/metricsd.proto
@@ -0,0 +1,238 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+
+import "metrics.proto";
+import "orc8r/protos/common.proto";
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// For each metric name tracked, we use an enum
+enum MetricName {
+  // Prometheus metrics
+  process_start_time_seconds     = 0;
+  process_virtual_memory_bytes   = 1;
+  process_resident_memory_bytes  = 2;
+  process_cpu_seconds_total      = 3;
+  process_open_fds               = 4;
+  process_max_fds                = 5;
+
+  // subscriberdb metrics
+  s6a_auth_success               = 6;
+  s6a_auth_failure               = 7;
+  s6a_location_update            = 8;
+  diameter_capabilities_exchange = 9;
+  diameter_watchdog              = 10;
+  diameter_disconnect            = 11;
+
+  // More prometheus metrics
+  python_info                    = 50;
+
+  // Metricsd metrics
+  service_metrics_collected      = 60;
+  process_uptime_seconds         = 61;
+
+  // mobilityd metrics
+  ip_address_allocated           = 100;
+  ip_address_released            = 101;
+  ip_already_allocated           = 102;
+  ip_allocation_failure          = 103;
+
+  // enodebd metrics
+  enodeb_mgmt_connected          = 200;
+  enodeb_opstate_enabled         = 201;
+  enodeb_rf_tx_enabled           = 202;
+  enodeb_gps_connected           = 203;
+  enodeb_ptp_connected           = 204;
+  enodeb_mme_connected           = 205;
+  rrc_estab_attempts             = 206;
+  rrc_estab_successes            = 207;
+  pdcp_user_plane_bytes_ul       = 208;
+  pdcp_user_plane_bytes_dl       = 209;
+  rrc_reestab_attempts           = 210;
+  rrc_reestab_attempts_reconf_fail = 211;
+  rrc_reestab_attempts_ho_fail   = 212;
+  rrc_reestab_attempts_other     = 213;
+  rrc_reestab_successes          = 214;
+  erab_estab_attempts            = 215;
+  erab_estab_successes           = 216;
+  erab_estab_failures            = 217;
+  erab_release_requests          = 218;
+  erab_release_requests_user_inactivity = 219;
+  erab_release_requests_normal   = 220;
+  erab_release_requests_radio_resources_not_available = 221;
+  erab_release_requests_reduce_load = 222;
+  erab_release_requests_fail_in_radio_proc = 223;
+  erab_release_requests_eutran_reas = 224;
+  erab_release_requests_radio_radio_conn_lost = 225;
+  erab_release_requests_oam_intervention = 226;
+  enodeb_mgmt_configured         = 227;
+  enodeb_reboot_timer_active     = 228;
+  enodeb_reboots                 = 229;
+  enodeb_rf_tx_desired           = 230;
+
+  // Kernsnoopd metrics
+  magma_bytes_sent_total         = 260;
+  linux_bytes_sent_total         = 261;
+
+  // Magmad metrics
+  magmad_ping_rtt_ms             = 300;
+  cpu_percent                    = 301;
+  swap_memory_percent            = 302;
+  virtual_memory_percent         = 303;
+  disk_percent                   = 304;
+  bytes_sent                     = 305;
+  bytes_received                 = 306;
+  temperature                    = 307;
+  checkin_status                 = 308;
+  streamer_responses             = 309;
+  mem_total                      = 310;
+  mem_available                  = 311;
+  mem_used                       = 312;
+  mem_free                       = 313;
+  bootstrap_exception            = 314;
+  upgrader2_time_taken           = 315;
+  upgrader2_error                = 316;
+  upgrader2_prepared             = 317;
+  upgrader2_downloaded           = 318;
+  upgrader2_canary               = 319;
+  upgrader2_stable               = 320;
+  upgrader2_idle                 = 321;
+  unexpected_service_restarts    = 322;
+  unattended_upgrade_status      = 323;
+  service_restart_status         = 324;
+
+  // Pipelined metrics
+  dp_send_msg_error              = 350;
+  arp_default_gw_mac_error       = 351;
+  openflow_error_msg             = 352;
+  unknown_pkt_direction          = 353;
+  network_iface_status           = 354;
+  enforcement_rule_install_fail  = 355;
+  enforcement_stats_rule_install_fail = 356;
+
+  ///////////////////////////////
+  // GATEWAY FAILURES & ALERTS //
+  ///////////////////////////////
+  mme_restarted                  = 400;
+  s1_reset_from_enb              = 401;
+
+  // SCTP
+  sctp_reset                     = 410;
+  sctp_shutdown                  = 411;
+
+  // s6a
+  s6a_subscriberdb_connection_failure = 420;
+  s6a_auth_info_response_timer_expired = 421;
+
+  // UE attach, Serivce Request
+  duplicate_attach_request       = 430;
+  initial_context_setup_failure_received = 431;
+  initial_context_setup_request_timer_expired = 432;
+  nas_attach_accept_timer_expired = 433;
+  nas_auth_rsp_timer_expired = 434;
+  nas_security_mode_command_timer_expired = 435;
+  security_mode_reject_received  = 436;
+  authentication_failure         = 437; // cause=mac_failure,resync,amf
+  mme_spgw_create_session_req    = 438;
+  mme_spgw_create_session_rsp    = 439;
+  mme_spgw_delete_session_req    = 440;
+  mme_spgw_delete_session_rsp    = 441;
+
+  // UE S1AP context
+  ue_context_release_request     = 450;
+  ue_context_release_command_timer_expired = 451;
+
+  // Detach
+  implicit_detach_timer_expired  = 452;
+
+  // eNB SCTP shutdown context clean up time
+  enb_sctp_shutdown_ue_clean_up_timer_expired  = 453;
+
+  // Other errors
+  s1ap_error_ind_received        = 480;
+  gtpu_error_ind_received        = 481;
+  nas_non_delivery_indication_received = 482;
+  emm_status_received            = 483;
+  emm_status_sent                = 484;
+
+  ////////////////////////
+  // GATEWAY PROCEDURES //
+  ////////////////////////
+  mme_new_association            = 500;
+  ue_attach                      = 501; // result=failure,accept,complete
+  service_request                = 502;
+  ue_detach                      = 503; // cause=network_initiated,
+                                        // deregister_ue,implicit_detach,
+                                        // ue_initiated
+  spgw_create_session            = 504;
+  spgw_delete_session            = 505;
+  ue_pdn_connection              = 506;
+  tracking_area_update           = 507;
+  s1_setup                       = 508;
+
+  // Generic service metrics
+  service_errors                 = 550;
+}
+
+// Possible labels, used as metric_name{label_name=label_value}
+enum MetricLabelName {
+  result                         = 0;
+  cause                          = 1;
+  tau_type                       = 2;
+  pdn_type                       = 3;
+  action                         = 4;
+  host                           = 5; // magmad_ping_rtt_ms
+  metric                         = 6; // magmad_ping_rtt_ms
+  patchlevel                     = 7; // python_info
+  minor                          = 8; // python_info
+  major                          = 9; // python_info
+  version                        = 10; // python_info
+  implementation                 = 11; // python_info
+  sensor                         = 12; // magmad_temperature
+  error_code                     = 13;
+  error_type                     = 14;
+  iface_name                     = 15; // pipelined network_iface_status
+  service_name                   = 16; // magmad unexpected_service_restarts
+  rule_id                        = 17; // pipelined rule install failures
+  imsi                           = 18; // pipelined rule install failures
+  dest_service                   = 19; // kernsnoopd name of destination service
+  binary_name                    = 20; // kernsnoopd name of linux binary
+}
+
+message MetricsContainer {
+  string gatewayId = 1;
+  // TODO: we should strip this out of metricsd (or duplicate it ourselves)
+  // Prometheus 2 no longer supports protobuf client model
+  repeated io.prometheus.client.MetricFamily family = 2;
+}
+
+message PushedMetric {
+  string   metricName        = 1;
+  double   value             = 2;
+  int64    timestampMS       = 3;
+  repeated LabelPair labels  = 4;
+}
+
+message LabelPair {
+  string name  = 1;
+  string value = 2;
+}
+
+message PushedMetricsContainer {
+  string   networkId = 1;
+  repeated PushedMetric metrics = 2;
+}
+
+service MetricsController {
+  // Report a collection of metrics from a service
+  rpc Collect(MetricsContainer) returns (Void) {}
+
+  // Push a collection of metrics to metricsd
+  rpc Push(PushedMetricsContainer) returns (Void) {}
+}
diff --git a/proto_files/orc8r/protos/prometheus/metrics.proto b/proto_files/orc8r/protos/prometheus/metrics.proto
new file mode 100644
index 0000000..87ae0d7
--- /dev/null
+++ b/proto_files/orc8r/protos/prometheus/metrics.proto
@@ -0,0 +1,82 @@
+// SPDX-FileCopyrightText: 2013 Prometheus Team.
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: Apache-2.0
+
+syntax = "proto2";
+
+package io.prometheus.client;
+option java_package = "io.prometheus.client";
+
+// !!!!!!!!!!!!!
+// DO NOT MODIFY
+// !!!!!!!!!!!!!
+// This file is a copy of the open source prometheus library.
+// https://github.com/prometheus/client_model/blob/master/metrics.proto
+// The 'go_package' change is made locally, and needs to be upstreamed.
+option go_package = "github.com/prometheus/client_model/go";
+
+message LabelPair {
+  optional string name  = 1;
+  optional string value = 2;
+}
+
+enum MetricType {
+  COUNTER    = 0;
+  GAUGE      = 1;
+  SUMMARY    = 2;
+  UNTYPED    = 3;
+  HISTOGRAM  = 4;
+}
+
+message Gauge {
+  optional double value = 1;
+}
+
+message Counter {
+  optional double value = 1;
+}
+
+message Quantile {
+  optional double quantile = 1;
+  optional double value    = 2;
+}
+
+message Summary {
+  optional uint64   sample_count = 1;
+  optional double   sample_sum   = 2;
+  repeated Quantile quantile     = 3;
+}
+
+message Untyped {
+  optional double value = 1;
+}
+
+message Histogram {
+  optional uint64 sample_count = 1;
+  optional double sample_sum   = 2;
+  repeated Bucket bucket       = 3; // Ordered in increasing order of upper_bound, +Inf bucket is optional.
+}
+
+message Bucket {
+  optional uint64 cumulative_count = 1; // Cumulative in increasing order.
+  optional double upper_bound = 2;      // Inclusive.
+}
+
+message Metric {
+  repeated LabelPair label        = 1;
+  optional Gauge     gauge        = 2;
+  optional Counter   counter      = 3;
+  optional Summary   summary      = 4;
+  optional Untyped   untyped      = 5;
+  optional Histogram histogram    = 7;
+  optional int64     timestamp_ms = 6;
+}
+
+message MetricFamily {
+  optional string     name   = 1;
+  optional string     help   = 2;
+  optional MetricType type   = 3;
+  repeated Metric     metric = 4;
+}
diff --git a/proto_files/orc8r/protos/redis.proto b/proto_files/orc8r/protos/redis.proto
new file mode 100644
index 0000000..489cc0d
--- /dev/null
+++ b/proto_files/orc8r/protos/redis.proto
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+option go_package = "magma/orc8r/lib/go/protos";
+
+message RedisState {
+    bytes serialized_msg = 1;
+    uint64 version = 2;
+    bool is_garbage = 3;
+}
+
diff --git a/proto_files/orc8r/protos/service303.proto b/proto_files/orc8r/protos/service303.proto
new file mode 100644
index 0000000..143af45
--- /dev/null
+++ b/proto_files/orc8r/protos/service303.proto
@@ -0,0 +1,132 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+package magma.orc8r;
+
+import "orc8r/protos/common.proto";
+import "orc8r/protos/metricsd.proto";
+import "google/protobuf/wrappers.proto";
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// --------------------------------------------------------------------------
+// Service status messages
+// --------------------------------------------------------------------------
+
+message EnodebdStatus {
+  // For bools, parameter is not set if result can't be determined
+  google.protobuf.BoolValue enodeb_connected = 1;
+  google.protobuf.BoolValue opstate_enabled = 2;
+  google.protobuf.BoolValue rf_tx_on = 3;
+  google.protobuf.BoolValue gps_connected = 4;
+  google.protobuf.BoolValue ptp_connected = 5;
+  google.protobuf.BoolValue mme_connected = 6;
+  google.protobuf.BoolValue enodeb_configured = 7;
+  google.protobuf.FloatValue gps_latitude = 8;
+  google.protobuf.FloatValue gps_longitude = 9;
+  google.protobuf.BoolValue rf_tx_desired = 10;
+}
+
+message ServiceStatus {
+  // Metadata from the services that will be sent to the cloud through checkin
+  map<string, string> meta = 2;
+}
+
+message ServiceInfo {
+  string name = 1;
+
+  string version = 2;
+
+  enum ServiceState {
+    UNKNOWN = 0;
+    STARTING = 1;
+    ALIVE = 2;
+    STOPPING = 3;
+    STOPPED = 4;
+  }
+  ServiceState state = 3;
+
+  ServiceStatus status = 4;
+
+  // Gives information about whether the application is usable. Though the
+  // process may have started, the connections may not be set up. APP_HEALTHY in
+  // this case means the application is entirely usable
+  enum ApplicationHealth {
+    APP_UNKNOWN = 0;
+    APP_UNHEALTHY = 1;
+    APP_HEALTHY = 2;
+  }
+  ApplicationHealth health = 5;
+
+  // Time when the service was started (in seconds since epoch)
+  uint64 start_time_secs = 6;
+}
+
+message LogLevelMessage {
+    LogLevel level = 1;
+}
+
+message LogVerbosity {
+  int32 verbosity = 1;
+}
+
+message ReloadConfigResponse {
+  enum ReloadConfigResult {
+    RELOAD_UNKNOWN = 0;
+    RELOAD_SUCCESS = 1;
+    RELOAD_FAILURE = 2;
+    RELOAD_UNSUPPORTED = 3;
+  }
+  ReloadConfigResult result = 1;
+}
+
+message State {
+    // Type determines how the value is deserialized and validated on the cloud service side
+    string type = 1;
+    string deviceID = 2;
+    // Value contains the operational state json-serialized.
+    bytes value = 3;
+    uint64 version = 4;
+}
+
+message GetOperationalStatesResponse {
+  repeated State states = 1;
+}
+
+// --------------------------------------------------------------------------
+// Service303 interface definition.
+//
+// Service303 is named after fb303, which was named after TB-303
+// https://en.wikipedia.org/wiki/Roland_TB-303.
+//
+// The Service303 interface implements a set of functionalities which
+// all Magma services expose.
+// --------------------------------------------------------------------------
+service Service303 {
+
+  // Returns the service level info like name, version, state, status, etc.
+  //
+  rpc GetServiceInfo (Void) returns (ServiceInfo) {}
+
+  // Request to stop the service gracefully.
+  //
+  rpc StopService (Void) returns (Void) {}
+
+  // Collects metrics from the service
+  rpc GetMetrics (Void) returns (MetricsContainer) {}
+
+  // Set logging level
+  rpc SetLogLevel (LogLevelMessage) returns (Void) {}
+
+  // Set logging verbosity The larger, the more verbose. default 0
+  rpc SetLogVerbosity (LogVerbosity) returns (Void) {}
+
+  // Requests service reloads config files loaded on startup (<servicename>.yml)
+  rpc ReloadServiceConfig (Void) returns (ReloadConfigResponse) {}
+
+  // Returns the  operational states of devices managed by this service.
+  rpc GetOperationalStates (Void) returns (GetOperationalStatesResponse) {}
+}
diff --git a/proto_files/orc8r/protos/service_status.proto b/proto_files/orc8r/protos/service_status.proto
new file mode 100644
index 0000000..129d889
--- /dev/null
+++ b/proto_files/orc8r/protos/service_status.proto
@@ -0,0 +1,48 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// --------------------------------------------------------------------------
+// Service exit status
+// --------------------------------------------------------------------------
+
+message ServiceExitStatus {
+  // ServiceResult enumeration as defined in service "result" by systemd
+  enum ServiceResult {
+    UNUSED = 0;
+    SUCCESS = 1;
+    PROTOCOL = 2;
+    TIMEOUT = 3;
+    EXIT_CODE = 4;
+    SIGNAL = 5;
+    CORE_DUMP = 6;
+    WATCHDOG = 7;
+    START_LIMIT_HIT = 8;
+    RESOURCES = 9;
+  }
+  ServiceResult latest_service_result = 1;
+
+  // ExitCode enumeration as defined in service "result" by systemd
+  enum ExitCode {
+    UNUSED_EXIT_CODE = 0;
+    EXITED = 1;
+    KILLED = 2;
+    DUMPED = 3;
+  }
+  ExitCode latest_exit_code = 2;
+
+  // Optional return code returned by the service during exit
+  uint32 latest_rc = 3;
+
+  // Clean exit, e.g. SIGNKILL
+  uint32 num_clean_exits = 4;
+  // Unclean exit e.g. CORE_DUMP or non zero exit code.
+  uint32 num_fail_exits = 5;
+}
\ No newline at end of file
diff --git a/proto_files/orc8r/protos/streamer.proto b/proto_files/orc8r/protos/streamer.proto
new file mode 100644
index 0000000..ac4795b
--- /dev/null
+++ b/proto_files/orc8r/protos/streamer.proto
@@ -0,0 +1,59 @@
+// SPDX-FileCopyrightText: 2020 The Magma Authors.
+// SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+syntax = "proto3";
+
+package magma.orc8r;
+
+import "google/protobuf/any.proto";
+
+option go_package = "magma/orc8r/lib/go/protos";
+
+// Streamer provides a pipeline for the cloud to push the updates to the
+// gateway as and when the update happens.
+//
+// The Streamer interface defines the semantics and consistency guarantees
+// between the cloud and the gateway while abstracting the details of how
+// it's implemented in the cloud and what the gateway does with the updates.
+//
+// - The gateways call the GetUpdates() streaming API with a StreamRequest
+//   indicating the stream name and the offset to continue streaming from.
+// - The cloud sends a stream of DataUpdateBatch containing a batch of updates.
+// - If resync is true, then the gateway can cleanup all its data and add
+//   all the keys (the batch is guaranteed to contain only unique keys).
+// - If resync is false, then the gateway can update the keys, or add new
+//   ones if the key is not already present.
+// - Key deletions are not yet supported (#15109350)
+service Streamer {
+  // GetUpdates streams config updates from the cloud.
+  // The RPC call would be kept open to push new updates as they happen.
+  rpc GetUpdates (StreamRequest) returns (stream DataUpdateBatch) {}
+}
+
+message StreamRequest {
+  string gatewayId = 1;
+  // stream_name to attach to.
+  // E.g., subscriberdb, config, etc.
+  string stream_name = 2;
+  // extra_args contain any extra data to send up with the stream request.
+  // This value will be different per stream provider.
+  google.protobuf.Any extra_args = 3;
+}
+
+message DataUpdateBatch {
+  // updates to config values
+  repeated DataUpdate updates = 1;
+  // resync is true iff the updates would be a snapshot of all the contents
+  // in the cloud.
+  bool resync = 2;
+}
+
+message DataUpdate {
+  // key is the unique key for each item
+  string key = 1;
+  // value can be file contents, protobuf serialized message, etc.
+  // For key deletions, the value field would be absent.
+  bytes value = 2;
+}