diff options
author | LAN-TW <lantw44@gmail.com> | 2013-12-26 01:19:51 +0800 |
---|---|---|
committer | LAN-TW <lantw44@gmail.com> | 2013-12-26 01:19:51 +0800 |
commit | e0bda7bda411c995ba89f28193529786982bdb98 (patch) | |
tree | 2564bf17099fdaaa1774abd84c6e6585685b8208 | |
parent | 86f9aa41ca1bdebcf858b4efb7d18aca3ba77d02 (diff) | |
download | cn2013-e0bda7bda411c995ba89f28193529786982bdb98.tar.gz cn2013-e0bda7bda411c995ba89f28193529786982bdb98.tar.zst cn2013-e0bda7bda411c995ba89f28193529786982bdb98.zip |
修正 checksum 計算錯誤以及重傳時可能形成無窮迴圈的問題
-rw-r--r-- | hw2/ump-pkt.c | 2 | ||||
-rw-r--r-- | hw2/ump-sched.c | 39 |
2 files changed, 26 insertions, 15 deletions
diff --git a/hw2/ump-pkt.c b/hw2/ump-pkt.c index babcf34..73a66e5 100644 --- a/hw2/ump-pkt.c +++ b/hw2/ump-pkt.c @@ -15,7 +15,7 @@ uint16_t ump_pkt_calc_checksum (UmpPkt* pkt, bool skip_checksum) { for (int i = 0; i < pkt_len / 2; i++) { if ((i != 16 / 2) || !skip_checksum) { uint16_t checksum_new = checksum + pkt_data[i]; - if (checksum_new > checksum) { + if (checksum_new >= checksum) { checksum = checksum_new; } else { checksum = checksum_new + 1; 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++; } } |