introduce talloc all over OpenBSC

This commit is contained in:
Harald Welte 2009-06-20 22:36:41 +02:00
parent 879dc971ff
commit 2cf161be08
20 changed files with 2149 additions and 47 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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 */

View File

@ -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;

View File

@ -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,

View File

@ -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;
}

View File

@ -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,

View File

@ -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;

View File

@ -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;

View File

@ -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));

View File

@ -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)

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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];

1796
openbsc/src/talloc.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -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;

View File

@ -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;