]> sjero.net Git - iperf/blobdiff - include/SocketAddr.h
Native IPv6 support for iperf
[iperf] / include / SocketAddr.h
index feffdc780603c359c4a0ecda8569694d9823f0cf..37a735977d6f14aaaa9060810f4d8d6fe8984f0c 100644 (file)
 
 #include "headers.h"
 #include "Settings.hpp"
+#include <net/if.h>
 
 
 #ifdef __cplusplus
 extern "C" {
 #endif
-/* ------------------------------------------------------------------- */
-    void SockAddr_localAddr( thread_Settings *inSettings );
-    void SockAddr_remoteAddr( thread_Settings *inSettings );
 
-    void SockAddr_setHostname( const char* inHostname,
-                               iperf_sockaddr *inSockAddr, 
-                               int isIPv6 );          // DNS lookup
-    void SockAddr_getHostname( iperf_sockaddr *inSockAddr,
-                               char* outHostname, 
-                               size_t len );   // reverse DNS lookup
-    void SockAddr_getHostAddress( iperf_sockaddr *inSockAddr, 
-                                  char* outAddress, 
-                                  size_t len ); // dotted decimal
+static inline bool SockAddr_isIPv6(const struct sockaddr_storage *ss)
+{
+       return ss->ss_family == AF_INET6;
+}
 
-    void SockAddr_setPort( iperf_sockaddr *inSockAddr, unsigned short inPort );
-    void SockAddr_setPortAny( iperf_sockaddr *inSockAddr );
-    unsigned short SockAddr_getPort( iperf_sockaddr *inSockAddr );
+static inline int SockAddr_isMulticast(const struct sockaddr *sa)
+{
+    if (sa->sa_family == AF_INET6)
+       return IN6_IS_ADDR_MULTICAST(&(((struct sockaddr_in6 *)sa)->sin6_addr));
 
-    void SockAddr_setAddressAny( iperf_sockaddr *inSockAddr );
+    // IPv4 multicast: 224.0.0.0 to 239.255.255.255 (e0.00.00.00 to ef.ff.ff.ff)
+    return sa->sa_family == AF_INET &&
+          (ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr) >> 28) == 0xe;
+}
 
-    // return pointer to the struct in_addr
-    struct in_addr* SockAddr_get_in_addr( iperf_sockaddr *inSockAddr );
-#ifdef HAVE_IPV6
-    // return pointer to the struct in_addr
-    struct in6_addr* SockAddr_get_in6_addr( iperf_sockaddr *inSockAddr );
-#endif
-    // return the sizeof the addess structure (struct sockaddr_in)
-    Socklen_t SockAddr_get_sizeof_sockaddr( iperf_sockaddr *inSockAddr );
-
-    int SockAddr_isMulticast( iperf_sockaddr *inSockAddr );
-
-    int SockAddr_isIPv6( iperf_sockaddr *inSockAddr );
+int SockAddr_Hostare_Equal(struct sockaddr_storage *first, struct sockaddr_storage *second);
+int SockAddr_are_Equal(struct sockaddr_storage *first, struct sockaddr_storage *second);
 
-    int SockAddr_are_Equal( struct sockaddr *first, struct sockaddr *second );
-    int SockAddr_Hostare_Equal( struct sockaddr *first, struct sockaddr *second );
+int         SockAddr_port(struct sockaddr_storage *ss);
+const char *SockAddr_name(struct sockaddr_storage *ss, char *hbuf, size_t hbuflen);
 
-    void SockAddr_zeroAddress( iperf_sockaddr *inSockAddr );
 #ifdef __cplusplus
 } /* end extern "C" */
 #endif