/* * Reads the configuration from a set of vars. */ static void load_config(struct http_user_vars_s *vars, struct config_s *config) { http_get_bool_var(vars, VAR_ENABLED, &config->enabled); http_get_bool_var(vars, VAR_HIDE_TCP, &config->hide_tcp); http_get_bool_var(vars, VAR_HIDE_TCP_DATA, &config->hide_tcp_data); http_get_enum_var(vars, VAR_HIDE_TCP_SYN, flag_def, DEF_SIZE(flag_def), &config->hide_tcp_syn); http_get_enum_var(vars, VAR_HIDE_TCP_ACK, flag_def, DEF_SIZE(flag_def), &config->hide_tcp_ack); http_get_enum_var(vars, VAR_HIDE_TCP_PSH, flag_def, DEF_SIZE(flag_def), &config->hide_tcp_psh); http_get_enum_var(vars, VAR_HIDE_TCP_FIN, flag_def, DEF_SIZE(flag_def), &config->hide_tcp_fin); http_get_enum_var(vars, VAR_HIDE_TCP_RST, flag_def, DEF_SIZE(flag_def), &config->hide_tcp_rst); http_get_enum_var(vars, VAR_SPLIT_MODE, split_def, DEF_SIZE(split_def), &config->split); config_enum_t log_level; if (http_get_enum_var(vars, VAR_LOG_LEVEL, log_level_def, DEF_SIZE(log_level_def), &log_level)) { log_set_level(log_level); } http_get_bool_var(vars, VAR_HIDE_UDP, &config->hide_udp); http_get_enum_var(vars, VAR_GHOST_MODE, ghost_def, DEF_SIZE(ghost_def), &config->ghost); http_get_bool_var(vars, VAR_GHOST_CHECK, &config->ghost_check); http_get_bool_var(vars, VAR_GHOST_SET_TTL, &config->ghost_set_ttl); http_get_int_var(vars, VAR_GHOST_TTL, 0, UINT8_MAX, sizeof(config->ghost_ttl), &config->ghost_ttl); http_get_enum_var(vars, VAR_FRAG_MODE, frag_def, DEF_SIZE(frag_def), &config->fragment); http_get_int_var(vars, VAR_TCP_PORT, 0, UINT16_MAX, sizeof(config->tcp_port), (uint8_t *)&config->tcp_port); const char *tcp_proto_name; if (http_get_string_var(vars, VAR_TCP_PROTO, &tcp_proto_name)) { config->tcp_proto = protocol_get(tcp_proto_name); } http_get_int_var(vars, VAR_UDP_PORT, 0, UINT16_MAX, sizeof(config->udp_port), &config->udp_port); const char *udp_proto_name; if (http_get_string_var(vars, VAR_UDP_PROTO, &udp_proto_name)) { config->udp_proto = protocol_get(udp_proto_name); } http_get_int_var(vars, VAR_MTU, 0, UINT16_MAX, sizeof(config->mtu), (uint8_t *)&config->mtu); http_get_bool_var(vars, VAR_LAUNCH_UI, &config->launch_ui); }
void header_init(struct header_chunk* header, const struct cap_header* cp, int layer){ header->cp = cp; header->protocol = NULL; header->last_net = (struct network){"", "", 0}; header->truncated = 0; header->ptr = NULL; } int header_walk(struct header_chunk* header){ if ( !header->ptr ){ header->protocol = protocol_get(PROTOCOL_ETHERNET); header->ptr = header->cp->payload; if ( limited_caplen(header->cp, header->ptr, header_size(header)) ){ header->truncated = 1; } return 1; } return next_payload(header); } void header_dump(FILE* fp, const struct header_chunk* header, const char* prefix){ if ( !header->protocol->dump ){ fprintf(fp, "%s(not implemented)\n", prefix); return; } if ( header->truncated && !header->protocol->partial_print ){ fprintf(fp, "%s[Packet size limited during capture]\n", prefix); return; } ptr_sanity(header->cp, header->ptr, NULL); header->protocol->dump(fp, header, header->ptr, prefix, 0); } void header_format(FILE* fp, const struct header_chunk* header, int flags){ if ( header->truncated && !header->protocol->partial_print ){ fprintf(fp, ": %s [Packet size limited during capture]", header->protocol->name); return; } if ( !header->protocol->format ){ fprintf(fp, ": %s", header->protocol->name); return; } ptr_sanity(header->cp, header->ptr, NULL); header->protocol->format(fp, header, header->ptr, flags); } size_t header_size(const struct header_chunk* header){ return header->protocol->size_dyn ? header->protocol->size_dyn(header, header->ptr) : header->protocol->size; }
static int next_payload(struct header_chunk* header){ /* stop processing if protocol doesn't define next_payload */ if ( !header->protocol->next_payload ){ return 0; } /* stop if previous header was truncated */ if ( header->truncated ){ return 0; } const char* next = header->ptr; const struct caputils_protocol* current = header->protocol; enum caputils_protocol_type type = current->next_payload(header, header->ptr, &next); header->ptr = next; header->protocol = protocol_get(type); if ( !header->protocol ){ fprintf(stderr, "invalid protocol type %d, make sure protocol is registerd\n", type); abort(); } /* validate payload pointer */ if ( (header->ptr == NULL && type == PROTOCOL_DONE) || limited_caplen(header->cp, header->ptr, 0) ){ header->ptr = NULL; header->truncated = 1; return 0; } /* make sure pointer is actually inside the captured packet (and not pointing at random data because of a corrupted packet) */ ptr_sanity(header->cp, header->ptr, current); /* ensure there is enough data left */ if ( limited_caplen(header->cp, header->ptr, header_size(header)) ){ header->truncated = 1; } return type != PROTOCOL_UNKNOWN && type != PROTOCOL_DONE; }