aboutsummaryrefslogtreecommitdiffstats
path: root/src/input/ipa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/ipa.c')
-rw-r--r--src/input/ipa.c57
1 files changed, 19 insertions, 38 deletions
diff --git a/src/input/ipa.c b/src/input/ipa.c
index 8c6f6035..ba92163c 100644
--- a/src/input/ipa.c
+++ b/src/input/ipa.c
@@ -95,17 +95,6 @@ int ipa_msg_recv(int fd, struct msgb **rmsg)
return ret;
}
-void ipa_client_conn_close(struct ipa_client_conn *link);
-
-static void ipa_client_retry(struct ipa_client_conn *link)
-{
- LOGP(DLINP, LOGL_NOTICE, "connection closed\n");
- ipa_client_conn_close(link);
- LOGP(DLINP, LOGL_NOTICE, "retrying in 5 seconds...\n");
- osmo_timer_schedule(&link->timer, 5, 0);
- link->state = IPA_CLIENT_LINK_STATE_CONNECTING;
-}
-
void ipa_client_conn_close(struct ipa_client_conn *link)
{
/* be safe against multiple calls */
@@ -129,11 +118,15 @@ static void ipa_client_read(struct ipa_client_conn *link)
if (errno == EPIPE || errno == ECONNRESET) {
LOGP(DLINP, LOGL_ERROR, "lost connection with server\n");
}
- ipa_client_retry(link);
+ ipa_client_conn_close(link);
+ if (link->updown_cb)
+ link->updown_cb(link, 0);
return;
} else if (ret == 0) {
LOGP(DLINP, LOGL_ERROR, "connection closed with server\n");
- ipa_client_retry(link);
+ ipa_client_conn_close(link);
+ if (link->updown_cb)
+ link->updown_cb(link, 0);
return;
}
if (link->read_cb)
@@ -166,7 +159,9 @@ static int ipa_client_write_default_cb(struct ipa_client_conn *link)
ret = send(link->ofd->fd, msg->data, msg->len, 0);
if (ret < 0) {
if (errno == EPIPE || errno == ENOTCONN) {
- ipa_client_retry(link);
+ ipa_client_conn_close(link);
+ if (link->updown_cb)
+ link->updown_cb(link, 0);
}
LOGP(DLINP, LOGL_ERROR, "error to send\n");
}
@@ -184,14 +179,16 @@ static int ipa_client_fd_cb(struct osmo_fd *ofd, unsigned int what)
case IPA_CLIENT_LINK_STATE_CONNECTING:
ret = getsockopt(ofd->fd, SOL_SOCKET, SO_ERROR, &error, &len);
if (ret >= 0 && error > 0) {
- ipa_client_retry(link);
+ ipa_client_conn_close(link);
+ if (link->updown_cb)
+ link->updown_cb(link, 0);
return 0;
}
ofd->when &= ~BSC_FD_WRITE;
LOGP(DLINP, LOGL_NOTICE, "connection done.\n");
link->state = IPA_CLIENT_LINK_STATE_CONNECTED;
- if (link->connect_cb)
- link->connect_cb(link);
+ if (link->updown_cb)
+ link->updown_cb(link, 1);
break;
case IPA_CLIENT_LINK_STATE_CONNECTED:
if (what & BSC_FD_READ) {
@@ -209,12 +206,10 @@ static int ipa_client_fd_cb(struct osmo_fd *ofd, unsigned int what)
return 0;
}
-static void ipa_link_timer_cb(void *data);
-
struct ipa_client_conn *
ipa_client_conn_create(void *ctx, struct e1inp_ts *ts,
int priv_nr, const char *addr, uint16_t port,
- int (*connect_cb)(struct ipa_client_conn *link),
+ void (*updown_cb)(struct ipa_client_conn *link, int up),
int (*read_cb)(struct ipa_client_conn *link,
struct msgb *msgb),
int (*write_cb)(struct ipa_client_conn *link),
@@ -244,12 +239,11 @@ ipa_client_conn_create(void *ctx, struct e1inp_ts *ts,
ipa_link->ofd->priv_nr = priv_nr;
ipa_link->ofd->cb = ipa_client_fd_cb;
ipa_link->ofd->data = ipa_link;
+ ipa_link->ofd->fd = -1;
ipa_link->state = IPA_CLIENT_LINK_STATE_CONNECTING;
- ipa_link->timer.cb = ipa_link_timer_cb;
- ipa_link->timer.data = ipa_link;
ipa_link->addr = talloc_strdup(ipa_link, addr);
ipa_link->port = port;
- ipa_link->connect_cb = connect_cb;
+ ipa_link->updown_cb = updown_cb;
ipa_link->read_cb = read_cb;
/* default to generic write callback if not set. */
if (write_cb == NULL)
@@ -284,24 +278,11 @@ int ipa_client_conn_open(struct ipa_client_conn *link)
link->ofd->fd = ret;
if (osmo_fd_register(link->ofd) < 0) {
close(ret);
+ link->ofd->fd = -1;
return -EIO;
}
- return 0;
-}
-static void ipa_link_timer_cb(void *data)
-{
- struct ipa_client_conn *link = data;
-
- LOGP(DLINP, LOGL_NOTICE, "reconnecting.\n");
-
- switch(link->state) {
- case IPA_CLIENT_LINK_STATE_CONNECTING:
- ipa_client_conn_open(link);
- break;
- default:
- break;
- }
+ return 0;
}
void ipa_client_conn_send(struct ipa_client_conn *link, struct msgb *msg)