2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2009, 2010, 2011 Daniel Borkmann.
5 * Subject to the GPL, version 2.
20 static int pcap_rw_pull_file_header(int fd
)
23 struct pcap_filehdr hdr
;
25 ret
= read(fd
, &hdr
, sizeof(hdr
));
26 if (unlikely(ret
!= sizeof(hdr
)))
29 ret
= pcap_validate_header(&hdr
);
31 lseek(fd
, -sizeof(hdr
), SEEK_CUR
);
36 static int pcap_rw_push_file_header(int fd
)
39 struct pcap_filehdr hdr
;
41 memset(&hdr
, 0, sizeof(hdr
));
42 pcap_prepare_header(&hdr
, LINKTYPE_EN10MB
, 0,
43 PCAP_DEFAULT_SNAPSHOT_LEN
);
45 ret
= write_or_die(fd
, &hdr
, sizeof(hdr
));
46 if (unlikely(ret
!= sizeof(hdr
))) {
47 whine("Failed to write pkt file header!\n");
54 static ssize_t
pcap_rw_write_pcap_pkt(int fd
, struct pcap_pkthdr
*hdr
,
55 uint8_t *packet
, size_t len
)
57 ssize_t ret
= write_or_die(fd
, hdr
, sizeof(*hdr
));
58 if (unlikely(ret
!= sizeof(*hdr
))) {
59 whine("Failed to write pkt header!\n");
63 if (unlikely(hdr
->len
!= len
))
66 ret
= write_or_die(fd
, packet
, hdr
->len
);
67 if (unlikely(ret
!= hdr
->len
)) {
68 whine("Failed to write pkt payload!\n");
72 return sizeof(*hdr
) + hdr
->len
;
75 static ssize_t
pcap_rw_read_pcap_pkt(int fd
, struct pcap_pkthdr
*hdr
,
76 uint8_t *packet
, size_t len
)
78 ssize_t ret
= read(fd
, hdr
, sizeof(*hdr
));
79 if (unlikely(ret
!= sizeof(*hdr
)))
82 if (unlikely(hdr
->len
> len
))
85 ret
= read(fd
, packet
, hdr
->len
);
86 if (unlikely(ret
!= hdr
->len
))
89 if (unlikely(hdr
->len
== 0))
90 return -EINVAL
; /* Bogus packet */
92 return sizeof(*hdr
) + hdr
->len
;
95 static void pcap_rw_fsync_pcap(int fd
)
100 static int pcap_rw_prepare_writing_pcap(int fd
)
106 static int pcap_rw_prepare_reading_pcap(int fd
)
112 struct pcap_file_ops pcap_rw_ops __read_mostly
= {
113 .name
= "read-write",
114 .pull_file_header
= pcap_rw_pull_file_header
,
115 .push_file_header
= pcap_rw_push_file_header
,
116 .write_pcap_pkt
= pcap_rw_write_pcap_pkt
,
117 .read_pcap_pkt
= pcap_rw_read_pcap_pkt
,
118 .fsync_pcap
= pcap_rw_fsync_pcap
,
119 .prepare_writing_pcap
= pcap_rw_prepare_writing_pcap
,
120 .prepare_reading_pcap
= pcap_rw_prepare_reading_pcap
,
123 int init_pcap_rw(int jumbo_support
)
125 return pcap_ops_group_register(&pcap_rw_ops
, PCAP_OPS_RW
);
128 void cleanup_pcap_rw(void)
130 pcap_ops_group_unregister(PCAP_OPS_RW
);