Whamcloud - gitweb
LU-5435 lnet: LNet drop rule implementation
[fs/lustre-release.git] / lnet / lnet / peer.c
index 5b4b09e..702169b 100644 (file)
@@ -39,6 +39,7 @@
 #define DEBUG_SUBSYSTEM S_LNET
 
 #include <lnet/lib-lnet.h>
+#include <lnet/lib-dlc.h>
 
 int
 lnet_peer_tables_create(void)
@@ -387,3 +388,65 @@ lnet_debug_peer(lnet_nid_t nid)
 
        lnet_net_unlock(cpt);
 }
+
+int lnet_get_peer_info(__u32 peer_index, __u64 *nid,
+                      char aliveness[LNET_MAX_STR_LEN],
+                      __u32 *cpt_iter, __u32 *refcount,
+                      __u32 *ni_peer_tx_credits, __u32 *peer_tx_credits,
+                      __u32 *peer_rtr_credits, __u32 *peer_min_rtr_credits,
+                      __u32 *peer_tx_qnob)
+{
+       struct lnet_peer_table  *peer_table;
+       lnet_peer_t             *lp;
+       int                     j;
+       int                     lncpt;
+       bool                    found = false;
+
+       /* get the number of CPTs */
+       lncpt = cfs_percpt_number(the_lnet.ln_peer_tables);
+
+       /* if the cpt number to be examined is >= the number of cpts in
+        * the system then indicate that there are no more cpts to examin
+        */
+       if (*cpt_iter > lncpt)
+               return -ENOENT;
+
+       /* get the current table */
+       peer_table = the_lnet.ln_peer_tables[*cpt_iter];
+       /* if the ptable is NULL then there are no more cpts to examine */
+       if (peer_table == NULL)
+               return -ENOENT;
+
+       lnet_net_lock(*cpt_iter);
+
+       for (j = 0; j < LNET_PEER_HASH_SIZE && !found; j++) {
+               struct list_head *peers = &peer_table->pt_hash[j];
+
+               list_for_each_entry(lp, peers, lp_hashlist) {
+                       if (peer_index-- > 0)
+                               continue;
+
+                       snprintf(aliveness, LNET_MAX_STR_LEN, "NA");
+                       if (lnet_isrouter(lp) ||
+                               lnet_peer_aliveness_enabled(lp))
+                               snprintf(aliveness, LNET_MAX_STR_LEN,
+                                        lp->lp_alive ? "up" : "down");
+
+                       *nid = lp->lp_nid;
+                       *refcount = lp->lp_refcount;
+                       *ni_peer_tx_credits = lp->lp_ni->ni_peertxcredits;
+                       *peer_tx_credits = lp->lp_txcredits;
+                       *peer_rtr_credits = lp->lp_rtrcredits;
+                       *peer_min_rtr_credits = lp->lp_mintxcredits;
+                       *peer_tx_qnob = lp->lp_txqnob;
+
+                       found = true;
+               }
+
+       }
+       lnet_net_unlock(*cpt_iter);
+
+       *cpt_iter = lncpt;
+
+       return found ? 0 : -ENOENT;
+}