Repository : ssh://git@open-mesh.org/alfred
On branch : master
>---------------------------------------------------------------
commit 08a2de792eee543df06ac3253d59941391a3f2af
Author: Sven Eckelmann <sven(a)narfation.org>
Date: Sat Nov 12 10:25:19 2016 +0100
alfred: Move tx finish functionality in extra function
The process_alfred_status_txend has two main functionalities. It first
tries to find a transaction to be able to get its status. When it was found
then it either commits the data or just cleans it up.
The latter will be used by later by process_alfred_push_data to implement
out-of-order txend packets. Thus split process_alfred_status_txend now into
two functions to avoid code duplication.
Signed-off-by: Sven Eckelmann <sven(a)narfation.org>
Signed-off-by: Simon Wunderlich <sw(a)simonwunderlich.de>
>---------------------------------------------------------------
08a2de792eee543df06ac3253d59941391a3f2af
recv.c | 67 ++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 39 insertions(+), 28 deletions(-)
diff --git a/recv.c b/recv.c
index b6b6eab..6878e5e 100644
--- a/recv.c
+++ b/recv.c
@@ -160,6 +160,44 @@ struct transaction_head *transaction_clean(struct globals *globals,
return head;
}
+static int finish_alfred_transaction(struct globals *globals,
+ struct transaction_head *head,
+ struct ether_addr mac,
+ uint16_t num_packets)
+{
+ struct transaction_packet *transaction_packet, *safe;
+
+ /* this transaction was already finished/dropped */
+ if (head->finished != 0)
+ return -1;
+
+ /* missing packets -> cleanup everything */
+ if (head->num_packet == num_packets)
+ head->finished = -1;
+ else
+ head->finished = 1;
+
+ list_for_each_entry_safe(transaction_packet, safe, &head->packet_list,
+ list) {
+ if (head->finished == 1)
+ finish_alfred_push_data(globals, mac,
+ transaction_packet->push);
+
+ list_del(&transaction_packet->list);
+ free(transaction_packet->push);
+ free(transaction_packet);
+ }
+
+ transaction_clean(globals, head);
+
+ if (head->client_socket < 0)
+ free(head);
+ else
+ unix_sock_req_data_finish(globals, head);
+
+ return 1;
+}
+
static int process_alfred_push_data(struct globals *globals,
struct in6_addr *source,
struct alfred_push_data_v0 *push)
@@ -313,7 +351,6 @@ static int process_alfred_status_txend(struct globals *globals,
struct alfred_status_v0 *request)
{
struct transaction_head search, *head;
- struct transaction_packet *transaction_packet, *safe;
struct ether_addr mac;
int len, ret;
@@ -336,33 +373,7 @@ static int process_alfred_status_txend(struct globals *globals,
if (!head)
return -1;
- /* this transaction was already finished/dropped */
- if (head->finished != 0)
- return -1;
-
- /* missing packets -> cleanup everything */
- if (head->num_packet != ntohs(request->tx.seqno))
- head->finished = -1;
- else
- head->finished = 1;
-
- list_for_each_entry_safe(transaction_packet, safe, &head->packet_list,
- list) {
- if (head->finished == 1)
- finish_alfred_push_data(globals, mac,
- transaction_packet->push);
-
- list_del(&transaction_packet->list);
- free(transaction_packet->push);
- free(transaction_packet);
- }
-
- transaction_clean(globals, head);
-
- if (head->client_socket < 0)
- free(head);
- else
- unix_sock_req_data_finish(globals, head);
+ finish_alfred_transaction(globals, head, mac, ntohs(request->tx.seqno));
return 0;
}