INSEE 05.04.2011
Interconnection Nertworks Simulation and Evaluation Environment
C:/cygwin/home/Javier/insee/src/exd.h
Go to the documentation of this file.
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