#include <openbsc/trau_frame.h>
}
+#define SOCKET_RETRY_TIMER 5
+
/*
* DTMF stuff
*/
add_trace("keypad", NULL, "%c", mncc->keypad);
end_trace();
resp = create_mncc(MNCC_START_DTMF_RSP, p_m_g_callref);
+ resp->fields |= MNCC_F_KEYPAD;
resp->keypad = mncc->keypad;
send_and_free_mncc(p_m_g_instance, resp->msg_type, resp);
memcpy(&p_capainfo, ¶m->setup.capainfo, sizeof(p_capainfo));
memcpy(&p_redirinfo, ¶m->setup.redirinfo, sizeof(p_redirinfo));
+ /* no GSM MNCC connection */
+ if (gsm->mncc_lfd.fd < 0) {
+ gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_REQ, DIRECTION_OUT);
+ add_trace("failure", NULL, "No MNCC connection.");
+ end_trace();
+ message = message_create(p_serial, epoint_id, PORT_TO_EPOINT, MESSAGE_RELEASE);
+ message->param.disconnectinfo.cause = 27; // temp. unavail.
+ message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
+ message_put(message);
+ new_state(PORT_STATE_RELEASE);
+ trigger_work(&p_m_g_delete);
+ return;
+ }
+
/* no number */
if (!p_dialinginfo.id[0]) {
gsm_trace_header(p_m_mISDNport, this, MNCC_SETUP_REQ, DIRECTION_OUT);
class Pgsm_bs *pgsm_bs = NULL;
struct lcr_msg *message;
- printf("mncc_sock: closing\n");
+ PERROR("Lost MNCC socket, retrying in %u seconds\n", SOCKET_RETRY_TIMER);
close(lfd->fd);
unregister_fd(lfd);
lfd->fd = -1;
- /* flush the queue */
- while (mncc_q_dequeue())
- ;
-
/* free all the calls that were running through the MNCC interface */
port = port_first;
while(port) {
port = port->next;
}
- /* FIXME: start a re-connect timer */
+ /* flush the queue */
+ while (mncc_q_dequeue())
+ ;
+
+ /* start the re-connect timer */
+ schedule_timer(&gsm->socket_retry, SOCKET_RETRY_TIMER, 0);
generate_dtmf();
return mncc_fd_close(lfd);
if (rc < 0)
return rc;
- if (rc < qe->len)
+ if (rc < (int)qe->len)
return -1;
/* dequeue the successfully sent message */
qe2 = mncc_q_dequeue();
return rc;
}
-int gsm_bs_init(void)
+static int socket_retry_cb(struct lcr_timer *timer, void *instance, int index)
{
- struct sockaddr_un sun;
- int rc;
+ int fd, rc;
- rc = socket(PF_UNIX, SOCK_SEQPACKET, 0);
- if (rc < 0)
- return rc;
+ fd = socket(PF_UNIX, SOCK_SEQPACKET, 0);
+ if (fd < 0) {
+ PERROR("Cannot create SEQPACKET socket, giving up!\n");
+ return fd;
+ }
- gsm->mncc_lfd.fd = rc;
+ rc = connect(fd, (struct sockaddr *) &gsm->sun,
+ sizeof(gsm->sun));
+ if (rc < 0) {
+ PERROR("Could not connect to MNCC socket, "
+ "retrying in %u seconds\n", SOCKET_RETRY_TIMER);
+ close(fd);
+ schedule_timer(&gsm->socket_retry, SOCKET_RETRY_TIMER, 0);
+ } else {
+ PDEBUG(DEBUG_GSM, "Connected to MNCC socket!\n");
+ gsm->mncc_lfd.fd = fd;
+ register_fd(&gsm->mncc_lfd, LCR_FD_READ, &mncc_fd_cb, NULL, 0);
+ }
- sun.sun_family = AF_UNIX;
- strcpy(sun.sun_path, "/tmp/bsc_mncc");
- rc = connect(rc, (struct sockaddr *)&sun, sizeof(sun));
- if (rc < 0)
- return rc;
+ return 0;
+}
- rc = register_fd(&gsm->mncc_lfd, LCR_FD_READ, &mncc_fd_cb, NULL, 0);
+int gsm_bs_init(void)
+{
+ gsm->sun.sun_family = AF_UNIX;
+ strcpy(gsm->sun.sun_path, "/tmp/bsc_mncc");
- return rc;
+ memset(&gsm->socket_retry, 0, sizeof(gsm->socket_retry));
+ add_timer(&gsm->socket_retry, socket_retry_cb, NULL, 0);
+
+ /* do the initial connect */
+ socket_retry_cb(&gsm->socket_retry, NULL, 0);
+
+ return 0;
}