[Sumover-dev] [svn commit] r4470 - vic/branches/cc/net

sumover-dev at cs.ucl.ac.uk sumover-dev at cs.ucl.ac.uk
Fri Jun 26 23:12:16 BST 2009


Author: piers
Date: Fri Jun 26 23:12:14 2009
New Revision: 4470

Modified:
   vic/branches/cc/net/net-ip.cpp

Log:
Fixed bug in code [mis]handling the recvmsg() return value. Also moved setsockopt() IP_RECVTOS to IPNetwork::open() function as recv sock can be set to send sock when binding to same send and recv port.


Modified: vic/branches/cc/net/net-ip.cpp
==============================================================================
--- vic/branches/cc/net/net-ip.cpp	(original)
+++ vic/branches/cc/net/net-ip.cpp	Fri Jun 26 23:12:14 2009
@@ -258,9 +258,16 @@
 	(IPAddress&)local_ = local.sin_addr;
 	rsock_ = openrsock(g_addr_, s_addr_ssm_, port, local_);
 	if (rsock_ < 0) {
+	  debug_msg("setting rsock_ = ssock_\n");
 		rsock_ = ssock_;
 	}
 
+#ifdef IP_RECVTOS
+     int optval = 1;
+     if (setsockopt(rsock_, IPPROTO_IP, IP_RECVTOS, &optval, sizeof(optval)) == -1)
+             debug_msg("ERROR setsockopt IP_RECVTOS\n");
+#endif
+
 	lport_ = local.sin_port;
 	last_reset_ = 0;
 	return (0);
@@ -357,12 +364,6 @@
       * Enable the TOS value from received packets to be
       * returned along with the payload.
       */
-#ifdef IP_RECVTOS
-     int optval = 1;
-     if (setsockopt(fd, IPPROTO_IP, IP_RECVTOS, &optval, sizeof(optval)) == -1)
-             debug_msg("ERROR setsockopt IP_RECVTOS\n");
-#endif
-
 
 	memset((char *)&sin, 0, sizeof(sin));
 	sin.sin_family = AF_INET;
@@ -471,6 +472,7 @@
 				sizeof(bufsize)) < 0)
 			perror("SO_RCVBUF");
 	}
+
 	return (fd);
 }
 
@@ -602,57 +604,61 @@
 #else
 	int fromlen = sizeof(sfrom);
 #endif
-    int c=255;
 	int cc;
 
-     struct iovec iov[2];
-     unsigned char cbuf[128];
-     struct cmsghdr *cm;
-     struct msghdr m;
-     int found;
-     u_char data[2048];
-
-     (void)memset(&m, 0, sizeof(m));
-     (void)memset(&iov, 0, sizeof(iov));
-
-     iov[0].iov_base = buf;         /* buffer for packet payload */
-     iov[0].iov_len = len;  /* expected packet length */
-
-     m.msg_name = (sockaddr*)&sfrom;             /* sockaddr_in of peer */
-     m.msg_namelen = sizeof(sfrom);
-     m.msg_iov = iov;
-     m.msg_iovlen = 1;
-     m.msg_control = (caddr_t)cbuf;   /* buffer for control messages */
-     m.msg_controllen = sizeof(cbuf);
-
-     found = 0;
-	 if (cc = recvmsg(fd, &m, 0) == -1)
-			 debug_msg("recvmsg problem\n");
-	 for (cm = CMSG_FIRSTHDR(&m); cm != NULL;
+#ifdef IP_RECVTOS
+	struct iovec iov[2];
+	unsigned char cbuf[128];
+	struct cmsghdr *cm;
+	struct msghdr m;
+	int found=0;
+	u_char data[2048];
+
+	(void)memset(&m, 0, sizeof(m));
+	(void)memset(&iov, 0, sizeof(iov));
+
+	iov[0].iov_base = buf;         /* buffer for packet payload */
+	iov[0].iov_len = len;  /* expected packet length */
+
+	m.msg_name = (sockaddr_in*)&sfrom;             /* sockaddr_in of peer */
+	m.msg_namelen = sizeof(sfrom);
+	m.msg_iov = iov;
+	m.msg_iovlen = 1;
+	m.msg_control = (caddr_t)cbuf;   /* buffer for control messages */
+	m.msg_controllen = sizeof(cbuf);
+
+	if ((cc = ::recvmsg(fd, &m, 0)) == -1) {
+		 debug_msg("recvmsg error\n");
+		 return (-1);
+	}
+	debug_msg("recvmsg len:%d\n",cc);
+	for (cm = CMSG_FIRSTHDR(&m); cm != NULL;
 		  cm = CMSG_NXTHDR(&m, cm)) {
 			 if (cm->cmsg_level == IPPROTO_IP &&
 				 cm->cmsg_type == IP_TOS &&
 				 //cm->cmsg_len == CMSG_LEN(sizeof(struct in_addr))) {
 				 cm->cmsg_len ) {
 					 found = 1;
-					 (void)printf("recvopts limit: %d\n",
+					 (void)printf("recvmsg TOS: %d\n",
 						 *(uint8_t *)CMSG_DATA(cm));
 					 recv_tos_ = *(uint8_t *)CMSG_DATA(cm);
 					 break;
 			 } else 
 				debug_msg("recvmsg problem: no IP_TOS (type:%d,len:%d)\n", cm->cmsg_type, cm->cmsg_len);
 
-	 }
-	 if (cm == NULL && !found);
+	}
+	if (cm == NULL && !found);
 			 //debug_msg("recvmsg problem: no cm\n");
 
-	//int cc = ::recvfrom(fd, (char*)buf, len, 0,
-	//		    (sockaddr*)&sfrom, &fromlen);
+#else
+	cc = ::recvfrom(fd, (char*)buf, len, 0,
+			    (sockaddr*)&sfrom, &fromlen);
 	if (cc < 0) {
 		if (errno != EWOULDBLOCK)
 			perror("recvfrom");
 		return (-1);
 	}
+#endif
 	(IPAddress&)from = sfrom.sin_addr;
 
 	if (noloopback_broken_ && from == local_ && sfrom.sin_port == lport_)



More information about the Sumover-dev mailing list