summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2013-12-26 01:19:51 +0800
committerLAN-TW <lantw44@gmail.com>2013-12-26 01:19:51 +0800
commite0bda7bda411c995ba89f28193529786982bdb98 (patch)
tree2564bf17099fdaaa1774abd84c6e6585685b8208
parent86f9aa41ca1bdebcf858b4efb7d18aca3ba77d02 (diff)
downloadcn2013-e0bda7bda411c995ba89f28193529786982bdb98.tar.gz
cn2013-e0bda7bda411c995ba89f28193529786982bdb98.tar.zst
cn2013-e0bda7bda411c995ba89f28193529786982bdb98.zip
修正 checksum 計算錯誤以及重傳時可能形成無窮迴圈的問題
-rw-r--r--hw2/ump-pkt.c2
-rw-r--r--hw2/ump-sched.c39
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++;
}
}