Age | Commit message (Collapse) | Author | Files | Lines |
|
* we only need one piece of code to calculate rsl_ie_chan_mode from
our run-time data structures (gsm_lchan)
* add some more channel modes for TCH/H and data
* use enum's to make the compiler warn us about unhandled enum values
* make sure the caller determines the (signalling,speech,data) mode
|
|
only after the LCHAN_MODIFY we know the final mode of the channel,
so we have to postpone our IPAC_BIND until then to make sure we set
the correct speech codec.
|
|
Up until now, we only supported direct RTP streams between ip.access BTS.
With this commit, the user can specify '-P' to the command line to enable
a RTP/RTCP proxy inside OpenBSC. The nanoBTS will then send all their voice
data to OpenBSC, which will relay it to the respective destination BTS (which
can be the same BTS).
The default behaviour remains unchanged. Without '-P' on the command line,
RTP/RTCP is exchanged directly.
|
|
This is much more optimal than checking if the context exists every
time we allocate the respective object.
|
|
|
|
|
|
There were many places in the code where we had to explicitly
reference the transaction_id and put it into a packet. By introducing
and optional gsm_trans parameter to gsm48_sendmsg(), we can implement
this code once rather than dozens of time.
|
|
since a subscriber is an element of the gsm_network, we have to ensure
subscr->net is always set correctly. We do this by using gsm_network
as an argument to all functions that resolve or create a subscriber.
|
|
Since a transaction is associated to a gsm_subscriber, and the subsciber
is part of a network, we don't need to have a dedicated transaction->network
pointer.
|
|
This changeset factors out gsm_transaction as something independent
of call control in preparation to re-use the code from SMS. A
transaction is uniquely identified by either its callref, or by
a tuple of (transaction_id, protocol, subscriber).
|
|
As per specification, we first send the RR CHANNEL RELEASE to the MS,
and then tell the BTS to disable the SACCH on that channel.
|
|
|
|
to reflect that we now know their true names/meanings
|
|
For further evaluation/analysis, this patch stores the classmark 1, 2 and 3
values of every equipment in the SQL database. We can use this non-volatile
data to determine the supported features for each handset that we've ever
seen on our network.
|
|
IT sems that if a MS uses the TMSI of a previous network, we did not start
the reject timer. Thanks to Andreas Eversberg.
|
|
As Andreas points out, we already check for this condition some 10 lines
below, no need to check twice.
|
|
As Andreas Eversberg has pointed out, we need to use signal_data
rather than handler_data.
|
|
|
|
disable it by default
|
|
|
|
* when paging callback is called, we need to consider a failed paging
operation (i.e. lchan == NULL)
* we have to zero-initialize every transaction that is allocated
|
|
|
|
after passing the mncc structure (contained in msgb) to the mncc layer,
we have to release its memory. This leak was discovered as a direct result of
using talloc.
|
|
when we generate a talloc report (SIGUSR1), we can now see which system
allocated a given msgb, this helps memory leak debugging
|
|
This makes it much easier to do run-time configuration using the vty
interface.
|
|
|
|
This allows us to do subscriber lookups based on IMSI and e.g. establish
MT calls to subscribers with no assigned extension.
|
|
Fixed indication of cause value and location.
Replaced plain cause numbers by definitions from header file.
diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c
index f323a2a..39e7b1f 100644
--- a/openbsc/src/gsm_04_08.c
+++ b/openbsc/src/gsm_04_08.c
@@ -1865,8 +1865,7 @@ int mncc_release_ind(struct gsm_network *net, struct gsm_trans *trans,
memset(&rel, 0, sizeof(rel));
rel.callref = callref;
- mncc_set_cause(&rel, GSM48_CAUSE_LOC_PRN_S_LU,
- GSM48_CC_CAUSE_UNASSIGNED_NR);
+ mncc_set_cause(&rel, location, value);
return mncc_recvmsg(net, trans, MNCC_REL_IND, &rel);
}
@@ -1879,7 +1878,9 @@ void free_trans(struct gsm_trans *trans)
/* send release to L4, if callref still exists */
if (trans->callref) {
/* Ressource unavailable */
- mncc_release_ind(trans->network, trans, trans->callref, 1, 47);
+ mncc_release_ind(trans->network, trans, trans->callref,
+ GSM48_CAUSE_LOC_PRN_S_LU,
+ GSM48_CC_CAUSE_RESOURCE_UNAVAIL);
if (trans->state != GSM_CSTATE_NULL)
new_cc_state(trans, GSM_CSTATE_NULL);
}
@@ -1960,7 +1961,7 @@ static int setup_trig_pag_evt(unsigned int hooknum, unsigned int event,
subscr->extension);
/* Temporarily out of order */
mncc_release_ind(transt->network, transt, transt->callref,
- 1, 27);
+ 1, GSM48_CC_CAUSE_DEST_OOO);
transt->callref = 0;
free_trans(transt);
break;
@@ -2270,7 +2271,8 @@ static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg)
"This is not allowed!\n");
/* Temporarily out of order */
rc = mncc_release_ind(trans->network, trans, trans->callref,
- 1, 47);
+ GSM48_CAUSE_LOC_PRN_S_LU,
+ GSM48_CC_CAUSE_RESOURCE_UNAVAIL);
trans->callref = 0;
free_trans(trans);
return rc;
@@ -2287,7 +2289,8 @@ static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg)
if ((trans_id_mask & 0x007f) == 0x7f) {
/* no free transaction ID */
rc = mncc_release_ind(trans->network, trans, trans->callref,
- 1, 47);
+ GSM48_CAUSE_LOC_PRN_S_LU,
+ GSM48_CC_CAUSE_RESOURCE_UNAVAIL);
trans->callref = 0;
free_trans(trans);
return rc;
@@ -3373,14 +3376,18 @@ int mncc_send(struct gsm_network *net, int msg_type, void *arg)
"unknown callref %d\n", data->called.number,
get_mncc_name(msg_type), data->callref);
/* Invalid call reference */
- return mncc_release_ind(net, NULL, data->callref, 1, 81);
+ return mncc_release_ind(net, NULL, data->callref,
+ GSM48_CAUSE_LOC_PRN_S_LU,
+ GSM48_CC_CAUSE_INVAL_TRANS_ID);
}
if (!data->called.number[0] && !data->called.imsi[0]) {
DEBUGP(DCC, "(bts - trx - ts - ti) "
"Received '%s' from MNCC with "
"no number or IMSI\n", get_mncc_name(msg_type));
/* Invalid number */
- return mncc_release_ind(net, NULL, data->callref, 1, 28);
+ return mncc_release_ind(net, NULL, data->callref,
+ GSM48_CAUSE_LOC_PRN_S_LU,
+ GSM48_CC_CAUSE_INV_NR_FORMAT);
}
/* New transaction due to setup, find subscriber */
if (data->called.number[0])
@@ -3394,7 +3401,9 @@ int mncc_send(struct gsm_network *net, int msg_type, void *arg)
"unknown subscriber %s\n", data->called.number,
get_mncc_name(msg_type), data->called.number);
/* Unknown subscriber */
- return mncc_release_ind(net, NULL, data->callref, 1, 1);
+ return mncc_release_ind(net, NULL, data->callref,
+ GSM48_CAUSE_LOC_PRN_S_LU,
+ GSM48_CC_CAUSE_UNASSIGNED_NR);
}
/* If subscriber is not "attached" */
if (!subscr->lac) {
@@ -3404,14 +3413,18 @@ int mncc_send(struct gsm_network *net, int msg_type, void *arg)
get_mncc_name(msg_type), data->called.number);
subscr_put(subscr);
/* Temporarily out of order */
- return mncc_release_ind(net, NULL, data->callref, 1, 27);
+ return mncc_release_ind(net, NULL, data->callref,
+ GSM48_CAUSE_LOC_PRN_S_LU,
+ GSM48_CC_CAUSE_DEST_OOO);
}
/* Create transaction */
if (!(trans = calloc(1, sizeof(struct gsm_trans)))) {
DEBUGP(DCC, "No memory for trans.\n");
subscr_put(subscr);
/* Ressource unavailable */
- mncc_release_ind(net, NULL, data->callref, 1, 47);
+ mncc_release_ind(net, NULL, data->callref,
+ GSM48_CAUSE_LOC_PRN_S_LU,
+ GSM48_CC_CAUSE_RESOURCE_UNAVAIL);
return -ENOMEM;
}
trans->callref = data->callref;
|
|
Removed lchan_put() after IMSI detach function.
We don't need to put lchan, because we don't hold a ressource.
|
|
This fixes two reasons for crashes due to uninitialized memory or
wrong pointer passing introduced in my own mncc modifications
|
|
Introduce a gsm48_cc_cause enum and use it from gsm_04_08 and MNCC,
also make sure we use gsm48_cause_loc rather than plain numbers.
|
|
This is Harald's reworked MNCC base, slowly heading towards integration
into master. The key changes are:
* provide much more structure to the data in gsm_mncc
* encode_* and decode_* functions now take a structure rather than tons
of individual arguments (whose order nobody can remember)
* make sure we don't have copies of the same code everywhere by introducing
mncc_set_cause() and mncc_release_ind()
* save horizontal screen space if possible
* make sure we break lines > 80 characters
|
|
|
|
Reuqests for a subscriber a stored within the gsm_subscriber
datastructure and it will keep track how many channels are
allocated for this user and of which type to decide on policy...
e.g. attempt to submit SMS during a phone call and not doing
paging but a simple (immediate) assignment of the channel...
|
|
Andreas Eversberg is suspecting that some of these messages
are not balanced and we are seeing a leak here. The general location
updating request is guarded by the "location updating request" object
inside the lchan that will keep the channel open for at least five
seconds to get all the information we need.
|
|
Move the secret of how to find the BTS in a LocationArea into
the paging layer. This allows to implement different strategies
without changing other parts. E.g. we might want to try the BTS
were the device was seen last and then try...
There should be no semantic change and things should continue
to work. It is sadly not tested though.
|
|
Search for the MS at BTS in the location area of the
called_subscr. This makes the case work where caller and
receiver are not in the same location area. In fact this
looks like a breach of a BSC/MSC separation, I have no idea
if in true networks a BSC is managing BTS in different location
areas.
|
|
this patch implements the encoding/decoding of 04.08 call control information
elements. It adds new functions to be used for the application interface
patch, and is basis for the application patch (currently patch 36).
Please ignore warnings about unused static functions for now.
(Andreas Eversberg)
|
|
when paging is successfull, the paging_request_stop() function is called
with the current lchan, so the callback function will be called. for all
other bts', the paging_request_stop() function is called without lchan,
so the paging is stopped, but the callback function is not called.
this ensures that only one paging result is received when paging
multiple BTS. (Andreas Eversberg)
|
|
|