示例#1
0
void add_to_last_es(e_type ev,
		    node peer0, int port0,
		    node peer1, int port1,
		    int cost, char *name)
{
        struct el* tail = g_el->prev;
	bool local_event = false;
  
	assert (tail->es_head);

	// check for re-defined link (for establish)
	// check for local event (for tear-down, update)
	switch (ev) {
		case _es_link:
			// a local event?
			if ((peer0 == get_myid()) || peer1 == get_myid())
				local_event = true;
			break;
		case _ud_link:
			// a local event?
			if (geteventbylink(name))
				local_event = true;
			break;
		case _td_link:
			// a local event?
			if (geteventbylink(name))
				local_event = true;
			break;
		default:
			printf("[es]\t\tUnknown event!\n");
			break;
	}

	if (!local_event) {
		printf("[es]\t Not a local event, skip\n");
		return;
	}

	printf("[es]\t Adding into local event\n");

	{
		struct es* es_tail = (tail->es_head)->prev;
    
		struct es* n_es = (struct es*)
			getmem (sizeof(struct es));
    
		n_es->ev = ev;
		n_es->peer0 = peer0;
		n_es->port0 = port0;
		n_es->peer1 = peer1;
		n_es->port1 = port1;
		n_es->cost = cost;
		n_es->name = (char *)
			getmem(strlen(name)+1);
		strcpy (n_es->name, name);

		InsertDQ (es_tail, n_es);
	}
}
示例#2
0
void * increment_counter(void *arg)
{
    int cpu = get_myid();
    unsigned long myid = (unsigned long)pthread_self();
    //unsigned long myid = tno++;
    
    int i = 0;
    for (i = 0; i < 2; ++i)
    {
        POLL();
        mylock(&L);
        POLL();
        count++;
        POLL();
        myunlock(&L);
        POLL();
        sleep(interval);
                
    }
    POLL();
    sleep(2);   // Sleep to give time for other threads to send messages
    POLL();
    pthread_exit(NULL);
    return NULL;
}
示例#3
0
/*
 * Using node->hostname list to initiailize the routing table
 */
int init_rt_from_n2h()
{
	struct n2h *i;

	for (i = g_n2h->next; i != g_n2h; i= i->next) {
		assert(i);
		if ( i->nid != get_myid() ) {
			// dest, cost, next-hop
			assert(add_rte(i->nid, -1, i->nid));
		}
	}
	return true;
}
示例#4
0
void listenForInput(int *socketSet, int *portSet, int maxDescriptor){
  int running = 1;
  fd_set sockSet;
  int *updated = calloc(256, sizeof(int));
  while(running){
    FD_ZERO(&sockSet);
    
    int updatedSomething = 0;
    int itt = 0;
    while(socketSet[itt] > 0){
      FD_SET(socketSet[itt], &sockSet);
      itt+=1;
    }
    struct timeval selTimeout;
    selTimeout.tv_sec = 3;
    selTimeout.tv_usec = 0;
    
    if(select(maxDescriptor+1, &sockSet, NULL, NULL, &selTimeout) == 0){
      running = 0;
    }
    itt = 0;
    while(socketSet[itt] > 0){	
      if(FD_ISSET(socketSet[itt], &sockSet)){
	struct sockaddr_storage clntAddr;
	socklen_t clntAddrLen = sizeof(clntAddr);
	char rcvd[1032];
	recvfrom(socketSet[itt], rcvd, 1032, 0, 
		 (struct sockaddr *)&clntAddr, &clntAddrLen);
	struct link *tempLs = g_ls->next;
	int sender;
	while(tempLs != g_ls){
	  if(tempLs->sockfd0 == socketSet[itt]){
	    sender = tempLs->peer1;
	  }else if(tempLs->sockfd1 == socketSet[itt]){
	    sender = tempLs->peer0;
	  }
	  tempLs = tempLs->next;
	}
	
	
	short updateSize = rcvd[2];
	int tempItt = 1;
	while(tempItt <= updateSize){
	  int node = rcvd[tempItt*4];
	  if(node == get_myid()){
	    tempItt+=1;
	    continue;
	  }
	  int distance = rcvd[tempItt*4+1];
	  distance <<= 8;
	  distance >>= 8;
	  struct rte *currentBest = find_rte(node);
	  int distanceToSender = find_rte(sender)->c;
	  if(currentBest->c == -1){
	    update_rte(node, distanceToSender+distance, sender);
	    updated[node] = 1;
	    updatedSomething = 1;
	  }else if(distanceToSender+distance < currentBest->c){
	    update_rte(node, distanceToSender+distance, sender);
	    updated[node] = 1;
	    updatedSomething = 1;
	  }else if(currentBest->d== node && currentBest->nh == sender){
	    update_rte(node, distanceToSender+distance, sender);
	    updated[node] = 1;
	    updatedSomething = 1;
	  }
	  tempItt+=1;
	}	
      }
      
      itt+=1;
    } 
    if(updatedSomething){
      runDVA(updated, 0);
    }
  }
}
示例#5
0
void runDVA(int *updated, int isFirst){  
  char *advertise = calloc(1032,1);
  char type = 0x7;
  char version = 0x1;
  short numUpdates = 0;  
  
  char *tempPoint = (char *) &numUpdates;
  advertise[0] = type;
  advertise[1] = version;
  advertise[2] = tempPoint[0];
  advertise[3] = tempPoint[1];
  
  advertise[4] = '\0';
  //Build update
  int itt = 0;
  int entry = 1;
  while(itt < 256){
    if(updated[itt]){
      unsigned char node = itt;
      struct rte* thisRte = find_rte(itt);
      tempPoint = (char *) &thisRte->c;
      advertise[entry*4] = node; 
      advertise[entry*4+1] = tempPoint[0];
      advertise[entry*4+2] = tempPoint[1];
      advertise[entry*4+3] = tempPoint[2];
      
      advertise[entry*4+4] = 0;
      updated[itt] = 0;
      numUpdates +=1;
      tempPoint = (char *)&numUpdates;
      advertise[2] = tempPoint[0];
      advertise[3] = tempPoint[1];
      
      entry+=1;
    }
    itt +=1;
  }
  
  //Create a set of all the sockets on this node 
  int *socketSet = (int *) calloc(256, sizeof(int));
  int *portSet = (int *) calloc(256, sizeof(int));

  //Pointing to the first element of the list of links
  struct link *myLs = g_ls->next;
  	
  itt = 0;
  int maxDescriptor = -1;
  while(myLs->name != NULL){
    if(get_myid() == myLs->peer0){
      socketSet[itt] = myLs->sockfd0;
      portSet[itt] = myLs->port1;
    }else if(get_myid() == myLs->peer1){
      socketSet[itt] = myLs->sockfd1;
      portSet[itt] = myLs->port0;
    }
    if(socketSet[itt] > maxDescriptor){
      maxDescriptor = socketSet[itt];
    }
    
    itt +=1;
    myLs = myLs->next;
  }
  itt = 0;
  
  while(socketSet[itt] >0){
    struct addrinfo *myAddr;
    struct addrinfo hints;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_DGRAM;
    hints.ai_protocol = IPPROTO_UDP;
    
    char *portBuff = calloc(6,1);
    
    
    sprintf(portBuff, "%d", portSet[itt]);
    getaddrinfo("localhost", portBuff, &hints, &myAddr);
    
    sendto(socketSet[itt], advertise,entry*4 , 0, 
	   myAddr->ai_addr,myAddr->ai_addrlen);
    
    itt+=1;
  }

  if(isFirst){
    listenForInput(socketSet, portSet, maxDescriptor);
  }
}
示例#6
0
/*
 * A simple walk of event sets: dispatch and print a event SET every 2 sec
 */
void walk_el(int update_time, int time_between, int verb)
{
  struct el *el;
  struct es *es_hd;
  struct es *es;
  
  assert (g_el->next);
  assert (get_myid >= 0);
  
  print_el();
  
  /* initialize link set, routing table, and routing table */
  create_ls();
  create_rt();
  init_rt_from_n2h();
  
  for (el = g_el->next ; el != g_el ; el = el->next) {
    assert(el);
    es_hd = el->es_head;
    assert (es_hd);
  
    int *updated = (int *) calloc(256, sizeof(int));
    struct es *myCurrES = es_hd->next;
    while(myCurrES->ev != _es_null){
      if(myCurrES->ev == _es_link){
	if(get_myid() == myCurrES->peer0){
	  update_rte(myCurrES->peer1, myCurrES->cost, myCurrES->peer1);
	  updated[myCurrES->peer1] = 1;
	}else{
	  update_rte(myCurrES->peer0, myCurrES->cost, myCurrES->peer0);
	  updated[myCurrES->peer0] = 1;
	}
      }else if(myCurrES->ev == _td_link){
	struct link *linkToTd = find_link(myCurrES->name);
	if(get_myid() == linkToTd->peer0){
	  update_rte(linkToTd->peer1, -1, linkToTd->peer1);
	  updated[myCurrES->peer1] = 1;
	}else{
	  update_rte(linkToTd->peer0, -1, linkToTd->peer0);
	  updated[myCurrES->peer0] = 1;
	}
      }else if(myCurrES->ev == _ud_link){
	struct link *linkToUd = find_link(myCurrES->name);
	if(get_myid() == linkToUd->peer0){
	  update_rte(linkToUd->peer1, myCurrES->cost, linkToUd->peer1);
	  updated[myCurrES->peer1] = 1;
	}else{
	  update_rte(linkToUd->peer0, myCurrES->cost, linkToUd->peer0);
	  updated[myCurrES->peer0] = 1;
	}
      }
      myCurrES = myCurrES->next;
    }    
    
    printf("[es] >>>>>>>>>> Dispatch next event set <<<<<<<<<<<<<\n");
    for (es=es_hd->next ; es!=es_hd ; es=es->next) {
      printf("[es] Dispatching next event ... \n");
      dispatch_event(es);
    }
    runDVA(updated, 1);

    sleep(3);
    printf("[es] >>>>>>> Start dumping data stuctures <<<<<<<<<<<\n");
    print_n2h();
    print_ls();
    print_rt();
  }
}