示例#1
0
static int warts_trace_hop_read(scamper_trace_hop_t *hop, warts_state_t *state,
				warts_addrtable_t *table,
				const uint8_t *buf,uint32_t *off,uint32_t len)
{
  warts_param_reader_t handlers[] = {
    {&hop->hop_addr,       (wpr_t)extract_addr_gid,              state},
    {&hop->hop_probe_ttl,  (wpr_t)extract_byte,                  NULL},
    {&hop->hop_reply_ttl,  (wpr_t)extract_byte,                  NULL},
    {&hop->hop_flags,      (wpr_t)extract_byte,                  NULL},
    {&hop->hop_probe_id,   (wpr_t)warts_trace_hop_read_probe_id, NULL},
    {&hop->hop_rtt,        (wpr_t)extract_rtt,                   NULL},
    {hop,                  (wpr_t)warts_trace_hop_read_icmp_tc,  NULL},
    {&hop->hop_probe_size, (wpr_t)extract_uint16,                NULL},
    {&hop->hop_reply_size, (wpr_t)extract_uint16,                NULL},
    {&hop->hop_reply_ipid, (wpr_t)extract_uint16,                NULL},
    {&hop->hop_reply_tos,  (wpr_t)extract_byte,                  NULL},
    {&hop->hop_icmp_nhmtu, (wpr_t)extract_uint16,                NULL},
    {&hop->hop_icmp_q_ipl, (wpr_t)extract_uint16,                NULL},
    {&hop->hop_icmp_q_ttl, (wpr_t)extract_byte,                  NULL},
    {&hop->hop_tcp_flags,  (wpr_t)extract_byte,                  NULL},
    {&hop->hop_icmp_q_tos, (wpr_t)extract_byte,                  NULL},
    {hop,                  (wpr_t)warts_trace_hop_read_icmpext,  NULL},
    {&hop->hop_addr,       (wpr_t)extract_addr,                  table},
    {&hop->hop_tx,         (wpr_t)extract_timeval,               NULL},
  };
  const int handler_cnt = sizeof(handlers)/sizeof(warts_param_reader_t);
  uint32_t o = *off;
  int rc;

  if((rc = warts_params_read(buf, off, len, handlers, handler_cnt)) != 0)
    return rc;

  if(hop->hop_addr == NULL)
    return -1;
  if(hop->hop_probe_ttl == 0)
    return -1;

  if(SCAMPER_TRACE_HOP_IS_ICMP_Q(hop))
    {
      if(flag_isset(&buf[o], WARTS_TRACE_HOP_Q_IPTTL) == 0)
	hop->hop_icmp_q_ttl = 1;
      if(flag_isset(&buf[o], WARTS_TRACE_HOP_Q_IPLEN) == 0)
	hop->hop_icmp_q_ipl = hop->hop_probe_size;
    }

  return 0;
}
示例#2
0
static void warts_trace_hop_params(const scamper_trace_t *trace,
				   const scamper_trace_hop_t *hop,
				   warts_addrtable_t *table, uint8_t *flags,
				   uint16_t *flags_len, uint16_t *params_len)
{
  scamper_icmpext_t *ie;
  const warts_var_t *var;
  int i, max_id = 0;

  /* unset all the flags possible */
  memset(flags, 0, hop_vars_mfb);
  *params_len = 0;

  for(i=0; i<sizeof(hop_vars)/sizeof(warts_var_t); i++)
    {
      var = &hop_vars[i];

      /* not used any more */
      if(var->id == WARTS_TRACE_HOP_ADDR_GID)
	continue;

      if(var->id == WARTS_TRACE_HOP_ADDR)
	{
	  if(hop->hop_addr == NULL)
	    continue;
	}
      else if(var->id == WARTS_TRACE_HOP_TCP_FLAGS)
	{
	  if(SCAMPER_TRACE_HOP_IS_TCP(hop) == 0)
	    continue;
	}
      else if(var->id == WARTS_TRACE_HOP_ICMP_TC)
	{
	  if(SCAMPER_TRACE_HOP_IS_ICMP(hop) == 0)
	    continue;
	}
      else if(var->id == WARTS_TRACE_HOP_Q_IPLEN)
	{
	  if(SCAMPER_TRACE_HOP_IS_ICMP_Q(hop) == 0)
	    continue;
	  if(hop->hop_icmp_q_ipl == trace->probe_size)
	    continue;
	}
      else if(var->id == WARTS_TRACE_HOP_Q_IPTTL)
	{
	  if(SCAMPER_TRACE_HOP_IS_ICMP_Q(hop) == 0)
	    continue;
	  if(hop->hop_icmp_q_ttl == 1)
	    continue;
	}
      else if(var->id == WARTS_TRACE_HOP_Q_IPTOS)
	{
	  if(SCAMPER_TRACE_HOP_IS_ICMP_Q(hop) == 0)
	    continue;
	  if(hop->hop_addr->type != SCAMPER_ADDR_TYPE_IPV4)
	    continue;
	}
      else if(var->id == WARTS_TRACE_HOP_NHMTU)
	{
	  if(SCAMPER_TRACE_HOP_IS_ICMP_PTB(hop) == 0)
	    continue;
	}
      else if(var->id == WARTS_TRACE_HOP_ICMPEXT)
	{
	  if(hop->hop_icmpext == NULL)
	    continue;
	}
      else if(var->id == WARTS_TRACE_HOP_REPLY_IPID)
	{
	  if(hop->hop_reply_ipid == 0)
	    continue;
	}
      else if(var->id == WARTS_TRACE_HOP_TX)
	{
	  if(hop->hop_tx.tv_sec == 0)
	    continue;
	}

      flag_set(flags, var->id, &max_id);

      if(var->id == WARTS_TRACE_HOP_ADDR)
	{
	  *params_len += warts_addr_size(table, hop->hop_addr);
	}
      else if(var->id == WARTS_TRACE_HOP_ICMPEXT)
	{
	  *params_len += 2;
	  for(ie = hop->hop_icmpext; ie != NULL; ie = ie->ie_next)
	    *params_len += (2 + 1 + 1 + ie->ie_dl);
	}
      else
	{
	  assert(var->size >= 0);
	  *params_len += var->size;
	}
    }

  *flags_len = fold_flags(flags, max_id);
  return;
}
static char *hop_tostr(const scamper_trace_t *trace,
                       scamper_trace_hop_t *hop) {

  char buf[512], tmp[128];
  size_t off = 0;

  string_concat(buf, sizeof(buf), &off, "SCAMPER.%s", SCAMPER_VERSION);

  /* by DEFAULT 0; but can be changed using -U, perhaps a SK unit id */
  string_concat(buf, sizeof(buf), &off, ";%u", trace->userid);
  string_concat(buf, sizeof(buf), &off, ";%u", trace->start.tv_sec);

  /*strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", localtime(&tt));*/
  /*string_concat(buf, sizeof(buf), &off,*/
		/*", \"start\":{\"sec\":%u, \"usec\":%u, \"ftime\":\"%s\"}",*/
		/*trace->start.tv_sec, trace->start.tv_usec, tmp);*/

  string_concat(buf, sizeof(buf), &off, ";%s", scamper_addr_tostr(trace->src,
        tmp, sizeof(tmp)));

  string_concat(buf, sizeof(buf), &off, ";%s", scamper_addr_tostr(trace->dst,
        tmp, sizeof(tmp)));

  const char *ptr;
  if((ptr = scamper_trace_type_tostr(trace)) != NULL)
    string_concat(buf, sizeof(buf), &off, ";%s", ptr);
  else
    string_concat(buf, sizeof(buf), &off, ";%u", trace->type);

  /*if(SCAMPER_TRACE_TYPE_IS_UDP(trace) || SCAMPER_TRACE_TYPE_IS_TCP(trace))*/
    /*string_concat(buf, sizeof(buf), &off, ";%u;%u", trace->sport,*/
        /*trace->dport);*/
  /*else if(trace->flags & SCAMPER_TRACE_FLAG_ICMPCSUMDP)*/
    /*string_concat(buf, sizeof(buf), &off, ";%u", trace->dport);*/

  string_concat(buf, sizeof(buf), &off, ";%s",
      stop_reason_tostr(trace->stop_reason, tmp, sizeof(tmp)));

  /*string_concat(buf, sizeof(buf), &off, "%u", trace->stop_data);*/

  string_concat(buf, sizeof(buf), &off, ";%u", hop->hop_probe_ttl);

  string_concat(buf, sizeof(buf), &off,	";%s",
      scamper_addr_tostr(hop->hop_addr, tmp, sizeof(tmp)));

  /*string_concat(buf, sizeof(buf), &off, ";%u;%u", hop->hop_probe_id,*/
      /*hop->hop_probe_size);*/

  string_concat(buf, sizeof(buf), &off, ";%s", timeval_tostr(&hop->hop_rtt,
        tmp, sizeof(tmp)));

  /*string_concat(buf, sizeof(buf), &off, ";%u;%u;%u", hop->hop_reply_ttl,*/
      /*hop->hop_reply_tos, hop->hop_reply_size);*/

  /*string_concat(buf, sizeof(buf), &off,	";%u", hop->hop_reply_ipid);*/

  if(SCAMPER_TRACE_HOP_IS_ICMP(hop)) {

    /*string_concat(buf, sizeof(buf), &off, ";%u;%u", hop->hop_icmp_type,*/
        /*hop->hop_icmp_code);*/

    if(SCAMPER_TRACE_HOP_IS_ICMP_Q(hop)) {

      /*string_concat(buf, sizeof(buf), &off, ";%u;%u", hop->hop_icmp_q_ttl,*/
          /*hop->hop_icmp_q_ipl);*/

      /*if(SCAMPER_ADDR_TYPE_IS_IPV4(hop->hop_addr))*/
        /*string_concat(buf, sizeof(buf), &off, ";%u", hop->hop_icmp_q_tos);*/
    }

    /*if(SCAMPER_TRACE_HOP_IS_ICMP_PTB(hop))*/
        /*string_concat(buf, sizeof(buf), &off, "%u", hop->hop_icmp_nhmtu);*/
  }
  else {
    /*string_concat(buf, sizeof(buf), &off, ";%u", hop->hop_tcp_flags); */
  }

  /*string_concat(buf, sizeof(buf), &off,*/
		/*", \"hop_count\":%u, \"attempts\":%u, \"hoplimit\":%u",*/
		/*trace->hop_count, trace->attempts, trace->hoplimit);*/

  /*string_concat(buf, sizeof(buf), &off,*/
		/*", \"firsthop\":%u, \"wait\":%u, \"wait_probe\":%u",*/
		/*trace->firsthop, trace->wait, trace->wait_probe);*/

  /*string_concat(buf, sizeof(buf), &off,	", \"tos\":%u, \"probe_size\":%u",*/
		/*trace->tos, trace->probe_size);*/

  string_concat(buf, sizeof(buf), &off,	"\n", NULL);
  return strdup(buf);
}