/* * BPF receiver */ #include #include #include #include #include #include #include #include #include char buf[2048]; #define MY_ETHERTYPE 0x9999 // Ethertype of my ethernetframe // Filter to accept my ethernet frame (ethertype = 0x9999) struct bpf_insn insns[] = { BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, MY_ETHERTYPE, 0, 1), BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20), BPF_STMT(BPF_RET+BPF_K, 0), }; int main(int argc, char *argv[]) { int iPktLen, iHdl, iBytesRead; int i, ret; const int ciImmediate=1; //To enable BIOCIMMEDIATE mode struct ifreq stIfr; struct bpf_program my_bpf_program; my_bpf_program.bf_len = sizeof(insns); my_bpf_program.bf_insns = &insns; int iPacketsRead=0; memset(buf,0,2048); if (snprintf(stIfr.ifr_name, IFNAMSIZ, "en0") != 3) { perror("snprintf"); exit(EXIT_FAILURE); } printf("device name set to %s\n",stIfr.ifr_name); if ((iHdl = open("/dev/bpf0", O_RDONLY, 0)) < 0) { perror("open"); exit(EXIT_FAILURE); } printf("bpf /dev/bpf0 opened\n"); if (ioctl(iHdl, BIOCGBLEN, &iPktLen) < 0) { perror("ioctl BICGBLEN"); exit(EXIT_FAILURE); } if (ioctl(iHdl, BIOCSETIF, &stIfr) < 0) { perror("ioctl BIOCSETIF"); exit(EXIT_FAILURE); } printf("filter bound to network device %s\n",stIfr.ifr_name); if( ioctl(iHdl, BIOCIMMEDIATE, &ciImmediate ) == -1 ) { perror("ioctl BIOCIMMEDIATE"); exit(EXIT_FAILURE); } printf("Immediate Mode set\n"); if (ioctl(iHdl, BIOCSETF, &my_bpf_program) < 0) // Setting filter { perror("ioctl BIOCSETF"); exit(EXIT_FAILURE); } printf("Filter program set\n"); while (iPacketsRead++<1000) { printf("\n %d. Reading from bpf device...\n", iPacketsRead); if ((iBytesRead = read(iHdl, buf, iPktLen)) < 0) { perror("read"); exit(EXIT_FAILURE); } printf("%d returned from read, errno = %d..\n", iBytesRead, errno); } printf("Read %d packets",iPacketsRead); close(iHdl); return EXIT_SUCCESS; } /****************************************************************************************/ The output when I run bpfreceiver: $ ./bpfreceiver device name set to en0 bpf /dev/bpf0 opened filter bound to network device en0 Immediate Mode set ioctl BIOCSETF: Invalid argument // ERROR $ $ $