e6f414
commit a36602f1e65cd6bace6ed9405b0ce359de4a27d1
e6f414
Author: Miroslav Lichvar <mlichvar@redhat.com>
e6f414
Date:   Thu Jan 3 15:23:54 2019 +0100
e6f414
e6f414
    unicast: limit message rate and grant duration
e6f414
    
e6f414
    Deny service requests with logInterMessagePeriod smaller than -7 (128
e6f414
    packets per second) or larger than 16. This limits the network and CPU
e6f414
    consumption per address and prevents undefined shifts in the calculation
e6f414
    of the interval.
e6f414
    
e6f414
    Also, limit the maximum grant duration to one hour.
e6f414
    
e6f414
    Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
e6f414
e6f414
diff --git a/unicast_service.c b/unicast_service.c
e6f414
index 9c9b95b..c6c17c6 100644
e6f414
--- a/unicast_service.c
e6f414
+++ b/unicast_service.c
e6f414
@@ -31,6 +31,9 @@
e6f414
 #include "unicast_service.h"
e6f414
 #include "util.h"
e6f414
 
e6f414
+#define MIN_LOG_INTER_MESSAGE_PERIOD -7
e6f414
+#define MAX_LOG_INTER_MESSAGE_PERIOD 16
e6f414
+#define MAX_DURATION 3600
e6f414
 #define QUEUE_LEN 16
e6f414
 
e6f414
 struct unicast_client_address {
e6f414
@@ -289,6 +292,15 @@ int unicast_service_add(struct port *p, struct ptp_message *m,
e6f414
 		return SERVICE_DENIED;
e6f414
 	}
e6f414
 
e6f414
+	if (req->logInterMessagePeriod < MIN_LOG_INTER_MESSAGE_PERIOD ||
e6f414
+	    req->logInterMessagePeriod > MAX_LOG_INTER_MESSAGE_PERIOD) {
e6f414
+		return SERVICE_DENIED;
e6f414
+	}
e6f414
+
e6f414
+	if (req->durationField > MAX_DURATION) {
e6f414
+		req->durationField = MAX_DURATION;
e6f414
+	}
e6f414
+
e6f414
 	LIST_FOREACH(itmp, &p->unicast_service->intervals, list) {
e6f414
 		/*
e6f414
 		 * Remember the interval of interest.