else throw runtime_error((boost::format("Unsupported link type %d") % d_pfh.linktype).str());
d_runts = d_oversized = d_correctpackets = d_nonetheripudp = 0;
+
+ size_t alignmentCorrection = d_skipMediaHeader % alignof(struct ip);
+
+ d_buffer = d_readbuffer + alignmentCorrection;
+ d_bufsize = sizeof(d_readbuffer) - alignmentCorrection;
+
+ if (d_skipMediaHeader > d_bufsize) throw runtime_error("media header is too big");
}
void PcapPacketReader::checkedFreadSize(void* ptr, size_t size)
continue;
}
- if(d_pheader.caplen > sizeof(d_buffer)) {
+ if(d_pheader.caplen > d_bufsize) {
d_oversized++;
- throw runtime_error((boost::format("Can't handle a %d byte packet, have space for %d") % d_pheader.caplen % sizeof(d_buffer)).str());
+ throw runtime_error((boost::format("Can't handle a %d byte packet, have space for %d") % d_pheader.caplen % d_bufsize).str());
}
checkedFreadSize(d_buffer, d_pheader.caplen);
pdns_pcap_file_header d_pfh;
unsigned int d_runts, d_oversized, d_correctpackets, d_nonetheripudp;
- char d_buffer[32768];
+ alignas (struct ip) char d_readbuffer[32768];
+ char *d_buffer;
+ size_t d_bufsize;
private:
std::unique_ptr<FILE, int(*)(FILE*)> d_fp{nullptr, fclose};
string d_fname;
uint16_t dlen = pr.d_len;
if (stamp >= 0) {
- static_assert(sizeof(pr.d_buffer) >= 1500, "The size of the underlying buffer should be at least 1500 bytes");
+ static_assert(sizeof(pr.d_readbuffer) >= 1500, "The size of the underlying buffer should be at least 1500 bytes");
if (dlen > 1500) {
/* the existing packet is larger than the maximum size we are willing to send, and it won't get better by adding ECS */
return false;