[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