aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2015-12-24 08:46:58 +0100
committerHarald Welte <laforge@gnumonks.org>2015-12-24 08:46:58 +0100
commitbc4560cf18e98d0a768c1d7a04ca1f31eb0d0d05 (patch)
tree75b5996c6c2499a399e7713c6febf220c7591743 /src
parentc4338deee9f3928eae61689687a1ff7ffee0d7b8 (diff)
Implement forwarding of RANAP PAGING from CN to all HNBs
Diffstat (limited to 'src')
-rw-r--r--src/hnbgw_cn.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/hnbgw_cn.c b/src/hnbgw_cn.c
index b69f250..8333d78 100644
--- a/src/hnbgw_cn.c
+++ b/src/hnbgw_cn.c
@@ -121,19 +121,27 @@ static int cn_ranap_rx_reset_ack(struct hnbgw_cnlink *cnlink,
}
static int cn_ranap_rx_paging_cmd(struct hnbgw_cnlink *cnlink,
- RANAP_InitiatingMessage_t *imsg)
+ RANAP_InitiatingMessage_t *imsg,
+ const uint8_t *data, unsigned int len)
{
+ struct hnb_gw *gw;
+ struct hnb_context *hnb;
RANAP_PagingIEs_t ies;
- int rc;
+ int rc = 0;
rc = ranap_decode_pagingies(&ies, &imsg->value);
- /* FIXME: determine which HNBs to send this Paging command */
- return rc;
+ /* FIXME: determine which HNBs to send this Paging command,
+ * rather than broadcasting to all HNBs */
+ llist_for_each_entry(hnb, &gw->hnb_list, list) {
+ rc = rua_tx_udt(hnb, data, len);
+ }
+ return 0;
}
static int cn_ranap_rx_initiating_msg(struct hnbgw_cnlink *cnlink,
- RANAP_InitiatingMessage_t *imsg)
+ RANAP_InitiatingMessage_t *imsg,
+ const uint8_t *data, unsigned int len)
{
int rc;
@@ -141,7 +149,7 @@ static int cn_ranap_rx_initiating_msg(struct hnbgw_cnlink *cnlink,
case RANAP_ProcedureCode_id_Reset:
return cn_ranap_rx_reset_cmd(cnlink, imsg);
case RANAP_ProcedureCode_id_Paging:
- return cn_ranap_rx_paging_cmd(cnlink, imsg);
+ return cn_ranap_rx_paging_cmd(cnlink, imsg, data, len);
case RANAP_ProcedureCode_id_OverloadControl: /* Overload ind */
break;
case RANAP_ProcedureCode_id_ErrorIndication: /* Error ind */
@@ -185,13 +193,15 @@ static int cn_ranap_rx_successful_msg(struct hnbgw_cnlink *cnlink,
}
-static int _cn_ranap_rx(struct hnbgw_cnlink *cnlink, RANAP_RANAP_PDU_t *pdu)
+static int _cn_ranap_rx(struct hnbgw_cnlink *cnlink, RANAP_RANAP_PDU_t *pdu,
+ const uint8_t *data, unsigned int len)
{
int rc;
switch (pdu->present) {
case RANAP_RANAP_PDU_PR_initiatingMessage:
- rc = cn_ranap_rx_initiating_msg(cnlink, &pdu->choice.initiatingMessage);
+ rc = cn_ranap_rx_initiating_msg(cnlink, &pdu->choice.initiatingMessage,
+ data, len);
break;
case RANAP_RANAP_PDU_PR_successfulOutcome:
rc = cn_ranap_rx_successful_msg(cnlink, &pdu->choice.successfulOutcome);
@@ -223,7 +233,7 @@ static int handle_cn_ranap(struct hnbgw_cnlink *cnlink, const uint8_t *data,
return rc;
}
- rc = _cn_ranap_rx(cnlink, pdu);
+ rc = _cn_ranap_rx(cnlink, pdu, data, len);
return rc;
}