}
 
 /*
- * tipc_nametbl_translate - translate name to port id
+ * tipc_nametbl_translate - perform name translation
  *
- * Note: on entry 'destnode' is the search domain used during translation;
- *       on exit it passes back the node address of the matching port (if any)
+ * On entry, 'destnode' is the search domain used during translation.
+ *
+ * On exit:
+ * - if name translation is deferred to another node/cluster/zone,
+ *   leaves 'destnode' unchanged (will be non-zero) and returns 0
+ * - if name translation is attempted and succeeds, sets 'destnode'
+ *   to publishing node and returns port reference (will be non-zero)
+ * - if name translation is attempted and fails, sets 'destnode' to 0
+ *   and returns 0
  */
 
 u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *destnode)
        struct publication *publ;
        struct name_seq *seq;
        u32 ref = 0;
+       u32 node = 0;
 
        if (!tipc_in_scope(*destnode, tipc_own_addr))
                return 0;
        }
 
        ref = publ->ref;
-       *destnode = publ->node;
+       node = publ->node;
 no_match:
        spin_unlock_bh(&seq->lock);
 not_found:
        read_unlock_bh(&tipc_nametbl_lock);
+       *destnode = node;
        return ref;
 }
 
 
        msg_set_destnode(msg, destnode);
        msg_set_destport(msg, destport);
 
-       if (likely(destport)) {
+       if (likely(destport || destnode)) {
                if (likely(destnode == tipc_own_addr))
                        res = tipc_port_recv_sections(p_ptr, num_sect,
                                                      msg_sect, total_len);