From ab3086c6bcea9eaa4f3d155fdb593e6336d5fd17 Mon Sep 17 00:00:00 2001
From: Filip Matusiak <filip.matusiak@iopsys.eu>
Date: Wed, 23 Apr 2025 09:37:16 +0200
Subject: [PATCH] assoc ctrl: Remove outdated entries from file

---
 src/assoc_ctrl.c | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/src/assoc_ctrl.c b/src/assoc_ctrl.c
index 54ec5aef4..a2809ec27 100644
--- a/src/assoc_ctrl.c
+++ b/src/assoc_ctrl.c
@@ -250,7 +250,7 @@ struct rsta {
 	uint16_t validity;
 };
 
-int assoc_ctrl_read_restrictions(struct agent *a, uint8_t *bssid,
+static int assoc_ctrl_read_restrictions(struct agent *a, uint8_t *bssid,
 			struct rsta *fr, int *num_fr)
 {
 	struct blob_buf bssids = { 0 };
@@ -331,7 +331,6 @@ int assoc_ctrl_read_restrictions(struct agent *a, uint8_t *bssid,
 				fr[*num_fr].validity = 0;
 			} else {
 				fr[*num_fr].validity = duration - elapsed;
-				/* TODO: remove outdated entry from file */
 			}
 
 			(*num_fr)++;
@@ -344,6 +343,30 @@ out:
 	return ret;
 }
 
+static void assoc_ctrl_rem_neg_validity(struct agent *a, uint8_t *bssid,
+			struct rsta *fr, int *num_fr)
+{
+	int i;
+
+	for (i = 0; i < *num_fr; i++) {
+		if (fr[i].validity < 0) {
+			int j;
+
+			/* remove from file */
+			assoc_ctrl_update_restrict_file(bssid, fr[i].macaddr,
+					0, ASSOC_CTRL_UNBLOCK);
+			/* remove fr[i] from fr */
+			for (j = i; j < *num_fr - 1; j++)
+				memcpy(&fr[j], &fr[j + 1], sizeof(struct rsta));
+			memset(&fr[*num_fr - 1], 0, sizeof(struct rsta));
+			/* decrease num_fr */
+			(*num_fr)--;
+			/* decrease i */
+			i--;
+		}
+	}
+}
+
 static void agent_disconnect_stas(struct agent *a, int num_sta,
 		uint8_t sta_macs[][6], struct netif_ap *ap)
 {
@@ -576,11 +599,14 @@ int assoc_ctrl_sync_from_file(struct agent *a, struct netif_ap *ap)
 	struct restrict_sta_entry *s = NULL;
 	int ret = 0;
 
-	/* Read STA restrictions from file list */
+	/* Read STA restrictions from file */
 	ret = assoc_ctrl_read_restrictions(a, ap->bssid, fr, &num_fr);
 	if (ret)
 		return ret;
 
+	/* Remove all outdated entries from file */
+	assoc_ctrl_rem_neg_validity(a, ap->bssid, fr, &num_fr);
+
 	/* 1. Add/Update STAs: file list -> runtime list */
 	if (num_fr > 0)
 		ret |= assoc_ctrl_add_sta(a, ap, num_fr, fr, false);
-- 
GitLab