introduce talloc all over OpenBSC
This commit is contained in:
parent
879dc971ff
commit
2cf161be08
|
@ -407,6 +407,8 @@ struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
|
|||
char *gsm_band_name(enum gsm_band band);
|
||||
enum gsm_band gsm_band_parse(int mhz);
|
||||
|
||||
void *tall_bsc_ctx;
|
||||
|
||||
static inline int is_ipaccess_bts(struct gsm_bts *bts)
|
||||
{
|
||||
switch (bts->type) {
|
||||
|
|
|
@ -0,0 +1,190 @@
|
|||
#ifndef _TALLOC_H_
|
||||
#define _TALLOC_H_
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
Samba temporary memory allocation functions
|
||||
|
||||
Copyright (C) Andrew Tridgell 2004-2005
|
||||
Copyright (C) Stefan Metzmacher 2006
|
||||
|
||||
** NOTE! The following LGPL license applies to the talloc
|
||||
** library. This does NOT imply that all of Samba is released
|
||||
** under the LGPL
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
/* this is only needed for compatibility with the old talloc */
|
||||
typedef void TALLOC_CTX;
|
||||
|
||||
/*
|
||||
this uses a little trick to allow __LINE__ to be stringified
|
||||
*/
|
||||
#ifndef __location__
|
||||
#define __TALLOC_STRING_LINE1__(s) #s
|
||||
#define __TALLOC_STRING_LINE2__(s) __TALLOC_STRING_LINE1__(s)
|
||||
#define __TALLOC_STRING_LINE3__ __TALLOC_STRING_LINE2__(__LINE__)
|
||||
#define __location__ __FILE__ ":" __TALLOC_STRING_LINE3__
|
||||
#endif
|
||||
|
||||
#ifndef TALLOC_DEPRECATED
|
||||
#define TALLOC_DEPRECATED 0
|
||||
#endif
|
||||
|
||||
#ifndef PRINTF_ATTRIBUTE
|
||||
#if (__GNUC__ >= 3)
|
||||
/** Use gcc attribute to check printf fns. a1 is the 1-based index of
|
||||
* the parameter containing the format, and a2 the index of the first
|
||||
* argument. Note that some gcc 2.x versions don't handle this
|
||||
* properly **/
|
||||
#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
|
||||
#else
|
||||
#define PRINTF_ATTRIBUTE(a1, a2)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* try to make talloc_set_destructor() and talloc_steal() type safe,
|
||||
if we have a recent gcc */
|
||||
#if (__GNUC__ >= 3)
|
||||
#define _TALLOC_TYPEOF(ptr) __typeof__(ptr)
|
||||
#define talloc_set_destructor(ptr, function) \
|
||||
do { \
|
||||
int (*_talloc_destructor_fn)(_TALLOC_TYPEOF(ptr)) = (function); \
|
||||
_talloc_set_destructor((ptr), (int (*)(void *))_talloc_destructor_fn); \
|
||||
} while(0)
|
||||
/* this extremely strange macro is to avoid some braindamaged warning
|
||||
stupidity in gcc 4.1.x */
|
||||
#define talloc_steal(ctx, ptr) ({ _TALLOC_TYPEOF(ptr) __talloc_steal_ret = (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; })
|
||||
#else
|
||||
#define talloc_set_destructor(ptr, function) \
|
||||
_talloc_set_destructor((ptr), (int (*)(void *))(function))
|
||||
#define _TALLOC_TYPEOF(ptr) void *
|
||||
#define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr))
|
||||
#endif
|
||||
|
||||
#define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr))
|
||||
#define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(*(ptr)))_talloc_move((ctx),(void *)(ptr))
|
||||
|
||||
/* useful macros for creating type checked pointers */
|
||||
#define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type)
|
||||
#define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__)
|
||||
#define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(ptr)))
|
||||
|
||||
#define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__)
|
||||
|
||||
#define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type)
|
||||
#define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__)
|
||||
|
||||
#define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type)
|
||||
#define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type)
|
||||
#define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__)
|
||||
#define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_size(ctx, sizeof(*(ptr)), count)
|
||||
#define talloc_array_length(ctx) (talloc_get_size(ctx)/sizeof(*ctx))
|
||||
|
||||
#define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type)
|
||||
#define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__)
|
||||
|
||||
#define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__)
|
||||
|
||||
#define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type)
|
||||
#define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type)
|
||||
#define talloc_get_type_abort(ptr, type) (type *)_talloc_get_type_abort(ptr, #type, __location__)
|
||||
|
||||
#define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(ptr, #type)
|
||||
|
||||
#if TALLOC_DEPRECATED
|
||||
#define talloc_zero_p(ctx, type) talloc_zero(ctx, type)
|
||||
#define talloc_p(ctx, type) talloc(ctx, type)
|
||||
#define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count)
|
||||
#define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count)
|
||||
#define talloc_destroy(ctx) talloc_free(ctx)
|
||||
#define talloc_append_string(c, s, a) (s?talloc_strdup_append(s,a):talloc_strdup(c, a))
|
||||
#endif
|
||||
|
||||
#define TALLOC_FREE(ctx) do { talloc_free(ctx); ctx=NULL; } while(0)
|
||||
|
||||
/* The following definitions come from talloc.c */
|
||||
void *_talloc(const void *context, size_t size);
|
||||
void *talloc_pool(const void *context, size_t size);
|
||||
void _talloc_set_destructor(const void *ptr, int (*_destructor)(void *));
|
||||
int talloc_increase_ref_count(const void *ptr);
|
||||
size_t talloc_reference_count(const void *ptr);
|
||||
void *_talloc_reference(const void *context, const void *ptr);
|
||||
int talloc_unlink(const void *context, void *ptr);
|
||||
const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
|
||||
void talloc_set_name_const(const void *ptr, const char *name);
|
||||
void *talloc_named(const void *context, size_t size,
|
||||
const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
|
||||
void *talloc_named_const(const void *context, size_t size, const char *name);
|
||||
const char *talloc_get_name(const void *ptr);
|
||||
void *talloc_check_name(const void *ptr, const char *name);
|
||||
void *_talloc_get_type_abort(const void *ptr, const char *name, const char *location);
|
||||
void *talloc_parent(const void *ptr);
|
||||
const char *talloc_parent_name(const void *ptr);
|
||||
void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);
|
||||
int talloc_free(void *ptr);
|
||||
void talloc_free_children(void *ptr);
|
||||
void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name);
|
||||
void *_talloc_steal(const void *new_ctx, const void *ptr);
|
||||
void *_talloc_move(const void *new_ctx, const void *pptr);
|
||||
size_t talloc_total_size(const void *ptr);
|
||||
size_t talloc_total_blocks(const void *ptr);
|
||||
void talloc_report_depth_cb(const void *ptr, int depth, int max_depth,
|
||||
void (*callback)(const void *ptr,
|
||||
int depth, int max_depth,
|
||||
int is_ref,
|
||||
void *private_data),
|
||||
void *private_data);
|
||||
void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f);
|
||||
void talloc_report_full(const void *ptr, FILE *f);
|
||||
void talloc_report(const void *ptr, FILE *f);
|
||||
void talloc_enable_null_tracking(void);
|
||||
void talloc_disable_null_tracking(void);
|
||||
void talloc_enable_leak_report(void);
|
||||
void talloc_enable_leak_report_full(void);
|
||||
void *_talloc_zero(const void *ctx, size_t size, const char *name);
|
||||
void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name);
|
||||
void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name);
|
||||
void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name);
|
||||
void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name);
|
||||
void *talloc_realloc_fn(const void *context, void *ptr, size_t size);
|
||||
void *talloc_autofree_context(void);
|
||||
size_t talloc_get_size(const void *ctx);
|
||||
void *talloc_find_parent_byname(const void *ctx, const char *name);
|
||||
void talloc_show_parents(const void *context, FILE *file);
|
||||
int talloc_is_parent(const void *context, const void *ptr);
|
||||
|
||||
char *talloc_strdup(const void *t, const char *p);
|
||||
char *talloc_strdup_append(char *s, const char *a);
|
||||
char *talloc_strdup_append_buffer(char *s, const char *a);
|
||||
|
||||
char *talloc_strndup(const void *t, const char *p, size_t n);
|
||||
char *talloc_strndup_append(char *s, const char *a, size_t n);
|
||||
char *talloc_strndup_append_buffer(char *s, const char *a, size_t n);
|
||||
|
||||
char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
|
||||
char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
|
||||
char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
|
||||
|
||||
char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
|
||||
char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
|
||||
char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
|
||||
|
||||
void talloc_set_abort_fn(void (*abort_fn)(const char *reason));
|
||||
|
||||
#endif
|
|
@ -9,7 +9,7 @@ libbsc_a_SOURCES = abis_rsl.c abis_nm.c gsm_04_08.c gsm_data.c mncc.c \
|
|||
gsm_subscriber.c msgb.c select.c chan_alloc.c timer.c debug.c db.c \
|
||||
gsm_04_11.c telnet_interface.c subchan_demux.c \
|
||||
trau_frame.c trau_mux.c paging.c e1_config.c e1_input.c tlv_parser.c \
|
||||
input/misdn.c input/ipaccess.c signal.c gsm_utils.c
|
||||
input/misdn.c input/ipaccess.c signal.c gsm_utils.c talloc.c
|
||||
|
||||
libvty_a_SOURCES = vty/buffer.c vty/command.c vty/vector.c vty/vty.c
|
||||
|
||||
|
@ -17,7 +17,7 @@ bsc_hack_SOURCES = bsc_hack.c vty_interface.c
|
|||
bsc_hack_LDADD = libbsc.a libvty.a -ldl -ldbi $(LIBCRYPT)
|
||||
|
||||
bs11_config_SOURCES = bs11_config.c abis_nm.c gsm_data.c msgb.c debug.c \
|
||||
select.c timer.c rs232.c tlv_parser.c signal.c
|
||||
select.c timer.c rs232.c tlv_parser.c signal.c talloc.c
|
||||
|
||||
ipaccess_find_SOURCES = ipaccess-find.c select.c timer.c
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include <openbsc/abis_nm.h>
|
||||
#include <openbsc/misdn.h>
|
||||
#include <openbsc/signal.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
#define OM_ALLOC_SIZE 1024
|
||||
#define OM_HEADROOM_SIZE 128
|
||||
|
@ -2008,6 +2009,8 @@ int abis_nm_bs11_get_state(struct gsm_bts *bts)
|
|||
|
||||
/* BS11 SWL */
|
||||
|
||||
static void *tall_fle_ctx;
|
||||
|
||||
struct abis_nm_bs11_sw {
|
||||
struct gsm_bts *bts;
|
||||
char swl_fname[PATH_MAX];
|
||||
|
@ -2043,6 +2046,10 @@ static int bs11_read_swl_file(struct abis_nm_bs11_sw *bs11_sw)
|
|||
FILE *swl;
|
||||
int rc = 0;
|
||||
|
||||
if (!tall_fle_ctx)
|
||||
tall_fle_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"bs11_file_list_entry");
|
||||
|
||||
swl = fopen(bs11_sw->swl_fname, "r");
|
||||
if (!swl)
|
||||
return -ENODEV;
|
||||
|
@ -2050,7 +2057,7 @@ static int bs11_read_swl_file(struct abis_nm_bs11_sw *bs11_sw)
|
|||
/* zero the stale file list, if any */
|
||||
llist_for_each_safe(lh, lh2, &bs11_sw->file_list) {
|
||||
llist_del(lh);
|
||||
free(lh);
|
||||
talloc_free(lh);
|
||||
}
|
||||
|
||||
while (fgets(linebuf, sizeof(linebuf), swl)) {
|
||||
|
@ -2071,7 +2078,7 @@ static int bs11_read_swl_file(struct abis_nm_bs11_sw *bs11_sw)
|
|||
if (rc < 2)
|
||||
continue;
|
||||
|
||||
fle = malloc(sizeof(*fle));
|
||||
fle = talloc(tall_fle_ctx, struct file_list_entry);
|
||||
if (!fle) {
|
||||
rc = -ENOMEM;
|
||||
goto out;
|
||||
|
|
|
@ -47,6 +47,9 @@
|
|||
#include <openbsc/paging.h>
|
||||
#include <openbsc/e1_input.h>
|
||||
#include <openbsc/signal.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
void *tall_bsc_ctx;
|
||||
|
||||
/* global pointer to the gsm network data structure */
|
||||
static struct gsm_network *gsmnet;
|
||||
|
@ -1078,7 +1081,7 @@ static void print_help()
|
|||
static void handle_options(int argc, char** argv)
|
||||
{
|
||||
while (1) {
|
||||
int tmp, option_index = 0, c;
|
||||
int option_index = 0, c;
|
||||
static struct option long_options[] = {
|
||||
{"help", 0, 0, 'h'},
|
||||
{"debug", 1, 0, 'd'},
|
||||
|
@ -1170,6 +1173,9 @@ static void signal_handler(int signal)
|
|||
case SIGABRT:
|
||||
shutdown_net(gsmnet);
|
||||
break;
|
||||
case SIGUSR1:
|
||||
talloc_report_full(tall_bsc_ctx, stderr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1179,6 +1185,8 @@ int main(int argc, char **argv)
|
|||
{
|
||||
int rc;
|
||||
|
||||
tall_bsc_ctx = talloc_named_const(NULL, 1, "openbsc");
|
||||
|
||||
/* parse options */
|
||||
handle_options(argc, argv);
|
||||
|
||||
|
@ -1191,6 +1199,7 @@ int main(int argc, char **argv)
|
|||
|
||||
signal(SIGHUP, &signal_handler);
|
||||
signal(SIGABRT, &signal_handler);
|
||||
signal(SIGUSR1, &signal_handler);
|
||||
|
||||
while (1) {
|
||||
bsc_upqueue(gsmnet);
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <openbsc/trau_frame.h>
|
||||
#include <openbsc/trau_mux.h>
|
||||
#include <openbsc/misdn.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
#define SAPI_L2ML 0
|
||||
#define SAPI_OML 62
|
||||
|
@ -24,7 +25,7 @@ int e1_config(struct gsm_bts *bts, int cardnr, int release_l2)
|
|||
struct e1inp_ts *sign_ts;
|
||||
struct e1inp_sign_link *oml_link, *rsl_link;
|
||||
|
||||
line = malloc(sizeof(*line));
|
||||
line = talloc(tall_bsc_ctx, struct e1inp_line);
|
||||
if (!line)
|
||||
return -ENOMEM;
|
||||
memset(line, 0, sizeof(*line));
|
||||
|
@ -79,9 +80,9 @@ int ia_config_connect(struct gsm_bts *bts, struct sockaddr_in *sin)
|
|||
struct e1inp_ts *sign_ts, *rsl_ts;
|
||||
struct e1inp_sign_link *oml_link, *rsl_link;
|
||||
|
||||
line = malloc(sizeof(*line));
|
||||
line = talloc(tall_bsc_ctx, struct e1inp_line);
|
||||
if (!line)
|
||||
return NULL;
|
||||
return -ENOMEM;
|
||||
memset(line, 0, sizeof(*line));
|
||||
|
||||
/* create E1 timeslots for signalling and TRAU frames */
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
#include <openbsc/subchan_demux.h>
|
||||
#include <openbsc/trau_frame.h>
|
||||
#include <openbsc/trau_mux.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
#define NUM_E1_TS 32
|
||||
|
||||
|
@ -60,6 +61,8 @@ LLIST_HEAD(e1inp_driver_list);
|
|||
/* list of all E1 lines */
|
||||
LLIST_HEAD(e1inp_line_list);
|
||||
|
||||
static void *tall_sigl_ctx;
|
||||
|
||||
/* to be implemented, e.g. by bsc_hack.c */
|
||||
void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx);
|
||||
|
||||
|
@ -366,7 +369,11 @@ e1inp_sign_link_create(struct e1inp_ts *ts, enum e1inp_sign_type type,
|
|||
if (ts->type != E1INP_TS_TYPE_SIGN)
|
||||
return NULL;
|
||||
|
||||
link = malloc(sizeof(*link));
|
||||
if (!tall_sigl_ctx)
|
||||
tall_sigl_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"e1inp_sign_link");
|
||||
|
||||
link = talloc(tall_sigl_ctx, struct e1inp_sign_link);
|
||||
if (!link)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include <openbsc/signal.h>
|
||||
#include <openbsc/trau_frame.h>
|
||||
#include <openbsc/trau_mux.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
#define GSM48_ALLOC_SIZE 1024
|
||||
#define GSM48_ALLOC_HEADROOM 128
|
||||
|
@ -52,6 +53,9 @@
|
|||
#define GSM_MAX_SSVERSION 128
|
||||
#define GSM_MAX_USERUSER 128
|
||||
|
||||
static void *tall_locop_ctx;
|
||||
static void *tall_trans_ctx;
|
||||
|
||||
static const struct tlv_definition rsl_att_tlvdef = {
|
||||
.def = {
|
||||
[GSM48_IE_MOBILE_ID] = { TLV_TYPE_TLV },
|
||||
|
@ -337,7 +341,7 @@ static void release_loc_updating_req(struct gsm_lchan *lchan)
|
|||
return;
|
||||
|
||||
bsc_del_timer(&lchan->loc_operation->updating_timer);
|
||||
free(lchan->loc_operation);
|
||||
talloc_free(lchan->loc_operation);
|
||||
lchan->loc_operation = 0;
|
||||
put_lchan(lchan);
|
||||
}
|
||||
|
@ -347,8 +351,11 @@ static void allocate_loc_updating_req(struct gsm_lchan *lchan)
|
|||
use_lchan(lchan);
|
||||
release_loc_updating_req(lchan);
|
||||
|
||||
lchan->loc_operation = (struct gsm_loc_updating_operation *)
|
||||
malloc(sizeof(*lchan->loc_operation));
|
||||
if (!tall_locop_ctx)
|
||||
tall_locop_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"loc_updating_oper");
|
||||
lchan->loc_operation = talloc(tall_locop_ctx,
|
||||
struct gsm_loc_updating_operation);
|
||||
memset(lchan->loc_operation, 0, sizeof(*lchan->loc_operation));
|
||||
}
|
||||
|
||||
|
@ -1911,7 +1918,7 @@ void free_trans(struct gsm_trans *trans)
|
|||
|
||||
llist_del(&trans->entry);
|
||||
|
||||
free(trans);
|
||||
talloc_free(trans);
|
||||
}
|
||||
|
||||
static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg);
|
||||
|
@ -3420,7 +3427,7 @@ int mncc_send(struct gsm_network *net, int msg_type, void *arg)
|
|||
GSM48_CC_CAUSE_DEST_OOO);
|
||||
}
|
||||
/* Create transaction */
|
||||
if (!(trans = calloc(1, sizeof(struct gsm_trans)))) {
|
||||
if (!(trans = talloc(tall_trans_ctx, struct gsm_trans))) {
|
||||
DEBUGP(DCC, "No memory for trans.\n");
|
||||
subscr_put(subscr);
|
||||
/* Ressource unavailable */
|
||||
|
@ -3626,7 +3633,7 @@ static int gsm0408_rcv_cc(struct msgb *msg)
|
|||
DEBUGP(DCC, "Unknown transaction ID %02x, "
|
||||
"creating new trans.\n", transaction_id);
|
||||
/* Create transaction */
|
||||
if (!(trans = calloc(1, sizeof(struct gsm_trans)))) {
|
||||
if (!(trans = talloc(tall_trans_ctx, struct gsm_trans))) {
|
||||
DEBUGP(DCC, "No memory for trans.\n");
|
||||
rc = gsm48_tx_simple(msg->lchan,
|
||||
GSM48_PDISC_CC | transaction_id,
|
||||
|
|
|
@ -41,10 +41,14 @@
|
|||
#include <openbsc/abis_rsl.h>
|
||||
#include <openbsc/signal.h>
|
||||
#include <openbsc/db.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
#define GSM411_ALLOC_SIZE 1024
|
||||
#define GSM411_ALLOC_HEADROOM 128
|
||||
|
||||
static void *tall_sms_ctx;
|
||||
static void *tall_gsms_ctx;
|
||||
|
||||
struct msgb *gsm411_msgb_alloc(void)
|
||||
{
|
||||
return msgb_alloc_headroom(GSM411_ALLOC_SIZE, GSM411_ALLOC_HEADROOM);
|
||||
|
@ -139,8 +143,8 @@ static int gsm340_rx_sms_submit(struct msgb *msg, struct sms_submit *sms,
|
|||
{
|
||||
if (db_sms_store(gsms) != 0) {
|
||||
DEBUGP(DSMS, "Failed to store SMS in Database\n");
|
||||
free(sms);
|
||||
free(gsms);
|
||||
talloc_free(sms);
|
||||
talloc_free(gsms);
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
|
@ -156,14 +160,22 @@ static int gsm340_rx_tpdu(struct msgb *msg)
|
|||
u_int8_t address_lv[12]; /* according to 03.40 / 9.1.2.5 */
|
||||
int rc = 0;
|
||||
|
||||
sms = malloc(sizeof(*sms));
|
||||
if (!tall_sms_ctx)
|
||||
tall_sms_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"sms_submit");
|
||||
|
||||
sms = talloc(tall_sms_ctx, struct sms_submit);
|
||||
if (!sms)
|
||||
return -ENOMEM;
|
||||
memset(sms, 0, sizeof(*sms));
|
||||
|
||||
gsms = malloc(sizeof(*gsms));
|
||||
if (!tall_gsms_ctx)
|
||||
tall_gsms_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"sms");
|
||||
|
||||
gsms = talloc(tall_gsms_ctx, struct gsm_sms);
|
||||
if (!gsms) {
|
||||
free(sms);
|
||||
talloc_free(sms);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(gsms, 0, sizeof(*gsms));
|
||||
|
@ -268,8 +280,8 @@ static int gsm340_rx_tpdu(struct msgb *msg)
|
|||
}
|
||||
|
||||
out:
|
||||
free(gsms);
|
||||
free(sms);
|
||||
talloc_free(gsms);
|
||||
talloc_free(sms);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <openbsc/talloc.h>
|
||||
#include <openbsc/gsm_subscriber.h>
|
||||
#include <openbsc/paging.h>
|
||||
#include <openbsc/debug.h>
|
||||
|
@ -34,6 +35,8 @@
|
|||
#include <openbsc/db.h>
|
||||
|
||||
LLIST_HEAD(active_subscribers);
|
||||
static void *tall_subscr_ctx;
|
||||
static void *tall_sub_req_ctx;
|
||||
|
||||
/*
|
||||
* Struct for pending channel requests. This is managed in the
|
||||
|
@ -82,7 +85,7 @@ static int subscr_paging_cb(unsigned int hooknum, unsigned int event,
|
|||
request->cbfn(hooknum, event, msg, data, request->param);
|
||||
subscr->in_callback = 0;
|
||||
|
||||
free(request);
|
||||
talloc_free(request);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -100,7 +103,11 @@ struct gsm_subscriber *subscr_alloc(void)
|
|||
{
|
||||
struct gsm_subscriber *s;
|
||||
|
||||
s = malloc(sizeof(struct gsm_subscriber));
|
||||
if (!tall_subscr_ctx)
|
||||
tall_subscr_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"subscriber");
|
||||
|
||||
s = talloc(tall_subscr_ctx, struct gsm_subscriber);
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
|
@ -116,7 +123,7 @@ struct gsm_subscriber *subscr_alloc(void)
|
|||
static void subscr_free(struct gsm_subscriber *subscr)
|
||||
{
|
||||
llist_del(&subscr->entry);
|
||||
free(subscr);
|
||||
talloc_free(subscr);
|
||||
}
|
||||
|
||||
struct gsm_subscriber *subscr_get_by_tmsi(const char *tmsi)
|
||||
|
@ -202,7 +209,11 @@ void subscr_get_channel(struct gsm_subscriber *subscr,
|
|||
{
|
||||
struct subscr_request *request;
|
||||
|
||||
request = (struct subscr_request *)malloc(sizeof(*request));
|
||||
if (!tall_sub_req_ctx)
|
||||
tall_sub_req_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"subscr_request");
|
||||
|
||||
request = talloc(tall_sub_req_ctx, struct subscr_request);
|
||||
if (!request) {
|
||||
if (cbfn)
|
||||
cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_OOM,
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include <openbsc/subchan_demux.h>
|
||||
#include <openbsc/e1_input.h>
|
||||
#include <openbsc/ipaccess.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
/* data structure for one E1 interface with A-bis */
|
||||
struct ia_e1_handle {
|
||||
|
@ -429,7 +430,7 @@ static int listen_fd_cb(struct bsc_fd *listen_bfd, unsigned int what)
|
|||
}
|
||||
DEBUGP(DINP, "accept()ed new OML link from %s\n", inet_ntoa(sa.sin_addr));
|
||||
|
||||
line = malloc(sizeof(*line));
|
||||
line = talloc(tall_bsc_ctx, struct e1inp_line);
|
||||
if (!line) {
|
||||
close(ret);
|
||||
return -ENOMEM;
|
||||
|
@ -467,7 +468,7 @@ static int rsl_listen_fd_cb(struct bsc_fd *listen_bfd, unsigned int what)
|
|||
{
|
||||
struct sockaddr_in sa;
|
||||
socklen_t sa_len = sizeof(sa);
|
||||
struct bsc_fd *bfd = malloc(sizeof(*bfd));
|
||||
struct bsc_fd *bfd = talloc(tall_bsc_ctx, struct bsc_fd);
|
||||
int ret;
|
||||
|
||||
if (!(what & BSC_FD_READ))
|
||||
|
@ -581,7 +582,7 @@ int ipaccess_setup(struct gsm_network *gsmnet)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
e1h = malloc(sizeof(*e1h));
|
||||
e1h = talloc(tall_bsc_ctx, struct ia_e1_handle);
|
||||
memset(e1h, 0, sizeof(*e1h));
|
||||
e1h->gsmnet = gsmnet;
|
||||
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
#include <openbsc/abis_rsl.h>
|
||||
#include <openbsc/subchan_demux.h>
|
||||
#include <openbsc/e1_input.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
/* data structure for one E1 interface with A-bis */
|
||||
struct mi_e1_handle {
|
||||
|
@ -136,7 +137,7 @@ static int handle_ts1_read(struct bsc_fd *bfd)
|
|||
link = e1inp_lookup_sign_link(e1i_ts, l2addr.tei, l2addr.sapi);
|
||||
if (!link) {
|
||||
DEBUGPC(DMI, "mISDN message for unknown sign_link\n");
|
||||
free(msg);
|
||||
msgb_free(msg);
|
||||
return -EINVAL;
|
||||
}
|
||||
/* save the channel number in the driver private struct */
|
||||
|
@ -483,7 +484,7 @@ int mi_setup(int cardnr, struct e1inp_line *line, int release_l2)
|
|||
|
||||
/* create the actual line instance */
|
||||
/* FIXME: do this independent of driver registration */
|
||||
e1h = malloc(sizeof(*e1h));
|
||||
e1h = talloc(tall_bsc_ctx, struct mi_e1_handle);
|
||||
memset(e1h, 0, sizeof(*e1h));
|
||||
|
||||
e1h->cardnr = cardnr;
|
||||
|
|
|
@ -27,6 +27,10 @@
|
|||
#include <openbsc/gsm_04_08.h>
|
||||
#include <openbsc/debug.h>
|
||||
#include <openbsc/mncc.h>
|
||||
#include <openbsc/talloc.h>
|
||||
#include <openbsc/gsm_data.h>
|
||||
|
||||
static void *tall_call_ctx;
|
||||
|
||||
static struct mncc_names {
|
||||
char *name;
|
||||
|
@ -103,7 +107,7 @@ static void free_call(struct gsm_call *call)
|
|||
{
|
||||
llist_del(&call->entry);
|
||||
DEBUGP(DMNCC, "(call %x) Call removed.\n", call->callref);
|
||||
free(call);
|
||||
talloc_free(call);
|
||||
}
|
||||
|
||||
|
||||
|
@ -136,8 +140,11 @@ static int mncc_setup_ind(struct gsm_call *call, int msg_type,
|
|||
if (call->remote_ref)
|
||||
return 0;
|
||||
|
||||
if (!tall_call_ctx)
|
||||
tall_call_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"gsm_call");
|
||||
/* create remote call */
|
||||
if (!(remote = calloc(1, sizeof(struct gsm_call)))) {
|
||||
if (!(remote = talloc(tall_call_ctx, struct gsm_call))) {
|
||||
memset(&mncc, 0, sizeof(struct gsm_mncc));
|
||||
mncc.callref = call->callref;
|
||||
mncc_set_cause(&mncc, GSM48_CAUSE_LOC_PRN_S_LU,
|
||||
|
@ -299,8 +306,11 @@ int mncc_recv(struct gsm_network *net, int msg_type, void *arg)
|
|||
if (!call) {
|
||||
if (msg_type != MNCC_SETUP_IND)
|
||||
return 0; /* drop */
|
||||
if (!tall_call_ctx)
|
||||
tall_call_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"gsm_call");
|
||||
/* create call */
|
||||
if (!(call = calloc(1, sizeof(struct gsm_call)))) {
|
||||
if (!(call = talloc(tall_call_ctx, struct gsm_call))) {
|
||||
struct gsm_mncc rel;
|
||||
|
||||
memset(&rel, 0, sizeof(struct gsm_mncc));
|
||||
|
|
|
@ -24,10 +24,19 @@
|
|||
#include <sys/types.h>
|
||||
|
||||
#include <openbsc/msgb.h>
|
||||
#include <openbsc/gsm_data.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
static void *tall_msgb_ctx;
|
||||
|
||||
struct msgb *msgb_alloc(u_int16_t size)
|
||||
{
|
||||
struct msgb *msg = malloc(sizeof(*msg) + size);
|
||||
struct msgb *msg;
|
||||
|
||||
if (!tall_msgb_ctx)
|
||||
tall_msgb_ctx = talloc_named_const(tall_bsc_ctx, 1, "msgb");
|
||||
|
||||
msg = talloc_size(tall_msgb_ctx, sizeof(*msg) + size);
|
||||
|
||||
if (!msg)
|
||||
return NULL;
|
||||
|
@ -48,7 +57,7 @@ struct msgb *msgb_alloc(u_int16_t size)
|
|||
|
||||
void msgb_free(struct msgb *m)
|
||||
{
|
||||
free(m);
|
||||
talloc_free(m);
|
||||
}
|
||||
|
||||
void msgb_enqueue(struct llist_head *queue, struct msgb *msg)
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include <assert.h>
|
||||
|
||||
#include <openbsc/paging.h>
|
||||
#include <openbsc/talloc.h>
|
||||
#include <openbsc/debug.h>
|
||||
#include <openbsc/signal.h>
|
||||
#include <openbsc/abis_rsl.h>
|
||||
|
@ -48,6 +49,8 @@
|
|||
#define PAGING_TIMEOUT 1, 75000
|
||||
#define MAX_PAGING_REQUEST 750
|
||||
|
||||
static void *tall_paging_ctx;
|
||||
|
||||
static unsigned int calculate_group(struct gsm_bts *bts, struct gsm_subscriber *subscr)
|
||||
{
|
||||
int ccch_conf;
|
||||
|
@ -81,7 +84,7 @@ static void paging_remove_request(struct gsm_bts_paging_state *paging_bts,
|
|||
bsc_del_timer(&to_be_deleted->T3113);
|
||||
llist_del(&to_be_deleted->entry);
|
||||
subscr_put(to_be_deleted->subscr);
|
||||
free(to_be_deleted);
|
||||
talloc_free(to_be_deleted);
|
||||
}
|
||||
|
||||
static void page_ms(struct gsm_paging_request *request)
|
||||
|
@ -216,13 +219,16 @@ static void _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
|
|||
struct gsm_bts_paging_state *bts_entry = &bts->paging;
|
||||
struct gsm_paging_request *req;
|
||||
|
||||
if (!tall_paging_ctx)
|
||||
tall_paging_ctx = talloc_named_const(NULL, 1, "paging_request");
|
||||
|
||||
if (paging_pending_request(bts_entry, subscr)) {
|
||||
DEBUGP(DPAG, "Paging request already pending\n");
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUGP(DPAG, "Start paging on bts %d.\n", bts->nr);
|
||||
req = (struct gsm_paging_request *)malloc(sizeof(*req));
|
||||
req = talloc(tall_paging_ctx, struct gsm_paging_request);
|
||||
memset(req, 0, sizeof(*req));
|
||||
req->subscr = subscr_get(subscr);
|
||||
req->bts = bts;
|
||||
|
|
|
@ -19,10 +19,12 @@
|
|||
*/
|
||||
|
||||
#include <openbsc/signal.h>
|
||||
#include <openbsc/talloc.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
static void *tall_sigh_ctx;
|
||||
static LLIST_HEAD(signal_handler_list);
|
||||
|
||||
struct signal_handler {
|
||||
|
@ -35,8 +37,12 @@ struct signal_handler {
|
|||
|
||||
int register_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data)
|
||||
{
|
||||
struct signal_handler *sig_data = malloc(sizeof(*sig_data));
|
||||
struct signal_handler *sig_data;
|
||||
|
||||
if (!tall_sigh_ctx)
|
||||
tall_sigh_ctx = talloc_named_const(NULL, 1, "signal_handler");
|
||||
|
||||
sig_data = talloc(tall_sigh_ctx, struct signal_handler);
|
||||
if (!sig_data)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -61,7 +67,7 @@ void unregister_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *dat
|
|||
if (handler->cbfn == cbfn && handler->data == data
|
||||
&& subsys == handler->subsys) {
|
||||
llist_del(&handler->entry);
|
||||
free(handler);
|
||||
talloc_free(handler);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
#include <openbsc/subchan_demux.h>
|
||||
#include <openbsc/trau_frame.h>
|
||||
#include <openbsc/debug.h>
|
||||
#include <openbsc/talloc.h>
|
||||
#include <openbsc/gsm_data.h>
|
||||
|
||||
static void *tall_tqe_ctx;
|
||||
|
||||
static inline void append_bit(struct demux_subch *sch, u_int8_t bit)
|
||||
{
|
||||
|
@ -201,7 +205,7 @@ static int get_subch_bits(struct subch_mux *mx, int subch,
|
|||
/* free the tx_queue entry if it is fully consumed */
|
||||
if (txe->next_bit >= txe->bit_len) {
|
||||
llist_del(&txe->list);
|
||||
free(txe);
|
||||
talloc_free(txe);
|
||||
}
|
||||
|
||||
/* increment global number of bits dequeued */
|
||||
|
@ -277,7 +281,7 @@ static void tx_queue_evict(struct mux_subch *sch, int num_evict)
|
|||
|
||||
tqe = llist_entry(sch->tx_queue.next, struct subch_txq_entry, list);
|
||||
llist_del(&tqe->list);
|
||||
free(tqe);
|
||||
talloc_free(tqe);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -286,9 +290,9 @@ int subchan_mux_enqueue(struct subch_mux *mx, int s_nr, const u_int8_t *data,
|
|||
int len)
|
||||
{
|
||||
struct mux_subch *sch = &mx->subch[s_nr];
|
||||
struct subch_txq_entry *tqe = malloc(sizeof(*tqe) + len);
|
||||
int list_len = llist_len(&sch->tx_queue);
|
||||
|
||||
struct subch_txq_entry *tqe = talloc_size(tall_tqe_ctx,
|
||||
sizeof(*tqe) + len);
|
||||
if (!tqe)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -309,6 +313,9 @@ int subchan_mux_init(struct subch_mux *mx)
|
|||
{
|
||||
int i;
|
||||
|
||||
if (!tall_tqe_ctx)
|
||||
tall_tqe_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"subch_txq_entry");
|
||||
memset(mx, 0, sizeof(*mx));
|
||||
for (i = 0; i < NR_SUBCH; i++) {
|
||||
struct mux_subch *sch = &mx->subch[i];
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -34,6 +34,7 @@
|
|||
#include <openbsc/abis_rsl.h>
|
||||
#include <openbsc/paging.h>
|
||||
#include <openbsc/signal.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
#include <vty/buffer.h>
|
||||
|
||||
|
@ -47,6 +48,8 @@
|
|||
/* per connection data */
|
||||
LLIST_HEAD(active_connections);
|
||||
|
||||
static void *tall_telnet_ctx;
|
||||
|
||||
/* per network data */
|
||||
static int telnet_new_connection(struct bsc_fd *fd, unsigned int what);
|
||||
#if 0
|
||||
|
@ -66,6 +69,9 @@ void telnet_init(struct gsm_network *network, int port) {
|
|||
struct sockaddr_in sock_addr;
|
||||
int fd, on = 1;
|
||||
|
||||
tall_telnet_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"telnet_connection");
|
||||
|
||||
bsc_vty_init(network);
|
||||
|
||||
fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
|
@ -161,7 +167,7 @@ static int telnet_new_connection(struct bsc_fd *fd, unsigned int what) {
|
|||
}
|
||||
|
||||
|
||||
connection = (struct telnet_connection*)malloc(sizeof(*connection));
|
||||
connection = talloc(tall_telnet_ctx, struct telnet_connection);
|
||||
memset(connection, 0, sizeof(*connection));
|
||||
connection->network = (struct gsm_network*)fd->data;
|
||||
connection->fd.data = connection;
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <openbsc/subchan_demux.h>
|
||||
#include <openbsc/e1_input.h>
|
||||
#include <openbsc/debug.h>
|
||||
#include <openbsc/talloc.h>
|
||||
|
||||
struct map_entry {
|
||||
struct llist_head list;
|
||||
|
@ -46,11 +47,19 @@ struct upqueue_entry {
|
|||
static LLIST_HEAD(ss_map);
|
||||
static LLIST_HEAD(ss_upqueue);
|
||||
|
||||
static void *tall_map_ctx, *tall_upq_ctx;
|
||||
|
||||
/* map one particular subslot to another subslot */
|
||||
int trau_mux_map(const struct gsm_e1_subslot *src,
|
||||
const struct gsm_e1_subslot *dst)
|
||||
{
|
||||
struct map_entry *me = malloc(sizeof(*me));
|
||||
struct map_entry *me;
|
||||
|
||||
if (!tall_map_ctx)
|
||||
tall_map_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"trau_map_entry");
|
||||
|
||||
me = talloc(tall_map_ctx, struct map_entry);
|
||||
if (!me)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -189,8 +198,13 @@ int trau_mux_input(struct gsm_e1_subslot *src_e1_ss,
|
|||
int trau_recv_lchan(struct gsm_lchan *lchan, u_int32_t callref)
|
||||
{
|
||||
struct gsm_e1_subslot *src_ss;
|
||||
struct upqueue_entry *ue = malloc(sizeof(*ue));
|
||||
struct upqueue_entry *ue;
|
||||
|
||||
if (!tall_upq_ctx)
|
||||
tall_upq_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"trau_upq_entry");
|
||||
|
||||
ue = talloc(tall_upq_ctx, struct upqueue_entry);
|
||||
if (!ue)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
Loading…
Reference in New Issue