Ejemplo n.º 1
0
/*-----------------------------------------------------------
 *  Mise à jour de toutes les cellules de la grille
 *----------------------------------------------------------*/
int update_cells (struct ctx_s *ctx) {
  int x, y;
  int top, bottom, left, right;
  int update = 0;

  for (x=1; x < ctx->X+1; ++x) {
    for (y=1; y < ctx->Y+1; ++y) {
      int nb_burning = 0;
      left    = x - 1;
      right   = x + 1;
      top     = y - 1;
      bottom  = y + 1;

      update_neighbor(ctx, left,  y, &nb_burning);
      update_neighbor(ctx, right, y, &nb_burning);
      update_neighbor(ctx, x,     top, &nb_burning);
      update_neighbor(ctx, x,     bottom, &nb_burning);
      update += update_self(ctx, x, y, nb_burning);
    }
  }
  return update;
}
Ejemplo n.º 2
0
/*
 * Process an incoming neighbor probe message.
 */
void
accept_probe(u_int32_t src, u_int32_t dst, char *p, int datalen,
             u_int32_t level)
{
    vifi_t vifi;

    if ((vifi = find_vif(src, dst)) == NO_VIF) {
        logit(LOG_INFO, 0,
              "ignoring probe from non-neighbor %s", inet_fmt(src, s1));
        return;
    }

    update_neighbor(vifi, src, DVMRP_PROBE, p, datalen, level);
}
Ejemplo n.º 3
0
static void recv_beacon(nbr_state_t *s, Message *msg)
{
	nbr_beacon_t *pkt = (nbr_beacon_t*)(msg->data);
	uint8_t i;
	uint16_t my_addr = sys_id();
	bool dup;
	nbr_entry_t *nb;
	
	nb = update_neighbor(s, msg->saddr, entohs(pkt->seqno), &dup);
	
	if(nb == NULL) return;
	nb->parent = entohs(pkt->parent);
	nb->hop = pkt->hopcount;
	
	// find out my address, extract the estimation
	for (i = 0; i < pkt->estEntries; i++) {
		if (entohs(pkt->estList[i].id) == my_addr) {
			//DEBUG("found my entry %d\n", pkt->estList[i].receiveEst);
			nb->sendEst = pkt->estList[i].receiveEst;
			nb->liveliness++;
		}
	}
	return;
}
Ejemplo n.º 4
0
/*
 * Process an incoming route report message.
 */
void
accept_report(u_int32_t src, u_int32_t dst, char *p, int datalen,
              u_int32_t level)
{
    vifi_t vifi;
    register int width, i, nrt = 0;
    int metric;
    u_int32_t mask;
    u_int32_t origin;
    struct newrt rt[4096];

    if ((vifi = find_vif(src, dst)) == NO_VIF) {
        logit(LOG_INFO, 0,
              "ignoring route report from non-neighbor %s", inet_fmt(src, s1));
        return;
    }

    if (!update_neighbor(vifi, src, DVMRP_REPORT, NULL, 0, level))
        return;

    if (datalen > 2*4096) {
        logit(LOG_INFO, 0,
              "ignoring oversize (%d bytes) route report from %s",
              datalen, inet_fmt(src, s1));
        return;
    }

    while (datalen > 0) {	/* Loop through per-mask lists. */

        if (datalen < 3) {
            logit(LOG_WARNING, 0,
                  "received truncated route report from %s",
                  inet_fmt(src, s1));
            return;
        }
        ((u_char *)&mask)[0] = 0xff;
        width = 1;
        if ((((u_char *)&mask)[1] = *p++) != 0) width = 2;
        if ((((u_char *)&mask)[2] = *p++) != 0) width = 3;
        if ((((u_char *)&mask)[3] = *p++) != 0) width = 4;
        if (!inet_valid_mask(ntohl(mask))) {
            logit(LOG_WARNING, 0,
                  "%s reports bogus netmask 0x%08x (%s)",
                  inet_fmt(src, s1), ntohl(mask), inet_fmt(mask, s2));
            return;
        }
        datalen -= 3;

        do {			/* Loop through (origin, metric) pairs */
            if (datalen < width + 1) {
                logit(LOG_WARNING, 0,
                      "received truncated route report from %s",
                      inet_fmt(src, s1));
                return;
            }
            origin = 0;
            for (i = 0; i < width; ++i)
                ((char *)&origin)[i] = *p++;
            metric = *p++;
            datalen -= width + 1;
            rt[nrt].mask   = mask;
            rt[nrt].origin = origin;
            rt[nrt].metric = (metric & 0x7f);
            ++nrt;
        } while (!(metric & 0x80));
    }

    qsort((char*)rt, nrt, sizeof(rt[0]), compare_rts);
    start_route_updates();
    /*
     * If the last entry is default, change mask from 0xff000000 to 0
     */
    if (rt[nrt-1].origin == 0)
        rt[nrt-1].mask = 0;

    logit(LOG_DEBUG, 0, "Updating %d routes from %s to %s", nrt,
          inet_fmt(src, s1), inet_fmt(dst, s2));
    for (i = 0; i < nrt; ++i) {
        if (i != 0 && rt[i].origin == rt[i-1].origin &&
                rt[i].mask == rt[i-1].mask) {
            logit(LOG_WARNING, 0, "%s reports duplicate route for %s",
                  inet_fmt(src, s1), inet_fmts(rt[i].origin, rt[i].mask, s2));
            continue;
        }
        update_route(rt[i].origin, rt[i].mask, rt[i].metric,
                     src, vifi);
    }

    if (routes_changed && !delay_change_reports)
        report_to_all_neighbors(CHANGED_ROUTES);
}
Ejemplo n.º 5
0
int32_t read_genome(char* read_genome_fname, uintptr_t unfiltered_indiv_ct, uintptr_t* indiv_exclude, uintptr_t indiv_ct, char* person_ids, uintptr_t max_person_id_len, uintptr_t* cluster_merge_prevented, double* cluster_sdistances, double* mds_plot_dmatrix_copy, uint32_t neighbor_n2, double* neighbor_quantiles, uint32_t* neighbor_qindices, uint32_t* ppc_fail_counts, double min_ppc, uintptr_t cluster_ct, uint32_t* cluster_starts, uint32_t* indiv_to_cluster) {
  unsigned char* wkspace_mark = wkspace_base;
  gzFile gz_infile = NULL;
  uint32_t neighbor_load_quantiles = neighbor_quantiles && cluster_sdistances;
  uint32_t ppc_warning = 0;
  uintptr_t loaded_entry_ct = 0;
  uint32_t ppc_fail = 0;
  char* idbuf = &(tbuf[MAXLINELEN]);
  char* sorted_ids;
  uint32_t* id_map;
  char* bufptr;
  char* fam_id;
  char* indiv_id;
  uint32_t indiv_idx1;
  uint32_t indiv_idx2;
  double cur_ibs;
  double cur_ppc;
  uintptr_t tcoord;
  uint32_t uii;
  int32_t ii;
  int32_t retval;
  retval = sort_item_ids(&sorted_ids, &id_map, unfiltered_indiv_ct, indiv_exclude, unfiltered_indiv_ct - indiv_ct, person_ids, max_person_id_len, 0, 1, strcmp_deref);
  if (retval) {
    goto read_genome_ret_1;
  }
  if (gzopen_checked(&gz_infile, read_genome_fname, "rb")) {
    goto read_genome_ret_OPEN_FAIL;
  }
  tbuf[MAXLINELEN - 1] = ' ';
  // header line
  do {
    if (!gzgets(gz_infile, tbuf, MAXLINELEN)) {
      goto read_genome_ret_READ_FAIL;
    }
    if (!tbuf[MAXLINELEN - 1]) {
      goto read_genome_ret_INVALID_FORMAT_3;
    }
    bufptr = skip_initial_spaces(tbuf);
  } while (is_eoln_kns(*bufptr));
  // a little bit of input validation
  if (memcmp(bufptr, "FID1", 4)) {
    logprint("Error: Invalid --read-genome input file.\n");
    goto read_genome_ret_INVALID_FORMAT;
  }
  while (gzgets(gz_infile, tbuf, MAXLINELEN)) {
    if (!tbuf[MAXLINELEN - 1]) {
      goto read_genome_ret_INVALID_FORMAT_3;
    }
    fam_id = skip_initial_spaces(tbuf);
    if (is_eoln_kns(*fam_id)) {
      continue;
    }
    indiv_id = next_item(fam_id);
    bufptr = next_item_mult(indiv_id, 2);
    if (no_more_items(bufptr)) {
      goto read_genome_ret_INVALID_FORMAT_4;
    }
    ii = bsearch_fam_indiv(idbuf, sorted_ids, max_person_id_len, indiv_ct, fam_id, indiv_id);
    if (ii == -1) {
      continue;
    }
    indiv_idx1 = id_map[(uint32_t)ii];
    fam_id = next_item(indiv_id);
    indiv_id = bufptr;
    ii = bsearch_fam_indiv(idbuf, sorted_ids, max_person_id_len, indiv_ct, fam_id, indiv_id);
    if (ii == -1) {
      continue;
    }
    indiv_idx2 = id_map[(uint32_t)ii];
    if (indiv_idx2 == indiv_idx1) {
      logprint("Error: FID1/IID1 matches FID2/IID2 in --read-genome input file line.\n");
      goto read_genome_ret_INVALID_FORMAT;
    }
    bufptr = next_item_mult(indiv_id, 8); // distance
    fam_id = next_item(bufptr); // repurposed to PPC test value
    if (no_more_items(fam_id)) {
      goto read_genome_ret_INVALID_FORMAT_4;
    }
    if (min_ppc != 0.0) {
      if (sscanf(fam_id, "%lg", &cur_ppc) != 1) {
	logprint("Error: Invalid PPC test value in --read-genome input file.\n");
	goto read_genome_ret_INVALID_FORMAT;
      }
      ppc_fail = (cur_ppc < min_ppc)? 1 : 0;
      if (ppc_fail && ppc_fail_counts) {
	ppc_fail_counts[indiv_idx1] += 1;
	ppc_fail_counts[indiv_idx2] += 1;
      }
    }
    if (sscanf(bufptr, "%lg", &cur_ibs) != 1) {
      logprint("Error: Invalid IBS value in --read-genome input file.\n");
      goto read_genome_ret_INVALID_FORMAT;
    }
    if (neighbor_load_quantiles) {
      update_neighbor(indiv_ct, neighbor_n2, indiv_idx1, indiv_idx2, cur_ibs, neighbor_quantiles, neighbor_qindices);
    }
    loaded_entry_ct++;
    if (cluster_ct) {
      indiv_idx1 = indiv_to_cluster[indiv_idx1];
      indiv_idx2 = indiv_to_cluster[indiv_idx2];
      if (indiv_idx1 == indiv_idx2) {
	if (ppc_fail && (!ppc_warning)) {
	  logprint("Warning: Initial cluster assignment violates PPC test constraint.\n");
	  ppc_warning = 1;
	}
	continue;
      }
    }
    if (indiv_idx2 < indiv_idx1) {
      uii = indiv_idx1;
      indiv_idx1 = indiv_idx2;
      indiv_idx2 = uii;
    }
    tcoord = tri_coord_no_diag(indiv_idx1, indiv_idx2);
    if (ppc_fail) {
      set_bit_ul(cluster_merge_prevented, tcoord);
    }
    if (cluster_sdistances) {
      cluster_sdistances[tcoord] += cur_ibs;
    }
  }
  if (!gzeof(gz_infile)) {
    goto read_genome_ret_READ_FAIL;
  }
  if (loaded_entry_ct != (indiv_ct * (indiv_ct - 1)) / 2) {
    sprintf(logbuf, "Error: %s does not include all individual pairs.\n", read_genome_fname);
    goto read_genome_ret_INVALID_FORMAT_2;
  }
  if (cluster_sdistances) {
    cluster_dist_divide(indiv_ct, cluster_ct, cluster_starts, cluster_sdistances);
  }
  while (0) {
  read_genome_ret_OPEN_FAIL:
    retval = RET_OPEN_FAIL;
    break;
  read_genome_ret_READ_FAIL:
    retval = RET_READ_FAIL;
    break;
  read_genome_ret_INVALID_FORMAT_4:
    sprintf(logbuf, "Error: Fewer entries than expected in %s line.\n", read_genome_fname);
    logprintb();
    retval = RET_INVALID_FORMAT;
    break;
  read_genome_ret_INVALID_FORMAT_3:
    sprintf(logbuf, "Error: Pathologically long line in %s.\n", read_genome_fname);
  read_genome_ret_INVALID_FORMAT_2:
    logprintb();
  read_genome_ret_INVALID_FORMAT:
    retval = RET_INVALID_FORMAT;
    break;
  }
 read_genome_ret_1:
  wkspace_reset(wkspace_mark);
  gzclose_cond(gz_infile);
  return retval;
}