summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Olsa <Jiri Olsa jolsa@redhat.com>2010-06-04 17:43:50 +0200
committerJiri Olsa <Jiri Olsa jolsa@redhat.com>2010-06-04 17:43:50 +0200
commitf126078bbae246d179f15d9948450a8a8eb96312 (patch)
treef4c72a5be5b731ccb931d213a4c8a9882640a65d
parent23367a9167c0ee1efb700a474e1a40ac28856da1 (diff)
downloadtsnif-udp-1.tar.gz
tsnif-udp-1.tar.xz
tsnif-udp-1.zip
aliveudp-1
-rw-r--r--src/Makefile5
-rw-r--r--src/intf.c4
-rw-r--r--src/intf.h2
-rw-r--r--src/trans-libnl.c24
-rw-r--r--src/trans-tcp.c41
-rw-r--r--src/trans-udp.c41
-rw-r--r--src/trans.c93
-rw-r--r--src/trans.h46
-rw-r--r--src/tsnif.c2
-rw-r--r--src/tsnifd.c2
10 files changed, 242 insertions, 18 deletions
diff --git a/src/Makefile b/src/Makefile
index fb38799..a73ef91 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2,7 +2,10 @@
INTF_OBJS= \
src/intf.o \
src/fsm.o \
- src/trans-libnl.o
+ src/trans.o \
+ src/trans-libnl.o \
+ src/trans-udp.o \
+ src/trans-tcp.o \
STORAGE_OBJS= \
src/storage-mmap.o
diff --git a/src/intf.c b/src/intf.c
index e03b41a..a464e4e 100644
--- a/src/intf.c
+++ b/src/intf.c
@@ -95,7 +95,7 @@ static int init_mgroup(struct tsnif_handle *h)
return trans_send(&h->trans, &msg);
}
-int tsnif_init(struct tsnif_handle *h, struct tsnif_ops *ops)
+int tsnif_init(struct tsnif_handle *h, struct tsnif_ops *ops, int trans_flags)
{
int err;
@@ -106,7 +106,7 @@ int tsnif_init(struct tsnif_handle *h, struct tsnif_ops *ops)
h->ops = ops;
INIT_LIST_HEAD(&h->terms);
- err = trans_init(&h->trans, trans_cb);
+ err = trans_init(&h->trans, trans_cb, trans_flags);
if (err)
return err;
diff --git a/src/intf.h b/src/intf.h
index c136b6b..f331f92 100644
--- a/src/intf.h
+++ b/src/intf.h
@@ -62,7 +62,7 @@ struct tsnif_handle {
typedef int(*cb_tsnif_enum_t)(struct tsnif_term *term);
/* handle functions */
-int tsnif_init(struct tsnif_handle *h, struct tsnif_ops *ops);
+int tsnif_init(struct tsnif_handle *h, struct tsnif_ops *ops, int trans_flags);
int tsnif_close(struct tsnif_handle *h);
int tsnif_process(struct tsnif_handle *h);
int tsnif_fd(struct tsnif_handle *h);
diff --git a/src/trans-libnl.c b/src/trans-libnl.c
index c623375..3da465f 100644
--- a/src/trans-libnl.c
+++ b/src/trans-libnl.c
@@ -112,14 +112,12 @@ static int set_no_enobufs(struct trans_handle *h)
&val, sizeof(val));
}
-int trans_init(struct trans_handle *h, trans_cb_t cb)
+int lnl_init(struct trans_handle *h, trans_cb_t cb)
{
struct nl_handle *sock;
int family;
int err;
- memset(h, 0x0, sizeof(*h));
-
sock = nl_handle_alloc();
if (!sock)
return nl_get_errno();
@@ -143,7 +141,6 @@ int trans_init(struct trans_handle *h, trans_cb_t cb)
h->sock = sock;
h->family = family;
- h->cb = cb;
err = set_no_enobufs(h);
if (err)
@@ -152,13 +149,13 @@ int trans_init(struct trans_handle *h, trans_cb_t cb)
return 0;
}
-int trans_close(struct trans_handle *h)
+int lnl_close(struct trans_handle *h)
{
nl_handle_destroy(h->sock);
return 0;
}
-int trans_process(struct trans_handle *h)
+int lnl_process(struct trans_handle *h)
{
int err;
@@ -169,7 +166,7 @@ int trans_process(struct trans_handle *h)
return err;
}
-int trans_send(struct trans_handle *h, struct trans_msg *m)
+static int lnl_send(struct trans_handle *h, struct trans_msg *m)
{
struct nl_msg *msg;
int err;
@@ -201,12 +198,21 @@ int trans_send(struct trans_handle *h, struct trans_msg *m)
return err > 0 ? 0 : err;
}
-int trans_group(struct trans_handle *h, int group)
+static int lnl_group(struct trans_handle *h, int group)
{
return nl_socket_add_membership(h->sock, group);
}
-int trans_fd(struct trans_handle *h)
+static int lnl_fd(struct trans_handle *h)
{
return nl_socket_get_fd(h->sock);
}
+
+struct trans_layer trans_nl = {
+ .init = lnl_init,
+ .close = lnl_close,
+ .process = lnl_process,
+ .send = lnl_send,
+ .group = lnl_group,
+ .fd = lnl_fd,
+};
diff --git a/src/trans-tcp.c b/src/trans-tcp.c
new file mode 100644
index 0000000..f93a89b
--- /dev/null
+++ b/src/trans-tcp.c
@@ -0,0 +1,41 @@
+
+#include "trans.h"
+
+static int tcp_init(struct trans_handle *h, trans_cb_t cb)
+{
+ return 0;
+}
+
+static int tcp_close(struct trans_handle *h)
+{
+ return 0;
+}
+
+static int tcp_process(struct trans_handle *h)
+{
+ return 0;
+}
+
+static int tcp_send(struct trans_handle *h, struct trans_msg *msg)
+{
+ return 0;
+}
+
+static int tcp_group(struct trans_handle *h, int group)
+{
+ return 0;
+}
+
+static int tcp_fd(struct trans_handle *h)
+{
+ return 0;
+}
+
+struct trans_layer trans_tcp = {
+ .init = tcp_init,
+ .close = tcp_close,
+ .process = tcp_process,
+ .send = tcp_send,
+ .group = tcp_group,
+ .fd = tcp_fd,
+};
diff --git a/src/trans-udp.c b/src/trans-udp.c
new file mode 100644
index 0000000..8773b19
--- /dev/null
+++ b/src/trans-udp.c
@@ -0,0 +1,41 @@
+
+#include "trans.h"
+
+static int udp_init(struct trans_handle *h, trans_cb_t cb)
+{
+ return 0;
+}
+
+static int udp_close(struct trans_handle *h)
+{
+ return 0;
+}
+
+static int udp_process(struct trans_handle *h)
+{
+ return 0;
+}
+
+static int udp_send(struct trans_handle *h, struct trans_msg *msg)
+{
+ return 0;
+}
+
+static int udp_group(struct trans_handle *h, int group)
+{
+ return 0;
+}
+
+static int udp_fd(struct trans_handle *h)
+{
+ return 0;
+}
+
+struct trans_layer trans_udp = {
+ .init = udp_init,
+ .close = udp_close,
+ .process = udp_process,
+ .send = udp_send,
+ .group = udp_group,
+ .fd = udp_fd,
+};
diff --git a/src/trans.c b/src/trans.c
new file mode 100644
index 0000000..58e96e3
--- /dev/null
+++ b/src/trans.c
@@ -0,0 +1,93 @@
+
+#include <string.h>
+#include <errno.h>
+
+#include "trans.h"
+
+extern struct trans_layer trans_nl;
+extern struct trans_layer trans_udp;
+extern struct trans_layer trans_tcp;
+
+enum {
+ TRANS_NL = 0,
+ TRANS_UDP = 1,
+ TRANS_TCP = 2,
+ TRANS_MAX,
+};
+
+static struct trans_layer *layers[TRANS_MAX];
+
+static void layers_init(void)
+{
+ layers[TRANS_NL] = &trans_nl;
+ layers[TRANS_UDP] = &trans_udp;
+ layers[TRANS_TCP] = &trans_tcp;
+}
+
+#define NL (layers[TRANS_NL])
+#define UDP (layers[TRANS_NL])
+#define TCP (layers[TRANS_NL])
+
+#define TSNIF_TRANS_UDP (TSNIF_TRANS_UDP_CLIENT | TSNIF_TRANS_UDP_SERVER)
+#define TSNIF_TRANS_TCP (TSNIF_TRANS_TCP_CLIENT | TSNIF_TRANS_TCP_SERVER)
+
+static int cb_local(struct trans_handle *h, struct trans_msg *msg)
+{
+ return h->cb ? h->cb(h, msg) : -1;
+}
+
+int trans_init(struct trans_handle *h, trans_cb_t cb, int flags)
+{
+ int ret = -1;
+
+ layers_init();
+
+ memset(h, 0x0, sizeof(*h));
+ h->flags = flags;
+ h->cb = cb;
+ h->cb_local = cb_local;
+
+ if ((flags & TSNIF_TRANS_UDP_CLIENT) &&
+ (flags & TSNIF_TRANS_NL))
+ return -EINVAL;
+
+ if ((flags & TSNIF_TRANS_TCP_CLIENT) &&
+ (flags & TSNIF_TRANS_NL))
+ return -EINVAL;
+
+ if (flags & TSNIF_TRANS_NL)
+ ret = NL->init(h, cb);
+
+ if (!ret && (flags & TSNIF_TRANS_UDP))
+ ret = UDP->init(h, cb);
+
+ if (!ret && (flags & TSNIF_TRANS_UDP))
+ ret = TCP->init(h, cb);
+
+ return 0;
+}
+
+int trans_close(struct trans_handle *h)
+{
+ return 0;
+}
+
+int trans_process(struct trans_handle *h)
+{
+ return 0;
+}
+
+int trans_send(struct trans_handle *h, struct trans_msg *msg)
+{
+ return 0;
+}
+
+int trans_group(struct trans_handle *h, int group)
+{
+ return 0;
+}
+
+int trans_fd(struct trans_handle *h)
+{
+ return 0;
+}
diff --git a/src/trans.h b/src/trans.h
index e7c38bc..8916208 100644
--- a/src/trans.h
+++ b/src/trans.h
@@ -3,6 +3,7 @@
#define TRANS_H
#include <sys/ioctl.h>
+#include <stdlib.h>
struct trans_handle;
struct trans_msg;
@@ -40,14 +41,53 @@ struct trans_msg {
};
};
-int trans_init(struct trans_handle *h, trans_cb_t cb);
+/* public interface enum for tsnif_init function */
+enum {
+ TSNIF_TRANS_NL = 0x1,
+ TSNIF_TRANS_UDP_CLIENT = 0x2,
+ TSNIF_TRANS_UDP_SERVER = 0x4,
+ TSNIF_TRANS_TCP_CLIENT = 0x8,
+ TSNIF_TRANS_TCP_SERVER = 0x10,
+};
+
+typedef int (*init_t)(struct trans_handle *h, trans_cb_t cb);
+typedef int (*close_t)(struct trans_handle *h);
+typedef int (*process_t)(struct trans_handle *h);
+typedef int (*send_t)(struct trans_handle *h, struct trans_msg *msg);
+typedef int (*group_t)(struct trans_handle *h, int group);
+typedef int (*fd_t)(struct trans_handle *h);
+
+struct trans_layer {
+ init_t init;
+ close_t close;
+ process_t process;
+ send_t send;
+ group_t group;
+ fd_t fd;
+};
+
+int trans_init(struct trans_handle *h, trans_cb_t cb, int flags);
int trans_close(struct trans_handle *h);
int trans_process(struct trans_handle *h);
int trans_send(struct trans_handle *h, struct trans_msg *msg);
int trans_group(struct trans_handle *h, int group);
int trans_fd(struct trans_handle *h);
-/* TODO make CONFIG option and ifdef this place */
-#include "trans-libnl.h"
+struct trans_handle {
+ int flags;
+
+ trans_cb_t cb;
+ trans_cb_t cb_local;
+
+ /* nl */
+ struct nl_handle *sock;
+ int family;
+
+ /* udp */
+ int udp_socket;
+
+ /* tcp */
+ int tcp_socket;
+};
#endif /* !TRANS_H */
diff --git a/src/tsnif.c b/src/tsnif.c
index ef83561..777cf5e 100644
--- a/src/tsnif.c
+++ b/src/tsnif.c
@@ -227,7 +227,7 @@ int main(int argc, char **argv)
if (get_args(argc, argv))
usage();
- err = tsnif_init(&handle, &ops);
+ err = tsnif_init(&handle, &ops, TSNIF_TRANS_NL);
if (err)
return err;
diff --git a/src/tsnifd.c b/src/tsnifd.c
index 52393d5..c1c0456 100644
--- a/src/tsnifd.c
+++ b/src/tsnifd.c
@@ -212,7 +212,7 @@ int main(int argc, char **argv)
if (get_args(argc, argv))
usage();
- err = tsnif_init(&handle, &ops);
+ err = tsnif_init(&handle, &ops, TSNIF_TRANS_NL);
if (err)
return err;