[netperf-dev] netperf2 commit notice r344 - trunk/src
raj at netperf.org
raj at netperf.org
Mon Mar 15 14:21:46 PDT 2010
Author: raj
Date: 2010-03-15 14:21:46 -0700 (Mon, 15 Mar 2010)
New Revision: 344
Modified:
trunk/src/nettest_bsd.c
trunk/src/nettest_bsd.h
trunk/src/nettest_omni.c
Log:
might this enable IPv4 multicast
Modified: trunk/src/nettest_bsd.c
===================================================================
--- trunk/src/nettest_bsd.c 2010-02-09 20:48:50 UTC (rev 343)
+++ trunk/src/nettest_bsd.c 2010-03-15 21:21:46 UTC (rev 344)
@@ -219,6 +219,8 @@
remote_connected = 0, /* remote socket type, connected/non-connected */
routing_allowed = 1; /* set/clear SO_DONTROUTE on data socket */
+int multicast_ttl = -1; /* should we set the multicast TTL to a value? */
+
#ifdef WANT_HISTOGRAM
#ifdef HAVE_GETHRTIME
static hrtime_t time_one;
Modified: trunk/src/nettest_bsd.h
===================================================================
--- trunk/src/nettest_bsd.h 2010-02-09 20:48:50 UTC (rev 343)
+++ trunk/src/nettest_bsd.h 2010-03-15 21:21:46 UTC (rev 344)
@@ -558,7 +558,8 @@
loc_rcvavoid, /* avoid recv copies locally */
rem_sndavoid, /* avoid send copies remotely */
rem_rcvavoid, /* avoid recv_copies remotely */
- routing_allowed; /* do we set/clear SO_DONTROUTE on data sock */
+ routing_allowed, /* do we set/clear SO_DONTROUTE on data sock */
+ multicast_ttl; /* what should the TTL be on mcast dgrams */
#ifdef WANT_OMNI
extern void scan_omni_args(int argc, char *argv[]);
Modified: trunk/src/nettest_omni.c
===================================================================
--- trunk/src/nettest_omni.c 2010-02-09 20:48:50 UTC (rev 343)
+++ trunk/src/nettest_omni.c 2010-03-15 21:21:46 UTC (rev 344)
@@ -715,7 +715,81 @@
}
}
+/* we presume we are only called with something which is actually a
+ multicast address. raj 20100315 */
static void
+join_multicast_addr(SOCKET sock, struct addrinfo *res) {
+ switch(res->ai_family) {
+ case AF_INET: {
+ struct ip_mreq mreq;
+ struct in_addr bar = ((struct sockaddr_in *)res->ai_addr)->sin_addr;
+ int optlen = sizeof(int);
+ int one = 1;
+
+ mreq.imr_multiaddr.s_addr=bar.s_addr;
+ mreq.imr_interface.s_addr=htonl(INADDR_ANY);
+ if (setsockopt(sock,
+ IPPROTO_IP,
+ IP_ADD_MEMBERSHIP,
+ &mreq,sizeof(mreq)) == 0) {
+
+ /* let others do the same */
+ if (setsockopt(sock,
+ SOL_SOCKET,
+ SO_REUSEADDR,
+ &one,
+ sizeof(one)) < 0) {
+ if (debug) {
+ fprintf(where,
+ "join_multicast_addr SO_REUSADDR failed errno %d\n",
+ errno);
+ fflush(where);
+ }
+ }
+
+ /* now set/get the TTL */
+ if (multicast_ttl >= 0) {
+ if (setsockopt(sock,
+ IPPROTO_IP,
+ IP_TTL,
+ &multicast_ttl,
+ sizeof(multicast_ttl)) < 0) {
+ fprintf(where,
+ "setsockopt(IP_TTL) failed errno %d\n",
+ errno);
+ }
+ }
+ if (getsockopt(sock,
+ IPPROTO_IP,
+ IP_TTL,
+ &multicast_ttl,
+ &optlen) < 0) {
+ fprintf(where,
+ "getsockopt(IP_TTL) failed errno %d\n",
+ errno);
+ multicast_ttl = -2;
+ }
+ }
+ else {
+ if (debug) {
+ fprintf(where,
+ "setsockopt(IP_ADD_MEMBERSHIP) failed errno %d\n",
+ errno);
+ fflush(where);
+ }
+ }
+ break;
+ }
+ case AF_INET6: {
+ fprintf(where,"I do not know how to join an IPv6 multicast group\n");
+ break;
+ }
+
+ }
+ return;
+}
+
+static void
extract_inet_address_and_port(struct addrinfo *res, void *addr, int len, int *port)
{
switch(res->ai_family) {
@@ -4209,37 +4283,45 @@
}
}
- if ((direction & NETPERF_RECV) && (NULL == recv_ring)) {
- if (rsp_size > 0) {
- if (recv_width == 0) recv_width = 1;
- bytes_to_recv = rsp_size;
+ if (direction & NETPERF_RECV) {
+ /* do we need to join a multicast group? */
+ if (is_multicast_addr(local_res)) {
+ join_multicast_addr(data_socket, local_res);
}
- else {
- /* stream test */
- if (recv_size == 0) {
- if (lsr_size > 0) {
- recv_size = lsr_size;
+
+ /* do we need to allocate a recv_ring? */
+ if (NULL == recv_ring) {
+ if (rsp_size > 0) {
+ if (recv_width == 0) recv_width = 1;
+ bytes_to_recv = rsp_size;
+ }
+ else {
+ /* stream test */
+ if (recv_size == 0) {
+ if (lsr_size > 0) {
+ recv_size = lsr_size;
+ }
+ else {
+ recv_size = 4096;
+ }
}
- else {
- recv_size = 4096;
+ if (recv_width == 0) {
+ recv_width = (lsr_size/recv_size) + 1;
+ if (recv_width == 1) recv_width++;
}
+ bytes_to_recv = recv_size;
}
- if (recv_width == 0) {
- recv_width = (lsr_size/recv_size) + 1;
- if (recv_width == 1) recv_width++;
+
+ recv_ring = allocate_buffer_ring(recv_width,
+ bytes_to_recv,
+ local_recv_align,
+ local_recv_offset);
+ if (debug) {
+ fprintf(where,
+ "send_omni: %d entry recv_ring obtained...\n",
+ recv_width);
}
- bytes_to_recv = recv_size;
}
-
- recv_ring = allocate_buffer_ring(recv_width,
- bytes_to_recv,
- local_recv_align,
- local_recv_offset);
- if (debug) {
- fprintf(where,
- "send_omni: %d entry recv_ring obtained...\n",
- recv_width);
- }
}
if (!no_control) { /* foo */
@@ -5326,6 +5408,12 @@
omni_response->receive_size = omni_request->receive_size;
omni_response->recv_width = omni_response->recv_width;
if (omni_request->direction & NETPERF_RECV) {
+
+ /* do we need to join a multicast group? */
+ if (is_multicast_addr(local_res)) {
+ join_multicast_addr(data_socket, local_res);
+ }
+
if (omni_request->request_size > 0) {
/* request/response test */
bytes_to_recv = omni_request->request_size;
@@ -5844,7 +5932,7 @@
{
-#define OMNI_ARGS "b:cCd:DnNhH:kL:m:M:oOp:P:r:R:s:S:t:T:u:Vw:W:46"
+#define OMNI_ARGS "b:cCd:DnNhH:kl:L:m:M:oOp:P:r:R:s:S:t:T:u:Vw:W:46"
extern char *optarg; /* pointer to option string */
@@ -5982,6 +6070,9 @@
}
}
break;
+ case 'l':
+ multicast_ttl = atoi(optarg);
+ break;
case 'L':
break_args_explicit(optarg,arg1,arg2);
if (arg1[0]) {
More information about the netperf-dev
mailing list