static int warts_trace_dtree_params(const scamper_file_t *sf, const scamper_trace_t *trace, warts_addrtable_t *table, warts_trace_dtree_t *state) { scamper_trace_dtree_t *dtree = trace->dtree; const warts_var_t *var; int i, max_id = 0; /* unset all the flags possible */ memset(state->flags, 0, trace_dtree_vars_mfb); state->params_len = 0; for(i=0; i<sizeof(trace_dtree_vars)/sizeof(warts_var_t); i++) { var = &trace_dtree_vars[i]; /* not used any more */ if(var->id == WARTS_TRACE_DTREE_LSS_STOP_GID || var->id == WARTS_TRACE_DTREE_GSS_STOP_GID) continue; if((var->id == WARTS_TRACE_DTREE_LSS_STOP && dtree->lss_stop == NULL) || (var->id == WARTS_TRACE_DTREE_LSS_NAME && dtree->lss == NULL) || (var->id == WARTS_TRACE_DTREE_GSS_STOP && dtree->gss_stop == NULL) || (var->id == WARTS_TRACE_DTREE_FLAGS && dtree->flags == 0)) continue; flag_set(state->flags, var->id, &max_id); /* variables that don't have a fixed size */ if(var->id == WARTS_TRACE_DTREE_LSS_STOP) { state->params_len += warts_addr_size(table, dtree->lss_stop); continue; } else if(var->id == WARTS_TRACE_DTREE_LSS_NAME) { state->params_len += warts_str_size(dtree->lss); continue; } else if(var->id == WARTS_TRACE_DTREE_GSS_STOP) { state->params_len += warts_addr_size(table, dtree->gss_stop); continue; } assert(var->size != -1); state->params_len += var->size; } state->flags_len = fold_flags(state->flags, max_id); state->len = state->flags_len + state->params_len; if(state->params_len != 0) state->len += 2 ; return 0; }
static void warts_neighbourdisc_params(const scamper_neighbourdisc_t *nd, warts_addrtable_t *table, uint8_t *flags, uint16_t *flags_len, uint16_t *params_len) { int i, max_id = 0; const warts_var_t *var; memset(flags, 0, neighbourdisc_vars_mfb); *params_len = 0; for(i=0; i<sizeof(neighbourdisc_vars)/sizeof(warts_var_t); i++) { var = &neighbourdisc_vars[i]; if(var->id == WARTS_NEIGHBOURDISC_LIST && nd->list == NULL) continue; else if(var->id == WARTS_NEIGHBOURDISC_CYCLE && nd->cycle == NULL) continue; else if(var->id == WARTS_NEIGHBOURDISC_USERID && nd->userid == 0) continue; else if(var->id == WARTS_NEIGHBOURDISC_IFNAME && nd->ifname == NULL) continue; else if(var->id == WARTS_NEIGHBOURDISC_SRC_IP && nd->src_ip == NULL) continue; else if(var->id == WARTS_NEIGHBOURDISC_SRC_MAC && nd->src_mac == NULL) continue; else if(var->id == WARTS_NEIGHBOURDISC_DST_IP && nd->dst_ip == NULL) continue; else if(var->id == WARTS_NEIGHBOURDISC_DST_MAC && nd->dst_mac == NULL) continue; else if(var->id == WARTS_NEIGHBOURDISC_PROBEC && nd->probec == 0) continue; flag_set(flags, var->id, &max_id); if(var->size < 0) { if(var->id == WARTS_NEIGHBOURDISC_SRC_IP) *params_len += warts_addr_size(table, nd->src_ip); else if(var->id == WARTS_NEIGHBOURDISC_SRC_MAC) *params_len += warts_addr_size(table, nd->src_mac); else if(var->id == WARTS_NEIGHBOURDISC_DST_IP) *params_len += warts_addr_size(table, nd->dst_ip); else if(var->id == WARTS_NEIGHBOURDISC_DST_MAC) *params_len += warts_addr_size(table, nd->dst_mac); else if(var->id == WARTS_NEIGHBOURDISC_IFNAME) *params_len += warts_str_size(nd->ifname); continue; } assert(var->size >= 0); *params_len += var->size; } *flags_len = fold_flags(flags, max_id); return; }
static void warts_tbit_app_http_params(const scamper_tbit_t *tbit, warts_tbit_app_http_t *state) { scamper_tbit_app_http_t *http = tbit->app_data; const warts_var_t *var; int i, max_id = 0; /* unset all the flags possible */ memset(state->flags, 0, tbit_app_http_vars_mfb); state->params_len = 0; for(i=0; i<sizeof(tbit_app_http_vars)/sizeof(warts_var_t); i++) { var = &tbit_app_http_vars[i]; if(var->id == WARTS_TBIT_APP_HTTP_HOST && http->host == NULL) continue; if(var->id == WARTS_TBIT_APP_HTTP_FILE && http->file == NULL) continue; flag_set(state->flags, var->id, &max_id); if(var->size < 0) { if(var->id == WARTS_TBIT_APP_HTTP_HOST) state->params_len += warts_str_size(http->host); else if(var->id == WARTS_TBIT_APP_HTTP_FILE) state->params_len += warts_str_size(http->file); continue; } assert(var->size >= 0); state->params_len += var->size; } state->flags_len = fold_flags(state->flags, max_id); state->len = state->flags_len + state->params_len; if(state->params_len != 0) state->len += 2; return; }