|
Packit |
7b22a4 |
/*
|
|
Packit |
7b22a4 |
* BPF program compilation tool
|
|
Packit |
7b22a4 |
*
|
|
Packit |
7b22a4 |
* Generates decimal output, similar to `tcpdump -ddd ...`.
|
|
Packit |
7b22a4 |
* Unlike tcpdump, will generate for any given link layer type.
|
|
Packit |
7b22a4 |
*
|
|
Packit |
7b22a4 |
* Written by Willem de Bruijn (willemb@google.com)
|
|
Packit |
7b22a4 |
* Copyright Google, Inc. 2013
|
|
Packit |
7b22a4 |
* Licensed under the GNU General Public License version 2 (GPLv2)
|
|
Packit |
7b22a4 |
*/
|
|
Packit |
7b22a4 |
|
|
Packit |
7b22a4 |
#include <pcap.h>
|
|
Packit |
7b22a4 |
#include <stdio.h>
|
|
Packit |
7b22a4 |
|
|
Packit |
7b22a4 |
int main(int argc, char **argv)
|
|
Packit |
7b22a4 |
{
|
|
Packit |
7b22a4 |
struct bpf_program program;
|
|
Packit |
7b22a4 |
struct bpf_insn *ins;
|
|
Packit |
7b22a4 |
int i, dlt = DLT_RAW;
|
|
Packit |
7b22a4 |
|
|
Packit |
7b22a4 |
if (argc < 2 || argc > 3) {
|
|
Packit |
7b22a4 |
fprintf(stderr, "Usage: %s [link] '<program>'\n\n"
|
|
Packit |
7b22a4 |
" link is a pcap linklayer type:\n"
|
|
Packit |
7b22a4 |
" one of EN10MB, RAW, SLIP, ...\n\n"
|
|
Packit |
7b22a4 |
"Examples: %s RAW 'tcp and greater 100'\n"
|
|
Packit |
7b22a4 |
" %s EN10MB 'ip proto 47'\n'",
|
|
Packit |
7b22a4 |
argv[0], argv[0], argv[0]);
|
|
Packit |
7b22a4 |
return 1;
|
|
Packit |
7b22a4 |
}
|
|
Packit |
7b22a4 |
|
|
Packit |
7b22a4 |
if (argc == 3) {
|
|
Packit |
7b22a4 |
dlt = pcap_datalink_name_to_val(argv[1]);
|
|
Packit |
7b22a4 |
if (dlt == -1) {
|
|
Packit |
7b22a4 |
fprintf(stderr, "Unknown datalinktype: %s\n", argv[1]);
|
|
Packit |
7b22a4 |
return 1;
|
|
Packit |
7b22a4 |
}
|
|
Packit |
7b22a4 |
}
|
|
Packit |
7b22a4 |
|
|
Packit |
7b22a4 |
if (pcap_compile_nopcap(65535, dlt, &program, argv[argc - 1], 1,
|
|
Packit |
7b22a4 |
PCAP_NETMASK_UNKNOWN)) {
|
|
Packit |
7b22a4 |
fprintf(stderr, "Compilation error\n");
|
|
Packit |
7b22a4 |
return 1;
|
|
Packit |
7b22a4 |
}
|
|
Packit |
7b22a4 |
|
|
Packit |
7b22a4 |
printf("%d,", program.bf_len);
|
|
Packit |
7b22a4 |
ins = program.bf_insns;
|
|
Packit |
7b22a4 |
for (i = 0; i < program.bf_len-1; ++ins, ++i)
|
|
Packit |
7b22a4 |
printf("%u %u %u %u,", ins->code, ins->jt, ins->jf, ins->k);
|
|
Packit |
7b22a4 |
|
|
Packit |
7b22a4 |
printf("%u %u %u %u\n", ins->code, ins->jt, ins->jf, ins->k);
|
|
Packit |
7b22a4 |
|
|
Packit |
7b22a4 |
pcap_freecode(&program);
|
|
Packit |
7b22a4 |
return 0;
|
|
Packit |
7b22a4 |
}
|
|
Packit |
7b22a4 |
|