PERFORCE change 167409 for review
Fang Wang
fangwang at FreeBSD.org
Sun Aug 16 17:44:30 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167409
Change 167409 by fangwang at fangwang_utobsd on 2009/08/16 17:44:10
Fix style, copyright, add some comments.
Affected files ...
.. //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_input.c#8 edit
.. //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_output.c#10 edit
.. //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_subr.c#6 edit
.. //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_timer.c#9 edit
.. //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_usrreq.c#10 edit
.. //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_var.h#15 edit
.. //depot/projects/soc2009/tcputo/src/tools/regression/netinet/tcputo/README#3 edit
.. //depot/projects/soc2009/tcputo/src/tools/regression/netinet/tcputo/tcputo.c#8 edit
Differences ...
==== //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_input.c#8 (text+ko) ====
@@ -1188,12 +1188,12 @@
/*
* If TCP user timeout option is received, because it's an
- * optional option, we do nothing at this moment. We will
- * process when we need to use it. And we need it in two
+ * optional option, we do nothing at this moment. We will
+ * process when we need to use it. And we need it in two
* cases:
* 1. We need do retransmission.
* 2. Users request a UTO value.
- */
+ */
if (to.to_flags & TOF_UTO) {
tp->uto_flags |= TCPUTO_RCVD;
tp->rcv_uto = to.to_uto;
@@ -2251,10 +2251,10 @@
process_ACK:
/*
- * If we are sending the UTO option, and we receive a ACK acknowledge the
- * segment carrying the UTO option, the UTO was send successfully. So we
- * stop sending the UTO option.
- */
+ * If we are sending the UTO option, and we receive a ACK
+ * acknowledge the segment carrying the UTO option, the UTO
+ * was send successfully. So we stop sending the UTO option.
+ */
if (tp->uto_flags & TCPUTO_SENDING)
if (SEQ_GEQ(th->th_ack, tp->uto_carrier))
tp->uto_flags &= ~TCPUTO_SENDING;
@@ -2971,7 +2971,7 @@
continue;
to->to_flags |= TOF_UTO;
bcopy((char *)cp + 2,
- (char *)&to->to_uto, sizeof(to->to_uto));
+ (char *)&to->to_uto, sizeof(to->to_uto));
to->to_uto = ntohs(to->to_uto);
break;
default:
==== //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_output.c#10 (text+ko) ====
@@ -711,13 +711,16 @@
hdrlen += optlen = tcp_addoptions(&to, opt);
/*
- * According to RFC 5482:
- * "In addition to exchanging UTO options in the SYN segments, a
- * connection that has enabled UTO options SHOULD include a UTO option
- * in the first packet that does not have the SYN flag set. This helps to minimize
- * the amount of state information TCP must keep for connections in non-synchronized states."
- * So even though UTO options is put in SYN segment successfully, we still transmit it.
- */
+ * According to RFC 5482:
+ * "In addition to exchanging UTO options in the SYN segments,
+ * a connection that has enabled UTO options SHOULD include a
+ * UTO option in the first packet that does not have the SYN
+ * flag set. This helps to minimize the amount of state
+ * information TCP must keep for connections in
+ * non-synchronized states."
+ * So even though UTO option is put in SYN segment successfully,
+ * we still transmit it.
+ */
if (tp->uto_flags & (TCPUTO_NEED | TCPUTO_SENDING) &&
(to.to_flags & TOF_UTO) == 0) {
if ((flags & TH_SYN) == 0) {
@@ -1478,7 +1481,7 @@
case TOF_UTO:
{
if (TCP_MAXOLEN - optlen < TCPOLEN_UTO)
- continue;
+ continue;
*optp++ = TCPOPT_UTO;
*optp++ = TCPOLEN_UTO;
optlen += TCPOLEN_UTO;
==== //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_subr.c#6 (text+ko) ====
@@ -745,9 +745,10 @@
if (tcp_uto_enable)
tp->uto_flags |= TCPUTO_ENABLE;
/*
- * According to RFC 5482, t_uto_adv is UTO option advertised to the remote TCP peer.
- * It defaults to the default system-wide USER TIMEOUT.
- */
+ * According to RFC 5482, t_uto_adv is UTO option advertised to the
+ * remote TCP peer. It defaults to the default system-wide USER
+ * TIMEOUT.
+ */
tp->t_uto_adv = TCPTV_UTO_DEFAULT;
/*
* IPv4 TTL initialization is necessary for an IPv6 socket as well,
==== //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_timer.c#9 (text+ko) ====
@@ -114,9 +114,11 @@
int tcp_uto_min;
SYSCTL_PROC(_net_inet_tcp, OID_AUTO, uto_min, CTLTYPE_INT|CTLFLAG_RW,
&tcp_uto_min, 0, sysctl_msec_to_ticks, "I", "Minimun user timeout");
+
int tcp_uto_max;
SYSCTL_PROC(_net_inet_tcp, OID_AUTO, uto_max, CTLTYPE_INT|CTLFLAG_RW,
&tcp_uto_max, 0, sysctl_msec_to_ticks, "I", "Maximum user timeout");
+
int tcp_uto_enable = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, always_enableuto, CTLFLAG_RW,
&tcp_uto_enable , 0, "Enable TCP user timeout option on all TCP connections");
@@ -501,12 +503,13 @@
* been acked within retransmit interval. Back off
* to a longer retransmit interval and retransmit one segment.
*/
- if ((++tp->t_rxtshift > TCP_MAXRXTSHIFT && (tp->uto_flags & TCPUTO_IMPL) == 0) ||
+ if ((++tp->t_rxtshift > TCP_MAXRXTSHIFT &&
+ (tp->uto_flags & TCPUTO_IMPL) == 0) ||
(tp->t_uto_left == 0 && tp->uto_flags & TCPUTO_IMPL)) {
tp->t_rxtshift = TCP_MAXRXTSHIFT;
TCPSTAT_INC(tcps_timeoutdrop);
tp = tcp_drop(tp, tp->t_softerror ?
- tp->t_softerror : ETIMEDOUT);
+ tp->t_softerror : ETIMEDOUT);
goto out;
}
INP_INFO_WUNLOCK(&V_tcbinfo);
@@ -537,19 +540,20 @@
if ((tp->uto_flags & TCPUTO_IMPL) == 0) {
rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift];
TCPT_RANGESET(tp->t_rxtcur, rexmt,
- tp->t_rttmin, TCPTV_REXMTMAX);
+ tp->t_rttmin, TCPTV_REXMTMAX);
} else {
int rxtshift, interval;
rxtshift = min(TCP_MAXRXTSHIFT, tp->t_rxtshift);
interval = min(TCP_REXMTMAX, tcp_backoff[rxtshift]);
rexmt = TCP_REXMTVAL(tp) * tcp_backoff[rxtshift];
TCPT_RANGESET(tp->t_rxtcur, rexmt,
- tp->t_rttmin, TCPTV_REXMTMAX);
+ tp->t_rttmin, TCPTV_REXMTMAX);
if (tp->t_uto_left < interval) {
- tp->t_rxtcur = (tp->t_rxtcur * tp->t_uto_left) / interval;
+ tp->t_rxtcur = (tp->t_rxtcur * tp->t_uto_left)
+ / interval;
/* Prevent t_rxtcur to be zero */
TCPT_RANGESET(tp->t_rxtcur, tp->t_rxtcur,
- tp->t_rttmin, TCPTV_REXMTMAX);
+ tp->t_rttmin, TCPTV_REXMTMAX);
}
tp->t_uto_left -= min(tp->t_uto_left, interval);
}
==== //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_usrreq.c#10 (text+ko) ====
@@ -1379,7 +1379,8 @@
return (error);
INP_WLOCK_RECHECK(inp);
- if (tu.flags & ~(ENABLE_UTO | STORE_UTO | ENABLE_CHANGE)) {
+ if (tu.flags & ~(ENABLE_UTO | STORE_UTO |
+ ENABLE_CHANGE)) {
error = EINVAL;
break;
}
@@ -1398,10 +1399,12 @@
}
if (tp->uto_flags & TCPUTO_ENABLE &&
tp->uto_flags & TCPUTO_NEED) {
- tp->t_uto_impl = min(tcp_uto_max,
- max(tu.uto * hz, tcp_uto_min));
+ tp->t_uto_impl = min(
+ tcp_uto_max, max(tu.uto*hz,
+ tcp_uto_min));
tp->t_uto_adv = tp->t_uto_impl;
- tp->uto_flags &= ~TCPUTO_CHANGEABLE;
+ tp->uto_flags &=
+ ~TCPUTO_CHANGEABLE;
tp->uto_flags |= TCPUTO_IMPL;
}
} else
==== //depot/projects/soc2009/tcputo/src/sys/netinet/tcp_var.h#15 (text+ko) ====
@@ -254,19 +254,20 @@
/*
* Resolve user timeout value(ticks).
*/
-#define TCPT_RESOLVE_UTO(tp) do { \
- if ((tp)->uto_flags & TCPUTO_ENABLE && \
- (tp)->uto_flags & TCPUTO_RCVD && \
- (tp)->uto_flags & TCPUTO_CHANGEABLE) { \
- (tp)->t_uto_impl = (tp)->rcv_uto >> 1; \
- if ((tp)->rcv_uto & 1) \
- (tp)->t_uto_impl *= 60; \
- (tp)->t_uto_impl *= hz; \
- (tp)->t_uto_impl = min(tcp_uto_max, \
- max((tp)->t_uto_adv, max((tp)->t_uto_impl, tcp_uto_min))); \
- (tp)->uto_flags &= ~TCPUTO_RCVD; \
- (tp)->uto_flags |= TCPUTO_IMPL; \
- } \
+#define TCPT_RESOLVE_UTO(tp) do { \
+ if ((tp)->uto_flags & TCPUTO_ENABLE && \
+ (tp)->uto_flags & TCPUTO_RCVD && \
+ (tp)->uto_flags & TCPUTO_CHANGEABLE) { \
+ (tp)->t_uto_impl = (tp)->rcv_uto >> 1; \
+ if ((tp)->rcv_uto & 1) \
+ (tp)->t_uto_impl *= 60; \
+ (tp)->t_uto_impl *= hz; \
+ (tp)->t_uto_impl = min(tcp_uto_max, \
+ max((tp)->t_uto_adv, \
+ max((tp)->t_uto_impl, tcp_uto_min))); \
+ (tp)->uto_flags &= ~TCPUTO_RCVD; \
+ (tp)->uto_flags |= TCPUTO_IMPL; \
+ } \
} while(0)
#ifdef TCP_SIGNATURE
==== //depot/projects/soc2009/tcputo/src/tools/regression/netinet/tcputo/README#3 (text+ko) ====
@@ -21,4 +21,4 @@
After that, interrupt the connection without detected by operating system, and
wait until process exits.
-$FreeBSD: src/tools/regression/netinet/tcputo/README,v 1.0 2008/08/15 20:26:52 fw Exp $
+$FreeBSD: src/tools/regression/netinet/tcputo/README,v 1.0 2009/08/17 00:56:31 fw Exp $
==== //depot/projects/soc2009/tcputo/src/tools/regression/netinet/tcputo/tcputo.c#8 (text+ko) ====
@@ -23,9 +23,16 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/tools/regression/netinet/tcputo/tcputo.c 2009/08/15 20:28:31 fw $
+ * $FreeBSD: src/tools/regression/netinet/tcputo/tcputo.c 2009/08/17 00:56:31 fw $
+ */
+
+/*
+ * TCP regression test for tcp user timeout; build a TCP connection, interrupt
+ * it without detected by operating system, and make sure the timeout time and
+ * retransmission times has been changed appropriately.
*/
+
#include <sys/types.h>
#include <sys/socket.h>
@@ -49,22 +56,22 @@
#include <pthread.h>
#define SIZE_ETHERNET sizeof(struct ether_header)
+#define MAX_RXT 200
struct tcprxt {
struct timeval ts;
- u_int th_off;
- tcp_seq th_seq;
- tcp_seq th_ack;
+ u_int th_off;
+ tcp_seq th_seq;
+ tcp_seq th_ack;
u_short th_win;
- u_char th_flags;
+ u_char th_flags;
};
-#define MAX_RXT 200
+static struct tcprxt rxts[MAX_RXT];
-struct tcprxt rxts[MAX_RXT];
-
-void
-parse_packet(u_char *args, const struct pcap_pkthdr *pkt_header, const u_char *packet)
+static void
+parse_packet(u_char *args, const struct pcap_pkthdr *pkt_header,
+ const u_char *packet)
{
const struct ip *ip;
const struct tcphdr *tcp;
@@ -108,10 +115,12 @@
uto >>= 1;
p = localtime(&pkt_header->ts.tv_sec);
printf("uto packet: ");
- printf("%02d:%02d:%02d.%-6u ", p->tm_hour, p->tm_min, p->tm_sec,
- pkt_header->ts.tv_usec);
- printf("%s.%d > ", inet_ntoa(ip->ip_src), htons(tcp->th_sport));
- printf("%s.%d, ", inet_ntoa(ip->ip_dst), htons(tcp->th_dport));
+ printf("%02d:%02d:%02d.%-6u ", p->tm_hour, p->tm_min,
+ p->tm_sec, pkt_header->ts.tv_usec);
+ printf("%s.%d > ", inet_ntoa(ip->ip_src),
+ htons(tcp->th_sport));
+ printf("%s.%d, ", inet_ntoa(ip->ip_dst),
+ htons(tcp->th_dport));
printf("flags [");
if (tcp->th_flags & TH_SYN)
printf("S");
@@ -124,7 +133,8 @@
if (tcp->th_flags & TH_URG)
printf("U");
printf("], ");
- printf("uto %u, win %u, length %u\n", uto, htons(tcp->th_win), length);
+ printf("uto %u, win %u, length %u\n", uto,
+ htons(tcp->th_win), length);
}
hlen -= optlen - 1;
tcpopt += optlen - 2;
@@ -137,12 +147,13 @@
rxt.th_ack = htonl(tcp->th_ack);
rxt.th_seq = htonl(tcp->th_seq);
rxt.th_flags = tcp->th_flags;
- memcpy(&rxts[0], &rxts[1], sizeof(struct tcprxt) * (MAX_RXT - 1));
+ memcpy(&rxts[0], &rxts[1],
+ sizeof(struct tcprxt) * (MAX_RXT - 1));
memcpy(&rxts[MAX_RXT - 1], &rxt, sizeof(rxt));
}
}
-void *
+static void *
dump_packet(void *arg)
{
pcap_t *handle;
@@ -160,10 +171,12 @@
int flag;
optlen = sizeof(srcaddr);
- if (getsockname(*((int *)arg), (struct sockaddr *)&srcaddr, &optlen) == -1)
+ if (getsockname(*((int *)arg), (struct sockaddr *)&srcaddr,
+ &optlen) == -1)
err(-1, "getsockname");
optlen = sizeof(dstaddr);
- if (getpeername(*((int *)arg), (struct sockaddr *)&dstaddr, &optlen) == -1)
+ if (getpeername(*((int *)arg), (struct sockaddr *)&dstaddr,
+ &optlen) == -1)
err(-1, "getsockname");
if (pcap_findalldevs(&alldevsp, errbuf) == -1) {
@@ -177,7 +190,8 @@
addrp = devp->addresses;
while (addrp != NULL && flag) {
devaddrp = (struct sockaddr_in *)addrp->addr;
- if (!memcmp(&devaddrp->sin_addr, &srcaddr.sin_addr, sizeof(srcaddr.sin_addr))) {
+ if (!memcmp(&devaddrp->sin_addr, &srcaddr.sin_addr,
+ sizeof(srcaddr.sin_addr))) {
flag = 0;
break;
}
@@ -194,48 +208,56 @@
}
if (pcap_lookupnet(devp->name, &net, &mask, errbuf) == -1) {
- fprintf(stderr, "Couldn't get netmask for device %s: %s\n", devp->name, errbuf);
+ fprintf(stderr, "Couldn't get netmask for device %s: %s\n",
+ devp->name, errbuf);
net = 0;
mask = 0;
}
handle = pcap_open_live(devp->name, BUFSIZ, 1, 1000, errbuf);
if (handle == NULL) {
- fprintf(stderr, "Couldn't open device %s: %s\n", devp->name, errbuf);
+ fprintf(stderr, "Couldn't open device %s: %s\n",
+ devp->name, errbuf);
exit(-1);
}
pcap_freealldevs(alldevsp);
snprintf(filter_exp, sizeof(filter_exp),
- "(tcp src port %d and dst port %d) or (tcp src port %d and dst port %d)",
- ntohs(srcaddr.sin_port), ntohs(dstaddr.sin_port),
- ntohs(dstaddr.sin_port), ntohs(srcaddr.sin_port));
+ "(tcp src port %d and dst port %d) or"
+ "(tcp src port %d and dst port %d)",
+ ntohs(srcaddr.sin_port), ntohs(dstaddr.sin_port),
+ ntohs(dstaddr.sin_port), ntohs(srcaddr.sin_port));
if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
- fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
+ fprintf(stderr, "Couldn't parse filter %s: %s\n",
+ filter_exp, pcap_geterr(handle));
exit(-1);
}
if (pcap_setfilter(handle, &fp) == -1) {
- fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
+ fprintf(stderr, "Couldn't install filter %s: %s\n",
+ filter_exp, pcap_geterr(handle));
exit(-1);
}
pcap_loop(handle, -1, parse_packet, NULL);
pcap_close(handle);
-
+
return NULL;
}
-void print_result()
+static void
+print_result()
{
tcp_seq rxt_seq;
int i, last, rxt_nr;
struct tm *p;
-
+
+ /* Get the retransmit sequence number */
rxt_seq = rxts[MAX_RXT - 2].th_seq;
for (last = -1, rxt_nr = 0, i = 0; i < MAX_RXT; i++) {
- if (rxts[i].th_seq && (rxts[i].th_seq == rxt_seq || rxts[i].th_flags & TH_RST)) {
+ if (rxts[i].th_seq &&
+ (rxts[i].th_seq == rxt_seq || rxts[i].th_flags & TH_RST)) {
if (rxts[i].th_flags & TH_RST)
printf("reset packet, ");
else if (rxt_nr)
@@ -243,16 +265,25 @@
else if (!rxt_nr)
printf("send packet, ");
p = localtime(&rxts[i].ts.tv_sec);
- printf("%02d:%02d:%02d.%-6u ", p->tm_hour, p->tm_min, p->tm_sec, rxts[i].ts.tv_usec);
+ printf("%02d:%02d:%02d.%-6u ", p->tm_hour, p->tm_min,
+ p->tm_sec, rxts[i].ts.tv_usec);
if (last != -1) {
+ /* print interval between two packets */
if (rxts[i].ts.tv_usec < rxts[last].ts.tv_usec)
- printf("(%2u.%-6u) ", rxts[i].ts.tv_sec - rxts[last].ts.tv_sec - 1,
- 1000000 + rxts[i].ts.tv_usec - rxts[last].ts.tv_usec);
+ printf("(%2u.%-6u) ",
+ rxts[i].ts.tv_sec -
+ rxts[last].ts.tv_sec - 1,
+ 1000000 + rxts[i].ts.tv_usec -
+ rxts[last].ts.tv_usec);
else
- printf("(%2u.%-6u) ", rxts[i].ts.tv_sec - rxts[last].ts.tv_sec,
- rxts[i].ts.tv_usec - rxts[last].ts.tv_usec);
+ printf("(%2u.%-6u) ",
+ rxts[i].ts.tv_sec -
+ rxts[last].ts.tv_sec,
+ rxts[i].ts.tv_usec -
+ rxts[last].ts.tv_usec);
}
- printf("seq %u, ack %u, ", rxts[i].th_seq, rxts[i].th_ack);
+ printf("seq %u, ack %u, ",
+ rxts[i].th_seq, rxts[i].th_ack);
printf("win %u\n", rxts[i].th_win);
last = i;
rxt_nr++;
@@ -260,11 +291,12 @@
}
}
-int
+static int
print_uto_status(int sock, int print)
{
static struct tcputo tu = {0, 0};
- int default_uto = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 64 + 64 + 64 + 64 + 64 + 64;
+ int default_uto = 1 + 2 + 4 + 8 + 16 + 32 + 64 +
+ 64 + 64 + 64 + 64 + 64 + 64;
int optlen;
int utoval;
@@ -274,26 +306,29 @@
if (tu.flags & ENABLE_UTO) {
printf("tcputo: enabled, ");
if (tu.flags & STORE_UTO) {
- printf("user timeout(changed): %d seconds\n", tu.uto);
+ printf("user timeout(changed): %d seconds\n",
+ tu.uto);
utoval = tu.uto;
} else {
- printf("user timeout(default): %d seconds\n", default_uto);
+ printf("user timeout(default): %d seconds\n",
+ default_uto);
utoval = default_uto;
}
} else {
- printf("tcputo: disabled, default timeout: %d seconds\n", default_uto);
+ printf("tcputo: disabled, default timeout: %d "
+ "seconds\n", default_uto);
utoval = default_uto;
}
}
- return utoval;
+ return (utoval);
}
static void
usage(void)
{
- fprintf(stderr, "tcpconnect server port [uto [timeout seconds]]\n");
- fprintf(stderr, "tcpconnect client ip port [uto [timeout seconds]]\n");
+ fprintf(stderr, "tcpconnect server port [uto [timeout]]\n");
+ fprintf(stderr, "tcpconnect client ip port [uto [timeout]]\n");
exit(-1);
}
@@ -346,7 +381,8 @@
if (listen_sock == -1)
err(-1, "socket");
optval = 1;
- if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1)
+ if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &optval,
+ sizeof(optval)) == -1)
err(-1, "setsockopt");
if (bind(listen_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
@@ -365,6 +401,10 @@
if (argc >= 2) {
memset(&uto, 0, sizeof(uto));
+ /*
+ * If TCP UTO is enabled but not set, make it changeable,
+ * otherwise, make it unchangeable.
+ */
if (!strcmp(argv[1], "uto")) {
uto.flags |= ENABLE_UTO;
uto.flags |= ENABLE_CHANGE;
@@ -377,21 +417,27 @@
uto.flags |= STORE_UTO;
uto.flags &= ~ENABLE_CHANGE;
}
- if (setsockopt(accept_sock, IPPROTO_TCP, TCP_UTO, &uto, sizeof(uto)) == -1)
+ if (setsockopt(accept_sock, IPPROTO_TCP, TCP_UTO, &uto,
+ sizeof(uto)) == -1)
err(-1, "setsockopt");
}
optval = 4*1024;
- if (setsockopt(accept_sock, SOL_SOCKET, SO_SNDBUF, &optval, sizeof(optval)) == -1)
+ if (setsockopt(accept_sock, SOL_SOCKET, SO_SNDBUF, &optval,
+ sizeof(optval)) == -1)
err(-1, "setsockopt");
while(1) {
sleep(1);
- while(recv(accept_sock, buf, 8*1024, MSG_DONTWAIT) > 0);
+ while (recv(accept_sock, buf, 8*1024, MSG_DONTWAIT) > 0);
(void)tcputo_timer();
+ /*
+ * Send more data than socket send buffer,
+ * so that data are not buffered.
+ */
if (send(accept_sock, buf, 8*1024, MSG_NOSIGNAL) >= 0) {
(void)tcputo_timer();
- print_uto_status(accept_sock, 0);
+ (void)print_uto_status(accept_sock, 0);
continue;
}
user_timeout = tcputo_timer();
@@ -400,7 +446,7 @@
}
/* wait for the reset packet to be captured */
sleep(1);
- pthread_kill(tid, SIGTERM);
+ (void)pthread_kill(tid, SIGTERM);
close(accept_sock);
}
@@ -436,11 +482,16 @@
err(-1, "socket");
optval = 4*1024;
- if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &optval, sizeof(optval)) == -1)
+ if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &optval,
+ sizeof(optval)) == -1)
err(-1, "setsockopt");
if (argc >= 3) {
memset(&uto, 0, sizeof(uto));
+ /*
+ * If TCP UTO is enabled but not set, make it changeable,
+ * otherwise, make it unchangeable.
+ */
if (!strcmp(argv[2], "uto")) {
uto.flags |= ENABLE_UTO;
uto.flags |= ENABLE_CHANGE;
@@ -453,7 +504,8 @@
uto.flags |= STORE_UTO;
uto.flags &= ~ENABLE_CHANGE;
}
- if (setsockopt(sock, IPPROTO_TCP, TCP_UTO, &uto, sizeof(uto)) == -1)
+ if (setsockopt(sock, IPPROTO_TCP, TCP_UTO, &uto,
+ sizeof(uto)) == -1)
err(-1, "setsockopt");
}
@@ -467,9 +519,13 @@
sleep(1);
while(recv(sock, buf, 8*1024, MSG_DONTWAIT) > 0);
(void)tcputo_timer();
+ /*
+ * Send more data than socket send buffer,
+ * so that data are not buffered.
+ */
if (send(sock, buf, 8*1024, MSG_NOSIGNAL) > 0) {
(void)tcputo_timer();
- print_uto_status(sock, 0);
+ (void)print_uto_status(sock, 0);
continue;
}
user_timeout = tcputo_timer();
@@ -478,7 +534,7 @@
}
/* wait for the reset packet to be captured */
sleep(1);
- pthread_kill(tid, SIGTERM);
+ (void)pthread_kill(tid, SIGTERM);
close(sock);
}
@@ -498,7 +554,7 @@
else
usage();
- print_uto_status(-1, 1);
+ (void)print_uto_status(-1, 1);
print_result();
exit(0);
More information about the p4-projects
mailing list