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