21 #ifndef BM_BM_SIM_CHECKSUMS_H_
22 #define BM_BM_SIM_CHECKSUMS_H_
28 #include "expressions.h"
34 class NamedCalculation;
36 class Checksum :
public NamedP4Object{
38 Checksum(
const std::string &name, p4object_id_t
id,
39 header_id_t header_id,
int field_offset);
41 virtual ~Checksum() =
default;
44 Checksum(
const Checksum &other) =
delete;
46 Checksum &
operator=(
const Checksum &other) =
delete;
52 Checksum(Checksum &&other) =
default;
54 Checksum &
operator=(Checksum &&other) =
default;
56 void update(Packet *pkt)
const;
58 bool verify(
const Packet &pkt)
const;
60 void set_checksum_condition(std::unique_ptr<Expression> cksum_condition);
63 virtual void update_(Packet *pkt)
const = 0;
64 virtual bool verify_(
const Packet &pkt)
const = 0;
66 bool is_checksum_condition_met(
const Packet &pkt)
const;
68 bool is_target_field_valid(
const Packet &pkt)
const;
71 header_id_t header_id;
75 std::unique_ptr<Expression> condition{
nullptr};
78 class CalcBasedChecksum :
public Checksum {
80 CalcBasedChecksum(
const std::string &name, p4object_id_t
id,
81 header_id_t header_id,
int field_offset,
82 const NamedCalculation *calculation);
84 CalcBasedChecksum(
const CalcBasedChecksum &other) =
delete;
85 CalcBasedChecksum &
operator=(
const CalcBasedChecksum &other) =
delete;
87 CalcBasedChecksum(CalcBasedChecksum &&other) =
default;
88 CalcBasedChecksum &
operator=(CalcBasedChecksum &&other) =
default;
91 void update_(Packet *pkt)
const override;
92 bool verify_(
const Packet &pkt)
const override;
95 const NamedCalculation *calculation{
nullptr};
98 class IPv4Checksum :
public Checksum {
100 IPv4Checksum(
const std::string &name, p4object_id_t
id,
101 header_id_t header_id,
int field_offset);
104 void update_(Packet *pkt)
const override;
105 bool verify_(
const Packet &pkt)
const override;
110 #endif // BM_BM_SIM_CHECKSUMS_H_