Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
static inline bool reply_extract_tag(const probe_t * reply, uint16_t * ptag_reply) {
    return probe_extract_ext(reply, "checksum", 3, ptag_reply);
}
Esempio n. 4
0
static inline bool probe_extract_tag(const probe_t * probe, uint16_t * ptag_probe) {
    return probe_extract_ext(probe, "checksum", 1, ptag_probe);
}