#include #include #include #include #include #include #include #define REVARP_REQUEST 3 static struct bpf_insn accept_arp[] = { BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12), // 0 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_REVARP, 0, 3), // 1 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20), // 2 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, REVARP_REQUEST, 0, 1), // 3 BPF_STMT(BPF_RET+BPF_K, sizeof(struct ether_arp) + // 4 sizeof(struct ether_header)), BPF_STMT(BPF_RET+BPF_K, 0) // 5 }; struct bpf_insn insns[] = { BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_IP, 0, 8), BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2), BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3), BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1), BPF_STMT(BPF_RET+BPF_K, (u_int)-1), BPF_STMT(BPF_RET+BPF_K, 0), }; int main(int argc, char **argv) { void *prog; int32_t size; //if (0) { prog = accept_arp; size = sizeof(accept_arp) / sizeof(struct bpf_insn); } if (0) { prog = insns; size = sizeof(insns) / sizeof(struct bpf_insn); } fwrite(&size, 4, 1, stdout); fwrite(prog, size, sizeof(struct bpf_insn), stdout); fflush(stdout); return 0; }