diff options
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/discover.c | 20 | ||||
-rw-r--r-- | net/tipc/node.c | 27 | ||||
-rw-r--r-- | net/tipc/node.h | 6 |
3 files changed, 37 insertions, 16 deletions
diff --git a/net/tipc/discover.c b/net/tipc/discover.c index 933445337fb4..164d08907d6f 100644 --- a/net/tipc/discover.c +++ b/net/tipc/discover.c | |||
@@ -35,7 +35,7 @@ | |||
35 | */ | 35 | */ |
36 | 36 | ||
37 | #include "core.h" | 37 | #include "core.h" |
38 | #include "link.h" | 38 | #include "node.h" |
39 | #include "discover.h" | 39 | #include "discover.h" |
40 | 40 | ||
41 | /* min delay during bearer start up */ | 41 | /* min delay during bearer start up */ |
@@ -125,7 +125,6 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *buf, | |||
125 | { | 125 | { |
126 | struct tipc_net *tn = net_generic(net, tipc_net_id); | 126 | struct tipc_net *tn = net_generic(net, tipc_net_id); |
127 | struct tipc_node *node; | 127 | struct tipc_node *node; |
128 | struct tipc_link *link; | ||
129 | struct tipc_media_addr maddr; | 128 | struct tipc_media_addr maddr; |
130 | struct sk_buff *rbuf; | 129 | struct sk_buff *rbuf; |
131 | struct tipc_msg *msg = buf_msg(buf); | 130 | struct tipc_msg *msg = buf_msg(buf); |
@@ -170,13 +169,10 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *buf, | |||
170 | return; | 169 | return; |
171 | tipc_node_lock(node); | 170 | tipc_node_lock(node); |
172 | node->capabilities = caps; | 171 | node->capabilities = caps; |
173 | link = node->links[bearer->identity].link; | ||
174 | 172 | ||
175 | /* Prepare to validate requesting node's signature and media address */ | 173 | /* Prepare to validate requesting node's signature and media address */ |
176 | sign_match = (signature == node->signature); | 174 | sign_match = (signature == node->signature); |
177 | addr_match = link && !memcmp(&link->media_addr, &maddr, sizeof(maddr)); | 175 | tipc_node_check_dest(node, bearer, &link_up, &addr_match, &maddr); |
178 | link_up = link && tipc_link_is_up(link); | ||
179 | |||
180 | 176 | ||
181 | /* These three flags give us eight permutations: */ | 177 | /* These three flags give us eight permutations: */ |
182 | 178 | ||
@@ -239,16 +235,8 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *buf, | |||
239 | if (accept_sign) | 235 | if (accept_sign) |
240 | node->signature = signature; | 236 | node->signature = signature; |
241 | 237 | ||
242 | if (accept_addr) { | 238 | if (accept_addr && !tipc_node_update_dest(node, bearer, &maddr)) |
243 | if (!link) | 239 | respond = false; |
244 | link = tipc_link_create(node, bearer, &maddr); | ||
245 | if (link) { | ||
246 | memcpy(&link->media_addr, &maddr, sizeof(maddr)); | ||
247 | tipc_link_reset(link); | ||
248 | } else { | ||
249 | respond = false; | ||
250 | } | ||
251 | } | ||
252 | 240 | ||
253 | /* Send response, if necessary */ | 241 | /* Send response, if necessary */ |
254 | if (respond && (mtyp == DSC_REQ_MSG)) { | 242 | if (respond && (mtyp == DSC_REQ_MSG)) { |
diff --git a/net/tipc/node.c b/net/tipc/node.c index db46e5d1d156..06f642abdf38 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -334,6 +334,33 @@ bool tipc_node_is_up(struct tipc_node *n) | |||
334 | return n->active_links[0]; | 334 | return n->active_links[0]; |
335 | } | 335 | } |
336 | 336 | ||
337 | void tipc_node_check_dest(struct tipc_node *n, struct tipc_bearer *b, | ||
338 | bool *link_up, bool *addr_match, | ||
339 | struct tipc_media_addr *maddr) | ||
340 | { | ||
341 | struct tipc_link *l = n->links[b->identity].link; | ||
342 | struct tipc_media_addr *curr = &n->links[b->identity].maddr; | ||
343 | |||
344 | *link_up = l && tipc_link_is_up(l); | ||
345 | *addr_match = l && !memcmp(curr, maddr, sizeof(*maddr)); | ||
346 | } | ||
347 | |||
348 | bool tipc_node_update_dest(struct tipc_node *n, struct tipc_bearer *b, | ||
349 | struct tipc_media_addr *maddr) | ||
350 | { | ||
351 | struct tipc_link *l = n->links[b->identity].link; | ||
352 | struct tipc_media_addr *curr = &n->links[b->identity].maddr; | ||
353 | |||
354 | if (!l) | ||
355 | l = tipc_link_create(n, b, maddr); | ||
356 | if (!l) | ||
357 | return false; | ||
358 | memcpy(&l->media_addr, maddr, sizeof(*maddr)); | ||
359 | memcpy(curr, maddr, sizeof(*maddr)); | ||
360 | tipc_link_reset(l); | ||
361 | return true; | ||
362 | } | ||
363 | |||
337 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr) | 364 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr) |
338 | { | 365 | { |
339 | n_ptr->links[l_ptr->bearer_id].link = l_ptr; | 366 | n_ptr->links[l_ptr->bearer_id].link = l_ptr; |
diff --git a/net/tipc/node.h b/net/tipc/node.h index 320cea313bdc..68579c70748b 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
@@ -92,6 +92,7 @@ struct tipc_node_bclink { | |||
92 | struct tipc_link_entry { | 92 | struct tipc_link_entry { |
93 | struct tipc_link *link; | 93 | struct tipc_link *link; |
94 | u32 mtu; | 94 | u32 mtu; |
95 | struct tipc_media_addr maddr; | ||
95 | }; | 96 | }; |
96 | 97 | ||
97 | /** | 98 | /** |
@@ -143,6 +144,11 @@ struct tipc_node *tipc_node_find(struct net *net, u32 addr); | |||
143 | void tipc_node_put(struct tipc_node *node); | 144 | void tipc_node_put(struct tipc_node *node); |
144 | struct tipc_node *tipc_node_create(struct net *net, u32 addr); | 145 | struct tipc_node *tipc_node_create(struct net *net, u32 addr); |
145 | void tipc_node_stop(struct net *net); | 146 | void tipc_node_stop(struct net *net); |
147 | void tipc_node_check_dest(struct tipc_node *n, struct tipc_bearer *bearer, | ||
148 | bool *link_up, bool *addr_match, | ||
149 | struct tipc_media_addr *maddr); | ||
150 | bool tipc_node_update_dest(struct tipc_node *n, struct tipc_bearer *bearer, | ||
151 | struct tipc_media_addr *maddr); | ||
146 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); | 152 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); |
147 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); | 153 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); |
148 | void tipc_node_link_down(struct tipc_node *n_ptr, int bearer_id); | 154 | void tipc_node_link_down(struct tipc_node *n_ptr, int bearer_id); |