This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.
Pablo Neira Ayuso pablo at gnumonks.orgHi Alvaro, A couple of comments below. On Wed, Apr 02, 2014 at 01:36:57PM +0200, Alvaro Neira Ayuso wrote: > From: Álvaro Neira Ayuso <anayuso at sysmocom.de> > > With this patch, the manager monitors the sensors and send > OML Failure message from the Manager to the BTS and the BTS > to BSC, for having a report system of the sensors. > > Signed-off-by: Alvaro Neira Ayuso <anayuso at sysmocom.de> > --- > v4: Fixed situation that we have a connection opened with the manager and we > have other connection with other manager. > > src/osmo-bts-sysmo/main.c | 73 ++++++++++++++++ > src/osmo-bts-sysmo/misc/sysmobts_mgr.c | 77 +++++++++++++++++ > src/osmo-bts-sysmo/misc/sysmobts_misc.c | 140 ++++++++++++++++++++++++++++++- > src/osmo-bts-sysmo/misc/sysmobts_misc.h | 33 ++++++++ > 4 files changed, 322 insertions(+), 1 deletion(-) > > diff --git a/src/osmo-bts-sysmo/main.c b/src/osmo-bts-sysmo/main.c > index 74ee47f..269f442 100644 > --- a/src/osmo-bts-sysmo/main.c > +++ b/src/osmo-bts-sysmo/main.c > @@ -35,6 +35,7 @@ > > #include <osmocom/core/talloc.h> > #include <osmocom/core/application.h> > +#include <osmocom/core/socket.h> > #include <osmocom/vty/telnet_interface.h> > #include <osmocom/vty/logging.h> > > @@ -45,8 +46,10 @@ > #include <osmo-bts/vty.h> > #include <osmo-bts/bts_model.h> > #include <osmo-bts/pcu_if.h> > +#include <osmo-bts/oml.h> > > #define SYSMOBTS_RF_LOCK_PATH "/var/lock/bts_rf_lock" > +#define SOCKET_PATH "/var/run/bts_oml" > > #include "utils.h" > #include "eeprom.h" > @@ -258,6 +261,7 @@ static void signal_handler(int signal) > case SIGINT: > //osmo_signal_dispatch(SS_GLOBAL, S_GLOBAL_SHUTDOWN, NULL); > bts_shutdown(bts, "SIGINT"); > + unlink(SOCKET_PATH); > break; > case SIGABRT: > case SIGUSR1: > @@ -288,6 +292,62 @@ static int write_pid_file(char *procname) > return 0; > } > > +static int read_sock(struct osmo_fd *fd, unsigned int what) > +{ > + struct msgb *msg; > + struct gsm_abis_mo *mo; > + int rc; > + > + msg = oml_msgb_alloc(); > + if (msg == NULL) > + return -1; > + > + rc = recv(fd->fd, msg->tail, msg->data_len, 0); > + if (rc <= 0) { > + close(fd->fd); > + osmo_fd_unregister(fd); > + fd->fd = -1; > + return -1; > + } > + > + msgb_put(msg, rc); > + > + /*Remove the IPA header for removing the conflict with the new IPA > + * header*/ > + msgb_pull(msg, sizeof(struct ipaccess_head *)-1); > + > + mo = &bts->mo; > + msg->trx = mo->bts->c0; > + msg->l2h = msg->data; > + msg->l3h = msg->data + sizeof(struct abis_om_fom_hdr); > + > + return abis_oml_sendmsg(msg); > +} > + > +static int accept_unix_sock(struct osmo_fd *fd, unsigned int what) > +{ > + int sfd = fd->fd, cl; > + struct osmo_fd *ofd = (struct osmo_fd *)fd->data; > + > + if (ofd->fd > -1) { > + close(ofd->fd); > + osmo_fd_unregister(ofd); > + ofd->fd = -1; > + } > + > + cl = accept(sfd, NULL, NULL); > + if (cl < 0) > + return -1; > + > + ofd->fd = cl; > + if (osmo_fd_register(ofd) != 0) { > + close(cl); > + return -1; > + } > + > + return 0; > +} > + > int main(int argc, char **argv) > { > struct stat st; > @@ -295,6 +355,7 @@ int main(int argc, char **argv) > struct gsm_bts_role_bts *btsb; > struct e1inp_line *line; > void *tall_msgb_ctx; > + struct osmo_fd fd, rfd; Perhaps you can rename fd and rfd to something a bit more descriptive, eg. accept_ofd and ofd. > int rc; > > tall_bts_ctx = talloc_named_const(NULL, 1, "OsmoBTS context"); > @@ -370,6 +431,18 @@ int main(int argc, char **argv) > fprintf(stderr, "unable to connect to BSC\n"); > exit(1); > } > + fd.cb = accept_unix_sock; > + rfd.cb = read_sock; > + rfd.when = BSC_FD_READ; > + rfd.fd = -1; > + fd.data = &rfd; > + > + rc = osmo_sock_unix_init_ofd(&fd, SOCK_SEQPACKET, 0, SOCKET_PATH, > + OSMO_SOCK_F_BIND | OSMO_SOCK_F_NONBLOCK); > + if (rc < 0) { > + perror("Error creating socket domain creation"); > + exit(3); > + } > > if (daemonize) { > rc = osmo_daemonize(); > diff --git a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c > index 6c64d0f..525e526 100644 > --- a/src/osmo-bts-sysmo/misc/sysmobts_mgr.c > +++ b/src/osmo-bts-sysmo/misc/sysmobts_mgr.c > @@ -36,6 +36,7 @@ > #include <osmocom/core/timer.h> > #include <osmocom/core/msgb.h> > #include <osmocom/core/serial.h> > +#include <osmocom/core/socket.h> > #include <osmocom/vty/telnet_interface.h> > #include <osmocom/vty/logging.h> > > @@ -47,7 +48,11 @@ > > static int no_eeprom_write = 0; > static int daemonize = 0; > +static int trx_nr = -1; > +static int fd_unix = -1; > +static int state_connection = 0; Please, use some enum for this small state machine, eg. enum { SYSMO_MGR_DISCONNECTED = 0, SYSMO_MGR_CONNECTED, }; It should help to make the code a bit more readable. > void *tall_mgr_ctx; > +static struct sbts2050_config_info confinfo; > > /* every 6 hours means 365*4 = 1460 EEprom writes per year (max) */ > #define TEMP_TIMER_SECS (6 * 3600) > @@ -55,7 +60,29 @@ void *tall_mgr_ctx; > /* every 1 hours means 365*24 = 8760 EEprom writes per year (max) */ > #define HOURS_TIMER_SECS (1 * 3600) > > +/* every 5 minutes try to reconnect if we have a problem in the communication*/ > +#define CONNECT_TIMER_SECS (300) ^ ^ You can remove those parenthesis. > + > +/* unix domain socket file descriptor */ > +#define SOCKET_PATH "/var/run/bts_oml" > + > #ifdef BUILD_SBTS2050 > +static struct osmo_timer_list connect_timer; > +static void socket_connect_cb(void *data) > +{ > + if (state_connection == 0) { > + fd_unix = osmo_sock_unix_init(SOCK_SEQPACKET, 0, SOCKET_PATH, > + OSMO_SOCK_F_CONNECT); > + if (fd_unix < 0) { > + LOGP(DTEMP, LOGL_ERROR, "Error creating unix socket\n"); > + return; > + } > + > + state_connection = 1; > + } > + osmo_timer_schedule(&connect_timer, CONNECT_TIMER_SECS, 0); This timer keeps running even if we're connected. I think you should enable it only if we are in disconnected state. > +} > + > static struct osmo_timer_list temp_uc_timer; > static void check_uctemp_timer_cb(void *data) > { > @@ -64,6 +91,50 @@ static void check_uctemp_timer_cb(void *data) > > sbts2050_uc_check_temp(ucontrol0, &temp_pa, &temp_board); > > + confinfo.temp_pa_cur = temp_pa; > + confinfo.temp_board_cur = temp_board; > + > + if (confinfo.temp_min_pa_warn_limit > temp_pa || > + confinfo.temp_max_pa_warn_limit < temp_pa) { Should this be >= and <= ? > + state_connection = sendto_osmobts(fd_unix, ucontrol0, > + SBTS2050_WARN_ALERT, > + SBTS2050_TEMP_PA, > + &confinfo, trx_nr); > + } else if (confinfo.temp_min_pa_sever_limit > temp_pa || > + confinfo.temp_max_pa_sever_limit < temp_pa) { Same here. > + state_connection = sendto_osmobts(fd_unix, ucontrol0, > + SBTS2050_SEVER_ALERT, > + SBTS2050_TEMP_PA, > + &confinfo, trx_nr); > + sbts2050_uc_power(ucontrol0, > + sbts2050_uc_status(ucontrol0, > + SBTS2050_STATUS_MASTER), > + sbts2050_uc_status(ucontrol0, > + SBTS2050_STATUS_SLAVE), > + confinfo.pa_power_act); > + } > + > + if (confinfo.temp_min_board_warn_limit > temp_board || > + confinfo.temp_max_board_warn_limit < temp_board) { > + state_connection = sendto_osmobts(fd_unix, ucontrol0, > + SBTS2050_WARN_ALERT, > + SBTS2050_TEMP_BOARD, > + &confinfo, trx_nr); This code looks very similar, perhaps you can encapsulate it in a function, ie. check_temperature(confinfo.temp_min_board_warn_limit, confinfo.temp_max_board_warn_limit, temp_board, SBTS2050_TEMP_BOARD); > + } else if (confinfo.temp_min_board_sever_limit > temp_board || > + confinfo.temp_max_board_sever_limit < temp_board) { > + state_connection = sendto_osmobts(fd_unix, ucontrol0, > + SBTS2050_SEVER_ALERT, > + SBTS2050_TEMP_BOARD, > + &confinfo, trx_nr); > + sbts2050_uc_power(ucontrol0, confinfo.master_power_act, > + confinfo.slave_power_act, > + sbts2050_uc_status(ucontrol0, > + SBTS2050_STATUS_PA)); > + } > + > + if (state_connection == 0) > + close(fd_unix); > + > osmo_timer_schedule(&temp_uc_timer, TEMP_TIMER_SECS, 0); > } > #endif > @@ -93,6 +164,7 @@ static void initialize_sbts2050(void) > if (val != 0) > return; > } > + trx_nr = val; > > ucontrol0.fd = osmo_serial_init(ucontrol0.path, 115200); > if (ucontrol0.fd < 0) { > @@ -169,6 +241,7 @@ static void signal_handler(int signal) > case SIGINT: > sysmobts_check_temp(no_eeprom_write); > sysmobts_update_hours(no_eeprom_write); > + close(fd_unix); > exit(0); > break; > case SIGABRT: > @@ -363,6 +436,10 @@ int main(int argc, char **argv) > hours_timer.cb = hours_timer_cb; > hours_timer_cb(NULL); > > + /*start handle for reconnect the socket in case of error*/ ^ ^ Missing spaces. /* Start handle ... */ > + connect_timer.cb = socket_connect_cb; > + socket_connect_cb(NULL); > + > /* start uc temperature check timer */ > initialize_sbts2050(); > > diff --git a/src/osmo-bts-sysmo/misc/sysmobts_misc.c b/src/osmo-bts-sysmo/misc/sysmobts_misc.c > index 9ea26c2..0e89da6 100644 > --- a/src/osmo-bts-sysmo/misc/sysmobts_misc.c > +++ b/src/osmo-bts-sysmo/misc/sysmobts_misc.c > @@ -29,13 +29,17 @@ > #include <sys/signal.h> > #include <sys/types.h> > #include <sys/stat.h> > +#include <arpa/inet.h> > > #include <osmocom/core/talloc.h> > #include <osmocom/core/utils.h> > #include <osmocom/core/msgb.h> > +#include <osmocom/core/socket.h> > #include <osmocom/core/application.h> > #include <osmocom/vty/telnet_interface.h> > #include <osmocom/vty/logging.h> > +#include <osmocom/gsm/abis_nm.h> > +#include <osmocom/gsm/protocol/ipaccess.h> > > #include "btsconfig.h" > #include "sysmobts_misc.h" > @@ -49,10 +53,144 @@ > #define SERIAL_ALLOC_SIZE 300 > #define SIZE_HEADER_RSP 5 > #define SIZE_HEADER_CMD 4 > - > +#define OM_ALLOC_SIZE 1024 > +#define OM_HEADROOM_SIZE 128 > +#define IPA_OML_PROTO 0xFF > > #ifdef BUILD_SBTS2050 > /********************************************************************** > + * Function send information to OsmoBts > + *********************************************************************/ > +static void add_sw_descr(struct msgb *msg) > +{ > + char file_version[255]; > + char file_id[255]; > + > + strcpy(file_id, "sysmomgr"); Better use strncpy here. > + strncpy(file_version, PACKAGE_VERSION, strlen(PACKAGE_VERSION)); And make sure you nul-terminate these strings. file_version[strlen(PACKAGE_VERSION)-1] = '\0'; As strncpy doesn't append the \0. I remember you couldn't use strlcpy, right? > + msgb_v_put(msg, NM_ATT_SW_DESCR); > + msgb_tl16v_put(msg, NM_ATT_FILE_ID, strlen(file_id), > + (uint8_t *)file_id); Coding style nitpick, perhaps: msgb_tl16v_put(msg, NM_ATT_FILE_ID, strlen(file_id), (uint8_t *)file_id);