$OpenBSD$

Index: runtime/druntime/src/core/sys/posix/netinet/in_.d
--- runtime/druntime/src/core/sys/posix/netinet/in_.d.orig
+++ runtime/druntime/src/core/sys/posix/netinet/in_.d
@@ -202,6 +202,61 @@ else version( FreeBSD )
 
     //enum INET_ADDRSTRLEN       = 16;
 }
+else version (OpenBSD)
+{
+    struct sockaddr_in
+    {
+        ubyte       sin_len;
+        sa_family_t sin_family;
+        in_port_t   sin_port;
+        in_addr     sin_addr;
+        ubyte[8]    sin_zero;
+    }
+
+    enum
+    {
+        IPPROTO_IP        = 0,              /* dummy for IP */
+        IPPROTO_HOPOPTS   = IPPROTO_IP,     /* Hop-by-hop option header */
+        IPPROTO_ICMP      = 1,              /* control message protocol */
+        IPPROTO_IGMP      = 2,              /* group mgmt protocol */
+        IPPROTO_GGP       = 3,              /* gateway^2 (deprecated) */
+        IPPROTO_IPIP      = 4,              /* IP inside IP */
+        IPPROTO_IPV4      = IPPROTO_IPIP,   /* IP inside IP */
+        IPPROTO_TCP       = 6,              /* tcp */
+        IPPROTO_EGP       = 8,              /* exterior gateway protocol */
+        IPPROTO_PUP       = 12,             /* pup */
+        IPPROTO_UDP       = 17,             /* user datagram protocol */
+        IPPROTO_IDP       = 22,             /* xns idp */
+        IPPROTO_TP        = 29,             /* tp-4 w/ class negotiation */
+        IPPROTO_ROUTING   = 43,             /* Routing header */
+        IPPROTO_FRAGMENT  = 44,             /* Fragmentation/reassembly header */
+        IPPROTO_RSVP      = 46,             /* resource reservation */
+        IPPROTO_GRE       = 47,             /* GRE encap, RFCs 1701/1702 */
+        IPPROTO_ESP       = 50,             /* Encap. Security Payload */
+        IPPROTO_AH        = 51,             /* Authentication header */
+        IPPROTO_MOBILE    = 55,             /* IP Mobility, RFC 2004 */
+        IPPROTO_ICMPV6    = 58,             /* ICMP for IPv6 */
+        IPPROTO_NONE      = 59,             /* No next header */
+        IPPROTO_DSTOPTS   = 60,             /* Destination options header */
+        IPPROTO_EON       = 80,             /* ISO cnlp */
+        IPPROTO_ETHERIP   = 97,             /* Ethernet in IPv4 */
+        IPPROTO_ENCAP     = 98,             /* encapsulation header */
+        IPPROTO_PIM       = 103,            /* Protocol indep. multicast */
+        IPPROTO_IPCOMP    = 108,            /* IP Payload Comp. Protocol */
+        IPPROTO_CARP      = 112,            /* CARP */
+        IPPROTO_MPLS      = 137,            /* unicast MPLS packet */
+        IPPROTO_PFSYNC    = 240,            /* PFSYNC */
+        IPPROTO_MAX       = 256
+    }
+
+    enum : uint
+    {
+        INADDR_ANY       = 0x00000000,
+        INADDR_BROADCAST = 0xffffffff,
+        INADDR_LOOPBACK  = 0x7f000001,
+        INADDR_NONE      = 0xffffffff
+    }
+}
 else version( DragonFlyBSD )
 {
     //alias uint16_t in_port_t;
@@ -756,6 +811,171 @@ else version( FreeBSD )
                __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
     }
 }
+else version (OpenBSD)
+{
+    struct in6_addr
+    {
+        union
+        {
+            uint8_t[16] s6_addr;
+            uint16_t[8] s6_addr16;
+            uint32_t[4] s6_addr32;
+        }
+    }
+
+    struct sockaddr_in6
+    {
+        uint8_t     sin6_len;
+        sa_family_t sin6_family;
+        in_port_t   sin6_port;
+        uint32_t    sin6_flowinfo;
+        in6_addr    sin6_addr;
+        uint32_t    sin6_scope_id;
+    }
+
+    extern __gshared immutable in6_addr in6addr_any;
+    extern __gshared immutable in6_addr in6addr_loopback;
+
+    struct ipv6_mreq
+    {
+        in6_addr    ipv6mr_multiaddr;
+        uint        ipv6mr_interface;
+    }
+
+    enum : uint
+    {
+        IPPROTO_IPV6        = 41,
+
+        IPV6_JOIN_GROUP     = 12,
+        IPV6_LEAVE_GROUP    = 13,
+        IPV6_MULTICAST_HOPS = 10,
+        IPV6_MULTICAST_IF   = 9,
+        IPV6_MULTICAST_LOOP = 11,
+        IPV6_UNICAST_HOPS   = 4,
+        IPV6_V6ONLY         = 27,
+        IPV6_CHECKSUM       = 26,
+        IPV6_PORTRANGE      = 14,
+
+    /* new socket options introduced in RFC3542 */
+        IPV6_RTHDRDSTOPTS         = 35, /* ip6_dest; send dst option before rthdr */
+
+        IPV6_RECVPKTINFO          = 36, /* bool; recv if, dst addr */
+        IPV6_RECVHOPLIMIT         = 37, /* bool; recv hop limit */
+        IPV6_RECVRTHDR            = 38, /* bool; recv routing header */
+        IPV6_RECVHOPOPTS          = 39, /* bool; recv hop-by-hop option */
+        IPV6_RECVDSTOPTS          = 40, /* bool; recv dst option after rthdr */
+
+        IPV6_USE_MIN_MTU          = 42, /* bool; send packets at the minimum MTU */
+        IPV6_RECVPATHMTU          = 43, /* bool; notify an according MTU */
+
+        IPV6_PATHMTU              = 44, /* mtuinfo; get the current path MTU (sopt),4 bytes int; MTU notification (cmsg) */
+
+    /* More new socket options introduced in RFC3542 */
+        IPV6_PKTINFO              = 46, /* in6_pktinfo; send if, src addr */
+        IPV6_HOPLIMIT             = 47, /* int; send hop limit */
+        IPV6_NEXTHOP              = 48, /* sockaddr; next hop addr */
+        IPV6_HOPOPTS              = 49, /* ip6_hbh; send hop-by-hop option */
+        IPV6_DSTOPTS              = 50, /* ip6_dest; send dst option befor rthdr */
+        IPV6_RTHDR                = 51, /* ip6_rthdr; send routing header */
+
+        IPV6_AUTH_LEVEL           = 53,   /* int; authentication used */
+        IPV6_ESP_TRANS_LEVEL      = 54,   /* int; transport encryption */
+        IPV6_ESP_NETWORK_LEVEL    = 55,   /* int; full-packet encryption */
+    }
+
+    private enum
+    {
+        __IPV6_ADDR_SCOPE_NODELOCAL     = 0x01,
+        __IPV6_ADDR_SCOPE_INTFACELOCAL  = 0x01,
+        __IPV6_ADDR_SCOPE_LINKLOCAL     = 0x02,
+        __IPV6_ADDR_SCOPE_SITELOCAL     = 0x05,
+        __IPV6_ADDR_SCOPE_ORGLOCAL      = 0x08,
+        __IPV6_ADDR_SCOPE_GLOBAL        = 0x0e,
+    }
+
+    // macros
+    extern (D) int IN6_IS_ADDR_UNSPECIFIED( in in6_addr* a ) pure
+    {
+        return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == 0);
+    }
+
+    extern (D) int IN6_IS_ADDR_LOOPBACK( in in6_addr* a ) pure
+    {
+        return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) == ntohl(1));
+    }
+
+    extern (D) int IN6_IS_ADDR_V4COMPAT( in in6_addr* a ) pure
+    {
+        return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[12]) != ntohl(1));
+    }
+
+    extern (D) int IN6_IS_ADDR_V4MAPPED( in in6_addr* a ) pure
+    {
+        return (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[0]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[4]) == 0) &&
+               (*cast(const uint32_t*) cast(const void*) (&a.s6_addr[8]) == ntohl(0x0000ffff));
+    }
+
+    extern (D) int IN6_IS_ADDR_LINKLOCAL( in in6_addr* a ) pure
+    {
+        return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0x80;
+    }
+
+    extern (D) int IN6_IS_ADDR_SITELOCAL( in in6_addr* a ) pure
+    {
+        return a.s6_addr[0] == 0xfe && (a.s6_addr[1] & 0xc0) == 0xc0;
+    }
+
+    extern (D) int IN6_IS_ADDR_MULTICAST( in in6_addr* a ) pure
+    {
+        return a.s6_addr[0] == 0xff;
+    }
+
+    extern (D) uint8_t __IPV6_ADDR_MC_SCOPE( in in6_addr* a ) pure
+    {
+        return a.s6_addr[1] & 0x0f;
+    }
+
+    extern (D) int IN6_IS_ADDR_MC_NODELOCAL( in in6_addr* a ) pure
+    {
+        return IN6_IS_ADDR_MULTICAST(a) &&
+               __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL;
+    }
+
+    extern (D) int IN6_IS_ADDR_MC_LINKLOCAL( in in6_addr* a ) pure
+    {
+        return IN6_IS_ADDR_MULTICAST(a) &&
+               __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL;
+    }
+
+    extern (D) int IN6_IS_ADDR_MC_SITELOCAL( in in6_addr* a ) pure
+    {
+        return IN6_IS_ADDR_MULTICAST(a) &&
+               __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL;
+    }
+
+    extern (D) int IN6_IS_ADDR_MC_ORGLOCAL( in in6_addr* a ) pure
+    {
+        return IN6_IS_ADDR_MULTICAST(a) &&
+               __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL;
+    }
+
+    extern (D) int IN6_IS_ADDR_MC_GLOBAL( in in6_addr* a ) pure
+    {
+        return IN6_IS_ADDR_MULTICAST(a) &&
+               __IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL;
+    }
+}
 else version( DragonFlyBSD )
 {
     struct in6_addr
@@ -1168,6 +1388,10 @@ else version( OSX )
     enum uint IPPROTO_RAW = 255;
 }
 else version( FreeBSD )
+{
+    enum uint IPPROTO_RAW = 255;
+}
+else version (OpenBSD)
 {
     enum uint IPPROTO_RAW = 255;
 }
