Instead this patch uses flow_format() which gives very similar
output. This patch will improve the reliability of unit tests in
future patches which rely on the results of ofp_packet_to_string().
---
lib/ofp-print.c | 58 ++++-----------------------------------------------
tests/ofp-print.at | 5 +--
2 files changed, 7 insertions(+), 56 deletions(-)
diff --git a/lib/ofp-print.c b/lib/ofp-print.c
index 7ed3ce1..0417e9d 100644
--- a/lib/ofp-print.c
+++ b/lib/ofp-print.c
@@ -49,58 +49,19 @@ static void ofp_print_error(struct ds *, int error);
/* Returns a string that represents the contents of the Ethernet frame in the
- * 'len' bytes starting at 'data' to 'stream' as output by tcpdump.
- *
- * The caller must free the returned string.
- *
- * This starts and kills a tcpdump subprocess so it's quite expensive. */
+ * 'len' bytes starting at 'data'. The caller must free the returned string.*/
char *
ofp_packet_to_string(const void *data, size_t len)
{
struct ds ds = DS_EMPTY_INITIALIZER;
struct ofpbuf buf;
-
- char command[128];
- FILE *pcap;
- FILE *tcpdump;
- int status;
- int c;
+ struct flow flow;
ofpbuf_use_const(&buf, data, len);
+ flow_extract(&buf, 0, 0, 0, &flow);
+ flow_format(&ds, &flow);
+ ds_put_char(&ds, '\n');
- pcap = tmpfile();
- if (!pcap) {
- ovs_error(errno, "tmpfile");
- return xstrdup("<error>");
- }
- pcap_write_header(pcap);
- pcap_write(pcap, &buf);
- fflush(pcap);
- if (ferror(pcap)) {
- ovs_error(errno, "error writing temporary file");
- }
- rewind(pcap);
-
- snprintf(command, sizeof command, "/usr/sbin/tcpdump -t -e -n -r
/dev/fd/%d 2>/dev/null",
- fileno(pcap));
- tcpdump = popen(command, "r");
- fclose(pcap);
- if (!tcpdump) {
- ovs_error(errno, "exec(\"%s\")", command);
- return xstrdup("<error>");
- }
-
- while ((c = getc(tcpdump)) != EOF) {
- ds_put_char(&ds, c);
- }
-
- status = pclose(tcpdump);
- if (WIFEXITED(status)) {
- if (WEXITSTATUS(status))
- ovs_error(0, "tcpdump exited with status %d", WEXITSTATUS(status));
- } else if (WIFSIGNALED(status)) {
- ovs_error(0, "tcpdump exited with signal %d", WTERMSIG(status));
- }
return ds_cstr(&ds);
}
@@ -134,15 +95,6 @@ ofp_print_packet_in(struct ds *string, const struct
ofp_packet_in *op,
ds_put_char(string, '\n');
if (verbosity > 0) {
- struct flow flow;
- struct ofpbuf packet;
-
- ofpbuf_use_const(&packet, op->data, data_len);
- flow_extract(&packet, 0, 0, ntohs(op->in_port), &flow);
- flow_format(string, &flow);
- ds_put_char(string, '\n');
- }
- if (verbosity > 1) {
char *packet = ofp_packet_to_string(op->data, data_len);
ds_put_cstr(string, packet);
free(packet);
diff --git a/tests/ofp-print.at b/tests/ofp-print.at
index 09b785b..3f764a4 100644
--- a/tests/ofp-print.at
+++ b/tests/ofp-print.at
@@ -235,10 +235,9 @@ c0 a8 00 02 27 2f 00 00 78 50 cc 5b 57 af 42 1e \
"], [0], [stdout])
dnl The tcpdump output format differs slightly from one version to another,
dnl so trim off the end of the line where differences appear.
-AT_CHECK([sed 's/\(length 60:\).*/\1 .../' stdout], [0], [dnl
+AT_CHECK([cat stdout], [0], [dnl
OFPT_PACKET_IN (xid=0x0): total_len=60 in_port=3 data_len=60 buffer=0x00000111
-priority:0,tunnel:0,in_port:0003,tci(0)
mac(50:54:00:00:00:05->50:54:00:00:00:06) type:0800 proto:6 tos:0 ttl:64
ip(192.168.0.1->192.168.0.2) port(10031->0)
-50:54:00:00:00:05 > 50:54:00:00:00:06, ethertype IPv4 (0x0800), length 60: ...
+priority:0,tunnel:0,in_port:0000,tci(0)
mac(50:54:00:00:00:05->50:54:00:00:00:06) type:0800 proto:6 tos:0 ttl:64
ip(192.168.0.1->192.168.0.2) port(10031->0)
])
AT_CLEANUP
--
1.7.7.1
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev