syntax = "proto2";
package protocol;

import "stats_messages.proto";
import "header.proto";
import "time_common.proto";
import "config_messages.proto";
import "controller_commands.proto";
import "config_common.proto";

message flexran_message {
       optional flexran_direction msg_dir = 100;
	oneof msg {
              flex_hello hello_msg = 1;
              flex_echo_request echo_request_msg = 2;
	      flex_echo_reply echo_reply_msg = 3;
	      flex_stats_request stats_request_msg = 4;
	      flex_stats_reply stats_reply_msg = 5;
	      flex_sf_trigger sf_trigger_msg = 6;
	      flex_ul_sr_info ul_sr_info_msg = 7;
	      flex_enb_config_request enb_config_request_msg = 8;
	      flex_enb_config_reply enb_config_reply_msg = 9;
	      flex_ue_config_request ue_config_request_msg = 10;
	      flex_ue_config_reply ue_config_reply_msg = 11;
	      flex_lc_config_request lc_config_request_msg = 12;
	      flex_lc_config_reply lc_config_reply_msg = 13;
	      flex_dl_mac_config dl_mac_config_msg = 14;
	      flex_ue_state_change ue_state_change_msg = 15;
	      flex_control_delegation control_delegation_msg = 16;
	      flex_agent_reconfiguration agent_reconfiguration_msg = 17;
	      flex_rrc_triggering rrc_triggering = 18;
	      flex_ul_mac_config ul_mac_config_msg = 19;
              flex_disconnect disconnect_msg = 20;
              flex_ho_command ho_command_msg = 21;
	}
}

enum flexran_direction {
     //option allow_alias = true;
     NOT_SET = 0;
     INITIATING_MESSAGE = 1;
     SUCCESSFUL_OUTCOME=2;
     UNSUCCESSFUL_OUTCOME=3;	
}
	
enum flexran_err {
        //option allow_alias = true;
	// message errors
	NO_ERR = 0;	
	MSG_DEQUEUING = -1;
	MSG_ENQUEUING = -2;
	MSG_DECODING = -3;
	MSG_ENCODING = -4;
	MSG_BUILD = -5;
	MSG_NOT_SUPPORTED = -6; 
	MSG_NOT_HANDLED = -7;
	MSG_NOT_VALIDATED = -8;
	MSG_OUT_DATED = -9;

	
	// other erros
	UNEXPECTED = -100;	
}	

//
// Maintenance and discovery messages
//
enum flex_bs_capability {
    LOPHY = 0;
    HIPHY = 1;
    LOMAC = 2;
    HIMAC = 3;
    RLC   = 4;
    PDCP  = 5;
    SDAP  = 6;
    RRC   = 7;
    S1AP  = 8;
}

enum flex_bs_split {
  F1    = 0;
  nFAPI = 1;
  IF4   = 2;
  IF4p5 = 3;
  IF5   = 4;
}

message flex_hello {
    optional flex_header header = 1;
    optional uint64 bs_id = 2;        // Unique id to distinguish the eNB
    repeated flex_bs_capability capabilities = 3;
    repeated flex_bs_split splits = 4;
}

message flex_echo_request {
	optional flex_header header = 1;
	extensions 100 to 199;
}


message flex_echo_reply {
	optional flex_header header = 1;
	extensions 100 to 199;
}


//
// Statistics request and reply message
//

message flex_stats_request {
	optional flex_header header = 1;
	optional flex_stats_type type = 2;
	oneof body {
	      flex_complete_stats_request complete_stats_request = 3;
	      flex_cell_stats_request cell_stats_request = 4;
	      flex_ue_stats_request ue_stats_request = 5;
	}
}

message flex_stats_reply {
	optional flex_header header = 1;
	repeated flex_ue_stats_report ue_report = 2;
	repeated flex_cell_stats_report cell_report = 3;
}

//
// Time indication messages
//

message flex_sf_trigger {
	optional flex_header header = 1;
	optional uint32 sfn_sf = 2;
	repeated flex_dl_info dl_info = 3;
	repeated flex_ul_info ul_info = 4;	
}

//
// Asynchronous messages
//

message flex_ul_sr_info {
	optional flex_header header = 1;
	optional uint32 sfn_sf = 2;
	repeated uint32 rnti = 3;
}

//
// eNB configuration messages
//
message flex_enb_config_request {
	optional flex_header header = 1;
}

message flex_enb_config_reply {
	optional flex_header header = 1;
	repeated flex_cell_config cell_config = 3;
        optional uint32 device_spec = 4;
        optional flex_s1ap_config s1ap = 5;
}

message flex_ue_config_request {
	optional flex_header header = 1;
}

message flex_ue_config_reply {
	optional flex_header header = 1;
	repeated flex_ue_config ue_config = 2;
}

message flex_lc_config_request {
	optional flex_header header = 1;
}

message flex_lc_config_reply {
	optional flex_header header = 1;
	repeated flex_lc_ue_config lc_ue_config = 2;
}

//
// Controller command messages
//

message flex_dl_mac_config {
	optional flex_header header = 1;
	optional uint32 sfn_sf = 2;
	repeated flex_dl_data dl_ue_data = 3;
	repeated flex_dl_rar dl_rar = 4;
	repeated flex_dl_broadcast dl_broadcast = 5;
	repeated flex_pdcch_ofdm_sym_count ofdm_sym = 6; // OFDM symbol count for each CC
}

message flex_ul_mac_config {
	optional flex_header header = 1;
 	optional uint32 sfn_sf = 2;
	repeated flex_ul_data ul_ue_data = 3;
}

message flex_rrc_triggering {

	optional flex_header header = 1;
	optional string rrc_trigger = 2;
        optional flex_measurement_info meas_info = 3;
}

message flex_ho_command {
  optional flex_header header = 1;
  optional uint32 rnti = 2;
  optional uint32 target_phy_cell_id = 3;
}

//
// UE state change message
//

message flex_ue_state_change {
	optional flex_header header = 1;
	optional uint32 type = 2;		// One of the FLUESC_* values
	optional flex_ue_config config = 3;	// Body of the message (based on type)
}

//
// Control delegation message
//

message flex_control_delegation {
	optional flex_header header = 1;
	optional uint32 delegation_type = 2;	// Bitmap of FLCDT_* flags
	optional bytes payload = 3;	  	// Byte array of shared lib containing the delegated functions
	optional string name = 4;		// The delegated functions names ordered based on bitmap flags
}

//
// Agent reconfiguration message
//

message flex_agent_reconfiguration {
	optional flex_header header = 1;
	optional string policy = 2;		// The policy changes using YAML syntax in string format    
}

// Extensions of the echo request and reply
// messages for carrying a latency value in ms
message flex_echo_request_latency {
	extend flex_echo_request {
	       optional uint32 latency = 100;
	}
}

message flex_echo_reply_latency {
	extend flex_echo_reply {
	       optional uint32 latency = 100;
	}
}

message flex_disconnect {
        optional flex_header header = 1;
}
