/* * (c) Copyright, Real-Time Innovations, 2006-2024. * All rights reserved. * * No duplications, whole or partial, manual or electronic, may be made * without express written permission. Any such copies, or * revisions thereof, must display this notice unaltered. * This code contains trade secrets of Real-Time Innovations, Inc. */ #ifndef osapi_socket6_h #define osapi_socket6_h #include "osapi/osapi_type.h" #include "osapi/osapi_dll.h" #include "osapi/osapi_socket.h" #include "osapi/osapi_interfaces.h" #if (defined(RTI_IPV6) \ && !(defined(RTI_UNIX) || defined(RTI_QNX) || defined(RTI_VXWORKS) \ || defined(RTI_WINCE) || defined(RTI_WIN32) || defined(RTI_INTIME))) #error Need to port #endif #ifdef __cplusplus extern "C" { #endif /** @internal \file * \brief Socket * This module contains methods to manipulate sockets, including methods * to create, write and read the socket, etc. These methods may be IPv6- * specific. */ #if defined(RTI_UNIX) || defined(RTI_VXWORKS) || defined(RTI_QNX) \ || defined(RTI_INTIME) typedef u_int RTIOsapiSocket6MulticastLoopbackFlag; typedef u_int RTIOsapiSocket6TTL; #elif defined(RTI_WIN32) || defined(RTI_WINCE) #define RTIOsapiSocket6MulticastLoopbackFlag BOOL #define RTIOsapiSocket6TTL int #elif defined(RTI_IPV6) #error "Need to port" #endif /** @internal \ingroup RTIOsapiSocketClass * OS independent function to get socket option for IPv6 socket. * * @param s Socket * @param optType Desired action. * @param optVal Pointer to the desired value corresponding to the * optType. * @param optLenPtr Pointer to the integer to return the actual value. * Don't set the initial value to 0! * * @return 0 if successful, -1 if error * * @see RTIOsapiSocketOption RTIOsapiSocket6_setOption */ extern RTIOsapiDllExport int RTIOsapiSocket6_getOption( int s, RTIOsapiSocketOption optType, char *optVal, unsigned int *optLenPtr); /** @internal \ingroup RTIOsapiSocketClass * OS independent function to set socket option for IPv6 socket. * * @param s Socket * @param optType Desired action. * @param optVal Pointer to the desired value corresponding to the * optType. * @param optLen Length of the optVal in bytes. * * @return 0 if successful, -1 if error * * @see RTIOsapiSocket6_getOption */ extern RTIOsapiDllExport int RTIOsapiSocket6_setOption( int s, RTIOsapiSocketOption optType, const char *optVal, unsigned int optLen); #if defined(RTI_SOL210) || (defined(RTI_LINUX26) && !defined(RTI_GCC3)) /* * Transport priority for IPv6 (TCLASS) only supported on Solaris 10 AND * Linux 2.6 */ #define RTI_SOCKET_PRIORITY_IPv6 #endif #ifdef RTI_IPV6 /* req'd for any functions that take sockaddr_in6 */ /** @internal \ingroup RTIOsapiSocketClass * * @brief Assign a port number to an (IPv6) socket. * * Bind a port to a socket. Fills in sockAddr. If the passed port * number is 0, then the system will assign a new port number. If the * bind succeeds, the bound port number is returned, and is also * available as ntohs(sockAddr->sin6_port). This is only necessary if the * socket will receive data. */ extern RTIOsapiDllExport unsigned int RTIOsapiSocket6_bind( int sd, struct sockaddr_in6 *sockAddr, unsigned int portnum); /** @internal \ingroup RTIOsapiSocketClass * * @brief Assign a port number to an (IPv6) socket. * * Bind a port to a socket. Fills in sockAddr. If the passed port number is * 0, then the system will assign a new port number. If the bind succeeds, the * bound port number is returned, and is also available as * ntohs(sockAddr->sin6_port). This is only necessary if the socket will receive * data. */ extern RTIOsapiDllExport unsigned int RTIOsapiSocket6_bindWithIP( int sd, struct sockaddr_in6 *sockAddr, const struct in6_addr *ip, unsigned int portnum); /** @internal \ingroup RTIOsapiSocketClass * * @brief Add an IPv6 multicast group. * * Adds a socket to a multicast group to receive traffic sent to that * destination. This is only necessary if the socket will receive data. */ extern RTIOsapiDllExport int RTIOsapiSocket_multicastAdd( int sd, const struct sockaddr *mcAddr, int ifIndex); /** @internal \ingroup RTIOsapiSocketClass * * @brief Drop an IPv6 multicast group. * * Drops a socket from a multicast group previously added. This is * implicitly done on closing the socket. */ extern RTIOsapiDllExport int RTIOsapiSocket_multicastDrop( int sd, const struct sockaddr *mcAddr, int ifIndex); /** @internal \ingroup RTIOsapiSocketClass * \brief Generic buffer to hold data, described by a pointer to the * data and length of the data. Must be equivalent to NDDS_Transport_Buffer_t * (and also REDABuffer_t). */ typedef struct { /** @internal @brief Length of the buffer pointed to by pointer. */ RTI_INT32 length; /** @internal @brief Pre-allocated (by the caller) buffer. */ char *pointer; } RTIOsapiSocketBuffer_t; /** @internal \ingroup RTIOsapiSocketClass * \brief Opaque buffer used to hold scatter/gather information on platforms * where this is needed. */ typedef void *RTIOsapiSocketGatherBuffer_t; /** @internal \ingroup RTIOsapiSocketClass * * @brief Send data to a single socket. */ #define RTIOsapiSocket_sendMessage(s, gB, bufs, bufCount, address, addrLen) \ RTIOsapiSocket_sendMessageN(&s, 1, gB, bufs, bufCount, address, addrLen) /** @internal \ingroup RTIOsapiSocketClass * @brief Send data to a set of sockets (needed for multicast send). */ extern RTIOsapiDllExport int RTIOsapiSocket_sendMessageN( int *sockets, size_t socketCount, RTIOsapiSocketGatherBuffer_t gatherBuffer, const RTIOsapiSocketBuffer_t *buffers, size_t bufferCount, const struct sockaddr *address, socklen_t addressLen); #endif /* RTI_IPV6 */ /* Interface enumeration methods */ /** @internal \ingroup RTIOsapiSocketClass * \brief Interface is running */ #define RTI_OSAPI_SOCKET_INTERFACE_FLAG_UP (0x1) /** @internal \ingroup RTIOsapiSocketClass * \brief Interface supports broadcast */ #define RTI_OSAPI_SOCKET_INTERFACE_FLAG_BROADCAST (0x2) /** @internal \ingroup RTIOsapiSocketClass * \brief Interface supports a loopback interface */ #define RTI_OSAPI_SOCKET_INTERFACE_FLAG_LOOPBACK (0x4) /** @internal \ingroup RTIOsapiSocketClass * \brief Interface is a point-to-point connection. */ #define RTI_OSAPI_SOCKET_INTERFACE_FLAG_POINTOPOINT (0x8) /** @internal \ingroup RTIOsapiSocketClass * \brief Interface supports multicast. */ #define RTI_OSAPI_SOCKET_INTERFACE_FLAG_MULTICAST (0x10) /** @internal \ingroup RTIOsapiSocketClass * \brief Interface has all resources allocated. */ #define RTI_OSAPI_SOCKET_INTERFACE_FLAG_RUNNING (0x20) #ifdef __cplusplus } /* extern "C" */ #endif #endif /* osapi_socket6_h */