INSEE 05.04.2011
Interconnection Nertworks Simulation and Evaluation Environment
|
00001 00006 #include "globals.h" 00007 #if (EXECUTION_DRIVEN != 0) 00008 #include <sys/time.h> 00009 #include "list.h" 00010 #include <pthread.h> 00011 #include <netinet/in.h> 00012 00013 //#define SERV_ADDR (8082) 00014 //#define SERV_CENTRAL (8080) 00015 #define DEBUG 2 00016 00017 /* FSIN statistics collection */ 00018 #define CLEAR_STATS 1 00019 #define GET_STATS 2 00020 #define TARG_IP_ADDR "1.2.3.4" 00021 #define TARG_HW_ADDR "11:22:33:44:55:66" 00022 #define IP_ADDR_LEN 4 00023 00024 /* FSIN node latency alteration */ 00025 /*#define PADDING_LATENCY "latency:" 00026 #define PADDING_LATENCY_SIZE 8 00027 #define PADDING_LATENCY_DATA_SIZE 10*/ 00028 00029 char broadcast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 00030 int run_FSIN = 0; 00031 unsigned long long timestamp, timestamp_old = 0, periodo, when = 0; 00032 int sock, escritor, syn_sock; 00033 long num_Simics_hosts = 0; 00034 struct sockaddr_in syn_addr_r, syn_addr_s; 00035 struct ip_mreq mreq; 00036 int SIGPIPE_caught, received_terminate_signal = 0; 00037 pthread_t idHilo; 00038 fd_set lista_sockets; 00039 long FSIN_next_node_number = 0; 00040 long id_next_ethernet_frame = 0; 00041 unsigned long max_id_ethernet_frame; 00042 unsigned short num_bits_packet_sequence; 00043 long mask_eth_id_packet_sequence; 00044 long mask_eth_id_ethernet_frame; 00045 #define PACKET_SIZE_IN_BYTES (packet_size_in_phits * phit_size) 00046 long fsin_cycle_relation; 00047 long simics_cycle_relation; 00048 long fsin_cycle_run; // Ver descripcion en init_exd 00049 long simics_cycle_run; // Ver descripcion en init_exd 00050 #define FSIN_CYCLE_RUN_DEFAULT 10 00051 #define SIMICS_CYCLE_RUN_DEFAULT 100000 00052 #define TV_SEC 10 00053 //long packet_size_in_phits; // Esto es pkt_len 00054 #define FSIN_PORT 12345 00055 #define FSIN_GROUP "225.0.0.37" 00056 long serv_addr; 00057 long num_periodos_espera; 00058 // El porcentaje que determina si un paquete esperara 00059 // num_periodos_espera * periodos en ciclos Simics 00060 #define WAIT_PERCENT 0.00001f 00061 // Tiempos usados para mostrar las estadisticas de FSIN con respecto de Simics 00062 static time_t start_time, end_time; 00063 00064 unsigned long long veces_que_entra_FSIN = 0; 00065 unsigned long long timestamp_init = 0; 00066 unsigned long long timestamp_end = 0; 00067 00068 //Estructura que guarda la informacion de cada conexion relacionada con 00069 //la sincronización guarda MAC y el timestamp que ha enviado 00070 struct sync { 00071 char StationAddress[6]; 00072 unsigned long long timestamp; 00073 }; 00074 list * list_sync = NULL; 00075 00076 //Estructura que guarda la informacion de cada conexion a switch identificada 00077 //por el socket por el que se conecta y la direccion MAC de sus paquetes 00078 struct arp_record { 00079 char StationAddress[6]; 00080 int socket; 00081 struct timeval tiempo; 00082 unsigned long paquetes; 00083 unsigned long FSIN_node_number; 00084 }; 00085 list * lista = NULL; 00086 00087 //Estructura que guarda la informacion de un paquete recibido 00088 struct packet { 00089 char * buffer; //el paquete recibido y ocho bytes por el principio donde se pondra el tiempo 00090 //de espera en la cola de inyeccion de Simics y despues dos bytes por el 00091 //principio vacios para anadir la longitud del paquete 00092 unsigned short length;//longitud del paquete en si 00093 int socket; // por el que ha llegado el paquete 00094 unsigned long long timestamp; // de SIMICS 00095 unsigned long id_ethernet_frame; // identificador que se le asigna a la trama ethernet y que es unico 00096 unsigned short num_packets_to_come; // numero de paquetes que quedan por llegar de la trama 00097 /* Si se tiran phits en algn momento debido a que se llenan los buffers de inyeccion */ 00098 /* habria que hacer una rutina que cada cierto tiempo limpiase de la cola las tramas */ 00099 /* ethernet que estuviesen pendientes de llegar por mas de un tiempo razonable */ 00100 00101 struct FSIN_packet * FSIN_packets; 00102 /* Array de estructuras del tipo struct FSIN_packet que representan los paquetes en */ 00103 /* que se divide a una trama ethernet */ 00104 unsigned short num_FSIN_packets; // el numero de paquetes FSIN en que se ha dividido 00105 // la trama ethernet 00106 unsigned long FSIN_node_source; // El numero de nodo FSIN de donde proviene esta trama ethernet 00107 unsigned long FSIN_node_destination; // El numero de nodo FSIN a donde se mandaran 00108 // los paquetes y phits en que se dividira 00109 // esta trama ethernet 00110 00111 };//8 (periodo * num_periodos_espera), 2 (length), length (buf[ ]) = char * buffer 00112 list * list_packets = NULL; 00113 00114 struct FSIN_packet { 00115 unsigned short number_phits; // numero de phits en que se ha dividido el paquete de FSIN 00116 unsigned char tail_arrived; // indica que el phit que contiene la cola ha llegado 00117 // a su destino 1 TRUE y 0 FALSE 00118 unsigned char packet_generated; // indica que el paquete se ha generado correctamente y no ha tenido que 00119 // esperar para ser generado debido a que el buffer de inyeccion estaba lleno 00120 // 1 TRUE y 0 FALSE 00121 }; 00122 00123 /* Funcion de inicializacion para la Simulacion conducida por la ejecucion */ 00124 /* Parametros: */ 00125 /* long fsin_cycle_relation: relacion de ciclos entre Simics y FSIN, los ciclos que correra FSIN, por defecto es 10 */ 00126 /* long simics_cycle_relation: relacion de ciclos entre Simics y FSIN, los ciclos que correra Simics, por defecto es 1000 */ 00127 /* long packet_size_in_phits: tama� en phits del paquete, un phit son 4 bytes (configurable), por defecto es 32, es pkt_len */ 00128 /* long serv_addr: puerto de escucha de nuevas conexiones de SIMICS hosts, por defecto es 8082 */ 00129 /* long num_periodos_espera: retardo de interconexion que se introducira en el hosts destino. */ 00130 /* Medido en pasos de sincronizacion, por defecto es 0 */ 00131 void init_exd(long, long, long, long, long); 00132 00133 /* Funcion que ejecuta el bucle de recepcion de paquetes de los Simics hosts y */ 00134 /* timestamps del Central y los inyecta en FSIN */ 00135 void run_network_exd(void); 00136 00137 /* Funcion que comprueba si ha llegado un paquete y una trama depues de que haya */ 00138 /* llegado un phit a su destino en FSIN */ 00139 /* Los parametros son el nodo al que ha llegado el phit y el phit en cuestion */ 00140 void SIMICS_phit_away(long, phit); 00141 00142 #endif