aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorAllan Stephens <Allan.Stephens@windriver.com>2011-04-20 17:24:07 -0400
committerPaul Gortmaker <paul.gortmaker@windriver.com>2011-05-10 16:03:55 -0400
commit66e019a6af827a254641e83e96ee36b0f4adc5e3 (patch)
tree8a0245a404564b9bcfb01d5378c35714c99240de /net/tipc
parent1f3de471adf5c2a584480a6010808d7a17063897 (diff)
tipc: Strengthen checks for neighboring node discovery
Enhances existing checks on the discovery domain associated with a TIPC bearer. A bearer can no longer be configured to accept links from itself only (which would be pointless), or to nodes outside its own cluster (since multi-cluster support has now been removed from TIPC). Also, the neighbor discovery routine now validates link setup requests against the configured discovery domain for the bearer, rather than simply ensuring the requesting node belongs to the node's own cluster. Signed-off-by: Allan Stephens <Allan.Stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/bearer.c11
-rw-r--r--net/tipc/discover.c7
2 files changed, 14 insertions, 4 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index 411719feb803..f7c29af4ab81 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -493,8 +493,15 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority)
493 warn("Bearer <%s> rejected, illegal name\n", name); 493 warn("Bearer <%s> rejected, illegal name\n", name);
494 return -EINVAL; 494 return -EINVAL;
495 } 495 }
496 if (!tipc_addr_domain_valid(disc_domain) || 496 if (tipc_addr_domain_valid(disc_domain) &&
497 !tipc_in_scope(disc_domain, tipc_own_addr)) { 497 (disc_domain != tipc_own_addr)) {
498 if (tipc_in_scope(disc_domain, tipc_own_addr)) {
499 disc_domain = tipc_own_addr & TIPC_CLUSTER_MASK;
500 res = 0; /* accept any node in own cluster */
501 } else if (in_own_cluster(disc_domain))
502 res = 0; /* accept specified node in own cluster */
503 }
504 if (res) {
498 warn("Bearer <%s> rejected, illegal discovery domain\n", name); 505 warn("Bearer <%s> rejected, illegal discovery domain\n", name);
499 return -EINVAL; 506 return -EINVAL;
500 } 507 }
diff --git a/net/tipc/discover.c b/net/tipc/discover.c
index 491eff56b9da..d2163bd99e59 100644
--- a/net/tipc/discover.c
+++ b/net/tipc/discover.c
@@ -52,6 +52,7 @@
52 * struct link_req - information about an ongoing link setup request 52 * struct link_req - information about an ongoing link setup request
53 * @bearer: bearer issuing requests 53 * @bearer: bearer issuing requests
54 * @dest: destination address for request messages 54 * @dest: destination address for request messages
55 * @domain: network domain to which links can be established
55 * @buf: request message to be (repeatedly) sent 56 * @buf: request message to be (repeatedly) sent
56 * @timer: timer governing period between requests 57 * @timer: timer governing period between requests
57 * @timer_intv: current interval between requests (in ms) 58 * @timer_intv: current interval between requests (in ms)
@@ -59,6 +60,7 @@
59struct link_req { 60struct link_req {
60 struct tipc_bearer *bearer; 61 struct tipc_bearer *bearer;
61 struct tipc_media_addr dest; 62 struct tipc_media_addr dest;
63 u32 domain;
62 struct sk_buff *buf; 64 struct sk_buff *buf;
63 struct timer_list timer; 65 struct timer_list timer;
64 unsigned int timer_intv; 66 unsigned int timer_intv;
@@ -147,7 +149,7 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr)
147 } 149 }
148 if (!tipc_in_scope(dest, tipc_own_addr)) 150 if (!tipc_in_scope(dest, tipc_own_addr))
149 return; 151 return;
150 if (!in_own_cluster(orig)) 152 if (!tipc_in_scope(b_ptr->link_req->domain, orig))
151 return; 153 return;
152 154
153 /* Locate structure corresponding to requesting node */ 155 /* Locate structure corresponding to requesting node */
@@ -287,7 +289,7 @@ static void disc_timeout(struct link_req *req)
287 * tipc_disc_init_link_req - start sending periodic link setup requests 289 * tipc_disc_init_link_req - start sending periodic link setup requests
288 * @b_ptr: ptr to bearer issuing requests 290 * @b_ptr: ptr to bearer issuing requests
289 * @dest: destination address for request messages 291 * @dest: destination address for request messages
290 * @dest_domain: network domain of node(s) which should respond to message 292 * @dest_domain: network domain to which links can be established
291 * 293 *
292 * Returns pointer to link request structure, or NULL if unable to create. 294 * Returns pointer to link request structure, or NULL if unable to create.
293 */ 295 */
@@ -310,6 +312,7 @@ struct link_req *tipc_disc_init_link_req(struct tipc_bearer *b_ptr,
310 312
311 memcpy(&req->dest, dest, sizeof(*dest)); 313 memcpy(&req->dest, dest, sizeof(*dest));
312 req->bearer = b_ptr; 314 req->bearer = b_ptr;
315 req->domain = dest_domain;
313 req->timer_intv = TIPC_LINK_REQ_INIT; 316 req->timer_intv = TIPC_LINK_REQ_INIT;
314 k_init_timer(&req->timer, (Handler)disc_timeout, (unsigned long)req); 317 k_init_timer(&req->timer, (Handler)disc_timeout, (unsigned long)req);
315 k_start_timer(&req->timer, req->timer_intv); 318 k_start_timer(&req->timer, req->timer_intv);