void simulation_evaluation::run_random_fault_injection_simulation(int sim_num, int fault_num) {
	vector<bool> input_vector(input_num, false);
	sim->generate_fault_list();
	sim->inject_faults(0, RESET);
	while (sim_num > 0) {
		sim->generate_input_vector(input_vector, RANDOM);
		sim->run_fault_injection_simulation(fault_num, &input_vector);
		summarize_fault_injection_results(fault_num);
		sim_num--;
	}
	return;
}
void simulation_evaluation::run_exhaustive_golden_simulation() {
	long sim_num = (long)pow((double)2, (double)input_num);
	long round_num;
	vector<StatNode>::iterator ite;
	vector<bool>::const_iterator v_ite;
	vector<bool> input_vector(input_num, false);
	bitset<MAX_PARALLEL_NUM> res;

	while (sim_num > 0) {
		round_num = (sim_num > MAX_PARALLEL_NUM) ? MAX_PARALLEL_NUM : sim_num;
		sim_num -= MAX_PARALLEL_NUM;
		sim->run_golden_simulation(round_num, false, &input_vector);
		summarize_golden_results(round_num);		
	}
	return;
}
Beispiel #3
0
/* Forward a packet */
static void ethsw_forward(ethsw_table_t *t,ethsw_packet_t *sp)
{
   n_eth_hdr_t *hdr = (n_eth_hdr_t *)sp->pkt;
   ethsw_input_vector_t input_vector;
   ethsw_mac_entry_t *entry;
   u_int h_index;

   /* Learn the source MAC address */
   h_index = ethsw_hash_index(&hdr->saddr,sp->input_vlan);
   entry = &t->mac_addr_table[h_index];

   entry->nio      = sp->input_port;
   entry->vlan_id  = sp->input_vlan;
   entry->mac_addr = hdr->saddr;

   /* If we have a broadcast/multicast packet, flood it */
   if (eth_addr_is_mcast(&hdr->daddr)) {
      ethsw_debug(t,"multicast dest, flooding packet.\n");
      ethsw_flood(t,sp);
      return;
   }

   /* Lookup on the destination MAC address (unicast) */
   h_index = ethsw_hash_index(&hdr->daddr,sp->input_vlan);
   entry = &t->mac_addr_table[h_index];

   /* If the dest MAC is unknown, flood the packet */
   if (memcmp(&entry->mac_addr,&hdr->daddr,N_ETH_ALEN) ||
       (entry->vlan_id != sp->input_vlan))
   {
      ethsw_debug(t,"unknown dest, flooding packet.\n");
      ethsw_flood(t,sp);
      return;
   }

   /* Forward the packet to the output port only */
   if (entry->nio != sp->input_port) {
      input_vector = sp->input_port->vlan_input_vector;
      assert(input_vector != NULL);
      input_vector(t,sp,entry->nio);
   } else {
      ethsw_debug(t,"source and dest ports identical, dropping.\n");
   }
}
void simulation_evaluation::run_exhaustive_fault_injection_simulation() {
	long sim_num = (long)pow((double)2, (double)input_num);
	vector<bool> input_vector(input_num, false);
	int target_num;
	int fault_num;
	sim->generate_fault_list();
	sim->generate_input_vector(input_vector, RESET);
	sim->inject_faults(0, RESET);
	while (sim_num > 0) {
		target_num = sim->get_fault_candidate_size();
		while (target_num > 0) {
			fault_num = (target_num > MAX_PARALLEL_NUM) ? MAX_PARALLEL_NUM : target_num;
			sim->run_fault_injection_simulation(fault_num, &input_vector, false);
			summarize_fault_injection_results(fault_num);
			target_num -= MAX_PARALLEL_NUM;
		}
		sim->generate_input_vector(input_vector, SEQUENCE);
		sim_num--;
	}
	return;
}
Beispiel #5
0
/* Flood a packet */
static void ethsw_flood(ethsw_table_t *t,ethsw_packet_t *sp)
{
   ethsw_input_vector_t input_vector;
   netio_desc_t *op;
   int i;

   input_vector = sp->input_port->vlan_input_vector;
   assert(input_vector != NULL);

   for(i=0;i<ETHSW_MAX_NIO;i++) {
      op = t->nio[i];

      if (!op || (op == sp->input_port))
         continue;

      /* skip output port configured in access mode with a different vlan */
      if ((op->vlan_port_type == ETHSW_PORT_TYPE_ACCESS) &&
          (op->vlan_id != sp->input_vlan))
         continue;

      /* send the packet to the output port */
      input_vector(t,sp,op);
   }
}