aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/hnbap_const.h55
-rw-r--r--src/hnbgw.h29
-rw-r--r--src/hnbgw_hnbap.c138
3 files changed, 222 insertions, 0 deletions
diff --git a/src/hnbap_const.h b/src/hnbap_const.h
new file mode 100644
index 0000000..7d3dfa3
--- /dev/null
+++ b/src/hnbap_const.h
@@ -0,0 +1,55 @@
+#pragma once
+
+/* should be auto-generated by ffasn1c, but isn't :( */
+enum hnbap_procedure_code {
+ HNBAP_PC_HNBRegister = 1,
+ HNBAP_PC_HNBDe_Register = 2,
+ HNBAP_PC_UERegister = 3,
+ HNBAP_PC_UEDe_Register = 4,
+ HNBAP_PC_ErrorIndication = 5,
+ HNBAP_PC_privateMessage = 6,
+ HNBAP_PC_CSGMembershipUpdate = 7,
+ HNBAP_PC_TNLUpdate = 9,
+ HNBAP_PC_HNBConfigTransfer = 10,
+ HNBAP_PC_RelocationComplete = 11,
+ HNBAP_PC_U_RNTIQuery = 14,
+};
+
+/* should be auto-generated by ffasn1c, but isn't :( */
+enum hnbap_iei {
+ HNBAP_IEI_Cause = 1,
+ HNBAP_IEI_CriticalityDiagnostics = 2,
+ HNBAP_IEI_HNB_Identity = 3,
+ HNBAP_IEI_Context_ID = 4,
+ HNBAP_IEI_UE_Identity = 5,
+ HNBAP_IEI_LAC = 6,
+ HNBAP_IEI_RAC = 7,
+ HNBAP_IEI_HNB_Location_Information = 8,
+ HNBAP_IEI_PLMNidentity = 9,
+ HNBAP_IEI_SAC = 10,
+ HNBAP_IEI_CellIdentity = 11,
+ HNBAP_IEI_RegistrationCause = 12,
+ HNBAP_IEI_UE_Capabilities = 13,
+ HNBAP_IEI_RNC_ID = 14,
+ HNBAP_IEI_CSG_ID = 15,
+ HNBAP_IEI_BackoffTimer = 16,
+ HNBAP_IEI_HNB_Internet_Information = 17,
+ HNBAP_IEI_HNB_Cell_Acces_Mode = 18,
+ HNBAP_IEI_MuxPortNumber = 19,
+ HNBAP_IEI_Service_Area_For_Broadcast = 20,
+ HNBAP_IEI_CSGMembershipStatus = 21,
+ HNBAP_IEI_RABList = 22,
+ HNBAP_IEI_HNBConfigInfo = 23,
+ HNBAP_IEI_AccessResult = 25,
+ HNBAP_IEI_Update_cause = 26,
+ HNBAP_IEI_NeighborInfoList = 27,
+ HNBAP_IEI_NeighborInfoRequestList = 28,
+ HNBAP_IEI_Iurh_Signalling_TNL_Address = 29,
+ HNBAP_IEI_PSC = 30,
+ HNBAP_IEI_HNB_Cell_Identifier = 31,
+ HNBAP_IEI_HNB_Tunnel_Information = 41,
+ HNBAP_IEI_CELL_FACHMobilitySupport = 42,
+ HNBAP_IEI_S_RNTIPrefix = 43,
+ HNBAP_IEI_S_RNTIPrefix = 43,
+ /* FIXME */
+};
diff --git a/src/hnbgw.h b/src/hnbgw.h
new file mode 100644
index 0000000..87a5a2f
--- /dev/null
+++ b/src/hnbgw.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include <osmocom/core/select.h>
+#include <osmocom/core/linuxlist.h>
+
+struct hnb_context {
+ /*! Entry in HNB-global list of HNB */
+ struct llist_head list;
+ /*! SCTP socket for Iuh to this specific HNB */
+ struct osmo_fd socket;
+
+ /*! copied from HNB-Identity-Info */
+ char identity[256];
+};
+
+struct ue_context {
+ struct llist_head list;
+ uint32_t context_id;
+};
+
+struct hnb_gw {
+ struct {
+ /*! SCTP port for Iuh listening */
+ uint16_t iuh_listen_port;
+ } config;
+ /*! SCTP listen socket for incoming connections */
+ struct osmo_fd listen_fd;
+ struct llist_head hnb_list;
+};
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)
+{
+
+}