From 610b60fa0d16d1c64f8dce481f2655d60c4a7a52 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 21 Aug 2015 17:43:48 +0200 Subject: [PATCH] Import public domain macros from musl. --- libc/include/netinet/in.h | 89 ++++++++++++++++++++++++++++----------- 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/libc/include/netinet/in.h b/libc/include/netinet/in.h index b9cd85c2..7beb2101 100644 --- a/libc/include/netinet/in.h +++ b/libc/include/netinet/in.h @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2013, 2014. + Copyright(C) Jonas 'Sortie' Termansen 2013, 2014, 2015. This file is part of the Sortix C Library. @@ -68,7 +68,7 @@ struct sockaddr_in struct in_addr sin_addr; }; -struct in6_addr +struct __attribute__((aligned(4))) in6_addr { uint8_t s6_addr[16]; }; @@ -101,9 +101,15 @@ struct ipv6_mreq #define IPPROTO_TCP 5 #define IPPROTO_UDP 6 -#define INADDR_ANY ((in_addr_t) 0x00000000) -#define INADDR_BROADCAST ((in_addr_t) 0xffffffff) -#define INADDR_NONE ((in_addr_t) 0xffffffff) +#define INADDR_ANY ((in_addr_t) 0x00000000) +#define INADDR_BROADCAST ((in_addr_t) 0xffffffff) +#define INADDR_NONE ((in_addr_t) 0xffffffff) +#define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) + +#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000) +#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001) +#define INADDR_ALLRTRS_GROUP ((in_addr_t) 0xe0000002) +#define INADDR_MAX_LOCAL_GROUP ((in_addr_t) 0xe00000ff) #define INET_ADDRSTRLEN 16 #define INET6_ADDRSTRLEN 46 @@ -121,26 +127,61 @@ struct ipv6_mreq #define IPV6_UNICAST_HOPS 5 #define IPV6_V6ONLY 6 -/* TODO: -IN6_IS_ADDR_UNSPECIFIED -IN6_IS_ADDR_LOOPBACK -IN6_IS_ADDR_MULTICAST -IN6_IS_ADDR_LINKLOCAL -IN6_IS_ADDR_SITELOCAL -IN6_IS_ADDR_V4MAPPED -IN6_IS_ADDR_V4COMPAT -IN6_IS_ADDR_MC_NODELOCAL -IN6_IS_ADDR_MC_LINKLOCAL -IN6_IS_ADDR_MC_SITELOCAL -IN6_IS_ADDR_MC_ORGLOCAL -IN6_IS_ADDR_MC_GLOBAL -*/ +#define IN6_IS_ADDR_UNSPECIFIED(a) \ + (((uint32_t*) (a))[0] == 0 && ((uint32_t*) (a))[1] == 0 && \ + ((uint32_t*) (a))[2] == 0 && ((uint32_t*) (a))[3] == 0) +#define IN6_IS_ADDR_LOOPBACK(a) \ + (((uint32_t*) (a))[0] == 0 && ((uint32_t*) (a))[1] == 0 && \ + ((uint32_t*) (a))[2] == 0 && \ + ((uint8_t*) (a))[12] == 0 && ((uint8_t*) (a))[13] == 0 && \ + ((uint8_t*) (a))[14] == 0 && ((uint8_t*) (a))[15] == 1 ) +#define IN6_IS_ADDR_MULTICAST(a) (((uint8_t*) (a))[0] == 0xff) +#define IN6_IS_ADDR_LINKLOCAL(a) \ + ((((uint8_t*) (a))[0]) == 0xfe && (((uint8_t*) (a))[1] & 0xc0) == 0x80) +#define IN6_IS_ADDR_SITELOCAL(a) \ + ((((uint8_t*) (a))[0]) == 0xfe && (((uint8_t*) (a))[1] & 0xc0) == 0xc0) +#define IN6_IS_ADDR_V4MAPPED(a) \ + (((uint32_t*) (a))[0] == 0 && ((uint32_t*) (a))[1] == 0 && \ + ((uint8_t*) (a))[8] == 0 && ((uint8_t*) (a))[9] == 0 && \ + ((uint8_t*) (a))[10] == 0xff && ((uint8_t*) (a))[11] == 0xff) +#define IN6_IS_ADDR_V4COMPAT(a) \ + (((uint32_t*) (a))[0] == 0 && ((uint32_t*) (a))[1] == 0 && \ + ((uint32_t*) (a))[2] == 0 && ((uint8_t*) (a))[15] > 1) +#define IN6_IS_ADDR_MC_NODELOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*) (a))[1] & 0xf) == 0x1)) +#define IN6_IS_ADDR_MC_LINKLOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*) (a))[1] & 0xf) == 0x2)) +#define IN6_IS_ADDR_MC_SITELOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*) (a))[1] & 0xf) == 0x5)) +#define IN6_IS_ADDR_MC_ORGLOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*) (a))[1] & 0xf) == 0x8)) +#define IN6_IS_ADDR_MC_GLOBAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t*) (a))[1] & 0xf) == 0xe)) +#define __ARE_4_EQUAL(a,b) \ + (!( (0[a]-0[b]) | (1[a]-1[b]) | (2[a]-2[b]) | (3[a]-3[b]) )) +#define IN6_ARE_ADDR_EQUAL(a,b) \ + __ARE_4_EQUAL((const uint32_t*)(a), (const uint32_t*)(b)) -# define IN6_ARE_ADDR_EQUAL(a,b) \ - ((((__const uint32_t *) (a))[0] == ((__const uint32_t *) (b))[0]) \ - && (((__const uint32_t *) (a))[1] == ((__const uint32_t *) (b))[1]) \ - && (((__const uint32_t *) (a))[2] == ((__const uint32_t *) (b))[2]) \ - && (((__const uint32_t *) (a))[3] == ((__const uint32_t *) (b))[3])) +#define IN_CLASSA(a) ((((in_addr_t)(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) ((((in_addr_t)(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) ((((in_addr_t)(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) ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000) +#define IN_MULTICAST(a) IN_CLASSD(a) +#define IN_EXPERIMENTAL(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000) +#define IN_BADCLASS(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000) + +#define IN_LOOPBACKNET 127 #ifdef __cplusplus } /* extern "C" */