diff options
-rw-r--r-- | src/vnet.am | 9 | ||||
-rw-r--r-- | src/vnet/unix/pcap2cinit.c | 139 | ||||
-rw-r--r-- | src/vnet/unix/pcap2pg.c | 2 |
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); |