diff options
author | Allan Stephens <Allan.Stephens@windriver.com> | 2011-04-20 17:24:07 -0400 |
---|---|---|
committer | Paul Gortmaker <paul.gortmaker@windriver.com> | 2011-05-10 16:03:55 -0400 |
commit | 66e019a6af827a254641e83e96ee36b0f4adc5e3 (patch) | |
tree | 8a0245a404564b9bcfb01d5378c35714c99240de /net | |
parent | 1f3de471adf5c2a584480a6010808d7a17063897 (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')
-rw-r--r-- | net/tipc/bearer.c | 11 | ||||
-rw-r--r-- | net/tipc/discover.c | 7 |
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 @@ | |||
59 | struct link_req { | 60 | struct 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); |