aboutsummaryrefslogtreecommitdiffstats
path: root/src/hnbgw_hnbap.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2015-08-29 20:33:16 +0200
committerHarald Welte <laforge@gnumonks.org>2015-08-29 20:33:16 +0200
commitba43de4bf671e2376616f244a8e8f32f9c2e8f1d (patch)
tree4c6e6c9aafcaa100dfbf9767c89b0173c94363a4 /src/hnbgw_hnbap.c
parent2e00202f58ceeef5cc6702c9b65a799f81b39ba3 (diff)
very early intial code snippets for handling HNBAP in a HNB-GW
Diffstat (limited to 'src/hnbgw_hnbap.c')
-rw-r--r--src/hnbgw_hnbap.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/hnbgw_hnbap.c b/src/hnbgw_hnbap.c
new file mode 100644
index 0000000..9b674ad
--- /dev/null
+++ b/src/hnbgw_hnbap.c
@@ -0,0 +1,138 @@
+#include <osmocom/core/msgb.h>
+
+#include "hnbgw.h"
+#include "hnbap_const.h"
+
+static int hnbgw_hnbap_tx(struct HNBAP_PDU *pdu)
+{
+ /* FIXME */
+}
+
+static int hnbgw_tx_hnb_register_acc()
+{
+ /* FIXME */
+ /* Single required response IE: RNC-ID */
+}
+
+static int hnbgw_tx_ue_register_acc()
+{
+ /* FIXME */
+ /* Single required response IE: RNC-ID */
+}
+
+struct ProtocolIE_Field_1 *find_ie(const struct ProtocolIE_Container_1 *cont, ProtocolIE_ID id)
+{
+ for (i = 0; i < cont->count; i++) {
+ if (cont->tab[i].id == id)
+ return &cont->tab[i];
+ }
+ return NULL;
+}
+
+static int hnbgw_rx_hnb_register_req(struct HNBRegisterRequest *req)
+{
+ HNB_Identity *identity =
+ FIND_IE(req->protocolIEs, HNBAP_IEI_HNB_Identity);
+ HNB_Location_Information *loc =
+ FIND_IE(req->protocolIEs, HNBAP_IEI_HNB_Location_Information);
+ PLMNidentity *plmn_id =
+ FIND_IE(req->protocolIEs, HNBAP_IEI_PLMNidentity);
+ CellIdentity *cell_id =
+ FIND_IE(req->protocolIEs, HNBAP_IEI_CellIdentity);
+ LAC *lac = FIND_IE(req->protocolIEs, HNBAP_IEI_LAC);
+ RAC *rac = FIND_IE(req->protocolIEs, HNBAP_IEI_RAC);
+ SAC *sac = FIND_IE(req->protocolIEs, HNBAP_IEI_SAC);
+ /* Optional: CSG-ID */
+
+ if(!identity || !loc || !plmn_id || !cell_id || !lac || !rac || !sac)
+ return -1;
+
+ /* FIXME: Send HNBRegisterAccept */
+}
+
+static int hnbgw_rx_ue_register_req(struct UERegisterRequest *req)
+{
+ UE_Identity *id =
+ FIND_IE(req->protocolIEs, HNBAP_IEI_UE_Identity);
+ Registration_Cause *reg_cause =
+ FIND_IE(req->protocolIEs, HNBAP_IEI_RegistrationCause);
+ UE_Capabilities *ue_cap =
+ FIND_IE(req->protocolIEs, HNBAP_IEI_UE_Capabilities);
+
+ if (!id || !reg_cause || !ue_cap)
+ return -1;
+
+ /* FIXME: Send UERegisterAccept */
+}
+
+static int hnbgw_rx_initiating_msg(struct InitiatingMessage *msg)
+{
+ int rc;
+
+ switch (msg->procedureCode) {
+ case HNBAP_PC_HNBRegister: /* 8.2 */
+ if (msg->value.type != asn1_type_HNBRegisterRequest)
+ return -1;
+ rc = hnbgw_rx_hnb_register_req();
+ break;
+ case HNBAP_PC_HNBDe_Register: /* 8.3 */
+ break;
+ case HNBAP_PC_UERegister: /* 8.4 */
+ if (msg->value.type != asn1_type_UERegisterRequest)
+ return -1;
+ rc = hnbgw_rx_ue_register_req();
+ break;
+ case HNBAP_PC_UEDe_Register: /* 8.5 */
+ break;
+ case HNBAP_PC_ErrorIndication: /* 8.6 */
+ case HNBAP_PC_TNLUpdate: /* 8.9 */
+ case HNBAP_PC_HNBConfigTransfer: /* 8.10 */
+ case HNBAP_PC_RelocationComplete: /* 8.11 */
+ case HNBAP_PC_U_RNTIQuery: /* 8.12 */
+ case HNBAP_PC_privateMessage:
+ break;
+ default:
+ break;
+ }
+}
+
+static int hnbgw_rx_successful_outcome_msg(struct SuccessfulOutcome *msg)
+{
+
+}
+
+static int hnbgw_rx_unsuccessful_outcome_msg(struct UnsuccessfulOutcome *msg)
+{
+
+}
+
+
+static int _hnbgw_hnbap_rx(struct HNBAP_PDU *pdu)
+{
+ /* it's a bit odd that we can't dispatch on procedure code, but
+ * that's not possible */
+ switch (pdu->choice) {
+ case HNBAP_PDU_initiatingMessage:
+ rc = hnbgw_rx_initiating_msg(&pdu->u.initiatingMessage);
+ break;
+ case HNBAP_PDU_successfulOutcome:
+ rc = hnbgw_rx_successful_outcome_msg(&pdu->u.successfulOutcome);
+ break;
+ case HNBAP_PDU_unsuccessfulOutcome:
+ rc = hnbgw_rx_unsuccessful_outcome_msg(&pdu->u.unsuccessfulOutcome);
+ break;
+ default:
+ return -1;
+ }
+}
+
+int hnbgw_hnbap_rx(struct msgb *msg)
+{
+ /* FIXME: decode and handle to _hnbgw_hnbap_rx() */
+}
+
+
+int hnbgw_hnbap_init(void)
+{
+
+}