Blame SOURCES/0065-curl-7.29.0-tftp-speed-limit.patch

9d7d3f
From 71e1317a4b44d9d81ec99c46038ada32c0e51bc9 Mon Sep 17 00:00:00 2001
9d7d3f
From: Daniel Stenberg <daniel@haxx.se>
9d7d3f
Date: Thu, 22 Aug 2013 19:23:08 +0200
9d7d3f
Subject: [PATCH 1/2] tftpd: support "writedelay" within <servercmd>
9d7d3f
9d7d3f
Upstream-commit: 06d1b10cbefaa7c54c73e09df746ae79b7f14e14
9d7d3f
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
9d7d3f
---
9d7d3f
 tests/FILEFORMAT     |  4 +++
9d7d3f
 tests/server/tftpd.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++--
9d7d3f
 2 files changed, 84 insertions(+), 3 deletions(-)
9d7d3f
9d7d3f
diff --git a/tests/FILEFORMAT b/tests/FILEFORMAT
9d7d3f
index 702368f..4759668 100644
9d7d3f
--- a/tests/FILEFORMAT
9d7d3f
+++ b/tests/FILEFORMAT
9d7d3f
@@ -137,6 +137,10 @@ rtp: part [num] channel [num] size [num]
9d7d3f
 connection-monitor When used, this will log [DISCONNECT] to the server.input
9d7d3f
                log when the connection is disconnected.
9d7d3f
 
9d7d3f
+
9d7d3f
+For TFTP:
9d7d3f
+writedelay: [secs] delay this amount between reply packets (each packet being
9d7d3f
+                   512 bytes payload)
9d7d3f
 </servercmd>
9d7d3f
 </reply>
9d7d3f
 
9d7d3f
diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c
9d7d3f
index 48950c5..e2ec628 100644
9d7d3f
--- a/tests/server/tftpd.c
9d7d3f
+++ b/tests/server/tftpd.c
9d7d3f
@@ -107,8 +107,10 @@ struct testcase {
9d7d3f
   size_t bufsize; /* size of the data in buffer */
9d7d3f
   char *rptr;     /* read pointer into the buffer */
9d7d3f
   size_t rcount;  /* amount of data left to read of the file */
9d7d3f
-  long num;       /* test case number */
9d7d3f
+  long testno;    /* test case number */
9d7d3f
   int ofile;      /* file descriptor for output file when uploading to us */
9d7d3f
+
9d7d3f
+  int writedelay; /* number of seconds between each packet */
9d7d3f
 };
9d7d3f
 
9d7d3f
 struct formats {
9d7d3f
@@ -579,7 +581,7 @@ static ssize_t write_behind(struct testcase *test, int convert)
9d7d3f
 
9d7d3f
   if(!test->ofile) {
9d7d3f
     char outfile[256];
9d7d3f
-    snprintf(outfile, sizeof(outfile), "log/upload.%ld", test->num);
9d7d3f
+    snprintf(outfile, sizeof(outfile), "log/upload.%ld", test->testno);
9d7d3f
     test->ofile=open(outfile, O_CREAT|O_RDWR, 0777);
9d7d3f
     if(test->ofile == -1) {
9d7d3f
       logmsg("Couldn't create and/or open file %s for upload!", outfile);
9d7d3f
@@ -1026,6 +1028,73 @@ again:
9d7d3f
   return 0;
9d7d3f
 }
9d7d3f
 
9d7d3f
+/* Based on the testno, parse the correct server commands. */
9d7d3f
+static int parse_servercmd(struct testcase *req)
9d7d3f
+{
9d7d3f
+  FILE *stream;
9d7d3f
+  char *filename;
9d7d3f
+  int error;
9d7d3f
+
9d7d3f
+  filename = test2file(req->testno);
9d7d3f
+
9d7d3f
+  stream=fopen(filename, "rb");
9d7d3f
+  if(!stream) {
9d7d3f
+    error = errno;
9d7d3f
+    logmsg("fopen() failed with error: %d %s", error, strerror(error));
9d7d3f
+    logmsg("  [1] Error opening file: %s", filename);
9d7d3f
+    logmsg("  Couldn't open test file %ld", req->testno);
9d7d3f
+    return 1; /* done */
9d7d3f
+  }
9d7d3f
+  else {
9d7d3f
+    char *orgcmd = NULL;
9d7d3f
+    char *cmd = NULL;
9d7d3f
+    size_t cmdsize = 0;
9d7d3f
+    int num=0;
9d7d3f
+
9d7d3f
+    /* get the custom server control "commands" */
9d7d3f
+    error = getpart(&orgcmd, &cmdsize, "reply", "servercmd", stream);
9d7d3f
+    fclose(stream);
9d7d3f
+    if(error) {
9d7d3f
+      logmsg("getpart() failed with error: %d", error);
9d7d3f
+      return 1; /* done */
9d7d3f
+    }
9d7d3f
+
9d7d3f
+    cmd = orgcmd;
9d7d3f
+    while(cmd && cmdsize) {
9d7d3f
+      char *check;
9d7d3f
+      if(1 == sscanf(cmd, "writedelay: %d", &num)) {
9d7d3f
+        logmsg("instructed to delay %d secs between packets", num);
9d7d3f
+        req->writedelay = num;
9d7d3f
+      }
9d7d3f
+      else {
9d7d3f
+        logmsg("Unknown <servercmd> instruction found: %s", cmd);
9d7d3f
+      }
9d7d3f
+      /* try to deal with CRLF or just LF */
9d7d3f
+      check = strchr(cmd, '\r');
9d7d3f
+      if(!check)
9d7d3f
+        check = strchr(cmd, '\n');
9d7d3f
+
9d7d3f
+      if(check) {
9d7d3f
+        /* get to the letter following the newline */
9d7d3f
+        while((*check == '\r') || (*check == '\n'))
9d7d3f
+          check++;
9d7d3f
+
9d7d3f
+        if(!*check)
9d7d3f
+          /* if we reached a zero, get out */
9d7d3f
+          break;
9d7d3f
+        cmd = check;
9d7d3f
+      }
9d7d3f
+      else
9d7d3f
+        break;
9d7d3f
+    }
9d7d3f
+    if(orgcmd)
9d7d3f
+      free(orgcmd);
9d7d3f
+  }
9d7d3f
+
9d7d3f
+  return 0; /* OK! */
9d7d3f
+}
9d7d3f
+
9d7d3f
+
9d7d3f
 /*
9d7d3f
  * Validate file access.
9d7d3f
  */
9d7d3f
@@ -1076,7 +1145,9 @@ static int validate_access(struct testcase *test,
9d7d3f
 
9d7d3f
     logmsg("requested test number %ld part %ld", testno, partno);
9d7d3f
 
9d7d3f
-    test->num = testno;
9d7d3f
+    test->testno = testno;
9d7d3f
+
9d7d3f
+    (void)parse_servercmd(test);
9d7d3f
 
9d7d3f
     file = test2file(testno);
9d7d3f
 
9d7d3f
@@ -1147,6 +1218,12 @@ static void sendtftp(struct testcase *test, struct formats *pf)
9d7d3f
 #ifdef HAVE_SIGSETJMP
9d7d3f
     (void) sigsetjmp(timeoutbuf, 1);
9d7d3f
 #endif
9d7d3f
+    if(test->writedelay) {
9d7d3f
+      logmsg("Pausing %d seconds before %d bytes", test->writedelay,
9d7d3f
+             size);
9d7d3f
+      wait_ms(1000*test->writedelay);
9d7d3f
+    }
9d7d3f
+
9d7d3f
     send_data:
9d7d3f
     if (swrite(peer, sdp, size + 4) != size + 4) {
9d7d3f
       logmsg("write");
9d7d3f
-- 
9d7d3f
2.14.4
9d7d3f
9d7d3f
9d7d3f
From fd692a86883109c1ab5b57b9b9ab19ae0ab15a1f Mon Sep 17 00:00:00 2001
9d7d3f
From: Daniel Stenberg <daniel@haxx.se>
9d7d3f
Date: Thu, 22 Aug 2013 22:40:38 +0200
9d7d3f
Subject: [PATCH 2/2] TFTP: make the CURLOPT_LOW_SPEED* options work
9d7d3f
9d7d3f
... this also makes sure that the progess callback gets called more
9d7d3f
often during TFTP transfers.
9d7d3f
9d7d3f
Added test 1238 to verify.
9d7d3f
9d7d3f
Bug: http://curl.haxx.se/bug/view.cgi?id=1269
9d7d3f
Reported-by: Jo3
9d7d3f
9d7d3f
Upstream-commit: 4bea91fc677359f3dcedb05a431258b6cd5d98f3
9d7d3f
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
9d7d3f
---
9d7d3f
 lib/tftp.c             | 10 ++++++++++
9d7d3f
 tests/data/Makefile.am |  2 +-
9d7d3f
 tests/data/test1238    | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
9d7d3f
 3 files changed, 60 insertions(+), 1 deletion(-)
9d7d3f
 create mode 100644 tests/data/test1238
9d7d3f
9d7d3f
diff --git a/lib/tftp.c b/lib/tftp.c
9d7d3f
index ef740b8..79b4f41 100644
9d7d3f
--- a/lib/tftp.c
9d7d3f
+++ b/lib/tftp.c
9d7d3f
@@ -56,6 +56,7 @@
9d7d3f
 #include "multiif.h"
9d7d3f
 #include "url.h"
9d7d3f
 #include "rawstr.h"
9d7d3f
+#include "speedcheck.h"
9d7d3f
 
9d7d3f
 #define _MPRINTF_REPLACE /* use our functions only */
9d7d3f
 #include <curl/mprintf.h>
9d7d3f
@@ -1259,6 +1260,15 @@ static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done)
9d7d3f
   if(*dophase_done) {
9d7d3f
     DEBUGF(infof(conn->data, "DO phase is complete\n"));
9d7d3f
   }
9d7d3f
+  else {
9d7d3f
+    /* The multi code doesn't have this logic for the DOING state so we
9d7d3f
+       provide it for TFTP since it may do the entire transfer in this
9d7d3f
+       state. */
9d7d3f
+    if(Curl_pgrsUpdate(conn))
9d7d3f
+      result = CURLE_ABORTED_BY_CALLBACK;
9d7d3f
+    else
9d7d3f
+      result = Curl_speedcheck(conn->data, Curl_tvnow());
9d7d3f
+  }
9d7d3f
   return result;
9d7d3f
 }
9d7d3f
 
9d7d3f
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
9d7d3f
index 677564b..9d9b9ea 100644
9d7d3f
--- a/tests/data/Makefile.am
9d7d3f
+++ b/tests/data/Makefile.am
9d7d3f
@@ -81,7 +81,7 @@ test1118 test1119 test1120 test1121 test1122 test1123 test1124 test1125	\
9d7d3f
 test1126 test1127 test1128 test1129 test1130 test1131 test1132 test1133 \
9d7d3f
 test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
9d7d3f
 test1208 test1209 test1210 test1211 test1213 test1214 test1216 test1218 \
9d7d3f
-test1220 test1221 test1222 test1223 test1233 test1236 \
9d7d3f
+test1220 test1221 test1222 test1223 test1233 test1236 test1238 \
9d7d3f
 test1300 test1301 test1302 test1303 test1304 test1305	\
9d7d3f
 test1306 test1307 test1308 test1309 test1310 test1311 test1312 test1313 \
9d7d3f
 test1314 test1315 test1316 test1317 test1318 test1319 test1320 test1321 \
9d7d3f
diff --git a/tests/data/test1238 b/tests/data/test1238
9d7d3f
new file mode 100644
9d7d3f
index 0000000..1859339
9d7d3f
--- /dev/null
9d7d3f
+++ b/tests/data/test1238
9d7d3f
@@ -0,0 +1,49 @@
9d7d3f
+<testcase>
9d7d3f
+<info>
9d7d3f
+<keywords>
9d7d3f
+TFTP
9d7d3f
+TFTP RRQ
9d7d3f
+</keywords>
9d7d3f
+</info>
9d7d3f
+
9d7d3f
+#
9d7d3f
+# Server-side
9d7d3f
+<reply>
9d7d3f
+<servercmd>
9d7d3f
+writedelay: 2
9d7d3f
+</servercmd>
9d7d3f
+# ~1200 bytes (so that they don't fit in two 512 byte chunks)
9d7d3f
+<data nocheck="yes">
9d7d3f
+012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
9d7d3f
+</data>
9d7d3f
+</reply>
9d7d3f
+
9d7d3f
+#
9d7d3f
+# Client-side
9d7d3f
+<client>
9d7d3f
+<server>
9d7d3f
+tftp
9d7d3f
+</server>
9d7d3f
+ <name>
9d7d3f
+slow TFTP retrieve cancel due to -Y and -y
9d7d3f
+ </name>
9d7d3f
+# if less than 1000 bytes/sec within 2 seconds, abort!
9d7d3f
+ <command>
9d7d3f
+tftp://%HOSTIP:%TFTPPORT//1238 -Y1000 -y2
9d7d3f
+</command>
9d7d3f
+</client>
9d7d3f
+
9d7d3f
+#
9d7d3f
+# Verify pseudo protocol after the test has been "shot"
9d7d3f
+<verify>
9d7d3f
+<protocol>
9d7d3f
+opcode: 1
9d7d3f
+filename: /1238
9d7d3f
+mode: octet
9d7d3f
+</protocol>
9d7d3f
+# 28 = CURLE_OPERATION_TIMEDOUT
9d7d3f
+<errorcode>
9d7d3f
+28
9d7d3f
+</errorcode>
9d7d3f
+</verify>
9d7d3f
+</testcase>
9d7d3f
-- 
9d7d3f
2.14.4
9d7d3f