From a0cc5ab6d4873164bcb6cdae02b928e49553d13a Mon Sep 17 00:00:00 2001 From: Dave Barach Date: Fri, 23 Feb 2018 12:09:41 -0500 Subject: Convert a pcap file to a set of C initializers Change-Id: Ieb6b7a75fa23c8142ae15f42cd3a703253f39e10 Signed-off-by: Dave Barach --- src/vnet/unix/pcap2cinit.c | 139 +++++++++++++++++++++++++++++++++++++++++++++ src/vnet/unix/pcap2pg.c | 2 +- 2 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 src/vnet/unix/pcap2cinit.c (limited to 'src/vnet/unix') 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 +#include +#include + +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 [-o ] + */ +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 [-o ]\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); -- cgit 1.2.3-korg