unsigned int md_flags;
void *md_user_ptr;
lnet_eq_t *md_eq;
- void *md_addrkey;
unsigned int md_niov; /* # frags */
union {
struct iovec iov[LNET_MAX_IOV];
void (*lnd_notify)(struct lnet_ni *ni, lnet_nid_t peer, int alive);
/* query of peer aliveness */
- void (*lnd_query)(struct lnet_ni *ni, lnet_nid_t peer, time_t *when);
+ void (*lnd_query)(struct lnet_ni *ni, lnet_nid_t peer, cfs_time_t *when);
#if defined(__KERNEL__) || defined(HAVE_LIBPTHREAD)
/* accept a new connection */
#endif
} lnd_t;
+#define LNET_NI_STATUS_UP 0x15aac0de
+#define LNET_NI_STATUS_DOWN 0xdeadface
+#define LNET_NI_STATUS_INVALID 0x00000000
+typedef struct {
+ lnet_nid_t ns_nid;
+ __u32 ns_status;
+ __u32 ns_unused;
+} WIRE_ATTR lnet_ni_status_t;
+
#define LNET_MAX_INTERFACES 16
typedef struct lnet_ni {
int ni_txcredits; /* # tx credits free */
int ni_mintxcredits; /* lowest it's been */
int ni_peertxcredits; /* # per-peer send credits */
+ int ni_peerrtrcredits; /* # per-peer router buffer credits */
int ni_peertimeout; /* seconds to consider peer dead */
lnet_nid_t ni_nid; /* interface's NID */
void *ni_data; /* instance-specific data */
lnd_t *ni_lnd; /* procedural interface */
int ni_refcount; /* reference count */
+ cfs_time_t ni_last_alive; /* when I was last alive */
+ lnet_ni_status_t *ni_status; /* my health status */
char *ni_interfaces[LNET_MAX_INTERFACES]; /* equivalent interfaces to use */
} lnet_ni_t;
+#define LNET_PROTO_PING_MATCHBITS 0x8000000000000000LL
+#define LNET_PROTO_PING_VERSION 2
+#define LNET_PROTO_PING_VERSION1 1
+typedef struct {
+ __u32 pi_magic;
+ __u32 pi_version;
+ lnet_pid_t pi_pid;
+ __u32 pi_nnis;
+ lnet_ni_status_t pi_ni[0];
+} WIRE_ATTR lnet_ping_info_t;
+
+/* router checker data, per router */
+#define LNET_MAX_RTR_NIS 16
+#define LNET_PINGINFO_SIZE offsetof(lnet_ping_info_t, pi_ni[LNET_MAX_RTR_NIS])
+typedef struct {
+ struct list_head rcd_list; /* chain on the_lnet.ln_zombie_rcd */
+ lnet_handle_md_t rcd_mdh; /* ping buffer MD */
+ lnet_ping_info_t *rcd_pinginfo; /* ping buffer */
+} lnet_rc_data_t;
+
typedef struct lnet_peer {
struct list_head lp_hashlist; /* chain on peer hash */
struct list_head lp_txq; /* messages blocking for tx credits */
unsigned int lp_ping_notsent; /* SEND event outstanding from ping */
int lp_alive_count; /* # times router went dead<->alive */
long lp_txqnob; /* bytes queued for sending */
- time_t lp_timestamp; /* time of last aliveness news */
- time_t lp_last_alive; /* when I was last alive */
- time_t lp_ping_timestamp; /* time of last ping attempt */
- time_t lp_ping_deadline; /* != 0 if ping reply expected */
+ cfs_time_t lp_timestamp; /* time of last aliveness news */
+ cfs_time_t lp_ping_timestamp; /* time of last ping attempt */
+ cfs_time_t lp_ping_deadline; /* != 0 if ping reply expected */
+ cfs_time_t lp_last_alive; /* when I was last alive */
+ cfs_time_t lp_last_query; /* when lp_ni was queried last time */
lnet_ni_t *lp_ni; /* interface peer is on */
lnet_nid_t lp_nid; /* peer's NID */
int lp_refcount; /* # refs */
int lp_rtr_refcount; /* # refs from lnet_route_t::lr_gateway */
+ lnet_rc_data_t *lp_rcd; /* router checker state */
} lnet_peer_t;
+#define lnet_peer_aliveness_enabled(lp) ((lp)->lp_ni->ni_peertimeout > 0)
+
typedef struct {
struct list_head lr_list; /* chain on net */
lnet_peer_t *lr_gateway; /* router node */
+ unsigned int lr_hops; /* how far I am */
} lnet_route_t;
typedef struct {
struct list_head lrn_list; /* chain on ln_remote_nets */
struct list_head lrn_routes; /* routes to me */
__u32 lrn_net; /* my net number */
- unsigned int lrn_hops; /* how far I am */
} lnet_remotenet_t;
typedef struct {
#define LNET_NRBPOOLS 3 /* # different router buffer pools */
-#define LNET_PROTO_PING_MATCHBITS 0x8000000000000000LL
-#define LNET_PROTO_PING_VERSION 1
-typedef struct {
- __u32 pi_magic;
- __u32 pi_version;
- lnet_pid_t pi_pid;
- __u32 pi_nnids;
- lnet_nid_t pi_nid[0];
-} WIRE_ATTR lnet_ping_info_t;
-
/* Options for lnet_portal_t::ptl_options */
#define LNET_PTL_LAZY (1 << 0)
typedef struct {
unsigned int ptl_options;
} lnet_portal_t;
-/* Router Checker */
-/* < 0 == startup error */
+/* Router Checker states */
#define LNET_RC_STATE_SHUTDOWN 0 /* not started */
#define LNET_RC_STATE_RUNNING 1 /* started up OK */
#define LNET_RC_STATE_STOPTHREAD 2 /* telling thread to stop */
lnet_ping_info_t *ln_ping_info;
#ifdef __KERNEL__
- int ln_rc_state; /* router checker startup/shutdown state */
struct semaphore ln_rc_signal; /* serialise startup/shutdown */
- lnet_handle_eq_t ln_rc_eqh; /* router checker's event queue */
#endif
+ int ln_rc_state; /* router checker startup/shutdown state */
+ lnet_handle_eq_t ln_rc_eqh; /* router checker's event queue */
+ lnet_handle_md_t ln_rc_mdh;
+ struct list_head ln_zombie_rcd;
#ifdef LNET_USE_LIB_FREELIST
lnet_freelist_t ln_free_mes;