1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Author: Liang Zhen <liangzhen@clusterfs.com>
6 * This file is part of Lustre, http://www.lustre.org
10 #include <libcfs/kp30.h>
13 #define LST_PING_TEST_MAGIC 0xbabeface
16 spinlock_t pnd_lock; /* serialize */
17 int pnd_counter; /* sequence counter */
18 int pnd_err_count; /* error count */
21 static lst_ping_data_t lst_ping_data;
24 ping_client_init(sfw_test_instance_t *tsi)
26 spin_lock_init(&lst_ping_data.pnd_lock);
27 lst_ping_data.pnd_counter = 0;
28 lst_ping_data.pnd_err_count = 0;
34 ping_client_fini(sfw_test_instance_t *tsi)
36 CWARN("Total ping %d, failed ping: %d\n",
37 lst_ping_data.pnd_counter, lst_ping_data.pnd_err_count);
41 ping_client_prep_rpc(sfw_test_unit_t *tsu,
42 lnet_process_id_t dest, srpc_client_rpc_t **rpc)
44 srpc_ping_reqst_t *req;
48 rc = sfw_create_test_rpc(tsu, dest, 0, 0, rpc);
52 req = &(*rpc)->crpc_reqstmsg.msg_body.ping_reqst;
54 req->pnr_magic = LST_PING_TEST_MAGIC;
56 spin_lock(&lst_ping_data.pnd_lock);
57 req->pnr_seq = lst_ping_data.pnd_counter ++;
58 spin_unlock(&lst_ping_data.pnd_lock);
61 req->pnr_time_sec = tv.tv_sec;
62 req->pnr_time_usec = tv.tv_usec;
68 ping_client_done_rpc(sfw_test_unit_t *tsu, srpc_client_rpc_t *rpc)
70 srpc_ping_reqst_t *req;
71 srpc_ping_reply_t *rep;
74 req = &rpc->crpc_reqstmsg.msg_body.ping_reqst;
75 rep = &rpc->crpc_replymsg.msg_body.ping_reply;
77 if (rpc->crpc_status == 0 &&
78 rpc->crpc_replymsg.msg_magic != SRPC_MSG_MAGIC) {
79 __swab32s(&rep->pnr_seq);
80 __swab32s(&rep->pnr_magic);
81 __swab32s(&rep->pnr_status);
84 if (rpc->crpc_status != 0) {
85 CERROR ("Unable to ping %s (%d): %d\n",
86 libcfs_id2str(rpc->crpc_dest),
87 req->pnr_seq, rpc->crpc_status);
88 } else if (rep->pnr_magic != LST_PING_TEST_MAGIC) {
89 tsu->tsu_error = -EBADMSG;
90 CERROR ("Bad magic %u from %s, %u expected.\n",
91 rep->pnr_magic, libcfs_id2str(rpc->crpc_dest),
93 } else if (rep->pnr_seq != req->pnr_seq) {
94 tsu->tsu_error = -EBADMSG;
95 CERROR ("Bad seq %u from %s, %u expected.\n",
96 rep->pnr_seq, libcfs_id2str(rpc->crpc_dest),
100 if (tsu->tsu_error != 0) {
101 spin_lock(&lst_ping_data.pnd_lock);
102 lst_ping_data.pnd_err_count++;
103 spin_unlock(&lst_ping_data.pnd_lock);
108 CDEBUG (D_NET, "%d reply in %u usec\n", rep->pnr_seq,
109 (unsigned)((tv.tv_sec - (unsigned)req->pnr_time_sec) * 1000000 +
110 (tv.tv_usec - req->pnr_time_usec)));
115 ping_server_handle (srpc_server_rpc_t *rpc)
117 srpc_service_t *sv = rpc->srpc_service;
118 srpc_msg_t *reqstmsg = &rpc->srpc_reqstbuf->buf_msg;
119 srpc_ping_reqst_t *req = &reqstmsg->msg_body.ping_reqst;
120 srpc_ping_reply_t *rep = &rpc->srpc_replymsg.msg_body.ping_reply;
122 LASSERT (sv->sv_id == SRPC_SERVICE_PING);
124 if (reqstmsg->msg_magic != SRPC_MSG_MAGIC) {
125 LASSERT (reqstmsg->msg_magic == __swab32(SRPC_MSG_MAGIC));
127 __swab32s(&reqstmsg->msg_type);
128 __swab32s(&req->pnr_seq);
129 __swab32s(&req->pnr_magic);
130 __swab64s(&req->pnr_time_sec);
131 __swab64s(&req->pnr_time_usec);
133 LASSERT (reqstmsg->msg_type == srpc_service2request(sv->sv_id));
135 if (req->pnr_magic != LST_PING_TEST_MAGIC) {
136 CERROR ("Unexpect magic %08x from %s\n",
137 req->pnr_magic, libcfs_id2str(rpc->srpc_peer));
141 rep->pnr_seq = req->pnr_seq;
142 rep->pnr_magic = LST_PING_TEST_MAGIC;
144 CDEBUG (D_NET, "Get ping %d from %s\n",
145 req->pnr_seq, libcfs_id2str(rpc->srpc_peer));
149 sfw_test_client_ops_t ping_test_client =
151 .tso_init = ping_client_init,
152 .tso_fini = ping_client_fini,
153 .tso_prep_rpc = ping_client_prep_rpc,
154 .tso_done_rpc = ping_client_done_rpc,
157 srpc_service_t ping_test_service =
159 .sv_name = "ping test",
160 .sv_handler = ping_server_handle,
161 .sv_id = SRPC_SERVICE_PING,