char *new_packet(int proto, int option, int *size) { char *packet = NULL; int packet_size = 0; char padding_offset = 0; int padding_len = 0; switch (proto) { case IPPROTO_TCP: packet_size = sizeof(struct iphdr) + sizeof(struct tcphdr); break; case IPPROTO_UDP: packet_size = sizeof(struct iphdr) + sizeof(struct udphdr); break; case IPPROTO_ICMP: packet_size = sizeof(struct iphdr) + sizeof(struct icmphdr); break; default: warn("this protocal is unsupported"); *size = 0; return NULL; } if (option & PACK_PADDING) { padding_len = get_rand_int(MAX_PADDING_LEN); padding_len = padding_len - padding_len % (sizeof(int)); padding_offset = packet_size; packet_size += padding_len; } packet = safe_malloc(packet_size); if (option & PACK_PADDING) { fill_buf_rand(packet + padding_offset, padding_len); } *size = packet_size; return packet; }
int find_min_cut(int **adj_list, int *lengths, int adj_list_len) { int nodes_num = adj_list_len; while(nodes_num > 2) { int node_1, node_2; do { node_1 = get_rand_int(adj_list_len); } while(lengths[node_1] == 0); node_2 = adj_list[node_1][ get_rand_int(lengths[node_1]) ]; merge_nodes(adj_list, lengths, adj_list_len, node_1, node_2); --nodes_num; } /* find cut */ int i; for(i = 0; lengths[i] == 0; ++i) ; return lengths[i]; }
/*get non-negative integer values with a given sum*/ std::vector<double> get_rand_int_with_sum(int num, int sum) { std::vector<double> result(num,0); int t_sum = sum; for(int i = 0; i < num; i++){ int value = get_rand_int(0, t_sum); t_sum -= value; if(t_sum >= 0) result[i] = value; else break; } return result; }