diff options
Diffstat (limited to 'hw2/ump-sched.c')
-rw-r--r-- | hw2/ump-sched.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/hw2/ump-sched.c b/hw2/ump-sched.c index 692ad6e..7ee4e0c 100644 --- a/hw2/ump-sched.c +++ b/hw2/ump-sched.c @@ -111,11 +111,15 @@ static bool check_packet (UmpPkt* pkt, UmpSched* sched, size_t pkt_len) { return true; } +static int get_net_score (UmpSched* sched, int j) { + return sched->conn[j].score - sched->conn[j].sent; +} + static int find_high_score (UmpSched* sched) { int selected = 0; int net_score = INT_MIN; for (int j = 0; j < sched->conn_count; j++) { - int net_score_this = sched->conn[j].score - sched->conn[j].sent; + int net_score_this = get_net_score (sched, j); if (net_score_this > net_score) { net_score = net_score_this; selected = j; @@ -431,8 +435,9 @@ ssize_t ump_sched_send (UmpSched* sched, void* buf, size_t count) { for (int i = 0; i < sched->pkt_count;) { for (int j = 0; j < sched->conn_count; j++) { lbs_logger_format (sched->log, - "agent[%d]: # sent %d # score %d #", - j, sched->conn[j].sent, sched->conn[j].score); + "agent[%d]: # sent %d # score %d # net_score %d", + j, sched->conn[j].sent, sched->conn[j].score, + get_net_score (sched, j)); } xalarm (0, 500000); @@ -449,16 +454,20 @@ ssize_t ump_sched_send (UmpSched* sched, void* buf, size_t count) { sched->conn[sched->pkt_map[i]].score--; int selected = find_high_score (sched); - UmpPkt* pkt = &(sched->pkt[i]); - lbs_logger_format (sched->log, "REsend %s packet #%" PRIu32 - " (agent[%d])", - ump_pkt_show_message (pkt), ump_pkt_get_seq_num (pkt), - selected); - sendto (sched->conn_fd, pkt, - ump_pkt_get_data_offset (pkt) + pkt->app_data_len, 0, - SOCKADDR (&(sched->conn[selected].addr)), - sched->conn[selected].addr_len); - sched->pkt_map[i] = selected; + + for (int k = i; k < sched->pkt_count; k++) { + UmpPkt* pkt = &(sched->pkt[k]); + lbs_logger_format (sched->log, "REsend %s packet #%" PRIu32 + " (agent[%d])", + ump_pkt_show_message (pkt), ump_pkt_get_seq_num (pkt), + selected); + sendto (sched->conn_fd, pkt, + ump_pkt_get_data_offset (pkt) + pkt->app_data_len, 0, + SOCKADDR (&(sched->conn[selected].addr)), + sched->conn[selected].addr_len); + sched->conn[selected].sent++; + sched->pkt_map[k] = selected; + } } continue; } @@ -474,7 +483,9 @@ ssize_t ump_sched_send (UmpSched* sched, void* buf, size_t count) { } uint32_t seq_rel = ump_pkt_get_seq_num (pkt_new) - sched->seq_start; if (seq_rel >= 0 && seq_rel < sched->pkt_count) { - if (seq_rel == i) { + if (seq_rel > i) { + i = seq_rel; + } else if (seq_rel == i) { i++; } } |