[Spread-cvs] commit: r514 - in libspreadutil/trunk: . include src
jonathan at spread.org
jonathan at spread.org
Wed May 2 16:48:25 EDT 2012
Author: jonathan
Date: 2012-05-02 16:48:25 -0400 (Wed, 02 May 2012)
New Revision: 514
Modified:
libspreadutil/trunk/Changelog
libspreadutil/trunk/include/spu_data_link.h
libspreadutil/trunk/src/data_link.c
Log:
Add new DL_BIND_ALL channel option to DL_init_channel to allow selection of multicast bind semantics in the new API
Modified: libspreadutil/trunk/Changelog
===================================================================
--- libspreadutil/trunk/Changelog 2012-05-02 18:32:53 UTC (rev 513)
+++ libspreadutil/trunk/Changelog 2012-05-02 20:48:25 UTC (rev 514)
@@ -1,3 +1,13 @@
+2012-05-02 Jonathan Stanton <jonathan at laptop5.int.spreadconcepts.com>
+
+ * src/data_link.c (DL_init_channel): The version of data_link.c's DL_init_channel function has
+ changed semantics from the version previously used by Spread. When you create a channel with a
+ multicast address, it will now only bind that socket to the multicast address not to INADDR_ANY.
+ This is needed for some uses of datalink (like in Spines) but is the wrong semantics if you want
+ one socket to receive both multicast and unicast traffic sent to the same port. So to support that
+ semantics a new channel_type modifier was added to the API DL_BIND_ALL which when passed in will force
+ the bind to be to INADDR_ANY unless a specific interface address was provided.
+
Tue Mar 20 17:57:44 2012 Jonathan Stanton <jonathan at spreadconcepts.com>
* configure.in: Make use of dladdr in the function name lookup code a compile time option so
Modified: libspreadutil/trunk/include/spu_data_link.h
===================================================================
--- libspreadutil/trunk/include/spu_data_link.h 2012-05-02 18:32:53 UTC (rev 513)
+++ libspreadutil/trunk/include/spu_data_link.h 2012-05-02 20:48:25 UTC (rev 514)
@@ -45,6 +45,7 @@
#define RECV_CHANNEL 0x00000002
#define NO_LOOP 0x00000004
#define REUSE_ADDR 0x00000008
+#define DL_BIND_ALL 0x00000010
#define IS_MCAST_ADDR(addr) ( ( (addr) & 0xF0000000 ) == 0xE0000000 )
#define IS_MCAST_ADDR_NET(addr) ( ( (unsigned char*) &(addr) )[0] == 0xE0 )
Modified: libspreadutil/trunk/src/data_link.c
===================================================================
--- libspreadutil/trunk/src/data_link.c 2012-05-02 18:32:53 UTC (rev 513)
+++ libspreadutil/trunk/src/data_link.c 2012-05-02 20:48:25 UTC (rev 514)
@@ -105,7 +105,7 @@
/* If mcast channel, the interface means the interface to
receive mcast packets on, and not interface to bind.
Must bind multicast address instead */
- if (mcast_address != 0)
+ if (mcast_address != 0 && IS_MCAST_ADDR(mcast_address) && !(channel_type & DL_BIND_ALL) )
soc_addr.sin_addr.s_addr= htonl(mcast_address);
else if (interface_address != 0)
soc_addr.sin_addr.s_addr= htonl(interface_address);
More information about the Spread-cvs
mailing list