From 9c41f0a3aadb8ca284613dd552128338af16dc2e Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Tue, 16 Sep 2008 16:11:44 +0000 Subject: Ticket #629: Added IGMPv2 multicast socket options (thanks David Parker for the patch). git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2283 74dad513-b988-da41-8d7b-12977e46ad98 --- pjlib/include/pj/compat/socket.h | 4 +-- pjlib/include/pj/sock.h | 54 ++++++++++++++++++++++++++++++++++++++++ pjlib/src/pj/sock_bsd.c | 5 ++++ pjlib/src/pj/sock_common.c | 25 +++++++++++++++++++ pjlib/src/pj/sock_symbian.cpp | 7 ++++++ 5 files changed, 93 insertions(+), 2 deletions(-) (limited to 'pjlib') diff --git a/pjlib/include/pj/compat/socket.h b/pjlib/include/pj/compat/socket.h index eb0f870e..d234aca2 100644 --- a/pjlib/include/pj/compat/socket.h +++ b/pjlib/include/pj/compat/socket.h @@ -53,14 +53,14 @@ * These VS uses Microsoft Platform SDK for Windows Server 2003 SP1, and * it has built-in IPv6 support. */ -#if defined(_MSC_VER) && defined(PJ_HAS_IPV6) && PJ_HAS_IPV6!=0 +#if defined(_MSC_VER) # ifndef s_addr # define s_addr S_un.S_addr # endif # include -# ifndef IPPROTO_IPV6 +# if !defined(IPPROTO_IPV6) && defined(PJ_HAS_IPV6) && PJ_HAS_IPV6!=0 /* Need to download and install IPv6Kit for this platform. * Please see the comments above about Visual Studio 6. */ diff --git a/pjlib/include/pj/sock.h b/pjlib/include/pj/sock.h index b9deb3d6..f700e192 100644 --- a/pjlib/include/pj/sock.h +++ b/pjlib/include/pj/sock.h @@ -289,6 +289,21 @@ extern const pj_uint16_t PJ_SO_RCVBUF; /** Buffer size for send. @see pj_SO_SNDBUF() */ extern const pj_uint16_t PJ_SO_SNDBUF; +/** IP multicast interface. @see pj_IP_MULTICAST_IF() */ +extern const pj_uint16_t PJ_IP_MULTICAST_IF; + +/** IP multicast ttl. @see pj_IP_MULTICAST_TTL() */ +extern const pj_uint16_t PJ_IP_MULTICAST_TTL; + +/** IP multicast loopback. @see pj_IP_MULTICAST_LOOP() */ +extern const pj_uint16_t PJ_IP_MULTICAST_LOOP; + +/** Add an IP group membership. @see pj_IP_ADD_MEMBERSHIP() */ +extern const pj_uint16_t PJ_IP_ADD_MEMBERSHIP; + +/** Drop an IP group membership. @see pj_IP_DROP_MEMBERSHIP() */ +extern const pj_uint16_t PJ_IP_DROP_MEMBERSHIP; + #if defined(PJ_DLL) /** Get #PJ_SO_TYPE constant */ @@ -299,6 +314,21 @@ extern const pj_uint16_t PJ_SO_SNDBUF; /** Get #PJ_SO_SNDBUF constant */ PJ_DECL(pj_uint16_t) pj_SO_SNDBUF(void); + + /** Get #PJ_IP_MULTICAST_IF constant */ + PJ_DECL(pj_uint16_t) pj_IP_MULTICAST_IF(void); + + /** Get #PJ_IP_MULTICAST_TTL constant */ + PJ_DECL(pj_uint16_t) pj_IP_MULTICAST_TTL(void); + + /** Get #PJ_IP_MULTICAST_LOOP constant */ + PJ_DECL(pj_uint16_t) pj_IP_MULTICAST_LOOP(void); + + /** Get #PJ_IP_ADD_MEMBERSHIP constant */ + PJ_DECL(pj_uint16_t) pj_IP_ADD_MEMBERSHIP(void); + + /** Get #PJ_IP_DROP_MEMBERSHIP constant */ + PJ_DECL(pj_uint16_t) pj_IP_DROP_MEMBERSHIP(void); #else /** Get #PJ_SO_TYPE constant */ # define pj_SO_TYPE() PJ_SO_TYPE @@ -308,6 +338,21 @@ extern const pj_uint16_t PJ_SO_SNDBUF; /** Get #PJ_SO_SNDBUF constant */ # define pj_SO_SNDBUF() PJ_SO_SNDBUF + + /** Get #PJ_IP_MULTICAST_IF constant */ +# define pj_IP_MULTICAST_IF() PJ_IP_MULTICAST_IF + + /** Get #PJ_IP_MULTICAST_TTL constant */ +# define pj_IP_MULTICAST_TTL() PJ_IP_MULTICAST_TTL + + /** Get #PJ_IP_MULTICAST_LOOP constant */ +# define pj_IP_MULTICAST_LOOP() PJ_IP_MULTICAST_LOOP + + /** Get #PJ_IP_ADD_MEMBERSHIP constant */ +# define pj_IP_ADD_MEMBERSHIP() PJ_IP_ADD_MEMBERSHIP + + /** Get #PJ_IP_DROP_MEMBERSHIP constant */ +# define pj_IP_DROP_MEMBERSHIP() PJ_IP_DROP_MEMBERSHIP #endif @@ -515,6 +560,15 @@ typedef union pj_sockaddr } pj_sockaddr; +/** + * This structure provides multicast group information for IPv4 addresses. + */ +typedef struct pj_ip_mreq { + pj_in_addr imr_multiaddr; /**< IP multicast address of group. */ + pj_in_addr imr_interface; /**< local IP address of interface. */ +} pj_ip_mreq; + + /***************************************************************************** * * SOCKET ADDRESS MANIPULATION. diff --git a/pjlib/src/pj/sock_bsd.c b/pjlib/src/pj/sock_bsd.c index 9f5023b4..b66740cc 100644 --- a/pjlib/src/pj/sock_bsd.c +++ b/pjlib/src/pj/sock_bsd.c @@ -115,6 +115,11 @@ const pj_uint16_t PJ_IPTOS_MINCOST = 0x02; const pj_uint16_t PJ_SO_TYPE = SO_TYPE; const pj_uint16_t PJ_SO_RCVBUF = SO_RCVBUF; const pj_uint16_t PJ_SO_SNDBUF = SO_SNDBUF; +const pj_uint16_t pj_IP_MULTICAST_IF = IP_MULTICAST_IF; +const pj_uint16_t pj_IP_MULTICAST_TTL = IP_MULTICAST_TTL; +const pj_uint16_t pj_IP_MULTICAST_LOOP = IP_MULTICAST_LOOP; +const pj_uint16_t pj_IP_ADD_MEMBERSHIP = IP_ADD_MEMBERSHIP; +const pj_uint16_t pj_IP_DROP_MEMBERSHIP = IP_DROP_MEMBERSHIP; /* recv() and send() flags */ diff --git a/pjlib/src/pj/sock_common.c b/pjlib/src/pj/sock_common.c index c92ca518..6c4383a1 100644 --- a/pjlib/src/pj/sock_common.c +++ b/pjlib/src/pj/sock_common.c @@ -686,6 +686,31 @@ PJ_DEF(pj_uint16_t) pj_SO_SNDBUF(void) return PJ_SO_SNDBUF; } +PJ_DEF(pj_uint16_t) pj_IP_MULTICAST_IF(void) +{ + return PJ_IP_MULTICAST_IF; +} + +PJ_DEF(pj_uint16_t) pj_IP_MULTICAST_TTL(void) +{ + return PJ_IP_MULTICAST_TTL; +} + +PJ_DEF(pj_uint16_t) pj_IP_MULTICAST_LOOP(void) +{ + return PJ_IP_MULTICAST_LOOP; +} + +PJ_DEF(pj_uint16_t) pj_IP_ADD_MEMBERSHIP(void) +{ + return PJ_IP_ADD_MEMBERSHIP; +} + +PJ_DEF(pj_uint16_t) pj_IP_DROP_MEMBERSHIP(void) +{ + return PJ_IP_DROP_MEMBERSHIP; +} + PJ_DEF(int) pj_MSG_OOB(void) { return PJ_MSG_OOB; diff --git a/pjlib/src/pj/sock_symbian.cpp b/pjlib/src/pj/sock_symbian.cpp index 10ff9387..82a5d90e 100644 --- a/pjlib/src/pj/sock_symbian.cpp +++ b/pjlib/src/pj/sock_symbian.cpp @@ -65,6 +65,13 @@ const pj_uint16_t PJ_SO_TYPE = 0xFFFF; const pj_uint16_t PJ_SO_RCVBUF = 0xFFFF; const pj_uint16_t PJ_SO_SNDBUF = 0xFFFF; +/* IP multicast is also not supported. */ +const pj_uint16_t pj_IP_MULTICAST_IF = 0xFFFF; +const pj_uint16_t pj_IP_MULTICAST_TTL = 0xFFFF; +const pj_uint16_t pj_IP_MULTICAST_LOOP = 0xFFFF; +const pj_uint16_t pj_IP_ADD_MEMBERSHIP = 0xFFFF; +const pj_uint16_t pj_IP_DROP_MEMBERSHIP = 0xFFFF; + /* Flags */ const int PJ_MSG_OOB = 0; const int PJ_MSG_PEEK = KSockReadPeek; -- cgit v1.2.3