|
@@ -1,139 +0,0 @@
|
|
|
-diff -uNpr vblade-15-orig/freebsd.c vblade-15-lsf/freebsd.c
|
|
|
---- vblade-15-orig/freebsd.c 2008-03-07 20:22:16.000000000 +0000
|
|
|
-+++ vblade-15-lsf/freebsd.c 2008-04-30 10:45:11.000000000 +0100
|
|
|
-@@ -54,40 +54,44 @@ dial(char *eth)
|
|
|
-
|
|
|
- /* packet filter for bpf */
|
|
|
- struct bpf_insn bpf_insns[] = {
|
|
|
-- /* Load the type into register */
|
|
|
-- BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
|
|
|
-- /* Does it match AoE Type (0x88a2)? No, goto INVALID */
|
|
|
-- BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x88a2, 0, 10),
|
|
|
-- /* Load the flags into register */
|
|
|
-- BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 14),
|
|
|
-- /* Check to see if the Resp flag is set */
|
|
|
-- BPF_STMT(BPF_ALU+BPF_AND+BPF_K, Resp),
|
|
|
-- /* Yes, goto INVALID */
|
|
|
-- BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0, 0, 7),
|
|
|
-- /* Load the command into register */
|
|
|
-- BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 19),
|
|
|
-- /* Is this a ATAcmd? No, goto VALID */
|
|
|
-- BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ATAcmd, 0, 4),
|
|
|
-- /* Load the shelf number into register */
|
|
|
-- BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 16),
|
|
|
-- /* Does it match shelf number? No, goto INVALID */
|
|
|
-- BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) shelf, 0, 3),
|
|
|
-- /* Load the slot number into register */
|
|
|
-- BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 18),
|
|
|
-- /* Does it match shelf number? No, goto INVALID */
|
|
|
-- BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) slot, 0, 1),
|
|
|
-- /* VALID: return -1 (allow the packet to be read) */
|
|
|
-- BPF_STMT(BPF_RET+BPF_K, (u_int)-1),
|
|
|
-- /* INVALID: return 0 (ignore the packet) */
|
|
|
-- BPF_STMT(BPF_RET+BPF_K, 0),
|
|
|
-+ /* Load the type into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
|
|
|
-+ /* Does it match AoE Type (0x88a2)? No, goto INVALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x88a2, 0, 12),
|
|
|
-+ /* Load the flags into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 14),
|
|
|
-+ /* Check to see if the Resp flag is set */
|
|
|
-+ BPF_STMT(BPF_ALU+BPF_AND+BPF_K, Resp),
|
|
|
-+ /* Yes, goto INVALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0, 0, 9),
|
|
|
-+ /* Load the shelf number into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 16),
|
|
|
-+ /* Does it match shelf number? No, goto CHECKBROADCAST */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) shelf, 0, 2),
|
|
|
-+ /* Load the slot number into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 18),
|
|
|
-+ /* Does it match shelf number? Yes, goto VALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) slot, 4, 0),
|
|
|
-+ /* CHECKBROADCAST: is (shelf, slot) == (0xffff, 0xff)? */
|
|
|
-+ /* Load the shelf number into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 16),
|
|
|
-+ /* Is it 0xffff? No, goto INVALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) 0xffff, 0, 3),
|
|
|
-+ /* Load the slot number into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 18),
|
|
|
-+ /* Is it 0xff? No, goto INVALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) 0xff, 0, 1),
|
|
|
-+ /* VALID: return -1 (allow the packet to be read) */
|
|
|
-+ BPF_STMT(BPF_RET+BPF_K, (u_int) -1),
|
|
|
-+ /* INVALID: return 0 (ignore the packet) */
|
|
|
-+ BPF_STMT(BPF_RET+BPF_K, 0),
|
|
|
- };
|
|
|
-
|
|
|
- struct bpf_program bpf_program = {
|
|
|
-- sizeof(bpf_insns)/sizeof(struct bpf_insn),
|
|
|
-- bpf_insns
|
|
|
-+ sizeof(bpf_insns)/sizeof(struct bpf_insn),
|
|
|
-+ bpf_insns
|
|
|
- };
|
|
|
--
|
|
|
--
|
|
|
-+
|
|
|
- strncpy(device, BPF_DEV, sizeof BPF_DEV);
|
|
|
-
|
|
|
- /* find a bpf device we can use, check /dev/bpf[0-9] */
|
|
|
-diff -uNpr vblade-15-orig/linux.c vblade-15-lsf/linux.c
|
|
|
---- vblade-15-orig/linux.c 2008-03-07 20:22:16.000000000 +0000
|
|
|
-+++ vblade-15-lsf/linux.c 2008-04-30 10:46:04.000000000 +0100
|
|
|
-@@ -22,6 +22,7 @@
|
|
|
- #include <netinet/in.h>
|
|
|
- #include <linux/fs.h>
|
|
|
- #include <sys/stat.h>
|
|
|
-+#include <pcap-bpf.h>
|
|
|
-
|
|
|
- #include "dat.h"
|
|
|
- #include "fns.h"
|
|
|
-@@ -54,6 +55,49 @@ dial(char *eth) // get us a raw connect
|
|
|
- perror("bind funky");
|
|
|
- return -1;
|
|
|
- }
|
|
|
-+
|
|
|
-+ /* bpf packet filter for socket */
|
|
|
-+ struct bpf_insn bpf_insns[] = {
|
|
|
-+ /* Load the type into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
|
|
|
-+ /* Does it match AoE Type (0x88a2)? No, goto INVALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x88a2, 0, 12),
|
|
|
-+ /* Load the flags into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 14),
|
|
|
-+ /* Check to see if the Resp flag is set */
|
|
|
-+ BPF_STMT(BPF_ALU+BPF_AND+BPF_K, Resp),
|
|
|
-+ /* Yes, goto INVALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0, 0, 9),
|
|
|
-+ /* Load the shelf number into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 16),
|
|
|
-+ /* Does it match shelf number? No, goto CHECKBROADCAST */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) shelf, 0, 2),
|
|
|
-+ /* Load the slot number into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 18),
|
|
|
-+ /* Does it match shelf number? Yes, goto VALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) slot, 4, 0),
|
|
|
-+ /* CHECKBROADCAST: is (shelf, slot) == (0xffff, 0xff)? */
|
|
|
-+ /* Load the shelf number into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 16),
|
|
|
-+ /* Is it 0xffff? No, goto INVALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) 0xffff, 0, 3),
|
|
|
-+ /* Load the slot number into register */
|
|
|
-+ BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 18),
|
|
|
-+ /* Is it 0xff? No, goto INVALID */
|
|
|
-+ BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (u_int) 0xff, 0, 1),
|
|
|
-+ /* VALID: return -1 (allow the packet to be read) */
|
|
|
-+ BPF_STMT(BPF_RET+BPF_K, (u_int) -1),
|
|
|
-+ /* INVALID: return 0 (ignore the packet) */
|
|
|
-+ BPF_STMT(BPF_RET+BPF_K, 0),
|
|
|
-+ };
|
|
|
-+
|
|
|
-+ struct bpf_program bpf_program = {
|
|
|
-+ sizeof(bpf_insns)/sizeof(struct bpf_insn),
|
|
|
-+ bpf_insns
|
|
|
-+ };
|
|
|
-+
|
|
|
-+ setsockopt(s, SOL_SOCKET, SO_ATTACH_FILTER, &bpf_program, sizeof(bpf_program));
|
|
|
-+
|
|
|
- return s;
|
|
|
- }
|
|
|
-
|