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);
|
char *gsm_band_name(enum gsm_band band);
|
||||||
enum gsm_band gsm_band_parse(int mhz);
|
enum gsm_band gsm_band_parse(int mhz);
|
||||||
|
|
||||||
|
void *tall_bsc_ctx;
|
||||||
|
|
||||||
static inline int is_ipaccess_bts(struct gsm_bts *bts)
|
static inline int is_ipaccess_bts(struct gsm_bts *bts)
|
||||||
{
|
{
|
||||||
switch (bts->type) {
|
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_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 \
|
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 \
|
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
|
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)
|
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 \
|
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
|
ipaccess_find_SOURCES = ipaccess-find.c select.c timer.c
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include <openbsc/abis_nm.h>
|
#include <openbsc/abis_nm.h>
|
||||||
#include <openbsc/misdn.h>
|
#include <openbsc/misdn.h>
|
||||||
#include <openbsc/signal.h>
|
#include <openbsc/signal.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
#define OM_ALLOC_SIZE 1024
|
#define OM_ALLOC_SIZE 1024
|
||||||
#define OM_HEADROOM_SIZE 128
|
#define OM_HEADROOM_SIZE 128
|
||||||
|
@ -2008,6 +2009,8 @@ int abis_nm_bs11_get_state(struct gsm_bts *bts)
|
||||||
|
|
||||||
/* BS11 SWL */
|
/* BS11 SWL */
|
||||||
|
|
||||||
|
static void *tall_fle_ctx;
|
||||||
|
|
||||||
struct abis_nm_bs11_sw {
|
struct abis_nm_bs11_sw {
|
||||||
struct gsm_bts *bts;
|
struct gsm_bts *bts;
|
||||||
char swl_fname[PATH_MAX];
|
char swl_fname[PATH_MAX];
|
||||||
|
@ -2043,6 +2046,10 @@ static int bs11_read_swl_file(struct abis_nm_bs11_sw *bs11_sw)
|
||||||
FILE *swl;
|
FILE *swl;
|
||||||
int rc = 0;
|
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");
|
swl = fopen(bs11_sw->swl_fname, "r");
|
||||||
if (!swl)
|
if (!swl)
|
||||||
return -ENODEV;
|
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 */
|
/* zero the stale file list, if any */
|
||||||
llist_for_each_safe(lh, lh2, &bs11_sw->file_list) {
|
llist_for_each_safe(lh, lh2, &bs11_sw->file_list) {
|
||||||
llist_del(lh);
|
llist_del(lh);
|
||||||
free(lh);
|
talloc_free(lh);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (fgets(linebuf, sizeof(linebuf), swl)) {
|
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)
|
if (rc < 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
fle = malloc(sizeof(*fle));
|
fle = talloc(tall_fle_ctx, struct file_list_entry);
|
||||||
if (!fle) {
|
if (!fle) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -47,6 +47,9 @@
|
||||||
#include <openbsc/paging.h>
|
#include <openbsc/paging.h>
|
||||||
#include <openbsc/e1_input.h>
|
#include <openbsc/e1_input.h>
|
||||||
#include <openbsc/signal.h>
|
#include <openbsc/signal.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
|
void *tall_bsc_ctx;
|
||||||
|
|
||||||
/* global pointer to the gsm network data structure */
|
/* global pointer to the gsm network data structure */
|
||||||
static struct gsm_network *gsmnet;
|
static struct gsm_network *gsmnet;
|
||||||
|
@ -1078,7 +1081,7 @@ static void print_help()
|
||||||
static void handle_options(int argc, char** argv)
|
static void handle_options(int argc, char** argv)
|
||||||
{
|
{
|
||||||
while (1) {
|
while (1) {
|
||||||
int tmp, option_index = 0, c;
|
int option_index = 0, c;
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
{"help", 0, 0, 'h'},
|
{"help", 0, 0, 'h'},
|
||||||
{"debug", 1, 0, 'd'},
|
{"debug", 1, 0, 'd'},
|
||||||
|
@ -1170,6 +1173,9 @@ static void signal_handler(int signal)
|
||||||
case SIGABRT:
|
case SIGABRT:
|
||||||
shutdown_net(gsmnet);
|
shutdown_net(gsmnet);
|
||||||
break;
|
break;
|
||||||
|
case SIGUSR1:
|
||||||
|
talloc_report_full(tall_bsc_ctx, stderr);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1179,6 +1185,8 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
tall_bsc_ctx = talloc_named_const(NULL, 1, "openbsc");
|
||||||
|
|
||||||
/* parse options */
|
/* parse options */
|
||||||
handle_options(argc, argv);
|
handle_options(argc, argv);
|
||||||
|
|
||||||
|
@ -1191,6 +1199,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
signal(SIGHUP, &signal_handler);
|
signal(SIGHUP, &signal_handler);
|
||||||
signal(SIGABRT, &signal_handler);
|
signal(SIGABRT, &signal_handler);
|
||||||
|
signal(SIGUSR1, &signal_handler);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
bsc_upqueue(gsmnet);
|
bsc_upqueue(gsmnet);
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <openbsc/trau_frame.h>
|
#include <openbsc/trau_frame.h>
|
||||||
#include <openbsc/trau_mux.h>
|
#include <openbsc/trau_mux.h>
|
||||||
#include <openbsc/misdn.h>
|
#include <openbsc/misdn.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
#define SAPI_L2ML 0
|
#define SAPI_L2ML 0
|
||||||
#define SAPI_OML 62
|
#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_ts *sign_ts;
|
||||||
struct e1inp_sign_link *oml_link, *rsl_link;
|
struct e1inp_sign_link *oml_link, *rsl_link;
|
||||||
|
|
||||||
line = malloc(sizeof(*line));
|
line = talloc(tall_bsc_ctx, struct e1inp_line);
|
||||||
if (!line)
|
if (!line)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
memset(line, 0, sizeof(*line));
|
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_ts *sign_ts, *rsl_ts;
|
||||||
struct e1inp_sign_link *oml_link, *rsl_link;
|
struct e1inp_sign_link *oml_link, *rsl_link;
|
||||||
|
|
||||||
line = malloc(sizeof(*line));
|
line = talloc(tall_bsc_ctx, struct e1inp_line);
|
||||||
if (!line)
|
if (!line)
|
||||||
return NULL;
|
return -ENOMEM;
|
||||||
memset(line, 0, sizeof(*line));
|
memset(line, 0, sizeof(*line));
|
||||||
|
|
||||||
/* create E1 timeslots for signalling and TRAU frames */
|
/* create E1 timeslots for signalling and TRAU frames */
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#include <openbsc/subchan_demux.h>
|
#include <openbsc/subchan_demux.h>
|
||||||
#include <openbsc/trau_frame.h>
|
#include <openbsc/trau_frame.h>
|
||||||
#include <openbsc/trau_mux.h>
|
#include <openbsc/trau_mux.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
#define NUM_E1_TS 32
|
#define NUM_E1_TS 32
|
||||||
|
|
||||||
|
@ -60,6 +61,8 @@ LLIST_HEAD(e1inp_driver_list);
|
||||||
/* list of all E1 lines */
|
/* list of all E1 lines */
|
||||||
LLIST_HEAD(e1inp_line_list);
|
LLIST_HEAD(e1inp_line_list);
|
||||||
|
|
||||||
|
static void *tall_sigl_ctx;
|
||||||
|
|
||||||
/* to be implemented, e.g. by bsc_hack.c */
|
/* to be implemented, e.g. by bsc_hack.c */
|
||||||
void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx);
|
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)
|
if (ts->type != E1INP_TS_TYPE_SIGN)
|
||||||
return NULL;
|
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)
|
if (!link)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include <openbsc/signal.h>
|
#include <openbsc/signal.h>
|
||||||
#include <openbsc/trau_frame.h>
|
#include <openbsc/trau_frame.h>
|
||||||
#include <openbsc/trau_mux.h>
|
#include <openbsc/trau_mux.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
#define GSM48_ALLOC_SIZE 1024
|
#define GSM48_ALLOC_SIZE 1024
|
||||||
#define GSM48_ALLOC_HEADROOM 128
|
#define GSM48_ALLOC_HEADROOM 128
|
||||||
|
@ -52,6 +53,9 @@
|
||||||
#define GSM_MAX_SSVERSION 128
|
#define GSM_MAX_SSVERSION 128
|
||||||
#define GSM_MAX_USERUSER 128
|
#define GSM_MAX_USERUSER 128
|
||||||
|
|
||||||
|
static void *tall_locop_ctx;
|
||||||
|
static void *tall_trans_ctx;
|
||||||
|
|
||||||
static const struct tlv_definition rsl_att_tlvdef = {
|
static const struct tlv_definition rsl_att_tlvdef = {
|
||||||
.def = {
|
.def = {
|
||||||
[GSM48_IE_MOBILE_ID] = { TLV_TYPE_TLV },
|
[GSM48_IE_MOBILE_ID] = { TLV_TYPE_TLV },
|
||||||
|
@ -337,7 +341,7 @@ static void release_loc_updating_req(struct gsm_lchan *lchan)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bsc_del_timer(&lchan->loc_operation->updating_timer);
|
bsc_del_timer(&lchan->loc_operation->updating_timer);
|
||||||
free(lchan->loc_operation);
|
talloc_free(lchan->loc_operation);
|
||||||
lchan->loc_operation = 0;
|
lchan->loc_operation = 0;
|
||||||
put_lchan(lchan);
|
put_lchan(lchan);
|
||||||
}
|
}
|
||||||
|
@ -347,8 +351,11 @@ static void allocate_loc_updating_req(struct gsm_lchan *lchan)
|
||||||
use_lchan(lchan);
|
use_lchan(lchan);
|
||||||
release_loc_updating_req(lchan);
|
release_loc_updating_req(lchan);
|
||||||
|
|
||||||
lchan->loc_operation = (struct gsm_loc_updating_operation *)
|
if (!tall_locop_ctx)
|
||||||
malloc(sizeof(*lchan->loc_operation));
|
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));
|
memset(lchan->loc_operation, 0, sizeof(*lchan->loc_operation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1911,7 +1918,7 @@ void free_trans(struct gsm_trans *trans)
|
||||||
|
|
||||||
llist_del(&trans->entry);
|
llist_del(&trans->entry);
|
||||||
|
|
||||||
free(trans);
|
talloc_free(trans);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg);
|
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);
|
GSM48_CC_CAUSE_DEST_OOO);
|
||||||
}
|
}
|
||||||
/* Create transaction */
|
/* 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");
|
DEBUGP(DCC, "No memory for trans.\n");
|
||||||
subscr_put(subscr);
|
subscr_put(subscr);
|
||||||
/* Ressource unavailable */
|
/* Ressource unavailable */
|
||||||
|
@ -3626,7 +3633,7 @@ static int gsm0408_rcv_cc(struct msgb *msg)
|
||||||
DEBUGP(DCC, "Unknown transaction ID %02x, "
|
DEBUGP(DCC, "Unknown transaction ID %02x, "
|
||||||
"creating new trans.\n", transaction_id);
|
"creating new trans.\n", transaction_id);
|
||||||
/* Create transaction */
|
/* 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");
|
DEBUGP(DCC, "No memory for trans.\n");
|
||||||
rc = gsm48_tx_simple(msg->lchan,
|
rc = gsm48_tx_simple(msg->lchan,
|
||||||
GSM48_PDISC_CC | transaction_id,
|
GSM48_PDISC_CC | transaction_id,
|
||||||
|
|
|
@ -41,10 +41,14 @@
|
||||||
#include <openbsc/abis_rsl.h>
|
#include <openbsc/abis_rsl.h>
|
||||||
#include <openbsc/signal.h>
|
#include <openbsc/signal.h>
|
||||||
#include <openbsc/db.h>
|
#include <openbsc/db.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
#define GSM411_ALLOC_SIZE 1024
|
#define GSM411_ALLOC_SIZE 1024
|
||||||
#define GSM411_ALLOC_HEADROOM 128
|
#define GSM411_ALLOC_HEADROOM 128
|
||||||
|
|
||||||
|
static void *tall_sms_ctx;
|
||||||
|
static void *tall_gsms_ctx;
|
||||||
|
|
||||||
struct msgb *gsm411_msgb_alloc(void)
|
struct msgb *gsm411_msgb_alloc(void)
|
||||||
{
|
{
|
||||||
return msgb_alloc_headroom(GSM411_ALLOC_SIZE, GSM411_ALLOC_HEADROOM);
|
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) {
|
if (db_sms_store(gsms) != 0) {
|
||||||
DEBUGP(DSMS, "Failed to store SMS in Database\n");
|
DEBUGP(DSMS, "Failed to store SMS in Database\n");
|
||||||
free(sms);
|
talloc_free(sms);
|
||||||
free(gsms);
|
talloc_free(gsms);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
return 0;
|
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 */
|
u_int8_t address_lv[12]; /* according to 03.40 / 9.1.2.5 */
|
||||||
int rc = 0;
|
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)
|
if (!sms)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
memset(sms, 0, sizeof(*sms));
|
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) {
|
if (!gsms) {
|
||||||
free(sms);
|
talloc_free(sms);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
memset(gsms, 0, sizeof(*gsms));
|
memset(gsms, 0, sizeof(*gsms));
|
||||||
|
@ -268,8 +280,8 @@ static int gsm340_rx_tpdu(struct msgb *msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
free(gsms);
|
talloc_free(gsms);
|
||||||
free(sms);
|
talloc_free(sms);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
#include <openbsc/gsm_subscriber.h>
|
#include <openbsc/gsm_subscriber.h>
|
||||||
#include <openbsc/paging.h>
|
#include <openbsc/paging.h>
|
||||||
#include <openbsc/debug.h>
|
#include <openbsc/debug.h>
|
||||||
|
@ -34,6 +35,8 @@
|
||||||
#include <openbsc/db.h>
|
#include <openbsc/db.h>
|
||||||
|
|
||||||
LLIST_HEAD(active_subscribers);
|
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
|
* 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);
|
request->cbfn(hooknum, event, msg, data, request->param);
|
||||||
subscr->in_callback = 0;
|
subscr->in_callback = 0;
|
||||||
|
|
||||||
free(request);
|
talloc_free(request);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +103,11 @@ struct gsm_subscriber *subscr_alloc(void)
|
||||||
{
|
{
|
||||||
struct gsm_subscriber *s;
|
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)
|
if (!s)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -116,7 +123,7 @@ struct gsm_subscriber *subscr_alloc(void)
|
||||||
static void subscr_free(struct gsm_subscriber *subscr)
|
static void subscr_free(struct gsm_subscriber *subscr)
|
||||||
{
|
{
|
||||||
llist_del(&subscr->entry);
|
llist_del(&subscr->entry);
|
||||||
free(subscr);
|
talloc_free(subscr);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gsm_subscriber *subscr_get_by_tmsi(const char *tmsi)
|
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;
|
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 (!request) {
|
||||||
if (cbfn)
|
if (cbfn)
|
||||||
cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_OOM,
|
cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_OOM,
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include <openbsc/subchan_demux.h>
|
#include <openbsc/subchan_demux.h>
|
||||||
#include <openbsc/e1_input.h>
|
#include <openbsc/e1_input.h>
|
||||||
#include <openbsc/ipaccess.h>
|
#include <openbsc/ipaccess.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
/* data structure for one E1 interface with A-bis */
|
/* data structure for one E1 interface with A-bis */
|
||||||
struct ia_e1_handle {
|
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));
|
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) {
|
if (!line) {
|
||||||
close(ret);
|
close(ret);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -467,7 +468,7 @@ static int rsl_listen_fd_cb(struct bsc_fd *listen_bfd, unsigned int what)
|
||||||
{
|
{
|
||||||
struct sockaddr_in sa;
|
struct sockaddr_in sa;
|
||||||
socklen_t sa_len = sizeof(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;
|
int ret;
|
||||||
|
|
||||||
if (!(what & BSC_FD_READ))
|
if (!(what & BSC_FD_READ))
|
||||||
|
@ -581,7 +582,7 @@ int ipaccess_setup(struct gsm_network *gsmnet)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
e1h = malloc(sizeof(*e1h));
|
e1h = talloc(tall_bsc_ctx, struct ia_e1_handle);
|
||||||
memset(e1h, 0, sizeof(*e1h));
|
memset(e1h, 0, sizeof(*e1h));
|
||||||
e1h->gsmnet = gsmnet;
|
e1h->gsmnet = gsmnet;
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@
|
||||||
#include <openbsc/abis_rsl.h>
|
#include <openbsc/abis_rsl.h>
|
||||||
#include <openbsc/subchan_demux.h>
|
#include <openbsc/subchan_demux.h>
|
||||||
#include <openbsc/e1_input.h>
|
#include <openbsc/e1_input.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
/* data structure for one E1 interface with A-bis */
|
/* data structure for one E1 interface with A-bis */
|
||||||
struct mi_e1_handle {
|
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);
|
link = e1inp_lookup_sign_link(e1i_ts, l2addr.tei, l2addr.sapi);
|
||||||
if (!link) {
|
if (!link) {
|
||||||
DEBUGPC(DMI, "mISDN message for unknown sign_link\n");
|
DEBUGPC(DMI, "mISDN message for unknown sign_link\n");
|
||||||
free(msg);
|
msgb_free(msg);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
/* save the channel number in the driver private struct */
|
/* 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 */
|
/* create the actual line instance */
|
||||||
/* FIXME: do this independent of driver registration */
|
/* 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));
|
memset(e1h, 0, sizeof(*e1h));
|
||||||
|
|
||||||
e1h->cardnr = cardnr;
|
e1h->cardnr = cardnr;
|
||||||
|
|
|
@ -27,6 +27,10 @@
|
||||||
#include <openbsc/gsm_04_08.h>
|
#include <openbsc/gsm_04_08.h>
|
||||||
#include <openbsc/debug.h>
|
#include <openbsc/debug.h>
|
||||||
#include <openbsc/mncc.h>
|
#include <openbsc/mncc.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
#include <openbsc/gsm_data.h>
|
||||||
|
|
||||||
|
static void *tall_call_ctx;
|
||||||
|
|
||||||
static struct mncc_names {
|
static struct mncc_names {
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -103,7 +107,7 @@ static void free_call(struct gsm_call *call)
|
||||||
{
|
{
|
||||||
llist_del(&call->entry);
|
llist_del(&call->entry);
|
||||||
DEBUGP(DMNCC, "(call %x) Call removed.\n", call->callref);
|
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)
|
if (call->remote_ref)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (!tall_call_ctx)
|
||||||
|
tall_call_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||||
|
"gsm_call");
|
||||||
/* create remote 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));
|
memset(&mncc, 0, sizeof(struct gsm_mncc));
|
||||||
mncc.callref = call->callref;
|
mncc.callref = call->callref;
|
||||||
mncc_set_cause(&mncc, GSM48_CAUSE_LOC_PRN_S_LU,
|
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 (!call) {
|
||||||
if (msg_type != MNCC_SETUP_IND)
|
if (msg_type != MNCC_SETUP_IND)
|
||||||
return 0; /* drop */
|
return 0; /* drop */
|
||||||
|
if (!tall_call_ctx)
|
||||||
|
tall_call_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||||
|
"gsm_call");
|
||||||
/* create call */
|
/* create call */
|
||||||
if (!(call = calloc(1, sizeof(struct gsm_call)))) {
|
if (!(call = talloc(tall_call_ctx, struct gsm_call))) {
|
||||||
struct gsm_mncc rel;
|
struct gsm_mncc rel;
|
||||||
|
|
||||||
memset(&rel, 0, sizeof(struct gsm_mncc));
|
memset(&rel, 0, sizeof(struct gsm_mncc));
|
||||||
|
|
|
@ -24,10 +24,19 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <openbsc/msgb.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 *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)
|
if (!msg)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -48,7 +57,7 @@ struct msgb *msgb_alloc(u_int16_t size)
|
||||||
|
|
||||||
void msgb_free(struct msgb *m)
|
void msgb_free(struct msgb *m)
|
||||||
{
|
{
|
||||||
free(m);
|
talloc_free(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
void msgb_enqueue(struct llist_head *queue, struct msgb *msg)
|
void msgb_enqueue(struct llist_head *queue, struct msgb *msg)
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <openbsc/paging.h>
|
#include <openbsc/paging.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
#include <openbsc/debug.h>
|
#include <openbsc/debug.h>
|
||||||
#include <openbsc/signal.h>
|
#include <openbsc/signal.h>
|
||||||
#include <openbsc/abis_rsl.h>
|
#include <openbsc/abis_rsl.h>
|
||||||
|
@ -48,6 +49,8 @@
|
||||||
#define PAGING_TIMEOUT 1, 75000
|
#define PAGING_TIMEOUT 1, 75000
|
||||||
#define MAX_PAGING_REQUEST 750
|
#define MAX_PAGING_REQUEST 750
|
||||||
|
|
||||||
|
static void *tall_paging_ctx;
|
||||||
|
|
||||||
static unsigned int calculate_group(struct gsm_bts *bts, struct gsm_subscriber *subscr)
|
static unsigned int calculate_group(struct gsm_bts *bts, struct gsm_subscriber *subscr)
|
||||||
{
|
{
|
||||||
int ccch_conf;
|
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);
|
bsc_del_timer(&to_be_deleted->T3113);
|
||||||
llist_del(&to_be_deleted->entry);
|
llist_del(&to_be_deleted->entry);
|
||||||
subscr_put(to_be_deleted->subscr);
|
subscr_put(to_be_deleted->subscr);
|
||||||
free(to_be_deleted);
|
talloc_free(to_be_deleted);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void page_ms(struct gsm_paging_request *request)
|
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_bts_paging_state *bts_entry = &bts->paging;
|
||||||
struct gsm_paging_request *req;
|
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)) {
|
if (paging_pending_request(bts_entry, subscr)) {
|
||||||
DEBUGP(DPAG, "Paging request already pending\n");
|
DEBUGP(DPAG, "Paging request already pending\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUGP(DPAG, "Start paging on bts %d.\n", bts->nr);
|
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));
|
memset(req, 0, sizeof(*req));
|
||||||
req->subscr = subscr_get(subscr);
|
req->subscr = subscr_get(subscr);
|
||||||
req->bts = bts;
|
req->bts = bts;
|
||||||
|
|
|
@ -19,10 +19,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <openbsc/signal.h>
|
#include <openbsc/signal.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
static void *tall_sigh_ctx;
|
||||||
static LLIST_HEAD(signal_handler_list);
|
static LLIST_HEAD(signal_handler_list);
|
||||||
|
|
||||||
struct signal_handler {
|
struct signal_handler {
|
||||||
|
@ -35,8 +37,12 @@ struct signal_handler {
|
||||||
|
|
||||||
int register_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data)
|
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)
|
if (!sig_data)
|
||||||
return -ENOMEM;
|
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
|
if (handler->cbfn == cbfn && handler->data == data
|
||||||
&& subsys == handler->subsys) {
|
&& subsys == handler->subsys) {
|
||||||
llist_del(&handler->entry);
|
llist_del(&handler->entry);
|
||||||
free(handler);
|
talloc_free(handler);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,10 @@
|
||||||
#include <openbsc/subchan_demux.h>
|
#include <openbsc/subchan_demux.h>
|
||||||
#include <openbsc/trau_frame.h>
|
#include <openbsc/trau_frame.h>
|
||||||
#include <openbsc/debug.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)
|
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 */
|
/* free the tx_queue entry if it is fully consumed */
|
||||||
if (txe->next_bit >= txe->bit_len) {
|
if (txe->next_bit >= txe->bit_len) {
|
||||||
llist_del(&txe->list);
|
llist_del(&txe->list);
|
||||||
free(txe);
|
talloc_free(txe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* increment global number of bits dequeued */
|
/* 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);
|
tqe = llist_entry(sch->tx_queue.next, struct subch_txq_entry, list);
|
||||||
llist_del(&tqe->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)
|
int len)
|
||||||
{
|
{
|
||||||
struct mux_subch *sch = &mx->subch[s_nr];
|
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);
|
int list_len = llist_len(&sch->tx_queue);
|
||||||
|
struct subch_txq_entry *tqe = talloc_size(tall_tqe_ctx,
|
||||||
|
sizeof(*tqe) + len);
|
||||||
if (!tqe)
|
if (!tqe)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -309,6 +313,9 @@ int subchan_mux_init(struct subch_mux *mx)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (!tall_tqe_ctx)
|
||||||
|
tall_tqe_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||||
|
"subch_txq_entry");
|
||||||
memset(mx, 0, sizeof(*mx));
|
memset(mx, 0, sizeof(*mx));
|
||||||
for (i = 0; i < NR_SUBCH; i++) {
|
for (i = 0; i < NR_SUBCH; i++) {
|
||||||
struct mux_subch *sch = &mx->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/abis_rsl.h>
|
||||||
#include <openbsc/paging.h>
|
#include <openbsc/paging.h>
|
||||||
#include <openbsc/signal.h>
|
#include <openbsc/signal.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
#include <vty/buffer.h>
|
#include <vty/buffer.h>
|
||||||
|
|
||||||
|
@ -47,6 +48,8 @@
|
||||||
/* per connection data */
|
/* per connection data */
|
||||||
LLIST_HEAD(active_connections);
|
LLIST_HEAD(active_connections);
|
||||||
|
|
||||||
|
static void *tall_telnet_ctx;
|
||||||
|
|
||||||
/* per network data */
|
/* per network data */
|
||||||
static int telnet_new_connection(struct bsc_fd *fd, unsigned int what);
|
static int telnet_new_connection(struct bsc_fd *fd, unsigned int what);
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -66,6 +69,9 @@ void telnet_init(struct gsm_network *network, int port) {
|
||||||
struct sockaddr_in sock_addr;
|
struct sockaddr_in sock_addr;
|
||||||
int fd, on = 1;
|
int fd, on = 1;
|
||||||
|
|
||||||
|
tall_telnet_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||||
|
"telnet_connection");
|
||||||
|
|
||||||
bsc_vty_init(network);
|
bsc_vty_init(network);
|
||||||
|
|
||||||
fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
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));
|
memset(connection, 0, sizeof(*connection));
|
||||||
connection->network = (struct gsm_network*)fd->data;
|
connection->network = (struct gsm_network*)fd->data;
|
||||||
connection->fd.data = connection;
|
connection->fd.data = connection;
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <openbsc/subchan_demux.h>
|
#include <openbsc/subchan_demux.h>
|
||||||
#include <openbsc/e1_input.h>
|
#include <openbsc/e1_input.h>
|
||||||
#include <openbsc/debug.h>
|
#include <openbsc/debug.h>
|
||||||
|
#include <openbsc/talloc.h>
|
||||||
|
|
||||||
struct map_entry {
|
struct map_entry {
|
||||||
struct llist_head list;
|
struct llist_head list;
|
||||||
|
@ -46,11 +47,19 @@ struct upqueue_entry {
|
||||||
static LLIST_HEAD(ss_map);
|
static LLIST_HEAD(ss_map);
|
||||||
static LLIST_HEAD(ss_upqueue);
|
static LLIST_HEAD(ss_upqueue);
|
||||||
|
|
||||||
|
static void *tall_map_ctx, *tall_upq_ctx;
|
||||||
|
|
||||||
/* map one particular subslot to another subslot */
|
/* map one particular subslot to another subslot */
|
||||||
int trau_mux_map(const struct gsm_e1_subslot *src,
|
int trau_mux_map(const struct gsm_e1_subslot *src,
|
||||||
const struct gsm_e1_subslot *dst)
|
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)
|
if (!me)
|
||||||
return -ENOMEM;
|
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)
|
int trau_recv_lchan(struct gsm_lchan *lchan, u_int32_t callref)
|
||||||
{
|
{
|
||||||
struct gsm_e1_subslot *src_ss;
|
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)
|
if (!ue)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue