pcap-file: move packet counter to PCAP packet structure

Code refactor to gather all PCAP-related structure members
under one structure.

New pcap_v structure guards protect the union variables from
other capture modes trying to access the packet number incorrectly.

Ticket: 7835
pull/14673/head
Lukas Sismis 7 months ago committed by Victor Julien
parent 400328c3c3
commit b575ae3fd1

@ -1095,6 +1095,27 @@ void PacketAlertGetMaxConfig(void)
SCLogDebug("detect->packet_alert_max set to %d", packet_alert_max);
}
static inline bool PcapPacketCntRunmodeCanAccess(void)
{
SCRunMode m = SCRunmodeGet();
return m == RUNMODE_PCAP_FILE || m == RUNMODE_UNITTEST || m == RUNMODE_UNIX_SOCKET;
}
inline uint64_t PcapPacketCntGet(const Packet *p)
{
if (PcapPacketCntRunmodeCanAccess() && p != NULL) {
return p->pcap_v.pcap_cnt;
}
return 0;
}
inline void PcapPacketCntSet(Packet *p, uint64_t pcap_cnt)
{
if (PcapPacketCntRunmodeCanAccess() && p != NULL) {
p->pcap_v.pcap_cnt = pcap_cnt;
}
}
/**
* @}
*/

@ -622,10 +622,6 @@ typedef struct Packet_
struct Host_ *host_src;
struct Host_ *host_dst;
/** packet number in the pcap file, matches wireshark */
uint64_t pcap_cnt;
/* engine events */
PacketEngineEvents events;
@ -1522,12 +1518,7 @@ static inline bool DecodeNetworkLayer(ThreadVars *tv, DecodeThreadVars *dtv,
return true;
}
// temporary macro to get pcap packet count to reduce the number of changes
// in the follow-up commit
#define PcapPacketCntGet(p) (p)->pcap_cnt
#define PcapPacketCntSet(p, cnt) \
do { \
(p)->pcap_cnt = (cnt); \
} while (0)
uint64_t PcapPacketCntGet(const Packet *p);
void PcapPacketCntSet(Packet *p, uint64_t pcap_cnt);
#endif /* SURICATA_DECODE_H */

@ -80,7 +80,7 @@ void PcapFileCallbackLoop(char *user, struct pcap_pkthdr *h, u_char *pkt)
p->ts = SCTIME_FROM_TIMEVAL_UNTRUSTED(&h->ts);
SCLogDebug("p->ts.tv_sec %" PRIuMAX "", (uintmax_t)SCTIME_SECS(p->ts));
p->datalink = ptv->datalink;
p->pcap_cnt = ++pcap_g.cnt;
p->pcap_v.pcap_cnt = ++pcap_g.cnt;
p->pcap_v.tenant_id = ptv->shared->tenant_id;
ptv->shared->pkts++;
@ -96,8 +96,8 @@ void PcapFileCallbackLoop(char *user, struct pcap_pkthdr *h, u_char *pkt)
if (pcap_g.checksum_mode == CHECKSUM_VALIDATION_DISABLE) {
p->flags |= PKT_IGNORE_CHECKSUM;
} else if (pcap_g.checksum_mode == CHECKSUM_VALIDATION_AUTO) {
if (ChecksumAutoModeCheck(ptv->shared->pkts, p->pcap_cnt,
SC_ATOMIC_GET(pcap_g.invalid_checksums))) {
if (ChecksumAutoModeCheck(ptv->shared->pkts, p->pcap_v.pcap_cnt,
SC_ATOMIC_GET(pcap_g.invalid_checksums))) {
pcap_g.checksum_mode = CHECKSUM_VALIDATION_DISABLE;
p->flags |= PKT_IGNORE_CHECKSUM;
}

@ -32,8 +32,8 @@ void PcapTranslateIPToDevice(char *pcap_dev, size_t len);
#define LIBPCAP_PROMISC 1
/* per packet Pcap vars */
typedef struct PcapPacketVars_
{
typedef struct PcapPacketVars_ {
uint64_t pcap_cnt;
uint32_t tenant_id;
} PcapPacketVars;

Loading…
Cancel
Save