aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChris Luke <chrisy@flirble.org>2017-10-26 10:44:43 -0400
committerDamjan Marion <dmarion.lists@gmail.com>2017-10-31 08:04:14 +0000
commite3c13e8b5b1e799e687fd93783407548e2b96594 (patch)
tree1c81fbbec197994f1d62a53cdf82f771a2a69a4d /src
parent088f042400fe104c86c86fb0de04aeb4b8013e74 (diff)
Fix for vppctl and interactive commands (VPP-1038)
- Interactive commands like "ping" read extra input from the input stream. - In the case of "ping" it is simply a signal to cease the current operation. - "vppctl", in non-interactive mode, will issue a "quit" immediately after the requested command to queue up closing of the session. - This resulted in "ping" thinking a keypress was seen and returning control to the CLI; the "quit" command however is consumed by the keypress event handler and thus the session does not close. - This patch reworks vppctl slightly to only issue "quit" after the command has completed. In particular it uses the fact that VPP issues NUL bytes as a surrogate prompt between output of commands to signal acknowledgement that the command has completed; vppctl now flags that the quit should be issued after the next such acknowledgement. - Since input it still accepted, the user can still terminate the "ping" early, if desired. Change-Id: I7e3dbe767f32f8e364ccb5f81799759b311585df Signed-off-by: Chris Luke <chrisy@flirble.org>
Diffstat (limited to 'src')
-rw-r--r--src/vpp/app/vppctl.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/vpp/app/vppctl.c b/src/vpp/app/vppctl.c
index f81a0ce9..66fe00ab 100644
--- a/src/vpp/app/vppctl.c
+++ b/src/vpp/app/vppctl.c
@@ -147,6 +147,7 @@ main (int argc, char *argv[])
u8 *cmd = 0;
int do_quit = 0;
int is_interactive = 0;
+ int acked = 1; /* counts messages from VPP; starts at 1 */
int sent_ttype = 0;
@@ -314,7 +315,10 @@ main (int argc, char *argv[])
}
while (q < (p + len) && !*q)
- q++;
+ {
+ q++;
+ acked++; /* every NUL is an acknowledgement */
+ }
len -= q - p;
p = q;
}
@@ -322,7 +326,7 @@ main (int argc, char *argv[])
vec_reset_length (str);
}
- if (do_quit)
+ if (do_quit && do_quit < acked)
{
/* Ask the other end to close the connection */
clib_socket_tx_add_formatted (s, "quit\n");
@@ -339,7 +343,7 @@ main (int argc, char *argv[])
clib_socket_tx_add_formatted (s, "%s\n", cmd);
clib_socket_tx (s);
vec_free (cmd);
- do_quit = 1;
+ do_quit = acked; /* quit after the next response */
}
}
else