9140f3d4f6f98c5e88128bd29ab15cf4195ef03c
[ric-plt/e2mgr.git] / E2Manager / e2pdus / x2_reset_known_causes.go
1 /*******************************************************************************
2  *
3  *   Copyright (c) 2019 AT&T Intellectual Property.
4  *
5  *   Licensed under the Apache License, Version 2.0 (the "License");
6  *   you may not use this file except in compliance with the License.
7  *   You may obtain a copy of the License at
8  *
9  *       http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *   Unless required by applicable law or agreed to in writing, software
12  *   distributed under the License is distributed on an "AS IS" BASIS,
13  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *   See the License for the specific language governing permissions and
15  *   limitations under the License.
16  *
17  *******************************************************************************/
18 package e2pdus
19
20 // #cgo CFLAGS: -I../asn1codec/inc/  -I../asn1codec/e2ap_engine/
21 // #cgo LDFLAGS: -L ../asn1codec/lib/ -L../asn1codec/e2ap_engine/ -le2ap_codec -lasncodec
22 // #include <x2reset_request_wrapper.h>
23 import "C"
24 import (
25         "fmt"
26         "strings"
27         "unsafe"
28 )
29
30 //TODO: replace the constant in setup_request_handler.go
31 const (
32         MaxAsn1PackedBufferSize       = 4096
33         MaxAsn1CodecMessageBufferSize = 4096
34         MaxAsn1CodecAllocationBufferSize = 4096 // TODO: remove later
35 )
36
37 // Used as default by the x2_reset_request
38 const (
39         OmInterventionCause = "misc:om-intervention"
40 )
41
42 type cause struct {
43         causeGroup uint32
44         cause      int
45 }
46
47 var knownCauses = map[string]cause{
48         "misc:control-processing-overload":                {causeGroup: C.Cause_PR_misc, cause: C.CauseMisc_control_processing_overload},
49         "misc:hardware-failure":                           {causeGroup: C.Cause_PR_misc, cause: C.CauseMisc_hardware_failure},
50         OmInterventionCause:                               {causeGroup: C.Cause_PR_misc, cause: C.CauseMisc_om_intervention},
51         "misc:not-enough-user-plane-processing-resources": {causeGroup: C.Cause_PR_misc, cause: C.CauseMisc_not_enough_user_plane_processing_resources},
52         "misc:unspecified":                                {causeGroup: C.Cause_PR_misc, cause: C.CauseMisc_unspecified},
53
54         "protocol:transfer-syntax-error":                             {causeGroup: C.Cause_PR_protocol, cause: C.CauseProtocol_transfer_syntax_error},
55         "protocol:abstract-syntax-error-reject":                      {causeGroup: C.Cause_PR_protocol, cause: C.CauseProtocol_abstract_syntax_error_reject},
56         "protocol:abstract-syntax-error-ignore-and-notify":           {causeGroup: C.Cause_PR_protocol, cause: C.CauseProtocol_abstract_syntax_error_ignore_and_notify},
57         "protocol:message-not-compatible-with-receiver-state":        {causeGroup: C.Cause_PR_protocol, cause: C.CauseProtocol_message_not_compatible_with_receiver_state},
58         "protocol:semantic-error":                                    {causeGroup: C.Cause_PR_protocol, cause: C.CauseProtocol_semantic_error},
59         "protocol:unspecified":                                       {causeGroup: C.Cause_PR_protocol, cause: C.CauseProtocol_unspecified},
60         "protocol:abstract-syntax-error-falsely-constructed-message": {causeGroup: C.Cause_PR_protocol, cause: C.CauseProtocol_abstract_syntax_error_falsely_constructed_message},
61
62         "transport:transport-resource-unavailable": {causeGroup: C.Cause_PR_transport, cause: C.CauseTransport_transport_resource_unavailable},
63         "transport:unspecified":                    {causeGroup: C.Cause_PR_transport, cause: C.CauseTransport_unspecified},
64
65         "radioNetwork:handover-desirable-for-radio-reasons":                            {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_handover_desirable_for_radio_reasons},
66         "radioNetwork:time-critical-handover":                                          {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_time_critical_handover},
67         "radioNetwork:resource-optimisation-handover":                                  {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_resource_optimisation_handover},
68         "radioNetwork:reduce-load-in-serving-cell":                                     {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_reduce_load_in_serving_cell},
69         "radioNetwork:partial-handover":                                                {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_partial_handover},
70         "radioNetwork:unknown-new-enb-ue-x2ap-id":                                      {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_unknown_new_eNB_UE_X2AP_ID},
71         "radioNetwork:unknown-old-enb-ue-x2ap-id":                                      {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_unknown_old_eNB_UE_X2AP_ID},
72         "radioNetwork:unknown-pair-of-ue-x2ap-id":                                      {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_unknown_pair_of_UE_X2AP_ID},
73         "radioNetwork:ho-target-not-allowed":                                           {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_ho_target_not_allowed},
74         "radioNetwork:tx2relocoverall-expiry":                                          {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_tx2relocoverall_expiry},
75         "radioNetwork:trelocprep-expiry":                                               {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_trelocprep_expiry},
76         "radioNetwork:cell-not-available":                                              {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_cell_not_available},
77         "radioNetwork:no-radio-resources-available-in-target-cell":                     {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_no_radio_resources_available_in_target_cell},
78         "radioNetwork:invalid-mme-groupid":                                             {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_invalid_MME_GroupID},
79         "radioNetwork:unknown-mme-code":                                                {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_unknown_MME_Code},
80         "radioNetwork:encryption-and-or-integrity-protection-algorithms-not-supported": {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported},
81         "radioNetwork:reportcharacteristicsempty":                                      {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_reportCharacteristicsEmpty},
82         "radioNetwork:noreportperiodicity":                                             {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_noReportPeriodicity},
83         "radioNetwork:existingMeasurementID":                                           {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_existingMeasurementID},
84         "radioNetwork:unknown-enb-measurement-id":                                      {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_unknown_eNB_Measurement_ID},
85         "radioNetwork:measurement-temporarily-not-available":                           {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_measurement_temporarily_not_available},
86         "radioNetwork:unspecified":                                                     {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_unspecified},
87         "radioNetwork:load-balancing":                                                  {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_load_balancing},
88         "radioNetwork:handover-optimisation":                                           {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_handover_optimisation},
89         "radioNetwork:value-out-of-allowed-range":                                      {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_value_out_of_allowed_range},
90         "radioNetwork:multiple-E-RAB-ID-instances":                                     {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_multiple_E_RAB_ID_instances},
91         "radioNetwork:switch-off-ongoing":                                              {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_switch_off_ongoing},
92         "radioNetwork:not-supported-qci-value":                                         {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_not_supported_QCI_value},
93         "radioNetwork:measurement-not-supported-for-the-object":                        {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_measurement_not_supported_for_the_object},
94         "radioNetwork:tdcoverall-expiry":                                               {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_tDCoverall_expiry},
95         "radioNetwork:tdcprep-expiry":                                                  {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_tDCprep_expiry},
96         "radioNetwork:action-desirable-for-radio-reasons":                              {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_action_desirable_for_radio_reasons},
97         "radioNetwork:reduce-load":                                                     {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_reduce_load},
98         "radioNetwork:resource-optimisation":                                           {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_resource_optimisation},
99         "radioNetwork:time-critical-action":                                            {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_time_critical_action},
100         "radioNetwork:target-not-allowed":                                              {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_target_not_allowed},
101         "radioNetwork:no-radio-resources-available":                                    {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_no_radio_resources_available},
102         "radioNetwork:invalid-qos-combination":                                         {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_invalid_QoS_combination},
103         "radioNetwork:encryption-algorithms-not-aupported":                             {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_encryption_algorithms_not_aupported},
104         "radioNetwork:procedure-cancelled":                                             {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_procedure_cancelled},
105         "radioNetwork:rrm-purpose":                                                     {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_rRM_purpose},
106         "radioNetwork:improve-user-bit-rate":                                           {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_improve_user_bit_rate},
107         "radioNetwork:user-inactivity":                                                 {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_user_inactivity},
108         "radioNetwork:radio-connection-with-ue-lost":                                   {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_radio_connection_with_UE_lost},
109         "radioNetwork:failure-in-the-radio-interface-procedure":                        {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_failure_in_the_radio_interface_procedure},
110         "radioNetwork:bearer-option-not-supported":                                     {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_bearer_option_not_supported},
111         "radioNetwork:mcg-mobility":                                                    {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_mCG_Mobility},
112         "radioNetwork:scg-mobility":                                                    {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_sCG_Mobility},
113         "radioNetwork:count-reaches-max-value":                                         {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_count_reaches_max_value},
114         "radioNetwork:unknown-old-en-gnb-ue-x2ap-id":                                   {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_unknown_old_en_gNB_UE_X2AP_ID},
115         "radioNetwork:pdcp-Overload":                                                   {causeGroup: C.Cause_PR_radioNetwork, cause: C.CauseRadioNetwork_pDCP_Overload},
116 }
117
118 var knownCausesToX2ResetPDUs = map[string][]byte{}
119
120 func prepareX2ResetPDUs(maxAsn1PackedBufferSize int, maxAsn1CodecMessageBufferSize int) error {
121         packedBuffer := make([]C.uchar, maxAsn1PackedBufferSize)
122         errorBuffer := make([]C.char, maxAsn1CodecMessageBufferSize)
123
124         for k, cause := range knownCauses {
125                 var payloadSize = C.ulong(maxAsn1PackedBufferSize)
126                 if status := C.build_pack_x2reset_request(cause.causeGroup, C.int(cause.cause), &payloadSize, &packedBuffer[0], C.ulong(maxAsn1CodecMessageBufferSize), &errorBuffer[0]); !status {
127                         return fmt.Errorf("#x2_reset_known_causes.prepareX2ResetPDUs - failed to build and pack the reset message %s ", C.GoString(&errorBuffer[0]))
128                 }
129                 knownCausesToX2ResetPDUs[strings.ToLower(k)] = C.GoBytes(unsafe.Pointer(&packedBuffer[0]), C.int(payloadSize))
130         }
131         return nil
132 }
133
134 // KnownCausesToX2ResetPDU returns a packed x2 reset pdu with the specified cause (case insensitive match).
135 func KnownCausesToX2ResetPDU(cause string) ([]byte, bool) {
136         v, ok := knownCausesToX2ResetPDUs[strings.ToLower(cause)]
137         return v, ok
138 }
139
140 func init() {
141         if err := prepareX2ResetPDUs(MaxAsn1PackedBufferSize, MaxAsn1CodecMessageBufferSize); err != nil {
142                 panic(err)
143         }
144 }