summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Maloy <jon.maloy@ericsson.com>2018-02-15 10:40:47 +0100
committerDavid S. Miller <davem@davemloft.net>2018-02-16 15:26:34 -0500
commit242e82cc95f6b4e83e1771f9915edcb2a63708e1 (patch)
tree00821f92cfc58231f4054d27fe5297b7f36a8836
parent8985ecc7c1e07c42acc1e44ac56fa224f8a5c62f (diff)
tipc: collapse subscription creation functions
After the previous changes it becomes logical to collapse the two-level creation of subscription instances into one. We do that here. We also rename the creation and deletion functions for more consistency. Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/tipc/server.c4
-rw-r--r--net/tipc/server.h1
-rw-r--r--net/tipc/subscr.c46
-rw-r--r--net/tipc/subscr.h14
4 files changed, 22 insertions, 43 deletions
diff --git a/net/tipc/server.c b/net/tipc/server.c
index 5d231fa8e4b5..6a18b10ac271 100644
--- a/net/tipc/server.c
+++ b/net/tipc/server.c
@@ -203,7 +203,7 @@ static void tipc_con_delete_sub(struct tipc_conn *con, struct tipc_subscr *s)
spin_lock_bh(&con->sub_lock);
list_for_each_entry_safe(sub, tmp, sub_list, subscrp_list) {
if (!s || !memcmp(s, &sub->evt.s, sizeof(*s)))
- tipc_sub_delete(sub);
+ tipc_sub_unsubscribe(sub);
else if (s)
break;
}
@@ -278,7 +278,7 @@ static int tipc_con_rcv_sub(struct tipc_server *srv,
tipc_con_delete_sub(con, s);
return 0;
}
- sub = tipc_subscrp_subscribe(srv, s, con->conid);
+ sub = tipc_sub_subscribe(srv, s, con->conid);
if (!sub)
return -1;
diff --git a/net/tipc/server.h b/net/tipc/server.h
index 2de8709b467d..995b79591ffe 100644
--- a/net/tipc/server.h
+++ b/net/tipc/server.h
@@ -2,6 +2,7 @@
* net/tipc/server.h: Include file for TIPC server code
*
* Copyright (c) 2012-2013, Wind River Systems
+ * Copyright (c) 2017, Ericsson AB
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c
index 406b09fc227b..8d37b61e3163 100644
--- a/net/tipc/subscr.c
+++ b/net/tipc/subscr.c
@@ -134,33 +134,29 @@ void tipc_subscrp_get(struct tipc_subscription *subscription)
kref_get(&subscription->kref);
}
-static struct tipc_subscription *tipc_subscrp_create(struct tipc_server *srv,
- struct tipc_subscr *s,
- int conid)
+struct tipc_subscription *tipc_sub_subscribe(struct tipc_server *srv,
+ struct tipc_subscr *s,
+ int conid)
{
struct tipc_net *tn = tipc_net(srv->net);
struct tipc_subscription *sub;
u32 filter = tipc_sub_read(s, filter);
+ u32 timeout;
- /* Refuse subscription if global limit exceeded */
- if (atomic_read(&tn->subscription_count) >= TIPC_MAX_SUBSCRIPTIONS) {
- pr_warn("Subscription rejected, limit reached (%u)\n",
- TIPC_MAX_SUBSCRIPTIONS);
+ if (atomic_read(&tn->subscription_count) >= TIPC_MAX_SUBSCR) {
+ pr_warn("Subscription rejected, max (%u)\n", TIPC_MAX_SUBSCR);
+ return NULL;
+ }
+ if ((filter & TIPC_SUB_PORTS && filter & TIPC_SUB_SERVICE) ||
+ (tipc_sub_read(s, seq.lower) > tipc_sub_read(s, seq.upper))) {
+ pr_warn("Subscription rejected, illegal request\n");
return NULL;
}
-
- /* Allocate subscription object */
sub = kmalloc(sizeof(*sub), GFP_ATOMIC);
if (!sub) {
pr_warn("Subscription rejected, no memory\n");
return NULL;
}
-
- /* Initialize subscription object */
- if (filter & TIPC_SUB_PORTS && filter & TIPC_SUB_SERVICE)
- goto err;
- if (tipc_sub_read(s, seq.lower) > tipc_sub_read(s, seq.upper))
- goto err;
sub->server = srv;
sub->conid = conid;
sub->inactive = false;
@@ -168,24 +164,6 @@ static struct tipc_subscription *tipc_subscrp_create(struct tipc_server *srv,
spin_lock_init(&sub->lock);
atomic_inc(&tn->subscription_count);
kref_init(&sub->kref);
- return sub;
-err:
- pr_warn("Subscription rejected, illegal request\n");
- kfree(sub);
- return NULL;
-}
-
-struct tipc_subscription *tipc_subscrp_subscribe(struct tipc_server *srv,
- struct tipc_subscr *s,
- int conid)
-{
- struct tipc_subscription *sub = NULL;
- u32 timeout;
-
- sub = tipc_subscrp_create(srv, s, conid);
- if (!sub)
- return NULL;
-
tipc_nametbl_subscribe(sub);
timer_setup(&sub->timer, tipc_subscrp_timeout, 0);
timeout = tipc_sub_read(&sub->evt.s, timeout);
@@ -194,7 +172,7 @@ struct tipc_subscription *tipc_subscrp_subscribe(struct tipc_server *srv,
return sub;
}
-void tipc_sub_delete(struct tipc_subscription *sub)
+void tipc_sub_unsubscribe(struct tipc_subscription *sub)
{
tipc_nametbl_unsubscribe(sub);
if (sub->evt.s.timeout != TIPC_WAIT_FOREVER)
diff --git a/net/tipc/subscr.h b/net/tipc/subscr.h
index db80e41bba08..2d35f1046754 100644
--- a/net/tipc/subscr.h
+++ b/net/tipc/subscr.h
@@ -1,7 +1,7 @@
/*
* net/tipc/subscr.h: Include file for TIPC network topology service
*
- * Copyright (c) 2003-2006, Ericsson AB
+ * Copyright (c) 2003-2017, Ericsson AB
* Copyright (c) 2005-2007, 2012-2013, Wind River Systems
* All rights reserved.
*
@@ -39,8 +39,8 @@
#include "server.h"
-#define TIPC_MAX_SUBSCRIPTIONS 65535
-#define TIPC_MAX_PUBLICATIONS 65535
+#define TIPC_MAX_SUBSCR 65535
+#define TIPC_MAX_PUBLICATIONS 65535
struct tipc_subscription;
struct tipc_conn;
@@ -66,10 +66,10 @@ struct tipc_subscription {
spinlock_t lock; /* serialize up/down and timer events */
};
-struct tipc_subscription *tipc_subscrp_subscribe(struct tipc_server *srv,
- struct tipc_subscr *s,
- int conid);
-void tipc_sub_delete(struct tipc_subscription *sub);
+struct tipc_subscription *tipc_sub_subscribe(struct tipc_server *srv,
+ struct tipc_subscr *s,
+ int conid);
+void tipc_sub_unsubscribe(struct tipc_subscription *sub);
int tipc_subscrp_check_overlap(struct tipc_name_seq *seq, u32 found_lower,
u32 found_upper);