aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/gsm_04_08.c
AgeCommit message (Collapse)AuthorFilesLines
2009-07-29generalize channel activation / channel mode modifyHarald Welte1-0/+1
* 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
2009-07-29postpone IPAC_BIND until we do a LCHAN_MODIFYHarald Welte1-7/+18
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.
2009-07-28add RTP proxy mode for ip.accessHarald Welte1-22/+110
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.
2009-07-28move allocation of talloc contexts into link-time constructorHarald Welte1-3/+2
This is much more optimal than checking if the context exists every time we allocate the respective object.
2009-07-23move allocating new transaction_ids to transaction.cHarald Welte1-17/+4
2009-07-23trans->transaction_id now reflects the actual (unshifted) valueHarald Welte1-9/+9
2009-07-23centralize the code that needs to deal with transaction_idHarald Welte1-79/+41
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.
2009-07-23make sure subscr->net is always setHarald Welte1-10/+17
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.
2009-07-23remove bogus 'network' member of 'struct gsm_transaction'Harald Welte1-30/+35
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.
2009-07-23gms_transactions data model reorganizationHarald Welte1-117/+66
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).
2009-07-19send DEACTIVATE SACCH when sending RR CHANEL RELEASEHarald Welte1-1/+5
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.
2009-07-19fix copy+paste mistake in ecnoding short net name in mm infoHarald Welte1-1/+1
2009-07-12rename ip.access structure field members and variablesHarald Welte1-4/+8
to reflect that we now know their true names/meanings
2009-07-05Store classmark1/2/3 in equipment SQL tableHarald Welte1-10/+11
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.
2009-07-04make sure we always schedule a location updating rejectHarald Welte1-6/+5
IT sems that if a MS uses the TMSI of a previous network, we did not start the reject timer. Thanks to Andreas Eversberg.
2009-07-04remove bogus extra check for data->imsi[0] in mncc_sendHarald Welte1-2/+1
As Andreas points out, we already check for this condition some 10 lines below, no need to check twice.
2009-07-04gsm48 lchan signal handling: use correct pointerHarald Welte1-1/+1
As Andreas Eversberg has pointed out, we need to use signal_data rather than handler_data.
2009-06-27cosmetic cleanup of LOCATION UPDATE REQ print-outHarald Welte1-8/+8
2009-06-27add new DMEAS debug category for measurement reportingHarald Welte1-6/+6
disable it by default
2009-06-26use taloc_zero() rather than talloc() and explisit memset()Harald Welte1-3/+2
2009-06-26fix two segfaultsHarald Welte1-2/+5
* 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
2009-06-26zero-initialize some more memory that we allocateHarald Welte1-1/+1
2009-06-26fix MNCC memory leakHarald Welte1-0/+1
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.
2009-06-26use named variant when allocating msgb'sHarald Welte1-2/+3
when we generate a talloc report (SIGUSR1), we can now see which system allocated a given msgb, this helps memory leak debugging
2009-06-21switch to dynamically allocated BTS and TRX data structuresHarald Welte1-2/+2
This makes it much easier to do run-time configuration using the vty interface.
2009-06-20introduce talloc all over OpenBSCHarald Welte1-6/+13
2009-06-15mncc: Add IMSI to gsm_mnccAndreas Eversberg1-2/+19
This allows us to do subscriber lookups based on IMSI and e.g. establish MT calls to subscribers with no assigned extension.
2009-06-14Use correct cause value and cause locationAndreas Eversberg1-10/+22
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;
2009-06-14Fix lchan refcounting in case of IMSI DETACHAndreas Eversberg1-2/+0
Removed lchan_put() after IMSI detach function. We don't need to put lchan, because we don't hold a ressource.
2009-06-1204.08: Make mncc-harald branch workHarald Welte1-2/+2
This fixes two reasons for crashes due to uninitialized memory or wrong pointer passing introduced in my own mncc modifications
2009-06-11use less magic numbers (04.08 CC cause values)Harald Welte1-8/+20
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.
2009-06-10reworked MNCC codebaseHarald Welte1-373/+1982
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
2009-06-10Merge commit 'origin/master'Harald Welte1-32/+2
2009-06-10Proposal for a "channel request" interface...Holger Freyther1-1/+1
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...
2009-06-10Remove use_lchan and put_lchan from location updating request pathsHolger Hans Peter Freyther1-8/+0
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.
2009-06-10Move the "finding" of the right BTS into paging.cHolger Hans Peter Freyther1-23/+2
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.
2009-06-10Search for BTS's in the Location Area of the subscriber we callHolger Hans Peter Freyther1-2/+1
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.
2009-06-10introduce encoding/decoding functions for 04.08 CCHarald Welte1-26/+471
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)
2009-06-10use gsm_bts_by_lac() function to start paging of all bts with same lacHarald Welte1-6/+27
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)
2009-06-10move openbsc into its own subdirectoryHarald Welte1-0/+1723