/*função responsável por colocar o pacote na fila de envio, utilizado pelo transporte e thread de envio de rotas*/ PUBLIC int net_send(uint16_t dest, byte *data, size_t size, uint8_t protocol) { int node; if(protocol == 0) { node = dest; } else { node = hostreachable(dest); } if(node != 0) { wait_item.dest = dest; wait_item.src = num_global; wait_item.data = data; wait_item.size = size; wait_item.protocol = protocol; wait_item.first_dest_link = node; wait_item.offset = 0; wait_item.ttl = TTL; wait_list_insert(wait_item); return OK; } return ERROR; }
/* si_sem_wait: wait operation on semaphore sem */ void si_sem_wait(si_semaphore *sem) { /* task id */ int task_id; /* disable interrupts */ DISABLE_INTERRUPTS; /* check counter */ if (sem->counter > 0) { /* decrement */ sem->counter--; } else { /* get task_id of running task */ task_id = task_get_task_id_running(); /* remove it from ready list */ ready_list_remove(task_id); /* insert it into the semaphore waiting list */ wait_list_insert( sem->wait_list, WAIT_LIST_SIZE, task_id); /* call schedule */ schedule(); } /* enable interrupts */ ENABLE_INTERRUPTS; }
/*função responsável por colocar o pacote na fila de envio, utilizado recebimento de rotas para repasse*/ PUBLIC void net_resend(datagram_t *datagram) { int node; wait_list_item_t resend; if((node = hostreachable(datagram->dest))!=0) { resend.size = datagram->size; resend.id = datagram->id; resend.offset = datagram->frag; resend.protocol = datagram->protocol; resend.ttl = datagram->ttl; resend.dest = datagram->dest; resend.src = datagram->src; resend.data = datagram->data; resend.first_dest_link = node; wait_list_insert(resend); } }