summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorSander Vrijders <sander.vrijders@intec.ugent.be>2017-01-09 16:05:57 +0100
committerSander Vrijders <sander.vrijders@intec.ugent.be>2017-01-09 16:05:57 +0100
commit0b6a6d6445b5addcf38eb67a001b792456242481 (patch)
tree76cc7bae73b4fba0ab67417d78be9d3eeeca84df /src/lib
parent0a071a42d4e80f54e92f34911cafda3d666d35d5 (diff)
downloadouroboros-0b6a6d6445b5addcf38eb67a001b792456242481.tar.gz
ouroboros-0b6a6d6445b5addcf38eb67a001b792456242481.zip
lib: Add Common Application Connection Establishment Phase
This adds CACEP to the library, which can be used for authenticating the other party after flow allocation and for obtaining other relevant information.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/CMakeLists.txt11
-rw-r--r--src/lib/cacep.c170
-rw-r--r--src/lib/cacep.proto29
3 files changed, 205 insertions, 5 deletions
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 22971806..f5273904 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -8,8 +8,8 @@ protobuf_generate_c(IRM_PROTO_SRCS IRM_PROTO_HDRS irmd_messages.proto)
protobuf_generate_c(IPCP_PROTO_SRCS IPCP_PROTO_HDRS ipcpd_messages.proto)
protobuf_generate_c(DIF_CONFIG_PROTO_SRCS DIF_CONFIG_PROTO_HDRS
dif_config.proto)
-protobuf_generate_c(CDAP_PROTO_SRCS CDAP_PROTO_HDRS
- cdap.proto)
+protobuf_generate_c(CDAP_PROTO_SRCS CDAP_PROTO_HDRS cdap.proto)
+protobuf_generate_c(CACEP_PROTO_SRCS CACEP_PROTO_HDRS cacep.proto)
if(NOT APPLE)
find_library(LIBRT_LIBRARIES rt)
@@ -28,6 +28,7 @@ endif()
set(SOURCE_FILES
# Add source files here
bitmap.c
+ cacep.c
cdap.c
cdap_req.c
dev.c
@@ -45,9 +46,9 @@ set(SOURCE_FILES
utils.c
)
-add_library(ouroboros SHARED ${SOURCE_FILES}
- ${IRM_PROTO_SRCS} ${IPCP_PROTO_SRCS}
- ${DIF_CONFIG_PROTO_SRCS} ${CDAP_PROTO_SRCS})
+add_library(ouroboros SHARED ${SOURCE_FILES} ${IRM_PROTO_SRCS}
+ ${IPCP_PROTO_SRCS} ${DIF_CONFIG_PROTO_SRCS}
+ ${CDAP_PROTO_SRCS} ${CACEP_PROTO_SRCS})
target_link_libraries(ouroboros ${LIBRT_LIBRARIES}
${LIBPTHREAD_LIBRARIES} ${PROTOBUF_C_LIBRARY})
diff --git a/src/lib/cacep.c b/src/lib/cacep.c
new file mode 100644
index 00000000..90994c04
--- /dev/null
+++ b/src/lib/cacep.c
@@ -0,0 +1,170 @@
+/*
+ * Ouroboros - Copyright (C) 2016 - 2017
+ *
+ * The Common Application Connection Establishment Phase
+ *
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <ouroboros/config.h>
+#include <ouroboros/cacep.h>
+#include <ouroboros/dev.h>
+#include <ouroboros/errno.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "cacep.pb-c.h"
+typedef Cacep cacep_t;
+
+#define BUF_SIZE 2048
+
+struct cacep {
+ int fd;
+ char * name;
+ uint64_t address;
+};
+
+struct cacep * cacep_create(int fd,
+ char * name,
+ uint64_t address)
+{
+ struct cacep * tmp;
+
+ tmp = malloc(sizeof(*tmp));
+ if (tmp == NULL)
+ return NULL;
+
+ tmp->fd = fd;
+ tmp->address = address;
+ tmp->name = strdup(name);
+ if (tmp->name == NULL) {
+ free(tmp);
+ return NULL;
+ }
+
+ return tmp;
+}
+
+int cacep_destroy(struct cacep * instance)
+{
+ if (instance == NULL)
+ return 0;
+
+ free(instance);
+
+ return 0;
+}
+
+static struct cacep_info * read_msg(struct cacep * instance)
+{
+ struct cacep_info * tmp;
+ uint8_t buf[BUF_SIZE];
+ cacep_t * msg;
+ ssize_t len;
+
+ len = flow_read(instance->fd, buf, BUF_SIZE);
+ if (len < 0)
+ return NULL;
+
+ msg = cacep__unpack(NULL, len, buf);
+ if (msg == NULL)
+ return NULL;
+
+ tmp = malloc(sizeof(*tmp));
+ if (tmp == NULL) {
+ cacep__free_unpacked(msg, NULL);
+ return NULL;
+ }
+
+ tmp->addr = msg->address;
+ tmp->name = strdup(msg->name);
+ if (tmp->name == NULL) {
+ free(tmp);
+ cacep__free_unpacked(msg, NULL);
+ return NULL;
+ }
+
+ cacep__free_unpacked(msg, NULL);
+
+ return tmp;
+}
+
+static int send_msg(struct cacep * instance)
+{
+ cacep_t msg = CACEP__INIT;
+ int ret = 0;
+ uint8_t * data = NULL;
+ size_t len = 0;
+
+ msg.name = instance->name;
+ msg.address = instance->address;
+
+ len = cacep__get_packed_size(&msg);
+ if (len == 0)
+ return -1;
+
+ data = malloc(len);
+ if (data == NULL)
+ return -ENOMEM;
+
+ cacep__pack(&msg, data);
+
+ if (flow_write(instance->fd, data, len) < 0)
+ ret = -1;
+
+ free(data);
+
+ return ret;
+}
+
+struct cacep_info * cacep_auth(struct cacep * instance)
+{
+ struct cacep_info * tmp;
+
+ if (instance == NULL)
+ return NULL;
+
+ if (send_msg(instance))
+ return NULL;
+
+ tmp = read_msg(instance);
+ if (tmp == NULL)
+ return NULL;
+
+ return tmp;
+}
+
+struct cacep_info * cacep_auth_wait(struct cacep * instance)
+{
+ struct cacep_info * tmp;
+
+ if (instance == NULL)
+ return NULL;
+
+ tmp = read_msg(instance);
+ if (tmp == NULL)
+ return NULL;
+
+ if (send_msg(instance)) {
+ free(tmp->name);
+ free(tmp);
+ return NULL;
+ }
+
+ return tmp;
+}
diff --git a/src/lib/cacep.proto b/src/lib/cacep.proto
new file mode 100644
index 00000000..603b095d
--- /dev/null
+++ b/src/lib/cacep.proto
@@ -0,0 +1,29 @@
+/*
+ * Ouroboros - Copyright (C) 2016 - 2017
+ *
+ * CACEP message
+ *
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+syntax = "proto2";
+
+message cacep {
+ required string name = 1;
+ required uint64 address = 2;
+}