diff options
Diffstat (limited to 'src/vnet/unix/pcap2cinit.c')
-rw-r--r-- | src/vnet/unix/pcap2cinit.c | 139 |
1 files changed, 139 insertions, 0 deletions
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: + */ |