bool icmpv4_matches(const struct probe_s * _probe, const struct probe_s * _reply) { uint8_t reply_type = 0, reply_code = 0, probe_type = 0, probe_code = 0; layer_t * icmp_layer = NULL; const probe_t * probe = (const probe_t *) _probe; const probe_t * reply = (const probe_t *) _reply; if (probe_extract(reply, "type", &reply_type) && probe_extract(probe, "type", &probe_type) && probe_extract(probe, "code", &probe_code)) { if (reply_type == ICMP_ECHOREPLY) { return true; } if (!(icmp_layer = probe_get_layer(reply, 3)) || strcmp(icmp_layer->protocol->name, "icmpv4")) { return false; } if (probe_extract_ext(reply, "type", 3, &reply_type) && probe_extract_ext(reply, "code", 3, &reply_code)) { return (probe_type == reply_type) && (probe_code == reply_code); } } return false; }
bool probe_extract(const probe_t * probe, const char * name, void * dst) { field_t * flow_id_field; // TEMPORARY HACK TO MANAGE flow_id metafield if (!strcmp(name, "flow_id")) { if ((flow_id_field = probe_create_metafield(probe, "flow_id")) != NULL) { memcpy(dst, &flow_id_field->value.int16, sizeof(uint16_t)); field_free(flow_id_field); return true; } return false; } return probe_extract_ext(probe, name, 0, dst); }
static inline bool reply_extract_tag(const probe_t * reply, uint16_t * ptag_reply) { return probe_extract_ext(reply, "checksum", 3, ptag_reply); }
static inline bool probe_extract_tag(const probe_t * probe, uint16_t * ptag_probe) { return probe_extract_ext(probe, "checksum", 1, ptag_probe); }