hnbgw: Actually link in + call ffasn1c runtime library
parent
c3fa0b0e43
commit
ee77cff224
|
@ -1,11 +1,11 @@
|
|||
LIBFFASN1_DIR=../../../kommerz/sysmocom/git/admin/ffasn1c/libffasn1
|
||||
|
||||
CFLAGS=-g -Wall `pkg-config --cflags libosmocore libosmovty libosmogsm` -I$(LIBFFASN1_DIR)
|
||||
LDFLAGS=`pkg-config --libs libosmocore libosmovty libosmogsm` -lsctp -L$(LIBFFASN1_DIR) -lffasn1
|
||||
LDFLAGS=`pkg-config --libs libosmocore libosmovty libosmogsm` -lsctp
|
||||
|
||||
all: hnbgw
|
||||
|
||||
hnbgw: hnbgw.o hnbgw_hnbap.o hnbap.o asn1helpers.o
|
||||
hnbgw: hnbgw.o hnbgw_hnbap.o hnbap.o asn1helpers.o $(LIBFFASN1_DIR)/libffasn1.a $(LIBFFASN1_DIR)/libffasn1_runtime_stdc.a
|
||||
$(CC) $(LDFLAGS) -o $@ $^
|
||||
|
||||
%.o: %.c
|
||||
|
|
|
@ -46,6 +46,7 @@ static int hnb_socket_cb(struct osmo_fd *fd, unsigned int what)
|
|||
NULL, NULL, &sinfo, &flags);
|
||||
if (rc < 0) {
|
||||
LOGP(DMAIN, LOGL_ERROR, "Error during sctp_recvmsg()\n");
|
||||
/* FIXME: clean up after disappeared HNB */
|
||||
return rc;
|
||||
} else
|
||||
msgb_put(msg, rc);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include <osmocom/core/utils.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "asn1helpers.h"
|
||||
|
@ -10,6 +11,49 @@
|
|||
#include "hnbgw.h"
|
||||
#include "hnbap_const.h"
|
||||
|
||||
#define IU_MSG_NUM_IES 32
|
||||
#define IU_MSG_NUM_EXT_IES 32
|
||||
|
||||
/* common structure of a HNBAP / RUA / RANAP message, must have identical
|
||||
* memory footprint as the other messages, such as HNBRegisterRequest */
|
||||
struct iu_common_msg {
|
||||
ProtocolIE_Container_1 protocolIEs;
|
||||
BOOL protocolExtensions_option;
|
||||
ProtocolIE_Container_1 protocolExtensions;
|
||||
};
|
||||
|
||||
/* Add an IE to a Iu message
|
||||
* \param _msg Message to which we want to add
|
||||
* \param[in] ie Information Element to be added (ffasn1c generated struct)
|
||||
* \param[in] iei Information Element Identifier
|
||||
* \param[in] type asn1_type of the IE
|
||||
* \param[in] ext should this be an extension field?
|
||||
*/
|
||||
int iu_msg_add_ie(void *_msg, void *ie, int iei, ASN1CType *type, int ext)
|
||||
{
|
||||
struct iu_common_msg *msg = _msg;
|
||||
ProtocolIE_Field_1 *field;
|
||||
|
||||
if (ext) {
|
||||
msg->protocolExtensions_option = TRUE;
|
||||
if (msg->protocolExtensions.count >= IU_MSG_NUM_EXT_IES)
|
||||
return -ERANGE;
|
||||
field = &msg->protocolExtensions.tab[msg->protocolExtensions.count++];
|
||||
} else {
|
||||
if (msg->protocolIEs.count >= IU_MSG_NUM_IES)
|
||||
return -ERANGE;
|
||||
field = &msg->protocolIEs.tab[msg->protocolIEs.count++];
|
||||
}
|
||||
|
||||
field->id = iei;
|
||||
//field->criticality = FIXME;
|
||||
field->value.type = type;
|
||||
field->value.u.data = ie;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int hnbgw_hnbap_tx(struct HNBAP_PDU *pdu)
|
||||
{
|
||||
|
@ -24,16 +68,34 @@ static int hnbgw_tx_hnb_register_acc()
|
|||
|
||||
static int hnbgw_tx_ue_register_acc()
|
||||
{
|
||||
#if 0
|
||||
HNBAP_PDU pdu;
|
||||
HNBRegisterAccept hnb_reg_acc;
|
||||
|
||||
hnb_reg_acc.protocol_IEs
|
||||
|
||||
pdu.choice = HNBAP_PDU_successfulOutcome;
|
||||
pdu.u.successfulOutcome.procedureCode = HNBAP_PC_HNBRegister;
|
||||
pdu.u.successfulOutcome.criticality = ;
|
||||
pdu.u.successfulOutcome.value.type = asn1_type_HNBRegisterAccept;
|
||||
pdu.u.successfulOutcome.value.u.data = &hnb_reg_acc;
|
||||
#endif
|
||||
/* FIXME */
|
||||
/* Single required response IE: RNC-ID */
|
||||
}
|
||||
|
||||
/* we type-cast to ProtocolIE_Container_1, as all the containers structs have
|
||||
* the same definiition. This is of course ugly, but I see no cleaner way.
|
||||
* Similarly, from the IEI it is clear what the type should be, but in a
|
||||
* statically typed language we can only return 'void *' and hope the caller
|
||||
* doesn the right typecast. */
|
||||
#define FIND_IE(cont, id) find_ie((const struct ProtocolIE_Container_1 *)cont, id)
|
||||
|
||||
static void *find_ie(const struct ProtocolIE_Container_1 *cont, ProtocolIE_ID id)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* iterate over the array of IEs in the IE container and look for the first
|
||||
* occurrence of the right IEI */
|
||||
for (i = 0; i < cont->count; i++) {
|
||||
ProtocolIE_Field_1 *field = &cont->tab[i];
|
||||
if (field->id == id) {
|
||||
|
@ -73,6 +135,8 @@ static int hnbgw_rx_hnb_register_req(struct hnb_context *ctx, struct HNBRegister
|
|||
//ctx->id.mcc FIXME
|
||||
//ctx->id.mnc FIXME
|
||||
|
||||
DEBUGP(DMAIN, "HNB-REGISTER-REQ from %s\n", ctx->identity_info);
|
||||
|
||||
/* FIXME: Send HNBRegisterAccept */
|
||||
}
|
||||
|
||||
|
@ -156,7 +220,22 @@ static int _hnbgw_hnbap_rx(struct hnb_context *hnb, struct HNBAP_PDU *pdu)
|
|||
|
||||
int hnbgw_hnbap_rx(struct hnb_context *hnb, struct msgb *msg)
|
||||
{
|
||||
/* FIXME: decode and handle to _hnbgw_hnbap_rx() */
|
||||
HNBAP_PDU *pdu;
|
||||
ASN1Error err;
|
||||
int rc;
|
||||
|
||||
/* decode and handle to _hnbgw_hnbap_rx() */
|
||||
|
||||
rc = asn1_aper_decode(&pdu, asn1_type_HNBAP_PDU, msg->data, msgb_length(msg), &err);
|
||||
if (rc < 0) {
|
||||
LOGP(DMAIN, LOGL_ERROR, "Error in ASN.1 decode (bit=%d): %s\n", err.bit_pos, err.msg);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = _hnbgw_hnbap_rx(hnb, pdu);
|
||||
asn1_free_value(asn1_type_HNBAP_PDU, pdu);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue