diff options
Diffstat (limited to 'src/hnbgw_hnbap.c')
-rw-r--r-- | src/hnbgw_hnbap.c | 138 |
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) +{ + +} |