diff options
author | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2010-06-04 17:43:50 +0200 |
---|---|---|
committer | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2010-06-04 17:43:50 +0200 |
commit | f126078bbae246d179f15d9948450a8a8eb96312 (patch) | |
tree | f4c72a5be5b731ccb931d213a4c8a9882640a65d | |
parent | 23367a9167c0ee1efb700a474e1a40ac28856da1 (diff) | |
download | tsnif-udp-1.tar.gz tsnif-udp-1.tar.xz tsnif-udp-1.zip |
aliveudp-1
-rw-r--r-- | src/Makefile | 5 | ||||
-rw-r--r-- | src/intf.c | 4 | ||||
-rw-r--r-- | src/intf.h | 2 | ||||
-rw-r--r-- | src/trans-libnl.c | 24 | ||||
-rw-r--r-- | src/trans-tcp.c | 41 | ||||
-rw-r--r-- | src/trans-udp.c | 41 | ||||
-rw-r--r-- | src/trans.c | 93 | ||||
-rw-r--r-- | src/trans.h | 46 | ||||
-rw-r--r-- | src/tsnif.c | 2 | ||||
-rw-r--r-- | src/tsnifd.c | 2 |
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 @@ -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; @@ -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; |