[Sumover-dev] [svn commit] r4484 - vic/branches/cc/net
sumover-dev at cs.ucl.ac.uk
sumover-dev at cs.ucl.ac.uk
Wed Jul 22 15:12:53 BST 2009
Author: soohyunc
Date: Wed Jul 22 15:12:51 2009
New Revision: 4484
Modified:
vic/branches/cc/net/net-ip.cpp
vic/branches/cc/net/net.h
Log:
This work was done by Piers O'Hanlon.
Basically, what it does is Vic can set ToS field in IP header
to be used for ECN marking.
Modified: vic/branches/cc/net/net-ip.cpp
==============================================================================
--- vic/branches/cc/net/net-ip.cpp (original)
+++ vic/branches/cc/net/net-ip.cpp Wed Jul 22 15:12:51 2009
@@ -111,7 +111,7 @@
}
return (result);
}
- uint8_t recv_tos() { return recv_tos_;}
+ u_int8_t recv_tos() { return recv_tos_;}
protected:
struct sockaddr_in sin;
virtual int dorecv(u_char* buf, int len, Address &from, int fd);
@@ -122,7 +122,7 @@
int openrsock(Address & g_addr, Address & s_addr_ssm, u_short port, Address & local);
void dosend(u_char* buf, int len, int fd);
time_t last_reset_;
- uint8_t recv_tos_;
+ u_int8_t recv_tos_;
};
static class IPNetworkMatcher : public Matcher {
@@ -258,16 +258,9 @@
(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);
@@ -364,6 +357,12 @@
* 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;
@@ -472,7 +471,6 @@
sizeof(bufsize)) < 0)
perror("SO_RCVBUF");
}
-
return (fd);
}
@@ -518,8 +516,9 @@
}
}
- int c=1;
- printf("set TOS:%d\n",setsockopt(fd, IPPROTO_IP, IP_TOS, (char*)&c, sizeof(c)));
+ int c = 1;
+ debug_msg("set TOS:%d\n",
+ setsockopt(fd, IPPROTO_IP, IP_TOS, (char*)&c, sizeof(c)));
memset((char *)&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
@@ -604,15 +603,15 @@
#else
int fromlen = sizeof(sfrom);
#endif
+ int c=255; UNUSED(c);
int cc;
-#ifdef IP_RECVTOS
struct iovec iov[2];
unsigned char cbuf[128];
- struct cmsghdr *cm;
+ struct cmsghdr *cm; UNUSED(cm);
struct msghdr m;
- int found=0;
- u_char data[2048];
+ int found;
+ //u_char data[2048];
(void)memset(&m, 0, sizeof(m));
(void)memset(&iov, 0, sizeof(iov));
@@ -620,45 +619,41 @@
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_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);
- 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;
+ found = 0;
+/* if (cc = recvmsg(fd, &m, 0) == -1)
+ debug_msg("recvmsg problem\n");
+ 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("recvmsg TOS: %d\n",
+ (void)printf("recvopts limit: %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");
+*/
-#else
- cc = ::recvfrom(fd, (char*)buf, len, 0,
- (sockaddr*)&sfrom, &fromlen);
+ 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_)
Modified: vic/branches/cc/net/net.h
==============================================================================
--- vic/branches/cc/net/net.h (original)
+++ vic/branches/cc/net/net.h Wed Jul 22 15:12:51 2009
@@ -90,6 +90,7 @@
inline const Address & interface() const { return (local_); }
inline int port() const { return (port_); }
inline int ttl() const { return (ttl_); }
+ inline u_int8_t recv_tos() const { return (recv_tos_); }
inline int noloopback_broken() const { return (noloopback_broken_); }
virtual void reset();
static void nonblock(int fd);
@@ -110,6 +111,7 @@
int rsock_;
int ssock_;
+ u_int8_t recv_tos_;
int noloopback_broken_;
Crypt* crypt_;
More information about the Sumover-dev
mailing list