libnl: bump to version 3.2.29
authorBaruch Siach <baruch@tkos.co.il>
Sun, 12 Mar 2017 17:18:06 +0000 (19:18 +0200)
committerThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Sun, 12 Mar 2017 22:03:56 +0000 (23:03 +0100)
Include upstream equivalent patch to fix build with older kernel headers. This
fixes build failures caused by the previous (reverted) version bump:
http://autobuild.buildroot.net/results/563/563f46e9a11f9e3b174a4e1308444f284d1b3421/
http://autobuild.buildroot.net/results/970/970463b628d9c81d5e217e92a455d2e05d0aa89e/
http://autobuild.buildroot.net/results/cee/ceea635a9d620398cbcd44ccb859b07bf6682780/

Add libc-compat.h patch to make it work for musl libc.

Add another upstream patch to fix both missing strerror_l() implementation,
and optionally missing locale support in uClibc-ng:
http://autobuild.buildroot.net/results/dce/dce5d21c27df57ac96d9302752dd1802e7a9786b/
http://autobuild.buildroot.net/results/c4b/c4b1c3f396ddd1d9242aed0953558606f929d57d/
http://autobuild.buildroot.net/results/44d/44dd3db6cdda4646fa12ccf243d6aca16bed3c90/

Add host-pkgconf dependency, since configure.ac uses PKG_CHECK_MODULES.

Add optional dependency on the 'check' package.

Cc: Gustavo Zacarias <gustavo@zacarias.com.ar>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
package/libnl/0001-fix-libc-kernel-headers-conflict.patch [new file with mode: 0644]
package/libnl/0003-Add-musl-workaround-to-the-libc-compat.h-copy.patch [new file with mode: 0644]
package/libnl/0004-lib-escape-usage-of-strerror_l-if-it-doesn-t-exist-i.patch [new file with mode: 0644]
package/libnl/libnl.hash
package/libnl/libnl.mk

diff --git a/package/libnl/0001-fix-libc-kernel-headers-conflict.patch b/package/libnl/0001-fix-libc-kernel-headers-conflict.patch
new file mode 100644 (file)
index 0000000..d9dfc6e
--- /dev/null
@@ -0,0 +1,756 @@
+Fix libc kernel headers conflict
+
+Add missing kernel headers to fix conflicts with toolchain provided kernel
+headers of older versions.
+
+This patch is equivalent to upstream commit 6c7f4215003 ("build: distribute
+in.h in6.h libc-compat.h"). These files are present in upstream git repo, but
+are missing from the distributed tarball.
+
+Signed-off-by: Baruch Siach <baruch@tkos.co.il>
+---
+
+--- /dev/null
++++ b/include/linux-private/linux/in.h
+@@ -0,0 +1,299 @@
++/*
++ * INET               An implementation of the TCP/IP protocol suite for the LINUX
++ *            operating system.  INET is implemented using the  BSD Socket
++ *            interface as the means of communication with the user level.
++ *
++ *            Definitions of the Internet Protocol.
++ *
++ * Version:   @(#)in.h        1.0.1   04/21/93
++ *
++ * Authors:   Original taken from the GNU Project <netinet/in.h> file.
++ *            Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
++ *
++ *            This program is free software; you can redistribute it and/or
++ *            modify it under the terms of the GNU General Public License
++ *            as published by the Free Software Foundation; either version
++ *            2 of the License, or (at your option) any later version.
++ */
++#ifndef _LINUX_IN_H
++#define _LINUX_IN_H
++
++#include <linux/types.h>
++#include <linux/libc-compat.h>
++#include <linux/socket.h>
++
++#if __UAPI_DEF_IN_IPPROTO
++/* Standard well-defined IP protocols.  */
++enum {
++  IPPROTO_IP = 0,             /* Dummy protocol for TCP               */
++#define IPPROTO_IP            IPPROTO_IP
++  IPPROTO_ICMP = 1,           /* Internet Control Message Protocol    */
++#define IPPROTO_ICMP          IPPROTO_ICMP
++  IPPROTO_IGMP = 2,           /* Internet Group Management Protocol   */
++#define IPPROTO_IGMP          IPPROTO_IGMP
++  IPPROTO_IPIP = 4,           /* IPIP tunnels (older KA9Q tunnels use 94) */
++#define IPPROTO_IPIP          IPPROTO_IPIP
++  IPPROTO_TCP = 6,            /* Transmission Control Protocol        */
++#define IPPROTO_TCP           IPPROTO_TCP
++  IPPROTO_EGP = 8,            /* Exterior Gateway Protocol            */
++#define IPPROTO_EGP           IPPROTO_EGP
++  IPPROTO_PUP = 12,           /* PUP protocol                         */
++#define IPPROTO_PUP           IPPROTO_PUP
++  IPPROTO_UDP = 17,           /* User Datagram Protocol               */
++#define IPPROTO_UDP           IPPROTO_UDP
++  IPPROTO_IDP = 22,           /* XNS IDP protocol                     */
++#define IPPROTO_IDP           IPPROTO_IDP
++  IPPROTO_TP = 29,            /* SO Transport Protocol Class 4        */
++#define IPPROTO_TP            IPPROTO_TP
++  IPPROTO_DCCP = 33,          /* Datagram Congestion Control Protocol */
++#define IPPROTO_DCCP          IPPROTO_DCCP
++  IPPROTO_IPV6 = 41,          /* IPv6-in-IPv4 tunnelling              */
++#define IPPROTO_IPV6          IPPROTO_IPV6
++  IPPROTO_RSVP = 46,          /* RSVP Protocol                        */
++#define IPPROTO_RSVP          IPPROTO_RSVP
++  IPPROTO_GRE = 47,           /* Cisco GRE tunnels (rfc 1701,1702)    */
++#define IPPROTO_GRE           IPPROTO_GRE
++  IPPROTO_ESP = 50,           /* Encapsulation Security Payload protocol */
++#define IPPROTO_ESP           IPPROTO_ESP
++  IPPROTO_AH = 51,            /* Authentication Header protocol       */
++#define IPPROTO_AH            IPPROTO_AH
++  IPPROTO_MTP = 92,           /* Multicast Transport Protocol         */
++#define IPPROTO_MTP           IPPROTO_MTP
++  IPPROTO_BEETPH = 94,                /* IP option pseudo header for BEET     */
++#define IPPROTO_BEETPH                IPPROTO_BEETPH
++  IPPROTO_ENCAP = 98,         /* Encapsulation Header                 */
++#define IPPROTO_ENCAP         IPPROTO_ENCAP
++  IPPROTO_PIM = 103,          /* Protocol Independent Multicast       */
++#define IPPROTO_PIM           IPPROTO_PIM
++  IPPROTO_COMP = 108,         /* Compression Header Protocol          */
++#define IPPROTO_COMP          IPPROTO_COMP
++  IPPROTO_SCTP = 132,         /* Stream Control Transport Protocol    */
++#define IPPROTO_SCTP          IPPROTO_SCTP
++  IPPROTO_UDPLITE = 136,      /* UDP-Lite (RFC 3828)                  */
++#define IPPROTO_UDPLITE               IPPROTO_UDPLITE
++  IPPROTO_MPLS = 137,         /* MPLS in IP (RFC 4023)                */
++#define IPPROTO_MPLS          IPPROTO_MPLS
++  IPPROTO_RAW = 255,          /* Raw IP packets                       */
++#define IPPROTO_RAW           IPPROTO_RAW
++  IPPROTO_MAX
++};
++#endif
++
++#if __UAPI_DEF_IN_ADDR
++/* Internet address. */
++struct in_addr {
++      __be32  s_addr;
++};
++#endif
++
++#define IP_TOS                1
++#define IP_TTL                2
++#define IP_HDRINCL    3
++#define IP_OPTIONS    4
++#define IP_ROUTER_ALERT       5
++#define IP_RECVOPTS   6
++#define IP_RETOPTS    7
++#define IP_PKTINFO    8
++#define IP_PKTOPTIONS 9
++#define IP_MTU_DISCOVER       10
++#define IP_RECVERR    11
++#define IP_RECVTTL    12
++#define       IP_RECVTOS      13
++#define IP_MTU                14
++#define IP_FREEBIND   15
++#define IP_IPSEC_POLICY       16
++#define IP_XFRM_POLICY        17
++#define IP_PASSSEC    18
++#define IP_TRANSPARENT        19
++
++/* BSD compatibility */
++#define IP_RECVRETOPTS        IP_RETOPTS
++
++/* TProxy original addresses */
++#define IP_ORIGDSTADDR       20
++#define IP_RECVORIGDSTADDR   IP_ORIGDSTADDR
++
++#define IP_MINTTL       21
++#define IP_NODEFRAG     22
++#define IP_CHECKSUM   23
++#define IP_BIND_ADDRESS_NO_PORT       24
++
++/* IP_MTU_DISCOVER values */
++#define IP_PMTUDISC_DONT              0       /* Never send DF frames */
++#define IP_PMTUDISC_WANT              1       /* Use per route hints  */
++#define IP_PMTUDISC_DO                        2       /* Always DF            */
++#define IP_PMTUDISC_PROBE             3       /* Ignore dst pmtu      */
++/* Always use interface mtu (ignores dst pmtu) but don't set DF flag.
++ * Also incoming ICMP frag_needed notifications will be ignored on
++ * this socket to prevent accepting spoofed ones.
++ */
++#define IP_PMTUDISC_INTERFACE         4
++/* weaker version of IP_PMTUDISC_INTERFACE, which allos packets to get
++ * fragmented if they exeed the interface mtu
++ */
++#define IP_PMTUDISC_OMIT              5
++
++#define IP_MULTICAST_IF                       32
++#define IP_MULTICAST_TTL              33
++#define IP_MULTICAST_LOOP             34
++#define IP_ADD_MEMBERSHIP             35
++#define IP_DROP_MEMBERSHIP            36
++#define IP_UNBLOCK_SOURCE             37
++#define IP_BLOCK_SOURCE                       38
++#define IP_ADD_SOURCE_MEMBERSHIP      39
++#define IP_DROP_SOURCE_MEMBERSHIP     40
++#define IP_MSFILTER                   41
++#define MCAST_JOIN_GROUP              42
++#define MCAST_BLOCK_SOURCE            43
++#define MCAST_UNBLOCK_SOURCE          44
++#define MCAST_LEAVE_GROUP             45
++#define MCAST_JOIN_SOURCE_GROUP               46
++#define MCAST_LEAVE_SOURCE_GROUP      47
++#define MCAST_MSFILTER                        48
++#define IP_MULTICAST_ALL              49
++#define IP_UNICAST_IF                 50
++
++#define MCAST_EXCLUDE 0
++#define MCAST_INCLUDE 1
++
++/* These need to appear somewhere around here */
++#define IP_DEFAULT_MULTICAST_TTL        1
++#define IP_DEFAULT_MULTICAST_LOOP       1
++
++/* Request struct for multicast socket ops */
++
++#if __UAPI_DEF_IP_MREQ
++struct ip_mreq  {
++      struct in_addr imr_multiaddr;   /* IP multicast address of group */
++      struct in_addr imr_interface;   /* local IP address of interface */
++};
++
++struct ip_mreqn {
++      struct in_addr  imr_multiaddr;          /* IP multicast address of group */
++      struct in_addr  imr_address;            /* local IP address of interface */
++      int             imr_ifindex;            /* Interface index */
++};
++
++struct ip_mreq_source {
++      __be32          imr_multiaddr;
++      __be32          imr_interface;
++      __be32          imr_sourceaddr;
++};
++
++struct ip_msfilter {
++      __be32          imsf_multiaddr;
++      __be32          imsf_interface;
++      __u32           imsf_fmode;
++      __u32           imsf_numsrc;
++      __be32          imsf_slist[1];
++};
++
++#define IP_MSFILTER_SIZE(numsrc) \
++      (sizeof(struct ip_msfilter) - sizeof(__u32) \
++      + (numsrc) * sizeof(__u32))
++
++struct group_req {
++      __u32                            gr_interface;  /* interface index */
++      struct __kernel_sockaddr_storage gr_group;      /* group address */
++};
++
++struct group_source_req {
++      __u32                            gsr_interface; /* interface index */
++      struct __kernel_sockaddr_storage gsr_group;     /* group address */
++      struct __kernel_sockaddr_storage gsr_source;    /* source address */
++};
++
++struct group_filter {
++      __u32                            gf_interface;  /* interface index */
++      struct __kernel_sockaddr_storage gf_group;      /* multicast address */
++      __u32                            gf_fmode;      /* filter mode */
++      __u32                            gf_numsrc;     /* number of sources */
++      struct __kernel_sockaddr_storage gf_slist[1];   /* interface index */
++};
++
++#define GROUP_FILTER_SIZE(numsrc) \
++      (sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) \
++      + (numsrc) * sizeof(struct __kernel_sockaddr_storage))
++#endif
++
++#if __UAPI_DEF_IN_PKTINFO
++struct in_pktinfo {
++      int             ipi_ifindex;
++      struct in_addr  ipi_spec_dst;
++      struct in_addr  ipi_addr;
++};
++#endif
++
++/* Structure describing an Internet (IP) socket address. */
++#if  __UAPI_DEF_SOCKADDR_IN
++#define __SOCK_SIZE__ 16              /* sizeof(struct sockaddr)      */
++struct sockaddr_in {
++  __kernel_sa_family_t        sin_family;     /* Address family               */
++  __be16              sin_port;       /* Port number                  */
++  struct in_addr      sin_addr;       /* Internet address             */
++
++  /* Pad to size of `struct sockaddr'. */
++  unsigned char               __pad[__SOCK_SIZE__ - sizeof(short int) -
++                      sizeof(unsigned short int) - sizeof(struct in_addr)];
++};
++#define sin_zero      __pad           /* for BSD UNIX comp. -FvK      */
++#endif
++
++#if __UAPI_DEF_IN_CLASS
++/*
++ * Definitions of the bits in an Internet address integer.
++ * On subnets, host and network parts are found according
++ * to the subnet mask, not these masks.
++ */
++#define       IN_CLASSA(a)            ((((long int) (a)) & 0x80000000) == 0)
++#define       IN_CLASSA_NET           0xff000000
++#define       IN_CLASSA_NSHIFT        24
++#define       IN_CLASSA_HOST          (0xffffffff & ~IN_CLASSA_NET)
++#define       IN_CLASSA_MAX           128
++
++#define       IN_CLASSB(a)            ((((long int) (a)) & 0xc0000000) == 0x80000000)
++#define       IN_CLASSB_NET           0xffff0000
++#define       IN_CLASSB_NSHIFT        16
++#define       IN_CLASSB_HOST          (0xffffffff & ~IN_CLASSB_NET)
++#define       IN_CLASSB_MAX           65536
++
++#define       IN_CLASSC(a)            ((((long int) (a)) & 0xe0000000) == 0xc0000000)
++#define       IN_CLASSC_NET           0xffffff00
++#define       IN_CLASSC_NSHIFT        8
++#define       IN_CLASSC_HOST          (0xffffffff & ~IN_CLASSC_NET)
++
++#define       IN_CLASSD(a)            ((((long int) (a)) & 0xf0000000) == 0xe0000000)
++#define       IN_MULTICAST(a)         IN_CLASSD(a)
++#define IN_MULTICAST_NET      0xF0000000
++
++#define       IN_EXPERIMENTAL(a)      ((((long int) (a)) & 0xf0000000) == 0xf0000000)
++#define       IN_BADCLASS(a)          IN_EXPERIMENTAL((a))
++
++/* Address to accept any incoming messages. */
++#define       INADDR_ANY              ((unsigned long int) 0x00000000)
++
++/* Address to send to all hosts. */
++#define       INADDR_BROADCAST        ((unsigned long int) 0xffffffff)
++
++/* Address indicating an error return. */
++#define       INADDR_NONE             ((unsigned long int) 0xffffffff)
++
++/* Network number for local host loopback. */
++#define       IN_LOOPBACKNET          127
++
++/* Address to loopback in software to local host.  */
++#define       INADDR_LOOPBACK         0x7f000001      /* 127.0.0.1   */
++#define       IN_LOOPBACK(a)          ((((long int) (a)) & 0xff000000) == 0x7f000000)
++
++/* Defines for Multicast INADDR */
++#define INADDR_UNSPEC_GROUP           0xe0000000U     /* 224.0.0.0   */
++#define INADDR_ALLHOSTS_GROUP         0xe0000001U     /* 224.0.0.1   */
++#define INADDR_ALLRTRS_GROUP    0xe0000002U   /* 224.0.0.2 */
++#define INADDR_MAX_LOCAL_GROUP  0xe00000ffU   /* 224.0.0.255 */
++#endif
++
++/* <asm/byteorder.h> contains the htonl type stuff.. */
++#include <asm/byteorder.h> 
++
++
++#endif /* _LINUX_IN_H */
+--- /dev/null
++++ b/include/linux-private/linux/in6.h
+@@ -0,0 +1,293 @@
++/*
++ *    Types and definitions for AF_INET6 
++ *    Linux INET6 implementation 
++ *
++ *    Authors:
++ *    Pedro Roque             <roque@di.fc.ul.pt>     
++ *
++ *    Sources:
++ *    IPv6 Program Interfaces for BSD Systems
++ *      <draft-ietf-ipngwg-bsd-api-05.txt>
++ *
++ *    Advanced Sockets API for IPv6
++ *    <draft-stevens-advanced-api-00.txt>
++ *
++ *    This program is free software; you can redistribute it and/or
++ *      modify it under the terms of the GNU General Public License
++ *      as published by the Free Software Foundation; either version
++ *      2 of the License, or (at your option) any later version.
++ */
++
++#ifndef _LINUX_IN6_H
++#define _LINUX_IN6_H
++
++#include <linux/types.h>
++#include <linux/libc-compat.h>
++
++/*
++ *    IPv6 address structure
++ */
++
++#if __UAPI_DEF_IN6_ADDR
++struct in6_addr {
++      union {
++              __u8            u6_addr8[16];
++#if __UAPI_DEF_IN6_ADDR_ALT
++              __be16          u6_addr16[8];
++              __be32          u6_addr32[4];
++#endif
++      } in6_u;
++#define s6_addr                       in6_u.u6_addr8
++#if __UAPI_DEF_IN6_ADDR_ALT
++#define s6_addr16             in6_u.u6_addr16
++#define s6_addr32             in6_u.u6_addr32
++#endif
++};
++#endif /* __UAPI_DEF_IN6_ADDR */
++
++#if __UAPI_DEF_SOCKADDR_IN6
++struct sockaddr_in6 {
++      unsigned short int      sin6_family;    /* AF_INET6 */
++      __be16                  sin6_port;      /* Transport layer port # */
++      __be32                  sin6_flowinfo;  /* IPv6 flow information */
++      struct in6_addr         sin6_addr;      /* IPv6 address */
++      __u32                   sin6_scope_id;  /* scope id (new in RFC2553) */
++};
++#endif /* __UAPI_DEF_SOCKADDR_IN6 */
++
++#if __UAPI_DEF_IPV6_MREQ
++struct ipv6_mreq {
++      /* IPv6 multicast address of group */
++      struct in6_addr ipv6mr_multiaddr;
++
++      /* local IPv6 address of interface */
++      int             ipv6mr_ifindex;
++};
++#endif /* __UAPI_DEF_IVP6_MREQ */
++
++#define ipv6mr_acaddr ipv6mr_multiaddr
++
++struct in6_flowlabel_req {
++      struct in6_addr flr_dst;
++      __be32  flr_label;
++      __u8    flr_action;
++      __u8    flr_share;
++      __u16   flr_flags;
++      __u16   flr_expires;
++      __u16   flr_linger;
++      __u32   __flr_pad;
++      /* Options in format of IPV6_PKTOPTIONS */
++};
++
++#define IPV6_FL_A_GET 0
++#define IPV6_FL_A_PUT 1
++#define IPV6_FL_A_RENEW       2
++
++#define IPV6_FL_F_CREATE      1
++#define IPV6_FL_F_EXCL                2
++#define IPV6_FL_F_REFLECT     4
++#define IPV6_FL_F_REMOTE      8
++
++#define IPV6_FL_S_NONE                0
++#define IPV6_FL_S_EXCL                1
++#define IPV6_FL_S_PROCESS     2
++#define IPV6_FL_S_USER                3
++#define IPV6_FL_S_ANY         255
++
++
++/*
++ *    Bitmask constant declarations to help applications select out the 
++ *    flow label and priority fields.
++ *
++ *    Note that this are in host byte order while the flowinfo field of
++ *    sockaddr_in6 is in network byte order.
++ */
++
++#define IPV6_FLOWINFO_FLOWLABEL               0x000fffff
++#define IPV6_FLOWINFO_PRIORITY                0x0ff00000
++
++/* These definitions are obsolete */
++#define IPV6_PRIORITY_UNCHARACTERIZED 0x0000
++#define IPV6_PRIORITY_FILLER          0x0100
++#define IPV6_PRIORITY_UNATTENDED      0x0200
++#define IPV6_PRIORITY_RESERVED1               0x0300
++#define IPV6_PRIORITY_BULK            0x0400
++#define IPV6_PRIORITY_RESERVED2               0x0500
++#define IPV6_PRIORITY_INTERACTIVE     0x0600
++#define IPV6_PRIORITY_CONTROL         0x0700
++#define IPV6_PRIORITY_8                       0x0800
++#define IPV6_PRIORITY_9                       0x0900
++#define IPV6_PRIORITY_10              0x0a00
++#define IPV6_PRIORITY_11              0x0b00
++#define IPV6_PRIORITY_12              0x0c00
++#define IPV6_PRIORITY_13              0x0d00
++#define IPV6_PRIORITY_14              0x0e00
++#define IPV6_PRIORITY_15              0x0f00
++
++/*
++ *    IPV6 extension headers
++ */
++#if __UAPI_DEF_IPPROTO_V6
++#define IPPROTO_HOPOPTS               0       /* IPv6 hop-by-hop options      */
++#define IPPROTO_ROUTING               43      /* IPv6 routing header          */
++#define IPPROTO_FRAGMENT      44      /* IPv6 fragmentation header    */
++#define IPPROTO_ICMPV6                58      /* ICMPv6                       */
++#define IPPROTO_NONE          59      /* IPv6 no next header          */
++#define IPPROTO_DSTOPTS               60      /* IPv6 destination options     */
++#define IPPROTO_MH            135     /* IPv6 mobility header         */
++#endif /* __UAPI_DEF_IPPROTO_V6 */
++
++/*
++ *    IPv6 TLV options.
++ */
++#define IPV6_TLV_PAD1         0
++#define IPV6_TLV_PADN         1
++#define IPV6_TLV_ROUTERALERT  5
++#define IPV6_TLV_JUMBO                194
++#define IPV6_TLV_HAO          201     /* home address option */
++
++/*
++ *    IPV6 socket options
++ */
++#if __UAPI_DEF_IPV6_OPTIONS
++#define IPV6_ADDRFORM         1
++#define IPV6_2292PKTINFO      2
++#define IPV6_2292HOPOPTS      3
++#define IPV6_2292DSTOPTS      4
++#define IPV6_2292RTHDR                5
++#define IPV6_2292PKTOPTIONS   6
++#define IPV6_CHECKSUM         7
++#define IPV6_2292HOPLIMIT     8
++#define IPV6_NEXTHOP          9
++#define IPV6_AUTHHDR          10      /* obsolete */
++#define IPV6_FLOWINFO         11
++
++#define IPV6_UNICAST_HOPS     16
++#define IPV6_MULTICAST_IF     17
++#define IPV6_MULTICAST_HOPS   18
++#define IPV6_MULTICAST_LOOP   19
++#define IPV6_ADD_MEMBERSHIP   20
++#define IPV6_DROP_MEMBERSHIP  21
++#define IPV6_ROUTER_ALERT     22
++#define IPV6_MTU_DISCOVER     23
++#define IPV6_MTU              24
++#define IPV6_RECVERR          25
++#define IPV6_V6ONLY           26
++#define IPV6_JOIN_ANYCAST     27
++#define IPV6_LEAVE_ANYCAST    28
++
++/* IPV6_MTU_DISCOVER values */
++#define IPV6_PMTUDISC_DONT            0
++#define IPV6_PMTUDISC_WANT            1
++#define IPV6_PMTUDISC_DO              2
++#define IPV6_PMTUDISC_PROBE           3
++/* same as IPV6_PMTUDISC_PROBE, provided for symetry with IPv4
++ * also see comments on IP_PMTUDISC_INTERFACE
++ */
++#define IPV6_PMTUDISC_INTERFACE               4
++/* weaker version of IPV6_PMTUDISC_INTERFACE, which allows packets to
++ * get fragmented if they exceed the interface mtu
++ */
++#define IPV6_PMTUDISC_OMIT            5
++
++/* Flowlabel */
++#define IPV6_FLOWLABEL_MGR    32
++#define IPV6_FLOWINFO_SEND    33
++
++#define IPV6_IPSEC_POLICY     34
++#define IPV6_XFRM_POLICY      35
++#endif
++
++/*
++ * Multicast:
++ * Following socket options are shared between IPv4 and IPv6.
++ *
++ * MCAST_JOIN_GROUP           42
++ * MCAST_BLOCK_SOURCE         43
++ * MCAST_UNBLOCK_SOURCE               44
++ * MCAST_LEAVE_GROUP          45
++ * MCAST_JOIN_SOURCE_GROUP    46
++ * MCAST_LEAVE_SOURCE_GROUP   47
++ * MCAST_MSFILTER             48
++ */
++
++/*
++ * Advanced API (RFC3542) (1)
++ *
++ * Note: IPV6_RECVRTHDRDSTOPTS does not exist. see net/ipv6/datagram.c.
++ */
++
++#define IPV6_RECVPKTINFO      49
++#define IPV6_PKTINFO          50
++#define IPV6_RECVHOPLIMIT     51
++#define IPV6_HOPLIMIT         52
++#define IPV6_RECVHOPOPTS      53
++#define IPV6_HOPOPTS          54
++#define IPV6_RTHDRDSTOPTS     55
++#define IPV6_RECVRTHDR                56
++#define IPV6_RTHDR            57
++#define IPV6_RECVDSTOPTS      58
++#define IPV6_DSTOPTS          59
++#define IPV6_RECVPATHMTU      60
++#define IPV6_PATHMTU          61
++#define IPV6_DONTFRAG         62
++#if 0 /* not yet */
++#define IPV6_USE_MIN_MTU      63
++#endif
++
++/*
++ * Netfilter (1)
++ *
++ * Following socket options are used in ip6_tables;
++ * see include/linux/netfilter_ipv6/ip6_tables.h.
++ *
++ * IP6T_SO_SET_REPLACE / IP6T_SO_GET_INFO             64
++ * IP6T_SO_SET_ADD_COUNTERS / IP6T_SO_GET_ENTRIES     65
++ */
++
++/*
++ * Advanced API (RFC3542) (2)
++ */
++#define IPV6_RECVTCLASS               66
++#define IPV6_TCLASS           67
++
++/*
++ * Netfilter (2)
++ *
++ * Following socket options are used in ip6_tables;
++ * see include/linux/netfilter_ipv6/ip6_tables.h.
++ *
++ * IP6T_SO_GET_REVISION_MATCH 68
++ * IP6T_SO_GET_REVISION_TARGET        69
++ * IP6T_SO_ORIGINAL_DST               80
++ */
++
++#define IPV6_AUTOFLOWLABEL    70
++/* RFC5014: Source address selection */
++#define IPV6_ADDR_PREFERENCES 72
++
++#define IPV6_PREFER_SRC_TMP           0x0001
++#define IPV6_PREFER_SRC_PUBLIC                0x0002
++#define IPV6_PREFER_SRC_PUBTMP_DEFAULT        0x0100
++#define IPV6_PREFER_SRC_COA           0x0004
++#define IPV6_PREFER_SRC_HOME          0x0400
++#define IPV6_PREFER_SRC_CGA           0x0008
++#define IPV6_PREFER_SRC_NONCGA                0x0800
++
++/* RFC5082: Generalized Ttl Security Mechanism */
++#define IPV6_MINHOPCOUNT              73
++
++#define IPV6_ORIGDSTADDR        74
++#define IPV6_RECVORIGDSTADDR    IPV6_ORIGDSTADDR
++#define IPV6_TRANSPARENT        75
++#define IPV6_UNICAST_IF         76
++
++/*
++ * Multicast Routing:
++ * see include/uapi/linux/mroute6.h.
++ *
++ * MRT6_BASE                  200
++ * ...
++ * MRT6_MAX
++ */
++#endif /* _LINUX_IN6_H */
+--- /dev/null
++++ b/include/linux-private/linux/libc-compat.h
+@@ -0,0 +1,143 @@
++/*
++ * Compatibility interface for userspace libc header coordination:
++ *
++ * Define compatibility macros that are used to control the inclusion or
++ * exclusion of UAPI structures and definitions in coordination with another
++ * userspace C library.
++ *
++ * This header is intended to solve the problem of UAPI definitions that
++ * conflict with userspace definitions. If a UAPI header has such conflicting
++ * definitions then the solution is as follows:
++ *
++ * * Synchronize the UAPI header and the libc headers so either one can be
++ *   used and such that the ABI is preserved. If this is not possible then
++ *   no simple compatibility interface exists (you need to write translating
++ *   wrappers and rename things) and you can't use this interface.
++ *
++ * Then follow this process:
++ *
++ * (a) Include libc-compat.h in the UAPI header.
++ *      e.g. #include <linux/libc-compat.h>
++ *     This include must be as early as possible.
++ *
++ * (b) In libc-compat.h add enough code to detect that the comflicting
++ *     userspace libc header has been included first.
++ *
++ * (c) If the userspace libc header has been included first define a set of
++ *     guard macros of the form __UAPI_DEF_FOO and set their values to 1, else
++ *     set their values to 0.
++ *
++ * (d) Back in the UAPI header with the conflicting definitions, guard the
++ *     definitions with:
++ *     #if __UAPI_DEF_FOO
++ *       ...
++ *     #endif
++ *
++ * This fixes the situation where the linux headers are included *after* the
++ * libc headers. To fix the problem with the inclusion in the other order the
++ * userspace libc headers must be fixed like this:
++ *
++ * * For all definitions that conflict with kernel definitions wrap those
++ *   defines in the following:
++ *   #if !__UAPI_DEF_FOO
++ *     ...
++ *   #endif
++ *
++ * This prevents the redefinition of a construct already defined by the kernel.
++ */
++#ifndef _LIBC_COMPAT_H
++#define _LIBC_COMPAT_H
++
++/* We have included glibc headers... */
++#if defined(__GLIBC__)
++
++/* Coordinate with glibc netinet/in.h header. */
++#if defined(_NETINET_IN_H)
++
++/* GLIBC headers included first so don't define anything
++ * that would already be defined. */
++#define __UAPI_DEF_IN_ADDR            0
++#define __UAPI_DEF_IN_IPPROTO         0
++#define __UAPI_DEF_IN_PKTINFO         0
++#define __UAPI_DEF_IP_MREQ            0
++#define __UAPI_DEF_SOCKADDR_IN                0
++#define __UAPI_DEF_IN_CLASS           0
++
++#define __UAPI_DEF_IN6_ADDR           0
++/* The exception is the in6_addr macros which must be defined
++ * if the glibc code didn't define them. This guard matches
++ * the guard in glibc/inet/netinet/in.h which defines the
++ * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */
++#if defined(__USE_MISC) || defined (__USE_GNU)
++#define __UAPI_DEF_IN6_ADDR_ALT               0
++#else
++#define __UAPI_DEF_IN6_ADDR_ALT               1
++#endif
++#define __UAPI_DEF_SOCKADDR_IN6               0
++#define __UAPI_DEF_IPV6_MREQ          0
++#define __UAPI_DEF_IPPROTO_V6         0
++#define __UAPI_DEF_IPV6_OPTIONS               0
++#define __UAPI_DEF_IN6_PKTINFO                0
++#define __UAPI_DEF_IP6_MTUINFO                0
++
++#else
++
++/* Linux headers included first, and we must define everything
++ * we need. The expectation is that glibc will check the
++ * __UAPI_DEF_* defines and adjust appropriately. */
++#define __UAPI_DEF_IN_ADDR            1
++#define __UAPI_DEF_IN_IPPROTO         1
++#define __UAPI_DEF_IN_PKTINFO         1
++#define __UAPI_DEF_IP_MREQ            1
++#define __UAPI_DEF_SOCKADDR_IN                1
++#define __UAPI_DEF_IN_CLASS           1
++
++#define __UAPI_DEF_IN6_ADDR           1
++/* We unconditionally define the in6_addr macros and glibc must
++ * coordinate. */
++#define __UAPI_DEF_IN6_ADDR_ALT               1
++#define __UAPI_DEF_SOCKADDR_IN6               1
++#define __UAPI_DEF_IPV6_MREQ          1
++#define __UAPI_DEF_IPPROTO_V6         1
++#define __UAPI_DEF_IPV6_OPTIONS               1
++#define __UAPI_DEF_IN6_PKTINFO                1
++#define __UAPI_DEF_IP6_MTUINFO                1
++
++#endif /* _NETINET_IN_H */
++
++/* Definitions for xattr.h */
++#if defined(_SYS_XATTR_H)
++#define __UAPI_DEF_XATTR              0
++#else
++#define __UAPI_DEF_XATTR              1
++#endif
++
++/* If we did not see any headers from any supported C libraries,
++ * or we are being included in the kernel, then define everything
++ * that we need. */
++#else /* !defined(__GLIBC__) */
++
++/* Definitions for in.h */
++#define __UAPI_DEF_IN_ADDR            1
++#define __UAPI_DEF_IN_IPPROTO         1
++#define __UAPI_DEF_IN_PKTINFO         1
++#define __UAPI_DEF_IP_MREQ            1
++#define __UAPI_DEF_SOCKADDR_IN                1
++#define __UAPI_DEF_IN_CLASS           1
++
++/* Definitions for in6.h */
++#define __UAPI_DEF_IN6_ADDR           1
++#define __UAPI_DEF_IN6_ADDR_ALT               1
++#define __UAPI_DEF_SOCKADDR_IN6               1
++#define __UAPI_DEF_IPV6_MREQ          1
++#define __UAPI_DEF_IPPROTO_V6         1
++#define __UAPI_DEF_IPV6_OPTIONS               1
++#define __UAPI_DEF_IN6_PKTINFO                1
++#define __UAPI_DEF_IP6_MTUINFO                1
++
++/* Definitions for xattr.h */
++#define __UAPI_DEF_XATTR              1
++
++#endif /* __GLIBC__ */
++
++#endif /* _LIBC_COMPAT_H */
diff --git a/package/libnl/0003-Add-musl-workaround-to-the-libc-compat.h-copy.patch b/package/libnl/0003-Add-musl-workaround-to-the-libc-compat.h-copy.patch
new file mode 100644 (file)
index 0000000..57d1c87
--- /dev/null
@@ -0,0 +1,37 @@
+From be07fdbc9658de19304defa7538f219cd3f21ec0 Mon Sep 17 00:00:00 2001
+From: Baruch Siach <baruch@tkos.co.il>
+Date: Sun, 12 Mar 2017 08:52:20 +0200
+Subject: [PATCH] Add musl workaround to the libc-compat.h copy
+
+The libc-compat.h kernel header uses glibc specific macros to solve conflicts
+with libc provided headers. This patch makes libc-compat.h work also for musl
+libc.
+
+Future rebase note: when upstream updates libc-compat.h some additional macro
+definitions will be needed. See the Buildroot iproute2 patch
+package/iproute2/0001-Add-the-musl-workaround-to-the-libc-compat.h-copy.patch.
+
+Signed-off-by: Baruch Siach <baruch@tkos.co.il>
+---
+Upstream status: libc-compat.h is a local copy of a kernel headers. A proper
+musl fix must go to the kernel first.
+---
+ include/linux-private/linux/libc-compat.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/linux-private/linux/libc-compat.h b/include/linux-private/linux/libc-compat.h
+index 9bed5b6ae4d9..e2562a819464 100644
+--- a/include/linux-private/linux/libc-compat.h
++++ b/include/linux-private/linux/libc-compat.h
+@@ -49,7 +49,7 @@
+ #define _LIBC_COMPAT_H
+ /* We have included glibc headers... */
+-#if defined(__GLIBC__)
++#if 1
+ /* Coordinate with glibc netinet/in.h header. */
+ #if defined(_NETINET_IN_H)
+-- 
+2.11.0
+
diff --git a/package/libnl/0004-lib-escape-usage-of-strerror_l-if-it-doesn-t-exist-i.patch b/package/libnl/0004-lib-escape-usage-of-strerror_l-if-it-doesn-t-exist-i.patch
new file mode 100644 (file)
index 0000000..6a9c354
--- /dev/null
@@ -0,0 +1,106 @@
+From e15966ac7f3b43df2acf869f98089762807d0568 Mon Sep 17 00:00:00 2001
+From: Alexey Brodkin <Alexey.Brodkin@synopsys.com>
+Date: Fri, 10 Mar 2017 17:44:22 +0300
+Subject: [PATCH] lib: escape usage of strerror_l() if it doesn't exist in libc
+
+uClibc doesn't implement strerror_l() and thus libnl starting from
+3.2.29 couldn't be compiled with it any longer.
+
+To work-around that problem we'll just do a check on strerror_l()
+availability during configuration and if it's not there just fall back
+to locale-less strerror().
+
+See-also: 6c2d111177e91184073c44f83d4a6182aaba06d7
+
+http://lists.infradead.org/pipermail/libnl/2017-March/002301.html
+
+Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
+Signed-off-by: Thomas Haller <thaller@redhat.com>
+Signed-off-by: Baruch Siach <baruch@tkos.co.il>
+---
+Patch status: upstream commit e15966ac7f3b43df
+
+ configure.ac    | 2 ++
+ lib/utils.c     | 8 +++++++-
+ src/lib/utils.c | 6 ++++++
+ 3 files changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 68b285e5b15c..2739b997ee3a 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -121,6 +121,8 @@ fi
+ AC_CONFIG_SUBDIRS([doc])
++AC_CHECK_FUNCS([strerror_l])
++
+ AC_CONFIG_FILES([
+ Makefile
+ libnl-3.0.pc
+diff --git a/lib/utils.c b/lib/utils.c
+index fb350d13fd2f..06273c5b291e 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -30,7 +30,9 @@
+ #include <netlink/utils.h>
+ #include <linux/socket.h>
+ #include <stdlib.h> /* exit() */
++#ifdef HAVE_STRERROR_L
+ #include <locale.h>
++#endif
+ /**
+  * Global variable indicating the desired level of debugging output.
+@@ -123,9 +125,10 @@ int __nl_read_num_str_file(const char *path, int (*cb)(long, const char *))
+ const char *nl_strerror_l(int err)
+ {
++      const char *buf;
++#ifdef HAVE_STRERROR_L
+       int errno_save = errno;
+       locale_t loc = newlocale(LC_MESSAGES_MASK, "", (locale_t)0);
+-      const char *buf;
+       if (loc == (locale_t)0) {
+               if (errno == ENOENT)
+@@ -140,6 +143,9 @@ const char *nl_strerror_l(int err)
+       }
+       errno = errno_save;
++#else
++      buf = strerror(err);
++#endif
+       return buf;
+ }
+ /** @endcond */
+diff --git a/src/lib/utils.c b/src/lib/utils.c
+index 5878f279c364..feb1d4ef4056 100644
+--- a/src/lib/utils.c
++++ b/src/lib/utils.c
+@@ -81,6 +81,7 @@ void nl_cli_fatal(int err, const char *fmt, ...)
+               fprintf(stderr, "\n");
+       } else {
+               char *buf;
++#ifdef HAVE_STRERROR_L
+               locale_t loc = newlocale(LC_MESSAGES_MASK, "", (locale_t)0);
+               if (loc == (locale_t)0) {
+                       if (errno == ENOENT)
+@@ -91,9 +92,14 @@ void nl_cli_fatal(int err, const char *fmt, ...)
+               }
+               if (loc != (locale_t)0)
+                       buf = strerror_l(err, loc);
++#else
++              buf = strerror(err);
++#endif
+               fprintf(stderr, "%s\n", buf);
++#ifdef HAVE_STRERROR_L
+               if (loc != (locale_t)0)
+                       freelocale(loc);
++#endif
+       }
+       exit(abs(err));
+-- 
+2.11.0
+
index 2f1a3cb1b322045aa00dd80148c5cfd20a888909..9761a9580cc9306c89bb9e9ece84e7e0bd58edc4 100644 (file)
@@ -1,2 +1,2 @@
-# From https://github.com/thom311/libnl/releases/download/libnl3_2_27/libnl-3.2.27.tar.gz.sha256sum
-sha256 4bbbf92b3c78a90f423cf96260bf419a28b75db8cced47051217a56795f58ec6        libnl-3.2.27.tar.gz
+# From https://github.com/thom311/libnl/releases/download/libnl3_2_29/libnl-3.2.29.tar.gz.sha256sum
+sha256 0beb593dc6abfffa18a5c787b27884979c1b7e7f1fd468c801e3cc938a685922        libnl-3.2.29.tar.gz
index 85c0db86f6cda2c767bbca1f233a77bfd2592786..f31a92c206f9edacfae2950097596e91278e1ead 100644 (file)
@@ -4,12 +4,14 @@
 #
 ################################################################################
 
-LIBNL_VERSION = 3.2.27
+LIBNL_VERSION = 3.2.29
 LIBNL_SITE = https://github.com/thom311/libnl/releases/download/libnl$(subst .,_,$(LIBNL_VERSION))
 LIBNL_LICENSE = LGPLv2.1+
 LIBNL_LICENSE_FILES = COPYING
 LIBNL_INSTALL_STAGING = YES
-LIBNL_DEPENDENCIES = host-bison host-flex
+LIBNL_DEPENDENCIES = host-bison host-flex host-pkgconf
+# Patching configure.ac
+LIBNL_AUTORECONF = YES
 
 ifeq ($(BR2_PACKAGE_LIBNL_TOOLS),y)
 LIBNL_CONF_OPTS += --enable-cli
@@ -17,4 +19,11 @@ else
 LIBNL_CONF_OPTS += --disable-cli
 endif
 
+ifeq ($(BR2_PACKAGE_CHECK),y)
+LIBNL_DEPENDENCIES += check
+LIBNL_CONF_OPTS += --enable-unit-tests
+else
+LIBNL_CONF_OPTS += --disable-unit-tests
+endif
+
 $(eval $(autotools-package))