Date: Tue, 20 Jun 1995 22:13:34 +0900 From: Inoguchi <inoguti@osa.dec.com> Message-ID: <9506201313.AA25735@osou15.osa.dec.com>
next in thread | raw e-mail | index | archive | help
I forgot to put with sample code.
Thanks / Kinichiro Inoguchi
-----------------------------------------------------------------------
Hello, I have a question about BSD packet filter.
I'm using RELEASE 2.0.5, now.
I want to read/write from/to bpf.
I could read from bpf, but can't write !
I tested again and again, but can't put packet to Ethernet.
write() system call didn't return error code until buffer was full.
It seems that everything I wrote to bpf stayed in system buffer.
Please tell me !
Kinichiro Inoguchi
------------------------------------------------------------------------
#include <stdio.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/bpf.h>
#define ETHERTYPE_DLI 0x6006
struct bpf_insn insns[] = {
BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_DLI, 0, 1),
BPF_STMT(BPF_RET+BPF_K, (u_int)-1),
BPF_STMT(BPF_RET+BPF_K, 0),
};
int main() {
int ists;
int fd;
struct bpf_program bpfprog;
unsigned short sval;
struct ifreq ifReq;
u_int flag;
int bufsiz;
char *buf;
unsigned char sim_addr[6] = {0xaa, 0x00, 0x04, 0x00, 0x96, 0xff};
unsigned char osoi_addr[6] = {0x08, 0x00, 0x2b, 0x3c, 0xfd, 0x6d};
/* open device */
if((fd = open("/dev/bpf0", O_WRONLY)) < 0) {
perror("open");
exit(0);
}
/* binding */
memset(&ifReq, 0, sizeof(struct ifreq));
strcpy(ifReq.ifr_name, "le0");
if(ioctl(fd, BIOCSETIF, &ifReq)) {
perror("setif");
exit(0);
}
flag = 1;
if(ioctl(fd, BIOCIMMEDIATE, &flag) < 0) {
perror("immediate");
exit(0);
}
if(ioctl(fd, BIOCPROMISC) < 0) {
perror("promisc");
exit(0);
}
/* filter settings */
bpfprog.bf_len = sizeof(insns) / sizeof(struct bpf_insn);
bpfprog.bf_insns = insns;
if(ioctl(fd, BIOCSETF, &bpfprog) < 0) {
perror("SETF");
exit(0);
}
if(ioctl(fd, BIOCGBLEN, &bufsiz) < 0) {
perror("gblen");
exit(0);
}
buf = (char *) malloc(bufsiz);
memset(buf, 0, bufsiz);
/* create packet to send */
memmove(&buf[0], sim_addr, 6);
memmove(&buf[6], osoi_addr, 6);
sval = htons(0x6006);
memmove(&buf[12], &sval, 2);
sval = 2;
memmove(&buf[14], &sval, 2);
/* send packet */
ists = write(fd, buf, 18);
if(ists < 0) {
perror("write");
}
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9506201313.AA25735>
