aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@gnumonks.org>2011-10-17 12:28:12 +0200
committerPablo Neira Ayuso <pablo@gnumonks.org>2011-10-17 12:34:40 +0200
commitc43bb089067ca05af4992fbafe46827a1f0a6e9b (patch)
tree86f7c957f654b261d8fcbcebaa01cac325d75a58
parent60eb9839645ab93b11d2d09767ee6dc21e51ad2d (diff)
datagram: add osmo_dgram_conn_recv
We provide osmo_dgram_conn_recv(...) which allows you to take control on the message allocation and receival process. Instead of hiding this details inside the datagram infrastructure. Providing more control to clients of this code means more flexibility.
-rw-r--r--examples/lapd-over-datagram-network.c12
-rw-r--r--examples/lapd-over-datagram-user.c14
-rw-r--r--include/osmocom/netif/datagram.h7
-rw-r--r--src/datagram.c52
4 files changed, 53 insertions, 32 deletions
diff --git a/examples/lapd-over-datagram-network.c b/examples/lapd-over-datagram-network.c
index 58ee3fa..fb94515 100644
--- a/examples/lapd-over-datagram-network.c
+++ b/examples/lapd-over-datagram-network.c
@@ -44,12 +44,22 @@ void sighandler(int foo)
exit(EXIT_SUCCESS);
}
-int read_cb(struct osmo_dgram_conn *conn, struct msgb *msg)
+int read_cb(struct osmo_dgram_conn *conn)
{
int error;
+ struct msgb *msg;
LOGP(DLAPDTEST, LOGL_DEBUG, "received message from datagram\n");
+ msg = msgb_alloc(1200, "LAPD/test");
+ if (msg == NULL) {
+ LOGP(DLAPDTEST, LOGL_ERROR, "cannot allocate message\n");
+ return -1;
+ }
+ if (osmo_dgram_conn_recv(conn, msg) < 0) {
+ LOGP(DLAPDTEST, LOGL_ERROR, "cannot receive message\n");
+ return -1;
+ }
if (lapd_receive(lapd, msg, &error) < 0) {
LOGP(DLAPDTEST, LOGL_ERROR, "lapd_receive returned error!\n");
return -1;
diff --git a/examples/lapd-over-datagram-user.c b/examples/lapd-over-datagram-user.c
index 68fa424..601d12c 100644
--- a/examples/lapd-over-datagram-user.c
+++ b/examples/lapd-over-datagram-user.c
@@ -55,11 +55,23 @@ void sighandler(int foo)
exit(EXIT_SUCCESS);
}
-static int read_cb(struct osmo_dgram_conn *conn, struct msgb *msg)
+static int read_cb(struct osmo_dgram_conn *conn)
{
int error;
+ struct msgb *msg;
+ msg = msgb_alloc(1200, "LAPD/test");
+ if (msg == NULL) {
+ LOGP(DLAPDTEST, LOGL_ERROR, "cannot allocate message\n");
+ return -1;
+ }
+ if (osmo_dgram_conn_recv(conn, msg) < 0) {
+ msgb_free(msg);
+ LOGP(DLAPDTEST, LOGL_ERROR, "cannot receive message\n");
+ return -1;
+ }
if (lapd_receive(lapd, msg, &error) < 0) {
+ msgb_free(msg);
LOGP(DLINP, LOGL_ERROR, "lapd_receive returned error!\n");
return -1;
}
diff --git a/include/osmocom/netif/datagram.h b/include/osmocom/netif/datagram.h
index e635e83..8ed6ce5 100644
--- a/include/osmocom/netif/datagram.h
+++ b/include/osmocom/netif/datagram.h
@@ -21,12 +21,14 @@ struct osmo_dgram_server_conn *osmo_dgram_server_conn_create(void *ctx);
void osmo_dgram_server_conn_set_addr(struct osmo_dgram_server_conn *conn, const char *addr);
void osmo_dgram_server_conn_set_port(struct osmo_dgram_server_conn *conn, uint16_t port);
-void osmo_dgram_server_conn_set_read_cb(struct osmo_dgram_server_conn *conn, int (*read_cb)(struct osmo_dgram_server_conn *conn, struct msgb *msg));
+void osmo_dgram_server_conn_set_read_cb(struct osmo_dgram_server_conn *conn, int (*read_cb)(struct osmo_dgram_server_conn *conn));
void osmo_dgram_server_conn_destroy(struct osmo_dgram_server_conn *conn);
int osmo_dgram_server_conn_open(struct osmo_dgram_server_conn *conn);
void osmo_dgram_server_conn_close(struct osmo_dgram_server_conn *conn);
+int osmo_dgram_server_conn_recv(struct osmo_dgram_server_conn *conn, struct msgb *msg);
+
struct osmo_dgram_conn;
struct osmo_dgram_conn *osmo_dgram_conn_create(void *ctx);
@@ -39,9 +41,10 @@ void osmo_dgram_conn_set_local_addr(struct osmo_dgram_conn *conn, const char *ad
void osmo_dgram_conn_set_remote_addr(struct osmo_dgram_conn *conn, const char *addr);
void osmo_dgram_conn_set_local_port(struct osmo_dgram_conn *conn, uint16_t port);
void osmo_dgram_conn_set_remote_port(struct osmo_dgram_conn *conn, uint16_t port);
-void osmo_dgram_conn_set_read_cb(struct osmo_dgram_conn *conn, int (*read_cb)(struct osmo_dgram_conn *conn, struct msgb *msg));
+void osmo_dgram_conn_set_read_cb(struct osmo_dgram_conn *conn, int (*read_cb)(struct osmo_dgram_conn *conn));
void osmo_dgram_conn_set_data(struct osmo_dgram_client_conn *conn, void *data);
void osmo_dgram_conn_send(struct osmo_dgram_conn *conn, struct msgb *msg);
+int osmo_dgram_conn_recv(struct osmo_dgram_conn *conn, struct msgb *msg);
#endif
diff --git a/src/datagram.c b/src/datagram.c
index 8f74a79..20cb1f8 100644
--- a/src/datagram.c
+++ b/src/datagram.c
@@ -167,41 +167,32 @@ struct osmo_dgram_server_conn {
struct osmo_fd ofd;
const char *addr;
uint16_t port;
- int (*cb)(struct osmo_dgram_server_conn *conn, struct msgb *msg);
+ int (*cb)(struct osmo_dgram_server_conn *conn);
void *data;
unsigned int flags;
};
-static void osmo_dgram_server_conn_read(struct osmo_dgram_server_conn *conn)
+int osmo_dgram_server_conn_recv(struct osmo_dgram_server_conn *conn,
+ struct msgb *msg)
{
- struct msgb *msg;
int ret;
- LOGP(DLINP, LOGL_DEBUG, "message received\n");
-
- msg = msgb_alloc(1200, "LAPD/client");
- if (!msg) {
- LOGP(DLINP, LOGL_ERROR, "cannot allocate room for message\n");
- return;
- }
ret = recv(conn->ofd.fd, msg->data, msg->data_len, 0);
- if (ret < 0) {
- if (errno == EPIPE || errno == ECONNRESET) {
- LOGP(DLINP, LOGL_ERROR, "lost connection with server\n");
- }
- osmo_dgram_server_conn_destroy(conn);
- return;
- } else if (ret == 0) {
- LOGP(DLINP, LOGL_ERROR, "connection closed with server\n");
- osmo_dgram_server_conn_destroy(conn);
- return;
+ if (ret <= 0) {
+ LOGP(DLINP, LOGL_ERROR, "error receiving data from client\n");
+ return ret;
}
msgb_put(msg, ret);
LOGP(DLINP, LOGL_DEBUG, "received %d bytes from client\n", ret);
- if (conn->cb)
- conn->cb(conn, msg);
+ return ret;
+}
+
+static void osmo_dgram_server_conn_read(struct osmo_dgram_server_conn *conn)
+{
+ LOGP(DLINP, LOGL_DEBUG, "message received\n");
- return;
+ if (conn->cb)
+ conn->cb(conn);
}
static int osmo_dgram_server_conn_cb(struct osmo_fd *ofd, unsigned int what)
@@ -249,7 +240,7 @@ void osmo_dgram_server_conn_set_port(struct osmo_dgram_server_conn *conn,
}
void osmo_dgram_server_conn_set_read_cb(struct osmo_dgram_server_conn *conn,
- int (*read_cb)(struct osmo_dgram_server_conn *conn, struct msgb *msg))
+ int (*read_cb)(struct osmo_dgram_server_conn *conn))
{
conn->cb = read_cb;
}
@@ -295,17 +286,17 @@ void osmo_dgram_server_conn_close(struct osmo_dgram_server_conn *conn)
struct osmo_dgram_conn {
struct osmo_dgram_server_conn *server;
struct osmo_dgram_client_conn *client;
- int (*read_cb)(struct osmo_dgram_conn *conn, struct msgb *msg);
+ int (*read_cb)(struct osmo_dgram_conn *conn);
void *data;
};
static int
-dgram_server_conn_cb(struct osmo_dgram_server_conn *server, struct msgb *msg)
+dgram_server_conn_cb(struct osmo_dgram_server_conn *server)
{
struct osmo_dgram_conn *conn = server->data;
if (conn->read_cb)
- return conn->read_cb(conn, msg);
+ return conn->read_cb(conn);
return 0;
}
@@ -365,7 +356,7 @@ osmo_dgram_conn_set_remote_port(struct osmo_dgram_conn *conn, uint16_t port)
}
void osmo_dgram_conn_set_read_cb(struct osmo_dgram_conn *conn,
- int (*read_cb)(struct osmo_dgram_conn *conn, struct msgb *msg))
+ int (*read_cb)(struct osmo_dgram_conn *conn))
{
conn->read_cb = read_cb;
}
@@ -402,3 +393,8 @@ void osmo_dgram_conn_send(struct osmo_dgram_conn *conn, struct msgb *msg)
{
osmo_dgram_client_conn_send(conn->client, msg);
}
+
+int osmo_dgram_conn_recv(struct osmo_dgram_conn *conn, struct msgb *msg)
+{
+ return osmo_dgram_server_conn_recv(conn->server, msg);
+}