[Buildroot] [git commit] fastd: add upstream patch to fix build with musl

Peter Korsgaard peter at korsgaard.com
Sun Nov 22 21:30:51 UTC 2015


commit: http://git.buildroot.net/buildroot/commit/?id=917b6e72ea01c689a2376b24c87d7f6f1570a06f
branch: http://git.buildroot.net/buildroot/commit/?id=refs/heads/master

The missing 'sys/queue.h' issue when building with musl has been solved
by an upstream commit which eliminates the dependency on
'net/if_ether.h' and, consequently, 'sys/queue.h' (needed on OpenBSD
since 'net/if_ether.h' uses LIST_* definitions).

As usual, the included patch can be dropped in the future when a new
version of this package gets released and integrated into Buildroot.

Fixes:
  http://autobuild.buildroot.net/results/14e/14e291e22b8c8a9c590f0c6ef4316f8ab0aa1fff/
  http://autobuild.buildroot.net/results/ed4/ed4437bed01138380cd42c0dc943cd3ec85e26f0/
  http://autobuild.buildroot.net/results/ad2/ad226962413dece4fee07143a2bcfe07c44d55b6/
  ...

Signed-off-by: Rodrigo Rebello <rprebello at gmail.com>
Signed-off-by: Peter Korsgaard <peter at korsgaard.com>
---
 .../0002-Don-t-depend-on-net-if_ether.h.patch      |  261 ++++++++++++++++++++
 1 files changed, 261 insertions(+), 0 deletions(-)

diff --git a/package/fastd/0002-Don-t-depend-on-net-if_ether.h.patch b/package/fastd/0002-Don-t-depend-on-net-if_ether.h.patch
new file mode 100644
index 0000000..9036ae5
--- /dev/null
+++ b/package/fastd/0002-Don-t-depend-on-net-if_ether.h.patch
@@ -0,0 +1,261 @@
+From 8ed750311482824e427db3b8b2cec6842ea8bc96 Mon Sep 17 00:00:00 2001
+From: Matthias Schiffer <mschiffer at universe-factory.net>
+Date: Thu, 25 Jun 2015 01:03:23 +0200
+Subject: [PATCH] Don't depend on net/if_ether.h
+
+Instead of adding compatiblity code to make this work with musl, just
+duplicate the needed definitions in fastd.
+
+[Backport from upstream commit 9ac7f3588dda7d175e04878e7b871a88306d13bf.
+Fixes missing 'sys/queue.h' issue when building with musl.]
+
+Signed-off-by: Rodrigo Rebello <rprebello at gmail.com>
+---
+ cmake/checks.cmake    |  5 -----
+ src/compat.h          | 22 ----------------------
+ src/config.y          |  1 +
+ src/fastd.h           | 15 +++++++++++----
+ src/fastd_config.h.in |  3 ---
+ src/log.c             |  2 +-
+ src/peer.c            |  7 ++++---
+ src/receive.c         |  2 +-
+ src/send.c            |  2 +-
+ src/socket.c          |  2 ++
+ src/status.c          |  1 +
+ src/types.h           |  1 +
+ 12 files changed, 23 insertions(+), 40 deletions(-)
+
+diff --git a/cmake/checks.cmake b/cmake/checks.cmake
+index f9f0399..62d52ff 100644
+--- a/cmake/checks.cmake
++++ b/cmake/checks.cmake
+@@ -54,11 +54,6 @@ if(NOT DARWIN)
+ endif(NOT DARWIN)
+ 
+ 
+-set(CMAKE_EXTRA_INCLUDE_FILES "netinet/if_ether.h")
+-check_type_size("struct ethhdr" SIZEOF_ETHHDR)
+-string(COMPARE NOTEQUAL "${SIZEOF_ETHHDR}" "" HAVE_ETHHDR)
+-
+-
+ set(CMAKE_REQUIRED_INCLUDES "sys/types.h")
+ 
+ if(NOT DARWIN)
+diff --git a/src/compat.h b/src/compat.h
+index 991c268..29c9253 100644
+--- a/src/compat.h
++++ b/src/compat.h
+@@ -39,32 +39,10 @@
+ #include <unistd.h>
+ 
+ #include <sys/types.h>
+-#include <sys/queue.h>
+ #include <sys/socket.h>
+ 
+-#include <net/if.h>
+-#include <net/if_arp.h>
+ #include <netinet/in.h>
+-#include <netinet/if_ether.h>
+ 
+-#ifndef ETH_ALEN
+-/** The length of a MAC address */
+-#define ETH_ALEN 6
+-#endif
+-
+-#ifndef ETH_HLEN
+-/** The length of the standard ethernet header */
+-#define ETH_HLEN 14
+-#endif
+-
+-#ifndef HAVE_ETHHDR
+-/** An ethernet header */
+-struct ethhdr {
+-	uint8_t h_dest[ETH_ALEN];			/**< The destination MAC address field */
+-	uint8_t h_source[ETH_ALEN];			/**< The source MAC address field */
+-	uint16_t h_proto;				/**< The EtherType/length field */
+-} __attribute__((packed));
+-#endif
+ 
+ #if defined(USE_FREEBIND) && !defined(IP_FREEBIND)
+ /** Compatiblity define for systems supporting, but not defining IP_FREEBIND */
+diff --git a/src/config.y b/src/config.y
+index f2f597f..5b00d7c 100644
+--- a/src/config.y
++++ b/src/config.y
+@@ -33,6 +33,7 @@
+ %code requires {
+ 	#include <src/fastd.h>
+ 	#include <arpa/inet.h>
++	#include <net/if.h>
+ }
+ 
+ %union {
+diff --git a/src/fastd.h b/src/fastd.h
+index f1b2f93..ec2316b 100644
+--- a/src/fastd.h
++++ b/src/fastd.h
+@@ -58,7 +58,14 @@
+ 
+ /** An ethernet address */
+ struct __attribute__((__packed__)) fastd_eth_addr {
+-	uint8_t data[ETH_ALEN];		/**< The bytes of the address */
++	uint8_t data[6];		/**< The bytes of the address */
++};
++
++/** An ethernet header */
++struct  __attribute__((packed)) fastd_eth_header {
++	fastd_eth_addr_t dest;		/**< The destination MAC address field */
++	fastd_eth_addr_t source;	/**< The source MAC address field */
++	uint16_t proto;			/**< The EtherType/length field */
+ };
+ 
+ 
+@@ -408,7 +415,7 @@ static inline void fastd_setnonblock(int fd) {
+ static inline size_t fastd_max_payload(void) {
+ 	switch (conf.mode) {
+ 	case MODE_TAP:
+-		return conf.mtu+ETH_HLEN;
++		return conf.mtu + sizeof(fastd_eth_header_t);
+ 	case MODE_TUN:
+ 		return conf.mtu;
+ 	default:
+@@ -420,14 +427,14 @@ static inline size_t fastd_max_payload(void) {
+ /** Returns the source address of an ethernet packet */
+ static inline fastd_eth_addr_t fastd_buffer_source_address(const fastd_buffer_t buffer) {
+ 	fastd_eth_addr_t ret;
+-	memcpy(&ret, buffer.data+offsetof(struct ethhdr, h_source), ETH_ALEN);
++	memcpy(&ret, buffer.data + offsetof(fastd_eth_header_t, source), sizeof(fastd_eth_addr_t));
+ 	return ret;
+ }
+ 
+ /** Returns the destination address of an ethernet packet */
+ static inline fastd_eth_addr_t fastd_buffer_dest_address(const fastd_buffer_t buffer) {
+ 	fastd_eth_addr_t ret;
+-	memcpy(&ret, buffer.data+offsetof(struct ethhdr, h_dest), ETH_ALEN);
++	memcpy(&ret, buffer.data + offsetof(fastd_eth_header_t, dest), sizeof(fastd_eth_addr_t));
+ 	return ret;
+ }
+ 
+diff --git a/src/fastd_config.h.in b/src/fastd_config.h.in
+index 6a55930..5f9c868 100644
+--- a/src/fastd_config.h.in
++++ b/src/fastd_config.h.in
+@@ -35,9 +35,6 @@
+ /** Defined if the platform supports the AI_ADDRCONFIG flag to getaddrinfo() */
+ #cmakedefine HAVE_AI_ADDRCONFIG
+ 
+-/** Defined if the platform defines the \e ethhdr struct */
+-#cmakedefine HAVE_ETHHDR
+-
+ /** Defined if the platform defines get_current_dir_name() */
+ #cmakedefine HAVE_GET_CURRENT_DIR_NAME
+ 
+diff --git a/src/log.c b/src/log.c
+index 7d1538a..0727bbb 100644
+--- a/src/log.c
++++ b/src/log.c
+@@ -74,7 +74,7 @@ size_t fastd_snprint_peer_address(char *buffer, size_t size, const fastd_peer_ad
+ 		if (!bind_address && hide)
+ 			return snprintf_safe(buffer, size, "[hidden]:%u", ntohs(address->in6.sin6_port));
+ 		if (inet_ntop(AF_INET6, &address->in6.sin6_addr, addr_buf, sizeof(addr_buf))) {
+-			char ifname_buf[IF_NAMESIZE];
++			char ifname_buf[IFNAMSIZ];
+ 			if (!iface && IN6_IS_ADDR_LINKLOCAL(&address->in6.sin6_addr))
+ 				iface = if_indextoname(address->in6.sin6_scope_id, ifname_buf);
+ 
+diff --git a/src/peer.c b/src/peer.c
+index 9ce5ca2..3313112 100644
+--- a/src/peer.c
++++ b/src/peer.c
+@@ -34,13 +34,14 @@
+ #include "poll.h"
+ 
+ #include <arpa/inet.h>
++#include <net/if.h>
+ #include <sys/wait.h>
+ 
+ 
+ /** Adds peer-specific fields to \e env */
+ void fastd_peer_set_shell_env(fastd_shell_env_t *env, const fastd_peer_t *peer, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *peer_addr) {
+-	/* both INET6_ADDRSTRLEN and IFNAMESIZE already include space for the zero termination, so there is no need to add space for the '%' here. */
+-	char buf[INET6_ADDRSTRLEN+IF_NAMESIZE];
++	/* both INET6_ADDRSTRLEN and IFNAMSIZ already include space for the zero termination, so there is no need to add space for the '%' here. */
++	char buf[INET6_ADDRSTRLEN+IFNAMSIZ];
+ 
+ 	fastd_shell_env_set(env, "PEER_NAME", peer ? peer->name : NULL);
+ 
+@@ -850,7 +851,7 @@ void fastd_peer_set_established(fastd_peer_t *peer) {
+ 
+ /** Compares two MAC addresses */
+ static inline int eth_addr_cmp(const fastd_eth_addr_t *addr1, const fastd_eth_addr_t *addr2) {
+-	return memcmp(addr1->data, addr2->data, ETH_ALEN);
++	return memcmp(addr1->data, addr2->data, sizeof(fastd_eth_addr_t));
+ }
+ 
+ /** Compares two fastd_peer_eth_addr_t entries by their MAC addresses */
+diff --git a/src/receive.c b/src/receive.c
+index 2ee402a..6db5cfd 100644
+--- a/src/receive.c
++++ b/src/receive.c
+@@ -289,7 +289,7 @@ void fastd_receive(fastd_socket_t *sock) {
+ /** Handles a received and decrypted payload packet */
+ void fastd_handle_receive(fastd_peer_t *peer, fastd_buffer_t buffer, bool reordered) {
+ 	if (conf.mode == MODE_TAP) {
+-		if (buffer.len < ETH_HLEN) {
++		if (buffer.len < sizeof(fastd_eth_header_t)) {
+ 			pr_debug("received truncated packet");
+ 			fastd_buffer_free(buffer);
+ 			return;
+diff --git a/src/send.c b/src/send.c
+index caa7312..6d9f66f 100644
+--- a/src/send.c
++++ b/src/send.c
+@@ -209,7 +209,7 @@ static inline bool send_data_tap_single(fastd_buffer_t buffer, fastd_peer_t *sou
+ 	if (conf.mode != MODE_TAP)
+ 		return false;
+ 
+-	if (buffer.len < ETH_HLEN) {
++	if (buffer.len < sizeof(fastd_eth_header_t)) {
+ 		pr_debug("truncated ethernet packet");
+ 		fastd_buffer_free(buffer);
+ 		return true;
+diff --git a/src/socket.c b/src/socket.c
+index e932148..03a11a6 100644
+--- a/src/socket.c
++++ b/src/socket.c
+@@ -32,6 +32,8 @@
+ #include "fastd.h"
+ #include "poll.h"
+ 
++#include <net/if.h>
++
+ 
+ /**
+    Creates a new socket bound to a specific address
+diff --git a/src/status.c b/src/status.c
+index d0b8511..27d6b38 100644
+--- a/src/status.c
++++ b/src/status.c
+@@ -39,6 +39,7 @@
+ #include "peer.h"
+ 
+ #include <json.h>
++#include <net/if.h>
+ #include <sys/un.h>
+ 
+ 
+diff --git a/src/types.h b/src/types.h
+index f380541..b684621 100644
+--- a/src/types.h
++++ b/src/types.h
+@@ -87,6 +87,7 @@ typedef struct fastd_bind_address fastd_bind_address_t;
+ typedef struct fastd_socket fastd_socket_t;
+ typedef struct fastd_peer_group fastd_peer_group_t;
+ typedef struct fastd_eth_addr fastd_eth_addr_t;
++typedef struct fastd_eth_header fastd_eth_header_t;
+ typedef struct fastd_peer fastd_peer_t;
+ typedef struct fastd_peer_eth_addr fastd_peer_eth_addr_t;
+ typedef struct fastd_remote fastd_remote_t;
+-- 
+2.1.4
+


More information about the buildroot mailing list