diff options
Diffstat (limited to 'src/ipcpd')
-rw-r--r-- | src/ipcpd/shim-udp/CMakeLists.txt | 9 | ||||
-rw-r--r-- | src/ipcpd/shim-udp/main.c | 127 | ||||
-rw-r--r-- | src/ipcpd/shim-udp/shim_udp_messages.proto | 37 |
3 files changed, 69 insertions, 104 deletions
diff --git a/src/ipcpd/shim-udp/CMakeLists.txt b/src/ipcpd/shim-udp/CMakeLists.txt index cc419fd0..aaf7e83b 100644 --- a/src/ipcpd/shim-udp/CMakeLists.txt +++ b/src/ipcpd/shim-udp/CMakeLists.txt @@ -12,19 +12,14 @@ include_directories(${CURRENT_BINARY_PARENT_DIR}) include_directories(${CMAKE_SOURCE_DIR}/include) include_directories(${CMAKE_BINARY_DIR}/include) -protobuf_generate_c(SHIM_UDP_PROTO_SRCS SHIM_UDP_PROTO_HDRS - shim_udp_messages.proto) - set(IPCP_SHIM_UDP_TARGET ipcpd-shim-udp CACHE INTERNAL "") set(SHIM_UDP_SOURCES # Add source files here ${CMAKE_CURRENT_SOURCE_DIR}/main.c) -add_executable(ipcpd-shim-udp ${SHIM_UDP_SOURCES} ${IPCP_SOURCES} - ${SHIM_UDP_PROTO_SRCS}) -target_link_libraries(ipcpd-shim-udp LINK_PUBLIC ouroboros-dev - ${PROTOBUF_C_LIBRARY}) +add_executable(ipcpd-shim-udp ${SHIM_UDP_SOURCES} ${IPCP_SOURCES}) +target_link_libraries(ipcpd-shim-udp LINK_PUBLIC ouroboros-dev) # Find the nsupdate executable find_program(NSUPDATE_EXECUTABLE diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c index 4fafc4de..79d5ea83 100644 --- a/src/ipcpd/shim-udp/main.c +++ b/src/ipcpd/shim-udp/main.c @@ -37,7 +37,6 @@ #include "ipcp.h" #include "shim-data.h" -#include "shim_udp_messages.pb-c.h" #include <string.h> #include <sys/socket.h> @@ -51,23 +50,32 @@ #include <sys/wait.h> #include <fcntl.h> -typedef ShimUdpMsg shim_udp_msg_t; +#define FLOW_REQ 1 +#define FLOW_REPLY 2 -#define THIS_TYPE IPCP_SHIM_UDP -#define LISTEN_PORT htons(0x0D1F) -#define SHIM_UDP_BUF_SIZE 256 -#define SHIM_UDP_MSG_SIZE 256 +#define THIS_TYPE IPCP_SHIM_UDP +#define LISTEN_PORT htons(0x0D1F) +#define SHIM_UDP_BUF_SIZE 256 +#define SHIM_UDP_MSG_SIZE 256 #define SHIM_UDP_MAX_SDU_SIZE 8980 -#define DNS_TTL 86400 -#define FD_UPDATE_TIMEOUT 100 /* microseconds */ +#define DNS_TTL 86400 +#define FD_UPDATE_TIMEOUT 100 /* microseconds */ -#define local_ip (udp_data.s_saddr.sin_addr.s_addr) +#define local_ip (udp_data.s_saddr.sin_addr.s_addr) -#define UDP_MAX_PORTS 0xFFFF +#define UDP_MAX_PORTS 0xFFFF + +struct mgmt_msg { + uint16_t src_udp_port; + uint16_t dst_udp_port; + uint8_t code; + uint8_t qoscube; + uint8_t response; +} __attribute__((packed)); struct uf { - int udp; - int skfd; + int udp; + int skfd; }; struct { @@ -172,10 +180,10 @@ static void clr_fd(int fd) pthread_mutex_unlock(&udp_data.fd_set_lock); } -static int send_shim_udp_msg(shim_udp_msg_t * msg, - uint32_t dst_ip_addr) +static int send_shim_udp_msg(uint8_t * buf, + size_t len, + uint32_t dst_ip_addr) { - buffer_t buf; struct sockaddr_in r_saddr; memset((char *)&r_saddr, 0, sizeof(r_saddr)); @@ -183,30 +191,13 @@ static int send_shim_udp_msg(shim_udp_msg_t * msg, r_saddr.sin_addr.s_addr = dst_ip_addr; r_saddr.sin_port = LISTEN_PORT; - buf.len = shim_udp_msg__get_packed_size(msg); - if (buf.len == 0) { - return -1; - } - - buf.data = malloc(SHIM_UDP_MSG_SIZE); - if (buf.data == NULL) - return -1; - - shim_udp_msg__pack(msg, buf.data); - - if (sendto(udp_data.s_fd, - buf.data, - buf.len, - 0, + if (sendto(udp_data.s_fd, buf, len, 0, (struct sockaddr *) &r_saddr, sizeof(r_saddr)) == -1) { log_err("Failed to send message."); - free(buf.data); return -1; } - free(buf.data); - return 0; } @@ -215,17 +206,29 @@ static int ipcp_udp_port_alloc(uint32_t dst_ip_addr, const uint8_t * dst, qoscube_t cube) { - shim_udp_msg_t msg = SHIM_UDP_MSG__INIT; + uint8_t * buf; + struct mgmt_msg * msg; + size_t len; + int ret; + + len = sizeof(*msg) + ipcp_dir_hash_len(); + + buf = malloc(len); + if (buf == NULL) + return -1; - msg.code = SHIM_UDP_MSG_CODE__FLOW_REQ; - msg.src_udp_port = src_udp_port; - msg.has_hash = true; - msg.hash.len = ipcp_dir_hash_len(); - msg.hash.data = (uint8_t *) dst; - msg.has_qoscube = true; - msg.qoscube = cube; + msg = (struct mgmt_msg *) buf; + msg->code = FLOW_REQ; + msg->src_udp_port = src_udp_port; + msg->qoscube = cube; - return send_shim_udp_msg(&msg, dst_ip_addr); + memcpy(msg + 1, dst, ipcp_dir_hash_len()); + + ret = send_shim_udp_msg(buf, len, dst_ip_addr); + + free(buf); + + return ret; } static int ipcp_udp_port_alloc_resp(uint32_t dst_ip_addr, @@ -233,16 +236,25 @@ static int ipcp_udp_port_alloc_resp(uint32_t dst_ip_addr, uint16_t dst_udp_port, int response) { - shim_udp_msg_t msg = SHIM_UDP_MSG__INIT; + uint8_t * buf; + struct mgmt_msg * msg; + int ret; + + buf = malloc(sizeof(*msg)); + if (buf == NULL) + return -1; - msg.code = SHIM_UDP_MSG_CODE__FLOW_REPLY; - msg.src_udp_port = src_udp_port; - msg.has_dst_udp_port = true; - msg.dst_udp_port = dst_udp_port; - msg.has_response = true; - msg.response = response; + msg = (struct mgmt_msg *) buf; + msg->code = FLOW_REPLY; + msg->src_udp_port = src_udp_port; + msg->dst_udp_port = dst_udp_port; + msg->response = response; - return send_shim_udp_msg(&msg, dst_ip_addr); + ret = send_shim_udp_msg(buf, sizeof(*msg), dst_ip_addr); + + free(buf); + + return ret; } static int ipcp_udp_port_req(struct sockaddr_in * c_saddr, @@ -404,7 +416,7 @@ static void * ipcp_udp_listener(void * o) (void) o; while (true) { - shim_udp_msg_t * msg = NULL; + struct mgmt_msg * msg = NULL; memset(&buf, 0, SHIM_UDP_MSG_SIZE); n = sizeof(c_saddr); @@ -419,31 +431,26 @@ static void * ipcp_udp_listener(void * o) == NULL) continue; - msg = shim_udp_msg__unpack(NULL, n, buf); - if (msg == NULL) - continue; + msg = (struct mgmt_msg *) buf; switch (msg->code) { - case SHIM_UDP_MSG_CODE__FLOW_REQ: + case FLOW_REQ: c_saddr.sin_port = msg->src_udp_port; ipcp_udp_port_req(&c_saddr, - msg->hash.data, + (uint8_t *) (msg + 1), msg->qoscube); break; - case SHIM_UDP_MSG_CODE__FLOW_REPLY: + case FLOW_REPLY: ipcp_udp_port_alloc_reply(msg->src_udp_port, msg->dst_udp_port, msg->response); break; default: log_err("Unknown message received %d.", msg->code); - shim_udp_msg__free_unpacked(msg, NULL); continue; } c_saddr.sin_port = LISTEN_PORT; - - shim_udp_msg__free_unpacked(msg, NULL); } return 0; diff --git a/src/ipcpd/shim-udp/shim_udp_messages.proto b/src/ipcpd/shim-udp/shim_udp_messages.proto deleted file mode 100644 index 377a8a91..00000000 --- a/src/ipcpd/shim-udp/shim_udp_messages.proto +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2017 - * - * Shim UDP message - * - * Dimitri Staessens <dimitri.staessens@ugent.be> - * Sander Vrijders <sander.vrijders@ugent.be> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., http://www.fsf.org/about/contact/. - */ - -syntax = "proto2"; - -enum shim_udp_msg_code { - FLOW_REQ = 1; - FLOW_REPLY = 2; -}; - -message shim_udp_msg { - required shim_udp_msg_code code = 1; - optional bytes hash = 2; - required uint32 src_udp_port = 3; - optional uint32 dst_udp_port = 4; - optional uint32 qoscube = 5; - optional sint32 response = 6; -}; |