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; }
/* 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; }
/* 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); } }