bsc: Allow the NAT to query the list of LACs
Right now the code assumes that any request coming from the NAT is a query and the code responds to with a list of configured LACs.
This commit is contained in:
parent
a78b6026c9
commit
2a9eeaa588
|
@ -69,7 +69,7 @@ struct ipac_msgt_sccp_state {
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @add_remove 0 for remove, 1 for add
|
* @add_remove 0 for remove, 1 for add, 3 to asK
|
||||||
* @nr_lacs Number of extra lacs inside this package
|
* @nr_lacs Number of extra lacs inside this package
|
||||||
* @lac One lac entry
|
* @lac One lac entry
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* Handle the connection to the MSC. This include ping/timeout/reconnect
|
* Handle the connection to the MSC. This include ping/timeout/reconnect
|
||||||
* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org>
|
* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org>
|
||||||
* (C) 2009-2010 by Holger Hans Peter Freyther <zecke@selfish.org>
|
* (C) 2009-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||||
* (C) 2009-2010 by On-Waves
|
* (C) 2009-2011 by On-Waves
|
||||||
* All Rights Reserved
|
* All Rights Reserved
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -37,6 +37,7 @@
|
||||||
|
|
||||||
|
|
||||||
static void initialize_if_needed(struct bsc_msc_connection *conn);
|
static void initialize_if_needed(struct bsc_msc_connection *conn);
|
||||||
|
static void send_lacs(struct gsm_network *net, struct bsc_msc_connection *conn);
|
||||||
static void send_id_get_response(struct osmo_msc_data *data, int fd);
|
static void send_id_get_response(struct osmo_msc_data *data, int fd);
|
||||||
static void send_ping(struct osmo_msc_data *data);
|
static void send_ping(struct osmo_msc_data *data);
|
||||||
|
|
||||||
|
@ -203,7 +204,8 @@ static void osmo_ext_handle(struct osmo_msc_data *msc, struct msgb *msg)
|
||||||
msg->l2h = hh_ext->data;
|
msg->l2h = hh_ext->data;
|
||||||
if (hh_ext->proto == IPAC_PROTO_EXT_MGCP)
|
if (hh_ext->proto == IPAC_PROTO_EXT_MGCP)
|
||||||
mgcp_forward(msc, msg);
|
mgcp_forward(msc, msg);
|
||||||
|
else if (hh_ext->proto == IPAC_PROTO_EXT_LAC)
|
||||||
|
send_lacs(msc->network, msc->msc_con);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipaccess_a_fd_cb(struct bsc_fd *bfd)
|
static int ipaccess_a_fd_cb(struct bsc_fd *bfd)
|
||||||
|
@ -329,6 +331,39 @@ static void msc_connection_was_lost(struct bsc_msc_connection *msc)
|
||||||
bsc_msc_schedule_connect(msc);
|
bsc_msc_schedule_connect(msc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void send_lacs(struct gsm_network *net, struct bsc_msc_connection *conn)
|
||||||
|
{
|
||||||
|
struct ipac_ext_lac_cmd *lac;
|
||||||
|
struct gsm_bts *bts;
|
||||||
|
struct msgb *msg;
|
||||||
|
int lacs = 0;
|
||||||
|
|
||||||
|
if (llist_empty(&net->bts_list)) {
|
||||||
|
LOGP(DMSC, LOGL_ERROR, "No BTSs configured. Not sending LACs.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = msgb_alloc_headroom(4096, 128, "LAC Command");
|
||||||
|
if (!msg) {
|
||||||
|
LOGP(DMSC, LOGL_ERROR, "Failed to create the LAC command.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lac = (struct ipac_ext_lac_cmd *) msgb_put(msg, sizeof(*lac));
|
||||||
|
lac->add_remove = 1;
|
||||||
|
|
||||||
|
llist_for_each_entry(bts, &net->bts_list, list) {
|
||||||
|
if (lacs++ == 0)
|
||||||
|
lac->lac = htons(bts->location_area_code);
|
||||||
|
else
|
||||||
|
msgb_put_u16(msg, htons(bts->location_area_code));
|
||||||
|
}
|
||||||
|
|
||||||
|
lac->nr_extra_lacs = lacs - 1;
|
||||||
|
ipaccess_prepend_header_ext(msg, IPAC_PROTO_EXT_LAC);
|
||||||
|
msc_queue_write(conn, msg, IPAC_PROTO_OSMO);
|
||||||
|
}
|
||||||
|
|
||||||
static void initialize_if_needed(struct bsc_msc_connection *conn)
|
static void initialize_if_needed(struct bsc_msc_connection *conn)
|
||||||
{
|
{
|
||||||
struct msgb *msg;
|
struct msgb *msg;
|
||||||
|
|
Loading…
Reference in New Issue