aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2018-02-23 12:09:41 -0500
committerDave Barach <dave@barachs.net>2018-02-23 12:12:04 -0500
commita0cc5ab6d4873164bcb6cdae02b928e49553d13a (patch)
treece34f8dfb715a3b42f7ef380e645b0d721deea35
parent1355fcd36f9ad63bbdc7ebd300c1c18b9520498b (diff)
Convert a pcap file to a set of C initializers
Change-Id: Ieb6b7a75fa23c8142ae15f42cd3a703253f39e10 Signed-off-by: Dave Barach <dave@barachs.net>
-rw-r--r--src/vnet.am9
-rw-r--r--src/vnet/unix/pcap2cinit.c139
-rw-r--r--src/vnet/unix/pcap2pg.c2
3 files changed, 148 insertions, 2 deletions
diff --git a/src/vnet.am b/src/vnet.am
index a5fb061c5d6..204c3c2c358 100644
--- a/src/vnet.am
+++ b/src/vnet.am
@@ -1236,6 +1236,13 @@ pcap2pg_SOURCES = \
pcap2pg_LDFLAGS = -static
pcap2pg_LDADD = libvnet.la libvppinfra.la -lpthread libvlibmemory.la -lm -ldl
-noinst_PROGRAMS += pcap2pg
+pcap2cinit_SOURCES = \
+ vnet/unix/pcap2cinit.c \
+ vnet/unix/pcap.h
+
+pcap2cinit_LDFLAGS = -static
+pcap2cinit_LDADD = libvnet.la libvppinfra.la -lpthread libvlibmemory.la -lm -ldl
+
+noinst_PROGRAMS += pcap2pg pcap2cinit
# vi:syntax=automake
diff --git a/src/vnet/unix/pcap2cinit.c b/src/vnet/unix/pcap2cinit.c
new file mode 100644
index 00000000000..a81722e4062
--- /dev/null
+++ b/src/vnet/unix/pcap2cinit.c
@@ -0,0 +1,139 @@
+/*
+ * pcap2cinit.c: convert pcap input to a u8 ** initializer
+ *
+ * Copyright (c) 2018 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * @file
+ * @brief Functions to convert PCAP file format to a u8 ** initializer
+ *
+ */
+#include <vnet/unix/pcap.h>
+#include <vnet/ethernet/packet.h>
+#include <stdio.h>
+
+pcap_main_t pcap_main;
+
+/**
+ * @brief Conversion of PCAP file to u8 ** initializer stanzas
+ *
+ * @param *pm - pcap_main_t
+ * @param *ofp - FILE
+ *
+ * @return rc - int
+ *
+ */
+int
+pcap2cinit (pcap_main_t * pm, FILE * ofp)
+{
+ int i, j;
+ u8 *pkt;
+
+ for (i = 0; i < vec_len (pm->packets_read); i++)
+ {
+ pkt = (u8 *) pm->packets_read[i];
+
+ fformat (ofp, "static u8 __pcap_pkt%d [] = {\n ", i);
+
+ for (j = 0; j < vec_len (pkt); j++)
+ {
+ if (((j + 1) % 8) == 0)
+ fformat (ofp, "0x%02x,\n ", pkt[j]);
+ else
+ fformat (ofp, "0x%02x, ", pkt[j]);
+ }
+ fformat (ofp, "\n};\n");
+ }
+
+ fformat (ofp, "static u8 *__pcap_pkts [] = {\n");
+
+ for (i = 0; i < vec_len (pm->packets_read); i++)
+ fformat (ofp, " __pcap_pkt%d, \n", i);
+
+ fformat (ofp, "};\n");
+
+ return 0;
+}
+
+/**
+ * @brief pcap2pg.
+ * usage: pcap2pg -i <input-file> [-o <output-file>]
+ */
+int
+main (int argc, char **argv)
+{
+ unformat_input_t input;
+ pcap_main_t *pm = &pcap_main;
+ u8 *input_file = 0, *output_file = 0;
+ FILE *ofp;
+ clib_error_t *error;
+
+ unformat_init_command_line (&input, argv);
+
+ while (unformat_check_input (&input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (&input, "-i %s", &input_file)
+ || unformat (&input, "input %s", &input_file))
+ ;
+ else if (unformat (&input, "-o %s", &output_file)
+ || unformat (&input, "output %s", &output_file))
+ ;
+ else
+ {
+ usage:
+ fformat (stderr,
+ "usage: pcap2pg -i <input-file> [-o <output-file>]\n");
+ exit (1);
+ }
+ }
+
+ if (input_file == 0)
+ goto usage;
+
+ pm->file_name = (char *) input_file;
+ error = pcap_read (pm);
+
+ if (error)
+ {
+ clib_error_report (error);
+ exit (1);
+ }
+
+ if (output_file)
+ {
+ ofp = fopen ((char *) output_file, "w+");
+ if (ofp == NULL)
+ {
+ clib_unix_warning ("Couldn't create '%s'", output_file);
+ exit (1);
+ }
+ }
+ else
+ {
+ ofp = stdout;
+ }
+
+ pcap2cinit (pm, ofp);
+
+ fclose (ofp);
+ exit (0);
+}
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */
diff --git a/src/vnet/unix/pcap2pg.c b/src/vnet/unix/pcap2pg.c
index 46d6bfcd0c7..712907a5bac 100644
--- a/src/vnet/unix/pcap2pg.c
+++ b/src/vnet/unix/pcap2pg.c
@@ -164,7 +164,7 @@ main (int argc, char **argv)
if (output_file)
{
- ofp = fopen ((char *) output_file, "rw");
+ ofp = fopen ((char *) output_file, "w+");
if (ofp == NULL)
clib_unix_warning ("Couldn't create '%s'", output_file);
exit (1);