From 6cc20e6d98aec8d1da0740a2a890e984e634445a Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Tue, 14 Jun 2016 17:56:45 +0200 Subject: ipcpd: Fix wrong length in shim-eth-llc The shim Ethernet with LLC was using the frame length in the header of the 802.3 frame, which contained a wrong value when sent over the wire. Probably the kernel filled in a wrong value. Now it uses the length as reported by recv. --- src/ipcpd/shim-eth-llc/main.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index fe7b5dcb..1ff3496b 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -65,6 +65,7 @@ typedef ShimEthLlcMsg shim_eth_llc_msg_t; #define MGMT_SAP 0x01 #define SHIM_ETH_LLC_MAX_SDU_SIZE 1500 #define MAC_SIZE 6 +#define LLC_HEADER_SIZE 3 #define MAX_SAPS 64 /* global for trapping signal */ @@ -278,7 +279,7 @@ static int eth_llc_ipcp_send_frame(uint8_t dst_addr[MAC_SIZE], return -1; } - length = htons(len); + length = htons(len + LLC_HEADER_SIZE); memcpy(frame, dst_addr, MAC_SIZE * sizeof(uint8_t)); frame_len += MAC_SIZE; @@ -580,8 +581,9 @@ static void * eth_llc_ipcp_sdu_reader(void * o) rw_lock_unlock(&_ipcp->state_lock); - if (recv(shim_data(_ipcp)->s_fd, buf, - SHIM_ETH_LLC_MAX_SDU_SIZE, 0) < 0) { + frame_len = recv(shim_data(_ipcp)->s_fd, buf, + SHIM_ETH_LLC_MAX_SDU_SIZE, 0); + if (frame_len < 0) { LOG_ERR("Failed to recv frame."); continue; } @@ -600,13 +602,14 @@ static void * eth_llc_ipcp_sdu_reader(void * o) for (; i < 2 * MAC_SIZE; i++) src_mac[i - MAC_SIZE] = buf[i]; - frame_len = ((buf[i]) << 8) + buf[i + 1]; i += 2; dsap = reverse_bits(buf[i++]); ssap = reverse_bits(buf[i++]); i++; + frame_len -= i; + if (ssap == MGMT_SAP && dsap == MGMT_SAP) { eth_llc_ipcp_mgmt_frame((uint8_t *) (buf + i), -- cgit v1.2.3