2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2009 - 2013 Daniel Borkmann.
5 * Subject to the GPL, version 2.
21 static ssize_t
pcap_rw_write(int fd
, pcap_pkthdr_t
*phdr
, enum pcap_type type
,
22 const uint8_t *packet
, size_t len
)
24 ssize_t ret
, hdrlen
= 0, hdrsize
= 0;
27 #define PCAP_HDR_WRITE(__member__) do { \
28 hdrlen = phdr->__member__.caplen; \
29 hdrsize = sizeof(phdr->__member__); \
30 ret = write_or_die(fd, &phdr->__member__, hdrsize); \
32 #define CASE_HDR_WRITE(what, member) \
34 PCAP_HDR_WRITE(member); \
36 CASE_HDR_WRITE(DEFAULT
, ppo
);
37 CASE_HDR_WRITE(NSEC
, ppn
);
38 CASE_HDR_WRITE(KUZNETZOV
, ppk
);
39 CASE_HDR_WRITE(BORKMANN
, ppb
);
44 if (unlikely(ret
!= hdrsize
))
45 panic("Failed to write pkt header!\n");
46 if (unlikely(hdrlen
!= len
))
49 ret
= write_or_die(fd
, packet
, hdrlen
);
50 if (unlikely(ret
!= hdrlen
))
51 panic("Failed to write pkt payload!\n");
53 return hdrsize
+ hdrlen
;
56 static ssize_t
pcap_rw_read(int fd
, pcap_pkthdr_t
*phdr
, enum pcap_type type
,
57 uint8_t *packet
, size_t len
)
59 ssize_t ret
, hdrlen
= 0, hdrsize
= 0;
62 #define PCAP_HDR_READ(__member__) do { \
63 hdrsize = sizeof(phdr->__member__); \
64 ret = read_or_die(fd, &phdr->__member__, hdrsize); \
65 if (unlikely(ret != hdrsize)) \
67 hdrlen = phdr->__member__.caplen; \
69 #define CASE_HDR_READ(what, member) \
71 PCAP_HDR_READ(member); \
73 CASE_HDR_READ(DEFAULT
, ppo
);
74 CASE_HDR_READ(NSEC
, ppn
);
75 CASE_HDR_READ(KUZNETZOV
, ppk
);
76 CASE_HDR_READ(BORKMANN
, ppb
);
81 if (unlikely(hdrlen
== 0 || hdrlen
> len
))
84 ret
= read(fd
, packet
, hdrlen
);
85 if (unlikely(ret
!= hdrlen
))
88 return hdrsize
+ hdrlen
;
91 static int pcap_rw_prepare_access(int fd
, enum pcap_mode mode
, bool jumbo
)
98 static void pcap_rw_fsync(int fd
)
103 const struct pcap_file_ops pcap_rw_ops
= {
104 .pull_fhdr_pcap
= pcap_generic_pull_fhdr
,
105 .push_fhdr_pcap
= pcap_generic_push_fhdr
,
106 .prepare_access_pcap
= pcap_rw_prepare_access
,
107 .read_pcap
= pcap_rw_read
,
108 .write_pcap
= pcap_rw_write
,
109 .fsync_pcap
= pcap_rw_fsync
,