diff options
-rw-r--r-- | include/openbsc/Makefile.am | 2 | ||||
-rw-r--r-- | include/openbsc/signal.h | 57 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/signal.c | 74 |
4 files changed, 133 insertions, 2 deletions
diff --git a/include/openbsc/Makefile.am b/include/openbsc/Makefile.am index 109f3c806..062df346f 100644 --- a/include/openbsc/Makefile.am +++ b/include/openbsc/Makefile.am @@ -1,4 +1,4 @@ noinst_HEADERS = abis_nm.h abis_rsl.h debug.h db.h gsm_04_08.h gsm_data.h \ gsm_subscriber.h linuxlist.h msgb.h select.h tlv.h gsm_04_11.h \ timer.h misdn.h chan_alloc.h telnet_interface.h paging.h \ - subchan_demux.h trau_frame.h e1_input.h trau_mux.h + subchan_demux.h trau_frame.h e1_input.h trau_mux.h signal.h diff --git a/include/openbsc/signal.h b/include/openbsc/signal.h new file mode 100644 index 000000000..6a0d6fb90 --- /dev/null +++ b/include/openbsc/signal.h @@ -0,0 +1,57 @@ +/* Generic signalling/notification infrastructure */ +/* (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org> + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#ifndef OPENBSC_SIGNAL_H +#define OPENBSC_SIGNAL_H + +#include <openbsc/gsm_data.h> +#include <openbsc/gsm_subscriber.h> + + +/* + * Signalling areas + */ +#define S_PAGING 0x0001 + + +struct signal_data { +}; + + +struct paging_signal_data { + struct signal_data data; + + struct gsm_subscriber *subscr; + struct gsm_bts *bts; + + /* NULL in case the paging didn't work */ + struct gsm_lchan *lchan; +}; + + +/* Management */ +void register_signal_handler(int areas, int (*sig)(struct signal_data *, void *data), void *data); +void remove_signal_handler(int (*sig)(struct signal_data *, void *data), void *data); + +/* Dispatch */ +void dispatch_signal(int area, struct signal_data *data); + + +#endif diff --git a/src/Makefile.am b/src/Makefile.am index 2a70b8bb5..714fff5d2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,7 +7,7 @@ bsc_hack_SOURCES = bsc_hack.c abis_rsl.c abis_nm.c gsm_04_08.c gsm_data.c \ gsm_subscriber.c msgb.c select.c chan_alloc.c timer.c debug.c db.c \ gsm_04_11.c telnet_interface.c telnet_parser.l 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 + input/misdn.c input/ipaccess.c signal.c bsc_hack_LDADD = -ldl -ldbi bs11_config_SOURCES = bs11_config.c abis_nm.c gsm_data.c msgb.c debug.c select.c timer.c rs232.c diff --git a/src/signal.c b/src/signal.c new file mode 100644 index 000000000..d4a4a7ce2 --- /dev/null +++ b/src/signal.c @@ -0,0 +1,74 @@ +/* Generic signalling/notification infrastructure */ +/* (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org> + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include <openbsc/signal.h> +#include <malloc.h> +#include <string.h> + + +static LLIST_HEAD(signal_handler_list); + +struct signal_handler { + struct llist_head entry; + int areas; + + int (*sig_handler)(struct signal_data *, void*); + void *data; +}; + + +void register_signal_handler(int areas, + int (*handler)(struct signal_data *, void *), void *data) +{ + struct signal_handler *sig_data = + (struct signal_handler *)malloc(sizeof(*sig_data)); + memset(sig_data, 0, sizeof(*sig_data)); + + + sig_data->areas = areas; + sig_data->data = data; + sig_data->sig_handler = handler; + llist_add_tail(&signal_handler_list, &sig_data->entry); +} + +void remove_signal_handler(int (*sig_handler)(struct signal_data *, void *), void *data) +{ + struct signal_handler *handler; + + llist_for_each_entry(handler, &signal_handler_list, entry) { + if (handler->sig_handler == sig_handler && handler->data == data) { + llist_del(&handler->entry); + free(handler); + break; + } + } +} + + +void dispatch_signal(int area, struct signal_data *data) +{ + struct signal_handler *handler; + + llist_for_each_entry(handler, &signal_handler_list, entry) { + if (handler->areas & area) { + (*handler->sig_handler)(data, handler->data); + } + } +} |