Repository : ssh://git@open-mesh.org/alfred
On branch : master
>---------------------------------------------------------------
commit 7bdbe49f371d612a206832d39927048053fd021e
Author: Sven Eckelmann <sven(a)narfation.org>
Date: Sat Nov 12 10:25:22 2016 +0100
alfred: Use expected packet count to finished transactions
The TXEND packet will specify the number of PUSH_DATA packets are required
to finish a transaction. This number has therefore to be stored when a
TXEND packet is receiver to later be able to decide whether the
transaction can be finished or not.
Signed-off-by: Sven Eckelmann <sven(a)narfation.org>
Signed-off-by: Simon Wunderlich <sw(a)simonwunderlich.de>
>---------------------------------------------------------------
7bdbe49f371d612a206832d39927048053fd021e
alfred.h | 8 +++++++-
recv.c | 11 +++++------
unix_sock.c | 2 +-
3 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/alfred.h b/alfred.h
index 9d0f6a6..eb8200c 100644
--- a/alfred.h
+++ b/alfred.h
@@ -71,7 +71,7 @@ struct transaction_head {
struct ether_addr server_addr;
uint16_t id;
uint8_t requested_type;
- uint16_t finished;
+ uint16_t txend_packets;
int num_packet;
int client_socket;
struct timespec last_rx_time;
@@ -161,6 +161,12 @@ struct transaction_head *
transaction_add(struct globals *globals, struct ether_addr mac, uint16_t id);
struct transaction_head *transaction_clean(struct globals *globals,
struct transaction_head *head);
+
+static inline bool transaction_finished(struct transaction_head *head)
+{
+ return head->txend_packets == head->num_packet;
+}
+
/* send.c */
int push_data(struct globals *globals, struct interface *interface,
struct in6_addr *destination, enum data_source max_source_level,
diff --git a/recv.c b/recv.c
index dd0b021..1f56016 100644
--- a/recv.c
+++ b/recv.c
@@ -131,7 +131,7 @@ transaction_add(struct globals *globals, struct ether_addr mac, uint16_t id)
head->server_addr = mac;
head->id = id;
head->requested_type = 0;
- head->finished = 0;
+ head->txend_packets = 0;
head->num_packet = 0;
head->client_socket = -1;
clock_gettime(CLOCK_MONOTONIC, &head->last_rx_time);
@@ -162,16 +162,14 @@ struct transaction_head *transaction_clean(struct globals *globals,
static int finish_alfred_transaction(struct globals *globals,
struct transaction_head *head,
- struct ether_addr mac,
- uint16_t num_packets)
+ struct ether_addr mac)
{
struct transaction_packet *transaction_packet, *safe;
/* finish when all packets received */
- if (head->num_packet != num_packets)
+ if (!transaction_finished(head))
return 0;
- head->finished = 1;
list_for_each_entry_safe(transaction_packet, safe, &head->packet_list,
list) {
finish_alfred_push_data(globals, mac, transaction_packet->push);
@@ -362,7 +360,8 @@ static int process_alfred_status_txend(struct globals *globals,
if (!head)
return -1;
- finish_alfred_transaction(globals, head, mac, ntohs(request->tx.seqno));
+ head->txend_packets = ntohs(request->tx.seqno);
+ finish_alfred_transaction(globals, head, mac);
return 0;
}
diff --git a/unix_sock.c b/unix_sock.c
index 150ad32..edc7e0b 100644
--- a/unix_sock.c
+++ b/unix_sock.c
@@ -276,7 +276,7 @@ int unix_sock_req_data_finish(struct globals *globals,
requested_type = head->requested_type;
id = head->id;
client_sock = head->client_socket;
- if (head->finished != 1)
+ if (!transaction_finished(head))
send_data = 0;
free(head);