summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2013-03-18 17:13:15 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2013-03-18 17:13:15 +0100
commit7d4283f8f54e9836c59d6507d0cfb0464ffb9e74 (patch)
tree7d3df167b95fab4dfcfae9996ccb14c91f0502ac
parent77199be682daa1797a4518b3958d58c133dd88f2 (diff)
downloadgmrf-7d4283f8f54e9836c59d6507d0cfb0464ffb9e74.tar
gmrf-7d4283f8f54e9836c59d6507d0cfb0464ffb9e74.zip
Add protocol module API library
-rw-r--r--CMakeLists.txt1
-rw-r--r--include/gmrf/gmrf.h8
-rw-r--r--include/mmss/protocol.h4
-rw-r--r--mmss-protocol/CMakeLists.txt6
-rw-r--r--mmss-protocol/mmss_protocol.c44
-rw-r--r--mmss/mmss.c13
-rw-r--r--mmss/mmss.h2
7 files changed, 71 insertions, 7 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c8a1c50..31d4066 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,3 +2,4 @@ cmake_minimum_required(VERSION 2.8.3)
project(GMRF C)
add_subdirectory(mmss)
+add_subdirectory(mmss-protocol)
diff --git a/include/gmrf/gmrf.h b/include/gmrf/gmrf.h
index 3634b29..f6cf9c4 100644
--- a/include/gmrf/gmrf.h
+++ b/include/gmrf/gmrf.h
@@ -59,7 +59,11 @@ size_t gmrf_iface_get_mtu(gmrf_t *gmrf, gmrf_iface_t *iface);
bool gmrf_iface_send(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len, const gmrf_addr_t *dest);
bool gmrf_iface_send_bc(gmrf_t *gmrf, gmrf_iface_t *iface, const void *data, size_t len);
-gmrf_context_t* gmrf_init(gmrf_t *gmrf);
-void gmrf_handle_packet(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
+/* implemented by protocol */
+extern const char *gmrf_protocol_name;
+extern const char *gmrf_protocol_version;
+
+gmrf_context_t* gmrf_protocol_init(gmrf_t *gmrf);
+void gmrf_protocol_handle_packet(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
#endif /* _GMRF_GMRF_H_ */
diff --git a/include/mmss/protocol.h b/include/mmss/protocol.h
index 502a923..7d131d2 100644
--- a/include/mmss/protocol.h
+++ b/include/mmss/protocol.h
@@ -31,8 +31,8 @@
typedef struct mmss_protocol {
- const char *name;
- const char *version;
+ const char* (*get_name)(void);
+ const char* (*get_version)(void);
gmrf_context_t* (*init)(gmrf_t *gmrf);
void (*handle_packet)(gmrf_t *gmrf, gmrf_context_t *ctx, gmrf_iface_t *iface, const gmrf_addr_t *source, const void *data, size_t len);
diff --git a/mmss-protocol/CMakeLists.txt b/mmss-protocol/CMakeLists.txt
new file mode 100644
index 0000000..6f08b21
--- /dev/null
+++ b/mmss-protocol/CMakeLists.txt
@@ -0,0 +1,6 @@
+include_directories(${GMRF_SOURCE_DIR}/include)
+
+add_library(mmss_protocol STATIC
+ mmss_protocol.c
+)
+set_target_properties(mmss_protocol PROPERTIES COMPILE_FLAGS "-fPIC")
diff --git a/mmss-protocol/mmss_protocol.c b/mmss-protocol/mmss_protocol.c
new file mode 100644
index 0000000..cad6d76
--- /dev/null
+++ b/mmss-protocol/mmss_protocol.c
@@ -0,0 +1,44 @@
+/*
+ Copyright (c) 2013, Matthias Schiffer <mschiffer@universe-factory.net>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#include <mmss/protocol.h>
+
+
+static const char* get_name(void) {
+ return gmrf_protocol_name;
+}
+
+static const char* get_version(void) {
+ return gmrf_protocol_version;
+}
+
+const mmss_protocol_t mmss_protocol_info = {
+ .get_name = get_name,
+ .get_version = get_version,
+
+ .init = gmrf_protocol_init,
+ .handle_packet = gmrf_protocol_handle_packet,
+};
diff --git a/mmss/mmss.c b/mmss/mmss.c
index abb4835..ae87afb 100644
--- a/mmss/mmss.c
+++ b/mmss/mmss.c
@@ -39,11 +39,20 @@ static void init_nodes(gmrf_t *nodes) {
}
-int main() {
+int main(int argc, char *argv[]) {
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s protocol_module\n", argv[0]);
+ return 1;
+ }
+
+ const mmss_protocol_t *proto = mmss_load_protocol(argv[1]);
+ if (!proto)
+ return 1;
+
mmss_t mmss = { .now = 0 };
mmss_network_t net = { .mtu = 1500 };
- gmrf_t node1 = { .mmss = &mmss }, node2 = { .mmss = &mmss };
+ gmrf_t node1 = { .mmss = &mmss, .proto = proto }, node2 = { .mmss = &mmss, .proto = proto };
gmrf_iface_t iface1 = {}, iface2 = {};
iface1.net = &net;
diff --git a/mmss/mmss.h b/mmss/mmss.h
index e8b8f32..55e86d5 100644
--- a/mmss/mmss.h
+++ b/mmss/mmss.h
@@ -64,7 +64,7 @@ struct gmrf {
gmrf_context_t *ctx;
gmrf_iface_t *interfaces;
- mmss_protocol_t *proto;
+ const mmss_protocol_t *proto;
};
struct gmrf_iface {