*/
 
 #include "core.h"
-#include "link.h"
+#include "node.h"
 #include "discover.h"
 
 /* min delay during bearer start up */
 {
        struct tipc_net *tn = net_generic(net, tipc_net_id);
        struct tipc_node *node;
-       struct tipc_link *link;
        struct tipc_media_addr maddr;
        struct sk_buff *rbuf;
        struct tipc_msg *msg = buf_msg(buf);
                return;
        tipc_node_lock(node);
        node->capabilities = caps;
-       link = node->links[bearer->identity].link;
 
        /* Prepare to validate requesting node's signature and media address */
        sign_match = (signature == node->signature);
-       addr_match = link && !memcmp(&link->media_addr, &maddr, sizeof(maddr));
-       link_up = link && tipc_link_is_up(link);
-
+       tipc_node_check_dest(node, bearer, &link_up, &addr_match, &maddr);
 
        /* These three flags give us eight permutations: */
 
        if (accept_sign)
                node->signature = signature;
 
-       if (accept_addr) {
-               if (!link)
-                       link = tipc_link_create(node, bearer, &maddr);
-               if (link) {
-                       memcpy(&link->media_addr, &maddr, sizeof(maddr));
-                       tipc_link_reset(link);
-               } else {
-                       respond = false;
-               }
-       }
+       if (accept_addr && !tipc_node_update_dest(node, bearer, &maddr))
+               respond = false;
 
        /* Send response, if necessary */
        if (respond && (mtyp == DSC_REQ_MSG)) {
 
        return n->active_links[0];
 }
 
+void tipc_node_check_dest(struct tipc_node *n, struct tipc_bearer *b,
+                         bool *link_up, bool *addr_match,
+                         struct tipc_media_addr *maddr)
+{
+       struct tipc_link *l = n->links[b->identity].link;
+       struct tipc_media_addr *curr = &n->links[b->identity].maddr;
+
+       *link_up = l && tipc_link_is_up(l);
+       *addr_match = l && !memcmp(curr, maddr, sizeof(*maddr));
+}
+
+bool tipc_node_update_dest(struct tipc_node *n,  struct tipc_bearer *b,
+                          struct tipc_media_addr *maddr)
+{
+       struct tipc_link *l = n->links[b->identity].link;
+       struct tipc_media_addr *curr = &n->links[b->identity].maddr;
+
+       if (!l)
+               l = tipc_link_create(n, b, maddr);
+       if (!l)
+               return false;
+       memcpy(&l->media_addr, maddr, sizeof(*maddr));
+       memcpy(curr, maddr, sizeof(*maddr));
+       tipc_link_reset(l);
+       return true;
+}
+
 void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr)
 {
        n_ptr->links[l_ptr->bearer_id].link = l_ptr;
 
 struct tipc_link_entry {
        struct tipc_link *link;
        u32 mtu;
+       struct tipc_media_addr maddr;
 };
 
 /**
 void tipc_node_put(struct tipc_node *node);
 struct tipc_node *tipc_node_create(struct net *net, u32 addr);
 void tipc_node_stop(struct net *net);
+void tipc_node_check_dest(struct tipc_node *n, struct tipc_bearer *bearer,
+                         bool *link_up, bool *addr_match,
+                         struct tipc_media_addr *maddr);
+bool tipc_node_update_dest(struct tipc_node *n, struct tipc_bearer *bearer,
+                          struct tipc_media_addr *maddr);
 void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr);
 void tipc_node_detach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr);
 void tipc_node_link_down(struct tipc_node *n_ptr, int bearer_id);