diff --git a/src/hnbap_common.c b/src/hnbap_common.c index d13cb507..f3aa1a3f 100644 --- a/src/hnbap_common.c +++ b/src/hnbap_common.c @@ -77,7 +77,7 @@ struct msgb *hnbap_generate_successful_outcome( return NULL; } - msgb_put(msg, rval.encoded); + msgb_put(msg, rval.encoded/8); return msg; } diff --git a/src/hnbgw_ranap.c b/src/hnbgw_ranap.c index 44a920b9..bad99c8c 100644 --- a/src/hnbgw_ranap.c +++ b/src/hnbgw_ranap.c @@ -8,6 +8,7 @@ #include "asn1helpers.h" #include "hnbgw.h" +#include "hnbgw_rua.h" //#include "ranap_common.h" #include "ranap/RANAP_RANAP-PDU.h" @@ -177,16 +178,37 @@ int ranap_encode_resetacknowledgeies( * END auto-generated copy+pasted ***********************************************************************/ -#if 0 +static int ranap_tx_reset_ack(struct hnb_context *hnb, + RANAP_CN_DomainIndicator_t domain) { - RANAP_ResetAcknowledgeIEs_s ies; + RANAP_ResetAcknowledge_t out; + RANAP_ResetAcknowledgeIEs_t ies; + struct msgb *msg; + int rc; memset(&ies, 0, sizeof(ies)); - ies.cN_DomainIndicator = RANAP_CN_DomainIndicator_cs_domain; + ies.cN_DomainIndicator = domain; - rc = ranap_encoderesetacknowledgeise(&ies, FIXME); + memset(&out, 0, sizeof(out)); + rc = ranap_encode_resetacknowledgeies(&out, &ies); + if (rc < 0) { + LOGP(DMAIN, LOGL_ERROR, "error encoding reset ack IEs: %d\n", rc); + return rc; + } + + msg = ranap_generate_successful_outcome(RANAP_ProcedureCode_id_Reset, + RANAP_Criticality_reject, + &asn_DEF_RANAP_ResetAcknowledge, + &out); + if (!msg) + return -1; + + msg->dst = hnb; + + rc = rua_tx_udt(msg); + + return rc; } -#endif static int ranap_rx_init_reset(struct hnb_context *hnb, ANY_t *in) { @@ -199,6 +221,8 @@ static int ranap_rx_init_reset(struct hnb_context *hnb, ANY_t *in) DEBUGP(DMAIN, "RESET.req\n"); + ranap_tx_reset_ack(hnb, ies.cN_DomainIndicator); + return 0; } diff --git a/src/hnbgw_rua.c b/src/hnbgw_rua.c index 3af564ba..69d5e691 100644 --- a/src/hnbgw_rua.c +++ b/src/hnbgw_rua.c @@ -21,73 +21,35 @@ static int hnbgw_rua_tx(struct hnb_context *ctx, struct msgb *msg) return osmo_wqueue_enqueue(&ctx->wqueue, msg); } -static const struct value_string rua_cause_radio_vals[] = { - { RUA_CauseRadioNetwork_normal, "normal" }, - { RUA_CauseRadioNetwork_connect_failed, "connect failed" }, - { RUA_CauseRadioNetwork_network_release, "network release" }, - { RUA_CauseRadioNetwork_unspecified, "unspecified" }, - { 0, NULL } -}; - -static const struct value_string rua_cause_transp_vals[] = { - { RUA_CauseTransport_transport_resource_unavailable, "resource unavailable" }, - { RUA_CauseTransport_unspecified, "unspecified" }, - { 0, NULL } -}; - -static const struct value_string rua_cause_prot_vals[] = { - { RUA_CauseProtocol_transfer_syntax_error, "syntax error" }, - { RUA_CauseProtocol_abstract_syntax_error_reject, - "abstract syntax error; reject" }, - { RUA_CauseProtocol_abstract_syntax_error_ignore_and_notify, - "abstract syntax error; ignore and notify" }, - { RUA_CauseProtocol_message_not_compatible_with_receiver_state, - "message not compatible with receiver state" }, - { RUA_CauseProtocol_semantic_error, "semantic error" }, - { RUA_CauseProtocol_unspecified, "unspecified" }, - { RUA_CauseProtocol_abstract_syntax_error_falsely_constructed_message, - "falsely constructed message" }, - { 0, NULL } -}; - -static const struct value_string rua_cause_misc_vals[] = { - { RUA_CauseMisc_processing_overload, "processing overload" }, - { RUA_CauseMisc_hardware_failure, "hardware failure" }, - { RUA_CauseMisc_o_and_m_intervention, "OAM intervention" }, - { RUA_CauseMisc_unspecified, "unspecified" }, - { 0, NULL } -}; - -static char *rua_cause_str(RUA_Cause_t *cause) +int rua_tx_udt(struct msgb *inmsg) { - static char buf[32]; + RUA_ConnectionlessTransfer_t out; + RUA_ConnectionlessTransferIEs_t ies; + struct msgb *msg; + int rc; - switch (cause->present) { - case RUA_Cause_PR_radioNetwork: - snprintf(buf, sizeof(buf), "radio(%s)", - get_value_string(rua_cause_radio_vals, - cause->choice.radioNetwork)); - break; - case RUA_Cause_PR_transport: - snprintf(buf, sizeof(buf), "transport(%s)", - get_value_string(rua_cause_transp_vals, - cause->choice.transport)); - break; - case RUA_Cause_PR_protocol: - snprintf(buf, sizeof(buf), "protocol(%s)", - get_value_string(rua_cause_prot_vals, - cause->choice.protocol)); - break; - case RUA_Cause_PR_misc: - snprintf(buf, sizeof(buf), "misc(%s)", - get_value_string(rua_cause_misc_vals, - cause->choice.misc)); - break; - } - return buf; + memset(&ies, 0, sizeof(ies)); + ies.ranaP_Message.buf = inmsg->data; + ies.ranaP_Message.size = msgb_length(inmsg); + + /* FIXME: msgb_free(msg)? ownership not yet clear */ + + memset(&out, 0, sizeof(out)); + rc = rua_encode_connectionlesstransferies(&out, &ies); + if (rc < 0) + return rc; + + msg = rua_generate_initiating_message(RUA_ProcedureCode_id_ConnectionlessTransfer, + RUA_Criticality_reject, + &asn_DEF_RUA_ConnectionlessTransfer, + &out); + msg->dst = inmsg->dst; + + DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg)); + + return hnbgw_rua_tx(msg->dst, msg); } - static int rua_rx_init_connect(struct msgb *msg, ANY_t *in) { RUA_ConnectIEs_t ies; diff --git a/src/hnbgw_rua.h b/src/hnbgw_rua.h index 97c35f05..69b23822 100644 --- a/src/hnbgw_rua.h +++ b/src/hnbgw_rua.h @@ -4,3 +4,5 @@ int hnbgw_rua_rx(struct hnb_context *hnb, struct msgb *msg); int hnbgw_rua_init(void); + +int rua_tx_udt(struct msgb *inmsg); diff --git a/src/ranap_common.c b/src/ranap_common.c index 7be7c958..dc86a7ac 100644 --- a/src/ranap_common.c +++ b/src/ranap_common.c @@ -77,7 +77,7 @@ struct msgb *ranap_generate_successful_outcome( return NULL; } - msgb_put(msg, rval.encoded); + msgb_put(msg, rval.encoded/8); return msg; } diff --git a/src/rua_common.c b/src/rua_common.c index 637cd72a..8f4da129 100644 --- a/src/rua_common.c +++ b/src/rua_common.c @@ -7,41 +7,106 @@ extern int asn1_xer_print; +static const struct value_string rua_cause_radio_vals[] = { + { RUA_CauseRadioNetwork_normal, "normal" }, + { RUA_CauseRadioNetwork_connect_failed, "connect failed" }, + { RUA_CauseRadioNetwork_network_release, "network release" }, + { RUA_CauseRadioNetwork_unspecified, "unspecified" }, + { 0, NULL } +}; + +static const struct value_string rua_cause_transp_vals[] = { + { RUA_CauseTransport_transport_resource_unavailable, "resource unavailable" }, + { RUA_CauseTransport_unspecified, "unspecified" }, + { 0, NULL } +}; + +static const struct value_string rua_cause_prot_vals[] = { + { RUA_CauseProtocol_transfer_syntax_error, "syntax error" }, + { RUA_CauseProtocol_abstract_syntax_error_reject, + "abstract syntax error; reject" }, + { RUA_CauseProtocol_abstract_syntax_error_ignore_and_notify, + "abstract syntax error; ignore and notify" }, + { RUA_CauseProtocol_message_not_compatible_with_receiver_state, + "message not compatible with receiver state" }, + { RUA_CauseProtocol_semantic_error, "semantic error" }, + { RUA_CauseProtocol_unspecified, "unspecified" }, + { RUA_CauseProtocol_abstract_syntax_error_falsely_constructed_message, + "falsely constructed message" }, + { 0, NULL } +}; + +static const struct value_string rua_cause_misc_vals[] = { + { RUA_CauseMisc_processing_overload, "processing overload" }, + { RUA_CauseMisc_hardware_failure, "hardware failure" }, + { RUA_CauseMisc_o_and_m_intervention, "OAM intervention" }, + { RUA_CauseMisc_unspecified, "unspecified" }, + { 0, NULL } +}; + +char *rua_cause_str(RUA_Cause_t *cause) +{ + static char buf[32]; + + switch (cause->present) { + case RUA_Cause_PR_radioNetwork: + snprintf(buf, sizeof(buf), "radio(%s)", + get_value_string(rua_cause_radio_vals, + cause->choice.radioNetwork)); + break; + case RUA_Cause_PR_transport: + snprintf(buf, sizeof(buf), "transport(%s)", + get_value_string(rua_cause_transp_vals, + cause->choice.transport)); + break; + case RUA_Cause_PR_protocol: + snprintf(buf, sizeof(buf), "protocol(%s)", + get_value_string(rua_cause_prot_vals, + cause->choice.protocol)); + break; + case RUA_Cause_PR_misc: + snprintf(buf, sizeof(buf), "misc(%s)", + get_value_string(rua_cause_misc_vals, + cause->choice.misc)); + break; + } + return buf; +} + + static struct msgb *rua_msgb_alloc(void) { return msgb_alloc(1024, "RUA Tx"); } -#if 0 -ssize_t rua_generate_initiating_message(uint8_t ** buffer, - uint32_t * length, +struct msgb *rua_generate_initiating_message( e_RUA_ProcedureCode procedureCode, RUA_Criticality_t criticality, asn_TYPE_descriptor_t * td, void *sptr) { RUA_RUA_PDU_t pdu; + struct msgb *msg = rua_msgb_alloc(); + asn_enc_rval_t rval; ssize_t encoded; memset(&pdu, 0, sizeof(pdu)); - pdu.present = RUA_RUA_PDU_PR_initiatingMessage; pdu.choice.initiatingMessage.procedureCode = procedureCode; pdu.choice.initiatingMessage.criticality = criticality; ANY_fromType_aper(&pdu.choice.initiatingMessage.value, td, sptr); - if (asn1_xer_print) - xer_fprint(stdout, &asn_DEF_RUA_RUA_PDU, (void *)&pdu); - - if ((encoded = - aper_encode_to_new_buffer(&asn_DEF_RUA_RUA_PDU, 0, &pdu, - (void **)buffer)) < 0) { - return -1; + rval = aper_encode_to_buffer(&asn_DEF_RUA_RUA_PDU, &pdu, + msg->data, msgb_tailroom(msg)); + if (rval.encoded < 0) { + LOGP(DMAIN, LOGL_ERROR, "Error encoding type %s\n", rval.failed_type->name); + msgb_free(msg); + return NULL; } - *length = encoded; - return encoded; + msgb_put(msg, rval.encoded/8); + + return msg; } -#endif struct msgb *rua_generate_successful_outcome( e_RUA_ProcedureCode procedureCode, @@ -74,7 +139,7 @@ struct msgb *rua_generate_successful_outcome( return NULL; } - msgb_put(msg, rval.encoded); + msgb_put(msg, rval.encoded/8); return msg; } diff --git a/src/rua_common.h b/src/rua_common.h index cb5b2f44..0c9e7860 100644 --- a/src/rua_common.h +++ b/src/rua_common.h @@ -48,6 +48,11 @@ extern int asn1_xer_print; +struct msgb *rua_generate_initiating_message( + e_RUA_ProcedureCode procedureCode, + RUA_Criticality_t criticality, + asn_TYPE_descriptor_t * td, void *sptr); + struct msgb *rua_generate_successful_outcome( e_RUA_ProcedureCode procedureCode, RUA_Criticality_t criticality, @@ -57,3 +62,4 @@ struct msgb *rua_generate_successful_outcome( RUA_IE_t *rua_new_ie(RUA_ProtocolIE_ID_t id, RUA_Criticality_t criticality, asn_TYPE_descriptor_t *type, void *sptr); +char *rua_cause_str(RUA_Cause_t *cause);