From b71517f07ec46558bc6032bdaa27650f8bef634d Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Mon, 5 Apr 2010 18:13:40 +0200 Subject: [sccp] Add a force_free method for connections E.g. when the underlying connection transport medium is gone one needs to force to close SCCP connections, add this helper. It will remove the connection from the list of connections and it will free the data. --- openbsc/include/sccp/sccp.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/sccp/sccp.h b/openbsc/include/sccp/sccp.h index 2e1478812..604a2ac72 100644 --- a/openbsc/include/sccp/sccp.h +++ b/openbsc/include/sccp/sccp.h @@ -105,6 +105,11 @@ int sccp_connection_send_it(struct sccp_connection *connection); int sccp_connection_close(struct sccp_connection *connection, int cause); int sccp_connection_free(struct sccp_connection *connection); +/** + * internal.. + */ +int sccp_connection_force_free(struct sccp_connection *conn); + /** * Create a new socket. Set your callbacks and then call bind to open * the connection. -- cgit v1.2.3 From 13d67b7ea331fdc6a0ef271a5839221c44f2d0d5 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 30 Mar 2010 15:41:03 +0200 Subject: [mgcp] Remove the sending of RSIP This message is ignored by the call agent and we were sending this on the first request which we maybe should not ignore... --- openbsc/include/openbsc/mgcp.h | 1 - 1 file changed, 1 deletion(-) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/mgcp.h b/openbsc/include/openbsc/mgcp.h index f7e800bd8..6a07cd111 100644 --- a/openbsc/include/openbsc/mgcp.h +++ b/openbsc/include/openbsc/mgcp.h @@ -115,7 +115,6 @@ void mgcp_free_endp(struct mgcp_endpoint *endp); * format helper functions */ struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg); -struct msgb *mgcp_create_rsip(void); struct msgb *mgcp_create_response_with_data(int code, const char *msg, const char *trans, const char *data); -- cgit v1.2.3 From 9bdcc9ca75a55c5d5bc5b7589e410c39b714c0c3 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 31 Mar 2010 06:39:35 +0200 Subject: [mgcp] Add some parsing for RSIP messages coming in This will just call a callback and leave all the handling to the application. --- openbsc/include/openbsc/mgcp.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/mgcp.h b/openbsc/include/openbsc/mgcp.h index 6a07cd111..37194bee8 100644 --- a/openbsc/include/openbsc/mgcp.h +++ b/openbsc/include/openbsc/mgcp.h @@ -77,6 +77,7 @@ struct mgcp_config; typedef int (*mgcp_change)(struct mgcp_config *cfg, int endpoint, int state, int local_rtp); typedef int (*mgcp_policy)(struct mgcp_config *cfg, int endpoint, int state, const char *transactio_id); +typedef int (*mgcp_reset)(struct mgcp_config *cfg); struct mgcp_config { int source_port; @@ -97,6 +98,7 @@ struct mgcp_config { mgcp_change change_cb; mgcp_policy policy_cb; + mgcp_reset reset_cb; void *data; struct mgcp_endpoint *endpoints; -- cgit v1.2.3 From 616d2225182a3ba64d6059d52594255ee472af89 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 31 Mar 2010 09:27:04 +0200 Subject: [mgcp] Add a helper function to convert from GSM0808 ts/mux to MGCP endpoint Move the conversion of GSM0808 timeslot and multiplex from the bssap.c into the mgcp.h so it can be reused by multiple users. The weird math comes from the mapping of the MSC... --- openbsc/include/openbsc/mgcp.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/mgcp.h b/openbsc/include/openbsc/mgcp.h index 37194bee8..c60a4550c 100644 --- a/openbsc/include/openbsc/mgcp.h +++ b/openbsc/include/openbsc/mgcp.h @@ -119,5 +119,13 @@ void mgcp_free_endp(struct mgcp_endpoint *endp); struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg); struct msgb *mgcp_create_response_with_data(int code, const char *msg, const char *trans, const char *data); +/* adc helper */ +static inline int mgcp_timeslot_to_endpoint(int multiplex, int timeslot) +{ + if (timeslot == 0) + timeslot = 1; + return timeslot + (31 * multiplex); +} + #endif -- cgit v1.2.3 From b79994c95292c8dda971268e5ac46e7f47ca6266 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 31 Mar 2010 11:46:41 +0200 Subject: [mgcp] Add a new config option to set the call agent ip addr In the case of the nat we only want to communicate with one upstream call agent and this can now be configured. --- openbsc/include/openbsc/mgcp.h | 1 + 1 file changed, 1 insertion(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/mgcp.h b/openbsc/include/openbsc/mgcp.h index c60a4550c..c4081b109 100644 --- a/openbsc/include/openbsc/mgcp.h +++ b/openbsc/include/openbsc/mgcp.h @@ -85,6 +85,7 @@ struct mgcp_config { char *source_addr; unsigned int number_endpoints; char *bts_ip; + char *call_agent_addr; struct in_addr bts_in; char *audio_name; -- cgit v1.2.3 From f2f1591ce7fde28d67da30c1998eaa631c2d5897 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 1 Apr 2010 03:27:04 +0200 Subject: [mgcp] Export header parsing via mgcp internal This will be used by the NAT code to implement custom protocol handling on top of that. --- openbsc/include/openbsc/mgcp_internal.h | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h index 10d0ca6ae..7ce1732f9 100644 --- a/openbsc/include/openbsc/mgcp_internal.h +++ b/openbsc/include/openbsc/mgcp_internal.h @@ -61,4 +61,13 @@ struct mgcp_endpoint { #define ENDPOINT_NUMBER(endp) abs(endp - endp->cfg->endpoints) +struct mgcp_msg_ptr { + unsigned int start; + unsigned int length; +}; + +int mgcp_analyze_header(struct mgcp_config *cfg, struct msgb *msg, + struct mgcp_msg_ptr *ptr, int size, + const char **transaction_id, struct mgcp_endpoint **endp); + #endif -- cgit v1.2.3 From b4b135efbf17f81a3faccb488ca35a5086adc618 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 7 Apr 2010 09:37:17 +0200 Subject: [mgcp] Count incoming RTP packets from the BTS and remote --- openbsc/include/openbsc/mgcp_internal.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h index 7ce1732f9..3a2832436 100644 --- a/openbsc/include/openbsc/mgcp_internal.h +++ b/openbsc/include/openbsc/mgcp_internal.h @@ -57,6 +57,10 @@ struct mgcp_endpoint { /* backpointer */ struct mgcp_config *cfg; + + /* statistics */ + unsigned int in_bts; + unsigned int in_remote; }; #define ENDPOINT_NUMBER(endp) abs(endp - endp->cfg->endpoints) -- cgit v1.2.3 From 408cc4ace99a9163136af601549a5d1b67a168c7 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 7 Apr 2010 10:51:27 +0200 Subject: [mgcp] Add an option to allow using reallocing an endpoint For some mode of operation it can be acceptable to reallocate an already allocated endpoint. This can be the case when we only deal with one call agent that is keeping track of the endpoint but slightly confused. --- openbsc/include/openbsc/mgcp.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/mgcp.h b/openbsc/include/openbsc/mgcp.h index c4081b109..71b7fc14e 100644 --- a/openbsc/include/openbsc/mgcp.h +++ b/openbsc/include/openbsc/mgcp.h @@ -97,6 +97,9 @@ struct mgcp_config { char *forward_ip; int forward_port; + /* spec handling */ + int force_realloc; + mgcp_change change_cb; mgcp_policy policy_cb; mgcp_reset reset_cb; -- cgit v1.2.3 From 754e801826207fb0c5ff490bbd8c36eb134aae5e Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Fri, 9 Apr 2010 21:53:35 +0200 Subject: [paging] Simplify the last request and treat llist as a queue The current code was overly complex. It tried to iterate over the list in a round robin and we had to keep track of the last element, see if we remove that one, check if the list becomes empty... This can all replaced by treating the double linked list as a queue. We take the item at the front, do something on it and then and then put it back to the list at the end. --- openbsc/include/openbsc/gsm_data.h | 1 - 1 file changed, 1 deletion(-) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 8dfa5886b..ef0b50768 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -368,7 +368,6 @@ struct gsm_paging_request { struct gsm_bts_paging_state { /* pending requests */ struct llist_head pending_requests; - struct gsm_paging_request *last_request; struct gsm_bts *bts; struct timer_list work_timer; -- cgit v1.2.3 From ccfd57264786a513b81429d7d7064e216c4461af Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Fri, 9 Apr 2010 13:06:56 +0200 Subject: [rsl] Remove method that is not called by anything. --- openbsc/include/openbsc/abis_rsl.h | 1 - 1 file changed, 1 deletion(-) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/abis_rsl.h b/openbsc/include/openbsc/abis_rsl.h index e6973eef0..ac0a17978 100644 --- a/openbsc/include/openbsc/abis_rsl.h +++ b/openbsc/include/openbsc/abis_rsl.h @@ -73,7 +73,6 @@ int rsl_release_request(struct gsm_lchan *lchan, u_int8_t link_id); /* to be provided by external code */ int abis_rsl_sendmsg(struct msgb *msg); int rsl_deact_sacch(struct gsm_lchan *lchan); -int rsl_chan_release(struct gsm_lchan *lchan); /* BCCH related code */ int rsl_ccch_conf_to_bs_cc_chans(int ccch_conf); -- cgit v1.2.3 From 74419497fccc93ef5acf6bc0d64f683c8bf25617 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 10 Apr 2010 00:12:31 +0200 Subject: [rsl] Introduce a method to set the state of the lchan Setting the state through a dedicated method allows us to track the state transitions and check if they are done in a proper way. --- openbsc/include/openbsc/abis_rsl.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/abis_rsl.h b/openbsc/include/openbsc/abis_rsl.h index ac0a17978..8e6774d15 100644 --- a/openbsc/include/openbsc/abis_rsl.h +++ b/openbsc/include/openbsc/abis_rsl.h @@ -70,6 +70,8 @@ u_int64_t str_to_imsi(const char *imsi_str); u_int8_t lchan2chan_nr(const struct gsm_lchan *lchan); int rsl_release_request(struct gsm_lchan *lchan, u_int8_t link_id); +int rsl_lchan_set_state(struct gsm_lchan *lchan, int); + /* to be provided by external code */ int abis_rsl_sendmsg(struct msgb *msg); int rsl_deact_sacch(struct gsm_lchan *lchan); -- cgit v1.2.3 From b54dda4cefe89665d98074cf3767858fa6ecdb6e Mon Sep 17 00:00:00 2001 From: Sylvain Munaut Date: Sun, 20 Dec 2009 22:06:40 +0100 Subject: ipaccess: Send RTP Payload IE for CRCX & MDCX For GSM V1 FR, the payload type is fixed to 3 in the RFC. But for the other codecs, the payload type is dynamically assigned between 96 and 127. Here, we use a static mapping internal to OpenBSC. This patch is needed to make a rather old 139 unit (with sw version 120a002_v149b42d0) work with something else than FR codec. I also tested this patch on a newer 139 (with sw version 120a352_v267b22d0) to make sure it didn't add a regression. More testing with newer EDGE units should be done by whoever has some of theses. Signed-off-by: Sylvain Munaut --- openbsc/include/openbsc/gsm_data.h | 1 + openbsc/include/openbsc/rtp_proxy.h | 6 ++++++ 2 files changed, 7 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index ef0b50768..68d3deebf 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -250,6 +250,7 @@ struct gsm_lchan { u_int16_t bound_port; u_int16_t connect_port; u_int16_t conn_id; + u_int8_t rtp_payload; u_int8_t rtp_payload2; u_int8_t speech_mode; struct rtp_socket *rtp_socket; diff --git a/openbsc/include/openbsc/rtp_proxy.h b/openbsc/include/openbsc/rtp_proxy.h index f82711a8e..65b1a5fac 100644 --- a/openbsc/include/openbsc/rtp_proxy.h +++ b/openbsc/include/openbsc/rtp_proxy.h @@ -28,6 +28,12 @@ #include #include +#define RTP_PT_GSM_FULL 3 +#define RTP_PT_GSM_HALF 96 +#define RTP_PT_GSM_EFR 97 +#define RTP_PT_AMR_FULL 98 +#define RTP_PT_AMR_HALF 99 + enum rtp_rx_action { RTP_NONE, RTP_PROXY, -- cgit v1.2.3 From 70402a4e4ddc0f7ee584445c9c3ac7dc91fe374b Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 15 Apr 2010 11:17:24 +0200 Subject: [ipa] Handle losing the RSL/OML connection.. This is addressing multiple issues regarding the loss of the OML/RSL link to the BTS. 1.) When we lose the OML link, close down all RSL connections on all TRXs (only tested with one TRX) and free the e1inp_line allocated for the OML connection. 2.) When we lose the RSL link on any TRX and we know to which lines this connection belongs, we will close down the OML connection as we have a problem to just reactivate one RSL link. 3.) When we lose the RSL link on any TRX and we do not know where it belongs to we will free the bfd we have allocated in the rsl listen/accept method and we properly close the socket (i could not test this one properly). This is made under the assumption the BTS has not responded to the ID request. 4.) When we already have a bts->oml_link we will throw it away and use the new link (it should not happen) and the same applies to the rsl link. --- openbsc/include/openbsc/ipaccess.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/ipaccess.h b/openbsc/include/openbsc/ipaccess.h index 86248aae5..f8ddfd467 100644 --- a/openbsc/include/openbsc/ipaccess.h +++ b/openbsc/include/openbsc/ipaccess.h @@ -53,6 +53,8 @@ int ipaccess_send_id_req(int fd); int ipaccess_idtag_parse(struct tlv_parsed *dec, unsigned char *buf, int len); +int ipaccess_drop_oml(struct gsm_bts *bts); +int ipaccess_drop_rsl(struct gsm_bts_trx *trx); /* * Firmware specific header -- cgit v1.2.3 From 135f797a3711d317a9aef43f0efa9fb8764a0d10 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 15 Apr 2010 11:21:02 +0200 Subject: [bsc_init] When the RSL/OML connection drops, free all lchans Free all allocated channels on the TRX that failed, go through lchan_free to signal higher layers and then force a reset of the channel. Make the TRX and TS unusable by setting the operational set to 0 (not really defined) which should be reset once the RSL is coming up again. --- openbsc/include/openbsc/chan_alloc.h | 1 + 1 file changed, 1 insertion(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/chan_alloc.h b/openbsc/include/openbsc/chan_alloc.h index f564e9e4d..d4f5858b7 100644 --- a/openbsc/include/openbsc/chan_alloc.h +++ b/openbsc/include/openbsc/chan_alloc.h @@ -45,6 +45,7 @@ struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type); /* Free a logical channel (SDCCH, TCH, ...) */ void lchan_free(struct gsm_lchan *lchan); +void lchan_reset(struct gsm_lchan *lchan); /* Consider releasing the channel */ int lchan_auto_release(struct gsm_lchan *lchan); -- cgit v1.2.3 From e0ec32686792bd962f4efb6122be8769b1b832b9 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 15 Apr 2010 11:28:14 +0200 Subject: [vty] Separate BSC and MSC statistics. Make it easy to print them. Move the statistics command into the MSC part and move the BSC statistics printing into a subroutine. --- openbsc/include/openbsc/vty.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/vty.h b/openbsc/include/openbsc/vty.h index 40e219162..f1b1148ad 100644 --- a/openbsc/include/openbsc/vty.h +++ b/openbsc/include/openbsc/vty.h @@ -1,6 +1,10 @@ #ifndef OPENBSC_VTY_H #define OPENBSC_VTY_H +struct gsm_network; +struct vty; + void openbsc_vty_add_cmds(void); +void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *); #endif -- cgit v1.2.3 From 3ba36d5b57f5964b9bdc2fd1e5ee7d0d9fd398dd Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 17 Apr 2010 06:48:29 +0200 Subject: [statistics] Keep track of rf failures and rll release failures Add two new counters to count the RF Failures and the RLL Release failure and make them available via the vty interface. --- openbsc/include/openbsc/gsm_data.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 68d3deebf..2db98de97 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -535,6 +535,10 @@ struct gsmnet_stats { struct counter *alerted; /* we alerted the other end */ struct counter *connected;/* how many calls were accepted */ } call; + struct { + struct counter *rf_fail; + struct counter *rll_err; + } chan; }; enum gsm_auth_policy { -- cgit v1.2.3 From bb110f91e8fd5c190f974ef3b9cb9a1118beb592 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Mon, 12 Apr 2010 10:45:52 +0200 Subject: [statistics] Keep track of OML/RSL failures of the BTS. --- openbsc/include/openbsc/gsm_data.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 2db98de97..a2f0e406c 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -539,6 +539,10 @@ struct gsmnet_stats { struct counter *rf_fail; struct counter *rll_err; } chan; + struct { + struct counter *oml_fail; + struct counter *rsl_fail; + } bts; }; enum gsm_auth_policy { -- cgit v1.2.3 From da0586a83810f43b061f7b12ad079b264bc03781 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 18 Apr 2010 14:49:05 +0200 Subject: GPRS: Add Support for the GPRS Cell Option Extension Info IE Extension Information is part of the GPRS Cell Options IE, as specified in Chapter 12.24 of TS 04.60. It is needed for indicating EDGE capabilities of the BTS to the MS. This simply adds the code to encode this IE as part of SI13, but does not actually use the code yet. --- openbsc/include/openbsc/rest_octets.h | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/rest_octets.h b/openbsc/include/openbsc/rest_octets.h index 4e72c0f87..6d9011963 100644 --- a/openbsc/include/openbsc/rest_octets.h +++ b/openbsc/include/openbsc/rest_octets.h @@ -71,6 +71,7 @@ enum gprs_nmo { GPRS_NMO_III = 2, /* no paging coordination */ }; +/* TS 04.60 12.24 */ struct gprs_cell_options { enum gprs_nmo nmo; /* T3168: wait for packet uplink assignment message */ @@ -79,6 +80,16 @@ struct gprs_cell_options { u_int32_t t3192; /* in milliseconds */ u_int32_t drx_timer_max;/* in seconds */ u_int32_t bs_cv_max; + + u_int8_t ext_info_present; + struct { + u_int8_t egprs_supported; + u_int8_t use_egprs_p_ch_req; + u_int8_t bep_period; + u_int8_t pfc_supported; + u_int8_t dtm_supported; + u_int8_t bss_paging_coordination; + } ext_info; }; /* TS 04.60 Table 12.9.2 */ -- cgit v1.2.3 From 4511d891ddf221eeea32d33f6199fa76c17df9c3 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 18 Apr 2010 15:51:20 +0200 Subject: GPRS: change 'gprs enabled <0-1>' to 'gprs mode (none|gprs|egprs)' This causes some config file breakage but sounds like a much cleaner approach than to have two separate config variables for this. --- openbsc/include/openbsc/gsm_data.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'openbsc/include') diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index a2f0e406c..52b82c062 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -73,6 +73,12 @@ enum gsm_paging_event { GSM_PAGING_OOM, }; +enum bts_gprs_mode { + BTS_GPRS_NONE = 0, + BTS_GPRS_GPRS = 1, + BTS_GPRS_EGPRS = 2, +}; + struct msgb; typedef int gsm_cbfn(unsigned int hooknum, unsigned int event, @@ -476,7 +482,7 @@ struct gsm_bts { /* Not entirely sure how ip.access specific this is */ struct { - int enabled; + enum bts_gprs_mode mode; struct { struct gsm_nm_state nm_state; u_int16_t nsei; @@ -705,6 +711,9 @@ const char *gsm_auth_policy_name(enum gsm_auth_policy policy); enum rrlp_mode rrlp_mode_parse(const char *arg); const char *rrlp_mode_name(enum rrlp_mode mode); +enum bts_gprs_mode bts_gprs_mode_parse(const char *arg); +const char *bts_gprs_mode_name(enum bts_gprs_mode mode); + void gsm_trx_lock_rf(struct gsm_bts_trx *trx, int locked); /* A parsed GPRS routing area */ -- cgit v1.2.3