Procházet zdrojové kódy

Added possibility to also limit subscriptions per session

It will also be possible to limit monitoredItems per subscription.
Jonas Green před 5 roky
rodič
revize
a9a9e2aa1a

+ 2 - 0
include/open62541/server_config.h

@@ -151,6 +151,7 @@ struct UA_ServerConfig {
 
     /* Limits for Subscriptions */
     UA_UInt32 maxSubscriptions;
+    UA_UInt32 maxSubscriptionsPerSession;
     UA_DurationRange publishingIntervalLimits; /* in ms (must not be less than 5) */
     UA_UInt32Range lifeTimeCountLimits;
     UA_UInt32Range keepAliveCountLimits;
@@ -163,6 +164,7 @@ struct UA_ServerConfig {
 
     /* Limits for MonitoredItems */
     UA_UInt32 maxMonitoredItems;
+    UA_UInt32 maxMonitoredItemsPerSubscription;
     UA_DurationRange samplingIntervalLimits; /* in ms (must not be less than 5) */
     UA_UInt32Range queueSizeLimits; /* Negotiated with the client */
 

+ 9 - 4
src/server/ua_services_subscription.c

@@ -69,8 +69,10 @@ Service_CreateSubscription(UA_Server *server, UA_Session *session,
                            const UA_CreateSubscriptionRequest *request,
                            UA_CreateSubscriptionResponse *response) {
     /* Check limits for the number of subscriptions */
-    if((server->config.maxSubscriptions != 0) &&
-       (server->numSubscriptions >= server->config.maxSubscriptions)) {
+    if(((server->config.maxSubscriptions != 0) &&
+        (server->numSubscriptions >= server->config.maxSubscriptions)) ||
+       ((server->config.maxSubscriptionsPerSession != 0) &&
+        (session->numSubscriptions >= server->config.maxSubscriptionsPerSession))) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADTOOMANYSUBSCRIPTIONS;
         return;
     }
@@ -280,8 +282,11 @@ Operation_CreateMonitoredItem(UA_Server *server, UA_Session *session, struct cre
                               const UA_MonitoredItemCreateRequest *request,
                               UA_MonitoredItemCreateResult *result) {
     /* Check available capacity */
-    if(server->config.maxMonitoredItems != 0 && cmc->sub &&
-       server->numMonitoredItems >= server->config.maxMonitoredItems) {
+    if(cmc->sub &&
+       (((server->config.maxMonitoredItems != 0) &&
+         (server->numMonitoredItems >= server->config.maxMonitoredItems)) ||
+        ((server->config.maxMonitoredItemsPerSubscription != 0) &&
+         (cmc->sub->monitoredItemsSize >= server->config.maxMonitoredItemsPerSubscription)))) {
         result->statusCode = UA_STATUSCODE_BADTOOMANYMONITOREDITEMS;
         return;
     }