diff options
Diffstat (limited to 'src/ipcpd/shim-eth-llc')
-rw-r--r-- | src/ipcpd/shim-eth-llc/CMakeLists.txt | 8 | ||||
-rw-r--r-- | src/ipcpd/shim-eth-llc/main.c | 174 | ||||
-rw-r--r-- | src/ipcpd/shim-eth-llc/shim_eth_llc_messages.proto | 39 |
3 files changed, 99 insertions, 122 deletions
diff --git a/src/ipcpd/shim-eth-llc/CMakeLists.txt b/src/ipcpd/shim-eth-llc/CMakeLists.txt index 56e25457..b1d2196c 100644 --- a/src/ipcpd/shim-eth-llc/CMakeLists.txt +++ b/src/ipcpd/shim-eth-llc/CMakeLists.txt @@ -76,8 +76,6 @@ endif () if (HAVE_LLC) message(STATUS "Supported raw Ethernet API found, building shim-eth-llc") - protobuf_generate_c(SHIM_ETH_LLC_PROTO_SRCS SHIM_ETH_LLC_PROTO_HDRS - shim_eth_llc_messages.proto) set(SHIM_ETH_LLC_SOURCES # Add source files here @@ -86,8 +84,7 @@ if (HAVE_LLC) set(IPCP_SHIM_ETH_LLC_TARGET ipcpd-shim-eth-llc CACHE INTERNAL "") - add_executable(ipcpd-shim-eth-llc ${SHIM_ETH_LLC_SOURCES} ${IPCP_SOURCES} - ${SHIM_ETH_LLC_PROTO_SRCS}) + add_executable(ipcpd-shim-eth-llc ${SHIM_ETH_LLC_SOURCES} ${IPCP_SOURCES}) if (HAVE_BPF AND NOT APPLE) target_include_directories(ipcpd-shim-eth-llc PUBLIC ${BPF_C_INCLUDE_DIR}) @@ -98,8 +95,7 @@ if (HAVE_LLC) ${NETMAP_C_INCLUDE_DIR}) endif () - target_link_libraries(ipcpd-shim-eth-llc LINK_PUBLIC ouroboros-dev - ${PROTOBUF_C_LIBRARY}) + target_link_libraries(ipcpd-shim-eth-llc LINK_PUBLIC ouroboros-dev) include(AddCompileFlags) if (CMAKE_BUILD_TYPE MATCHES "Debug*") diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index cd245323..c27e42d3 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -47,7 +47,6 @@ #include "ipcp.h" #include "shim-data.h" -#include "shim_eth_llc_messages.pb-c.h" #include <signal.h> #include <stdlib.h> @@ -106,7 +105,18 @@ #define NAME_QUERY_TIMEO 2000 /* ms */ #define MGMT_TIMEO 100 /* ms */ -typedef ShimEthLlcMsg shim_eth_llc_msg_t; +#define FLOW_REQ 0 +#define FLOW_REPLY 1 +#define NAME_QUERY_REQ 2 +#define NAME_QUERY_REPLY 3 + +struct mgmt_msg { + uint8_t code; + uint8_t ssap; + uint8_t dsap; + uint8_t qoscube; + int8_t response; +} __attribute__((packed)); struct eth_llc_frame { uint8_t dst_hwaddr[MAC_SIZE]; @@ -116,7 +126,7 @@ struct eth_llc_frame { uint8_t ssap; uint8_t cf; uint8_t payload; -}; +} __attribute__((packed)); struct ef { int8_t sap; @@ -351,51 +361,35 @@ static int eth_llc_ipcp_send_frame(const uint8_t * dst_addr, return 0; } -static int eth_llc_ipcp_send_mgmt_frame(shim_eth_llc_msg_t * msg, - const uint8_t * dst_addr) +static int eth_llc_ipcp_sap_alloc(const uint8_t * dst_addr, + uint8_t ssap, + const uint8_t * hash, + qoscube_t cube) { - size_t len; - uint8_t * buf; + uint8_t * buf; + struct mgmt_msg * msg; + size_t len; + int ret; - len = shim_eth_llc_msg__get_packed_size(msg); - if (len == 0) - return -1; + len = sizeof(*msg) + ipcp_dir_hash_len(); buf = malloc(len); if (buf == NULL) return -1; - shim_eth_llc_msg__pack(msg, buf); + msg = (struct mgmt_msg *) buf; + msg->code = FLOW_REQ; + msg->ssap = ssap; + msg->qoscube = cube; - if (eth_llc_ipcp_send_frame(dst_addr, reverse_bits(MGMT_SAP), - reverse_bits(MGMT_SAP), buf, len)) { - log_err("Failed to send management frame."); - free(buf); - return -1; - } + memcpy(msg + 1, hash, ipcp_dir_hash_len()); - free(buf); + ret = eth_llc_ipcp_send_frame(dst_addr, reverse_bits(MGMT_SAP), + reverse_bits(MGMT_SAP), buf, len); - return 0; -} + free(buf); -static int eth_llc_ipcp_sap_alloc(const uint8_t * dst_addr, - uint8_t ssap, - const uint8_t * hash, - qoscube_t cube) -{ - shim_eth_llc_msg_t msg = SHIM_ETH_LLC_MSG__INIT; - - msg.code = SHIM_ETH_LLC_MSG_CODE__FLOW_REQ; - msg.has_ssap = true; - msg.ssap = ssap; - msg.has_hash = true; - msg.hash.len = ipcp_dir_hash_len(); - msg.hash.data = (uint8_t *) hash; - msg.has_qoscube = true; - msg.qoscube = cube; - - return eth_llc_ipcp_send_mgmt_frame(&msg, dst_addr); + return ret; } static int eth_llc_ipcp_sap_alloc_resp(uint8_t * dst_addr, @@ -403,17 +397,16 @@ static int eth_llc_ipcp_sap_alloc_resp(uint8_t * dst_addr, uint8_t dsap, int response) { - shim_eth_llc_msg_t msg = SHIM_ETH_LLC_MSG__INIT; + struct mgmt_msg msg; - msg.code = SHIM_ETH_LLC_MSG_CODE__FLOW_REPLY; - msg.has_ssap = true; - msg.ssap = ssap; - msg.has_dsap = true; - msg.dsap = dsap; - msg.has_response = true; - msg.response = response; + msg.code = FLOW_REPLY; + msg.ssap = ssap; + msg.dsap = dsap; + msg.response = response; - return eth_llc_ipcp_send_mgmt_frame(&msg, dst_addr); + return eth_llc_ipcp_send_frame(dst_addr, reverse_bits(MGMT_SAP), + reverse_bits(MGMT_SAP), + (uint8_t *) &msg, sizeof(msg)); } static int eth_llc_ipcp_sap_req(uint8_t r_sap, @@ -504,15 +497,30 @@ static int eth_llc_ipcp_sap_alloc_reply(uint8_t ssap, static int eth_llc_ipcp_name_query_req(const uint8_t * hash, uint8_t * r_addr) { - shim_eth_llc_msg_t msg = SHIM_ETH_LLC_MSG__INIT; + uint8_t * buf; + struct mgmt_msg * msg; + size_t len; if (shim_data_reg_has(eth_llc_data.shim_data, hash)) { - msg.code = SHIM_ETH_LLC_MSG_CODE__NAME_QUERY_REPLY; - msg.has_hash = true; - msg.hash.len = ipcp_dir_hash_len(); - msg.hash.data = (uint8_t *) hash; + len = sizeof(*msg) + ipcp_dir_hash_len(); - eth_llc_ipcp_send_mgmt_frame(&msg, r_addr); + buf = malloc(len); + if (buf == NULL) + return -1; + + msg = (struct mgmt_msg *) buf; + msg->code = NAME_QUERY_REPLY; + + memcpy(msg + 1, hash, ipcp_dir_hash_len()); + + if (eth_llc_ipcp_send_frame(r_addr, reverse_bits(MGMT_SAP), + reverse_bits(MGMT_SAP), buf, len)) { + log_err("Failed to send management frame."); + free(buf); + return -1; + } + + free(buf); } return 0; @@ -533,45 +541,39 @@ static int eth_llc_ipcp_name_query_reply(const uint8_t * hash, } static int eth_llc_ipcp_mgmt_frame(const uint8_t * buf, - size_t len, uint8_t * r_addr) { - shim_eth_llc_msg_t * msg; + struct mgmt_msg * msg; - msg = shim_eth_llc_msg__unpack(NULL, len, buf); - if (msg == NULL) { - log_err("Failed to unpack."); - return -1; - } + msg = (struct mgmt_msg *) buf; switch (msg->code) { - case SHIM_ETH_LLC_MSG_CODE__FLOW_REQ: - if (shim_data_reg_has(eth_llc_data.shim_data, msg->hash.data)) { + case FLOW_REQ: + if (shim_data_reg_has(eth_llc_data.shim_data, + buf + sizeof(*msg))) { eth_llc_ipcp_sap_req(msg->ssap, r_addr, - msg->hash.data, + buf + sizeof(*msg), msg->qoscube); } break; - case SHIM_ETH_LLC_MSG_CODE__FLOW_REPLY: + case FLOW_REPLY: eth_llc_ipcp_sap_alloc_reply(msg->ssap, r_addr, msg->dsap, msg->response); break; - case SHIM_ETH_LLC_MSG_CODE__NAME_QUERY_REQ: - eth_llc_ipcp_name_query_req(msg->hash.data, r_addr); + case NAME_QUERY_REQ: + eth_llc_ipcp_name_query_req(buf + sizeof(*msg), r_addr); break; - case SHIM_ETH_LLC_MSG_CODE__NAME_QUERY_REPLY: - eth_llc_ipcp_name_query_reply(msg->hash.data, r_addr); + case NAME_QUERY_REPLY: + eth_llc_ipcp_name_query_reply(buf + sizeof(*msg), r_addr); break; default: log_err("Unknown message received %d.", msg->code); - shim_eth_llc_msg__free_unpacked(msg, NULL); return -1; } - shim_eth_llc_msg__free_unpacked(msg, NULL); return 0; } @@ -617,7 +619,7 @@ static void * eth_llc_ipcp_mgmt_handler(void * o) list_del(&frame->next); pthread_mutex_unlock(ð_llc_data.mgmt_lock); - eth_llc_ipcp_mgmt_frame(frame->buf, frame->len, frame->r_addr); + eth_llc_ipcp_mgmt_frame(frame->buf, frame->r_addr); free(frame); } @@ -1161,25 +1163,43 @@ static int eth_llc_ipcp_query(const uint8_t * hash) uint8_t r_addr[MAC_SIZE]; struct timespec timeout = {(NAME_QUERY_TIMEO / 1000), (NAME_QUERY_TIMEO % 1000) * MILLION}; - shim_eth_llc_msg_t msg = SHIM_ETH_LLC_MSG__INIT; struct dir_query * query; int ret; + uint8_t * buf; + struct mgmt_msg * msg; + size_t len; if (shim_data_dir_has(eth_llc_data.shim_data, hash)) return 0; - msg.code = SHIM_ETH_LLC_MSG_CODE__NAME_QUERY_REQ; - msg.has_hash = true; - msg.hash.len = ipcp_dir_hash_len(); - msg.hash.data = (uint8_t *) hash; + len = sizeof(*msg) + ipcp_dir_hash_len(); + + buf = malloc(len); + if (buf == NULL) + return -1; + + msg = (struct mgmt_msg *) buf; + msg->code = NAME_QUERY_REQ; + + memcpy(buf + sizeof(*msg), hash, ipcp_dir_hash_len()); memset(r_addr, 0xff, MAC_SIZE); query = shim_data_dir_query_create(eth_llc_data.shim_data, hash); - if (query == NULL) + if (query == NULL) { + free(buf); return -1; + } - eth_llc_ipcp_send_mgmt_frame(&msg, r_addr); + if (eth_llc_ipcp_send_frame(r_addr, reverse_bits(MGMT_SAP), + reverse_bits(MGMT_SAP), buf, len)) { + log_err("Failed to send management frame."); + shim_data_dir_query_destroy(eth_llc_data.shim_data, query); + free(buf); + return -1; + } + + free(buf); ret = shim_data_dir_query_wait(query, &timeout); diff --git a/src/ipcpd/shim-eth-llc/shim_eth_llc_messages.proto b/src/ipcpd/shim-eth-llc/shim_eth_llc_messages.proto deleted file mode 100644 index bad3f470..00000000 --- a/src/ipcpd/shim-eth-llc/shim_eth_llc_messages.proto +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2017 - * - * Shim Ethernet with LLC 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_eth_llc_msg_code { - FLOW_REQ = 1; - FLOW_REPLY = 2; - NAME_QUERY_REQ = 3; - NAME_QUERY_REPLY = 4; -}; - -message shim_eth_llc_msg { - required shim_eth_llc_msg_code code = 1; - optional bytes hash = 2; - optional uint32 ssap = 3; - optional uint32 dsap = 4; - optional uint32 qoscube = 5; - optional sint32 response = 6; -}; |