aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2015-09-11 17:03:16 +0200
committerHarald Welte <laforge@gnumonks.org>2015-09-11 17:03:16 +0200
commit3af1db87edfa3c91efa9911d2f786f4b931750d6 (patch)
tree60305c189e679587ea5dcbdd1696f8c8f01ba4dd
parent10dfc5a97daae6bbd16a10d5d2fd39e2ef77fb34 (diff)
hnbap: Print error messages in error cases
-rw-r--r--src/hnbap_common.c80
-rw-r--r--src/hnbap_common.h1
-rw-r--r--src/hnbgw_hnbap.c23
3 files changed, 104 insertions, 0 deletions
diff --git a/src/hnbap_common.c b/src/hnbap_common.c
index f3aa1a3..0982a02 100644
--- a/src/hnbap_common.c
+++ b/src/hnbap_common.c
@@ -6,6 +6,86 @@
#include "hnbap_common.h"
#include "hnbgw.h"
+static const struct value_string hnbap_cause_radio_vals[] = {
+ { CauseRadioNetwork_overload, "overload" },
+ { CauseRadioNetwork_unauthorised_Location, "unauthorized location" },
+ { CauseRadioNetwork_unauthorised_HNB, "unauthorized HNB" },
+ { CauseRadioNetwork_hNB_parameter_mismatch, "HNB parameter mismatch" },
+ { CauseRadioNetwork_invalid_UE_identity, "invalid UE identity" },
+ { CauseRadioNetwork_uE_not_allowed_on_this_HNB,
+ "UE not allowed on this HNB" },
+ { CauseRadioNetwork_uE_unauthorised, "unauthorised UE" },
+ { CauseRadioNetwork_connection_with_UE_lost, "connection with UE lost" },
+ { CauseRadioNetwork_ue_RRC_release, "UE RRC release" },
+ { CauseRadioNetwork_hNB_not_registered, "HNB not registered" },
+ { CauseRadioNetwork_unspecified, "unspecified" },
+ { CauseRadioNetwork_normal, "normal" },
+ { CauseRadioNetwork_uE_relocated, "UE relocated" },
+ { CauseRadioNetwork_ue_registered_in_another_HNB,
+ "UE registered in another HNB" },
+ { 0, NULL }
+};
+
+static const struct value_string hnbap_cause_transp_vals[] = {
+ { CauseTransport_transport_resource_unavailable,
+ "transport resource unavailable" },
+ { CauseTransport_unspecified, "unspecified" },
+ { 0, NULL }
+};
+
+static const struct value_string hnbap_cause_prot_vals[] = {
+ { CauseProtocol_transfer_syntax_error, "syntax error" },
+ { CauseProtocol_abstract_syntax_error_reject,
+ "abstract syntax error; reject" },
+ { CauseProtocol_abstract_syntax_error_ignore_and_notify,
+ "abstract syntax error; ignore and notify" },
+ { CauseProtocol_message_not_compatible_with_receiver_state,
+ "message not compatible with receiver state" },
+ { CauseProtocol_semantic_error, "semantic error" },
+ { CauseProtocol_unspecified, "unspecified" },
+ { CauseProtocol_abstract_syntax_error_falsely_constructed_message,
+ "falsely constructed message" },
+ { 0, NULL }
+};
+
+static const struct value_string hnbap_cause_misc_vals[] = {
+ { CauseMisc_processing_overload, "processing overload" },
+ { CauseMisc_hardware_failure, "hardware failure" },
+ { CauseMisc_o_and_m_intervention, "OAM intervention" },
+ { CauseMisc_unspecified, "unspecified" },
+ { 0, NULL }
+};
+
+char *hnbap_cause_str(Cause_t *cause)
+{
+ static char buf[32];
+
+ switch (cause->present) {
+ case Cause_PR_radioNetwork:
+ snprintf(buf, sizeof(buf), "radio(%s)",
+ get_value_string(hnbap_cause_radio_vals,
+ cause->choice.radioNetwork));
+ break;
+ case Cause_PR_transport:
+ snprintf(buf, sizeof(buf), "transport(%s)",
+ get_value_string(hnbap_cause_transp_vals,
+ cause->choice.transport));
+ break;
+ case Cause_PR_protocol:
+ snprintf(buf, sizeof(buf), "protocol(%s)",
+ get_value_string(hnbap_cause_prot_vals,
+ cause->choice.protocol));
+ break;
+ case Cause_PR_misc:
+ snprintf(buf, sizeof(buf), "misc(%s)",
+ get_value_string(hnbap_cause_misc_vals,
+ cause->choice.misc));
+ break;
+ }
+ return buf;
+}
+
+
int asn_debug = 0;
int asn1_xer_print = 0;
diff --git a/src/hnbap_common.h b/src/hnbap_common.h
index c58ce18..17760fe 100644
--- a/src/hnbap_common.h
+++ b/src/hnbap_common.h
@@ -144,3 +144,4 @@ struct msgb *hnbap_generate_successful_outcome(
IE_t *hnbap_new_ie(ProtocolIE_ID_t id, Criticality_t criticality,
asn_TYPE_descriptor_t *type, void *sptr);
+char *hnbap_cause_str(Cause_t *cause);
diff --git a/src/hnbgw_hnbap.c b/src/hnbgw_hnbap.c
index 7810573..8b1527e 100644
--- a/src/hnbgw_hnbap.c
+++ b/src/hnbgw_hnbap.c
@@ -192,6 +192,21 @@ static int hnbgw_rx_ue_register_req(struct hnb_context *ctx, ANY_t *in)
return hnbgw_tx_ue_register_acc(ue);
}
+static int hnbgw_rx_err_ind(struct hnb_context *hnb, ANY_t *in)
+{
+ ErrorIndicationIEs_t ies;
+ int rc;
+
+ rc = hnbap_decode_hnbregisterrequesties(&ies, in);
+ if (rc < 0)
+ return rc;
+
+ LOGP(DMAIN, LOGL_NOTICE, "HNBAP ERROR.ind, cause: %s\n",
+ hnbap_cause_str(&ies.cause));
+
+ return 0;
+}
+
static int hnbgw_rx_initiating_msg(struct hnb_context *hnb, InitiatingMessage_t *imsg)
{
int rc;
@@ -208,13 +223,19 @@ static int hnbgw_rx_initiating_msg(struct hnb_context *hnb, InitiatingMessage_t
case ProcedureCode_id_UEDe_Register: /* 8.5 */
break;
case ProcedureCode_id_ErrorIndication: /* 8.6 */
+ rc = hnbgw_rx_err_ind(hnb, &imsg->value);
+ break;
case ProcedureCode_id_TNLUpdate: /* 8.9 */
case ProcedureCode_id_HNBConfigTransfer: /* 8.10 */
case ProcedureCode_id_RelocationComplete: /* 8.11 */
case ProcedureCode_id_U_RNTIQuery: /* 8.12 */
case ProcedureCode_id_privateMessage:
+ LOGP(DMAIN, LOGL_NOTICE, "Unimplemented HNBAP Procedure %u\n",
+ imsg->procedureCode);
break;
default:
+ LOGP(DMAIN, LOGL_NOTICE, "Unknown HNBAP Procedure %u\n",
+ imsg->procedureCode);
break;
}
}
@@ -247,6 +268,8 @@ static int _hnbgw_hnbap_rx(struct hnb_context *hnb, HNBAP_PDU_t *pdu)
rc = hnbgw_rx_unsuccessful_outcome_msg(hnb, &pdu->choice.unsuccessfulOutcome);
break;
default:
+ LOGP(DMAIN, LOGL_NOTICE, "Unknown HNBAP Presence %u\n",
+ pdu->present);
return -1;
}
}