bsc_api: Move gsm48_rcvmsg into the BSC API and dispatch.

The next step in the way to the BSC API. We have a clear a
new connection was opened signal now... and the MSC could
use it...
This commit is contained in:
Holger Hans Peter Freyther 2010-06-17 16:41:25 +08:00
parent 86481c29d4
commit 9764331062
10 changed files with 52 additions and 17 deletions

View File

@ -5,12 +5,16 @@
#include "gsm_data.h"
#define BSC_API_CONN_POL_ACCEPT 0
#define BSC_API_CONN_POL_REJECT 1
struct bsc_api {
void (*sapi_n_reject)(struct gsm_subscriber_connection *conn, int dlci);
void (*cipher_mode_compl)(struct gsm_subscriber_connection *conn,
struct msgb *msg, uint16_t ind);
void (*compl_l3)(struct gsm_subscriber_connection *conn,
struct msgb *msg, uint16_t chosen_channel);
int (*compl_l3)(struct gsm_subscriber_connection *conn,
struct msgb *msg, uint16_t chosen_channel);
void (*dtap)(struct gsm_subscriber_connection *conn, struct msgb *msg);
void (*ass_compl)(struct gsm_subscriber_connection *conn,
uint16_t rr_cause);
void (*ass_fail)(struct gsm_subscriber_connection *conn,

View File

@ -25,6 +25,7 @@ static inline struct msgb *gsm48_msgb_alloc(void)
/* config options controlling the behaviour of the lower leves */
void gsm0408_allow_everyone(int allow);
void gsm0408_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause);
int gsm0408_dispatch(struct gsm_subscriber_connection *conn, struct msgb *msg);
int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id);
enum gsm_chan_t get_ctype_by_chreq(struct gsm_bts *bts, u_int8_t ra, int neci);

View File

@ -25,7 +25,7 @@ struct sms_deliver {
struct msgb;
int gsm0411_rcv_sms(struct gsm_subscriber_connection *conn, struct msgb *msg, u_int8_t link_id);
int gsm0411_rcv_sms(struct gsm_subscriber_connection *conn, struct msgb *msg);
struct gsm_sms *sms_alloc(void);
void sms_free(struct gsm_sms *sms);

View File

@ -254,6 +254,7 @@ struct gsm_subscriber_connection {
int silent_call;
/* back pointers */
int allocated;
struct gsm_lchan *lchan;
struct gsm_bts *bts;
};

View File

@ -27,6 +27,7 @@
#include <openbsc/gsm_data.h>
#include <openbsc/signal.h>
#include <openbsc/abis_rsl.h>
#include <openbsc/chan_alloc.h>
#include <osmocore/talloc.h>
@ -84,6 +85,27 @@ int bsc_upqueue(struct gsm_network *net)
return work;
}
int gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id)
{
int rc;
struct gsm_subscriber_connection *conn;
struct bsc_api *api = msg->lchan->ts->trx->bts->network->bsc_api;
conn = &msg->lchan->conn;
if (conn->allocated) {
api->dtap(conn, msg);
} else {
/* accept the connection or close the lchan */
rc = api->compl_l3(conn, msg, 0);
if (rc == BSC_API_CONN_POL_ACCEPT)
conn->allocated = 1;
else
lchan_auto_release(msg->lchan);
}
return 0;
}
static void send_sapi_reject(struct gsm_subscriber_connection *conn, int link_id)
{
struct bsc_api *api;

View File

@ -3096,8 +3096,8 @@ static int gsm0408_rcv_cc(struct msgb *msg)
return rc;
}
/* here we pass in a msgb from the RSL->RLL. We expect the l3 pointer to be set */
int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id)
/* here we get data from the BSC level... */
int gsm0408_dispatch(struct gsm_subscriber_connection *conn, struct msgb *msg)
{
struct gsm48_hdr *gh = msgb_l3(msg);
u_int8_t pdisc = gh->proto_discr & 0x0f;
@ -3117,7 +3117,7 @@ int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id)
rc = gsm0408_rcv_rr(msg);
break;
case GSM48_PDISC_SMS:
rc = gsm0411_rcv_sms(&msg->lchan->conn, msg, link_id);
rc = gsm0411_rcv_sms(conn, msg);
break;
case GSM48_PDISC_MM_GPRS:
case GSM48_PDISC_SM_GPRS:

View File

@ -913,7 +913,7 @@ static int gsm411_tx_cp_error(struct gsm_trans *trans, u_int8_t cause)
/* Entry point for incoming GSM48_PDISC_SMS from abis_rsl.c */
int gsm0411_rcv_sms(struct gsm_subscriber_connection *conn,
struct msgb *msg, u_int8_t link_id)
struct msgb *msg)
{
struct gsm48_hdr *gh = msgb_l3(msg);
u_int8_t msg_type = gh->msg_type;
@ -940,7 +940,7 @@ int gsm0411_rcv_sms(struct gsm_subscriber_connection *conn,
trans->sms.cp_state = GSM411_CPS_IDLE;
trans->sms.rp_state = GSM411_RPS_IDLE;
trans->sms.is_mt = 0;
trans->sms.link_id = link_id;
trans->sms.link_id = UM_SAPI_SMS;
trans->conn = conn;
use_subscr_con(trans->conn);

View File

@ -99,11 +99,6 @@ int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
{}
int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id)
{
return -1;
}
static void queue_for_msc(struct bsc_msc_connection *con, struct msgb *msg)
{
if (write_queue_enqueue(&nat->msc_con->write_queue, msg) != 0) {

View File

@ -40,9 +40,25 @@ static void msc_clear_request(struct gsm_subscriber_connection* conn, uint32_t c
gsm0408_clear_request(conn, cause);
}
static int msc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg,
uint16_t chosen_channel)
{
gsm0408_dispatch(conn, msg);
/* TODO: do better */
return BSC_API_CONN_POL_ACCEPT;
}
static void msc_dtap(struct gsm_subscriber_connection *conn, struct msgb *msg)
{
gsm0408_dispatch(conn, msg);
}
static struct bsc_api msc_handler = {
.sapi_n_reject = msc_sapi_n_reject,
.clear_request = msc_clear_request,
.compl_l3 = msc_compl_l3,
.dtap = msc_dtap,
};
struct bsc_api *msc_bsc_api() {

View File

@ -721,7 +721,3 @@ int nm_state_event()
return -1;
}
int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id)
{
return -1;
}