}
static struct ksock_peer_ni *
-ksocknal_create_peer(struct lnet_ni *ni, struct lnet_process_id id)
+ksocknal_create_peer(struct lnet_ni *ni, struct lnet_processid *id)
{
- int cpt = lnet_cpt_of_nid(id.nid, ni);
+ int cpt = lnet_nid2cpt(&id->nid, ni);
struct ksock_net *net = ni->ni_data;
struct ksock_peer_ni *peer_ni;
- LASSERT(id.nid != LNET_NID_ANY);
- LASSERT(id.pid != LNET_PID_ANY);
+ LASSERT(!LNET_NID_IS_ANY(&id->nid));
+ LASSERT(id->pid != LNET_PID_ANY);
LASSERT(!in_interrupt());
if (!atomic_inc_unless_negative(&net->ksnn_npeers)) {
}
peer_ni->ksnp_ni = ni;
- peer_ni->ksnp_id = id;
+ peer_ni->ksnp_id = *id;
refcount_set(&peer_ni->ksnp_refcount, 1); /* 1 ref for caller */
peer_ni->ksnp_closing = 0;
peer_ni->ksnp_accepting = 0;
struct ksock_net *net = peer_ni->ksnp_ni->ni_data;
CDEBUG (D_NET, "peer_ni %s %p deleted\n",
- libcfs_id2str(peer_ni->ksnp_id), peer_ni);
+ libcfs_idstr(&peer_ni->ksnp_id), peer_ni);
LASSERT(refcount_read(&peer_ni->ksnp_refcount) == 0);
LASSERT(peer_ni->ksnp_accepting == 0);
}
struct ksock_peer_ni *
-ksocknal_find_peer_locked(struct lnet_ni *ni, struct lnet_process_id id)
+ksocknal_find_peer_locked(struct lnet_ni *ni, struct lnet_processid *id)
{
struct ksock_peer_ni *peer_ni;
- unsigned long hash = nidhash(id.nid);
+ unsigned long hash = nidhash(&id->nid);
hash_for_each_possible(ksocknal_data.ksnd_peers, peer_ni,
ksnp_list, hash) {
if (peer_ni->ksnp_ni != ni)
continue;
- if (peer_ni->ksnp_id.nid != id.nid ||
- peer_ni->ksnp_id.pid != id.pid)
+ if (!nid_same(&peer_ni->ksnp_id.nid, &id->nid) ||
+ peer_ni->ksnp_id.pid != id->pid)
continue;
CDEBUG(D_NET, "got peer_ni [%p] -> %s (%d)\n",
- peer_ni, libcfs_id2str(id),
+ peer_ni, libcfs_idstr(id),
refcount_read(&peer_ni->ksnp_refcount));
return peer_ni;
}
}
struct ksock_peer_ni *
-ksocknal_find_peer(struct lnet_ni *ni, struct lnet_process_id id)
+ksocknal_find_peer(struct lnet_ni *ni, struct lnet_processid *id)
{
struct ksock_peer_ni *peer_ni;
ksocknal_peer_addref(peer_ni);
read_unlock(&ksocknal_data.ksnd_global_lock);
- return (peer_ni);
+ return peer_ni;
}
static void
if (index-- > 0)
continue;
- *id = peer_ni->ksnp_id;
+ id->pid = peer_ni->ksnp_id.pid;
+ id->nid = lnet_nid_to_nid4(&peer_ni->ksnp_id.nid);
*myip = 0;
*peer_ip = 0;
*port = 0;
if (index-- > 0)
continue;
- *id = peer_ni->ksnp_id;
+ id->pid = peer_ni->ksnp_id.pid;
+ id->nid = lnet_nid_to_nid4(&peer_ni->ksnp_id.nid);
*myip = peer_ni->ksnp_passive_ips[j];
*peer_ip = 0;
*port = 0;
conn_cb = peer_ni->ksnp_conn_cb;
- *id = peer_ni->ksnp_id;
+ id->pid = peer_ni->ksnp_id.pid;
+ id->nid = lnet_nid_to_nid4(&peer_ni->ksnp_id.nid);
if (conn_cb->ksnr_addr.ss_family == AF_INET) {
struct sockaddr_in *sa =
(void *)&conn_cb->ksnr_addr;
if (conn_cb->ksnr_myiface < 0) {
/* route wasn't bound locally yet (the initial route) */
CDEBUG(D_NET, "Binding %s %pIS to interface %d\n",
- libcfs_id2str(peer_ni->ksnp_id),
+ libcfs_idstr(&peer_ni->ksnp_id),
&conn_cb->ksnr_addr,
conn_iface);
} else {
CDEBUG(D_NET,
"Rebinding %s %pIS from interface %d to %d\n",
- libcfs_id2str(peer_ni->ksnp_id),
+ libcfs_idstr(&peer_ni->ksnp_id),
&conn_cb->ksnr_addr,
conn_cb->ksnr_myiface,
conn_iface);
}
int
-ksocknal_add_peer(struct lnet_ni *ni, struct lnet_process_id id,
+ksocknal_add_peer(struct lnet_ni *ni, struct lnet_process_id id4,
struct sockaddr *addr)
{
struct ksock_peer_ni *peer_ni;
struct ksock_peer_ni *peer2;
struct ksock_conn_cb *conn_cb;
+ struct lnet_processid id;
- if (id.nid == LNET_NID_ANY ||
- id.pid == LNET_PID_ANY)
+ if (id4.nid == LNET_NID_ANY ||
+ id4.pid == LNET_PID_ANY)
return (-EINVAL);
+ id.pid = id4.pid;
+ lnet_nid4_to_nid(id4.nid, &id.nid);
+
/* Have a brand new peer_ni ready... */
- peer_ni = ksocknal_create_peer(ni, id);
+ peer_ni = ksocknal_create_peer(ni, &id);
if (IS_ERR(peer_ni))
return PTR_ERR(peer_ni);
LASSERT(atomic_read(&((struct ksock_net *)ni->ni_data)->ksnn_npeers)
>= 0);
- peer2 = ksocknal_find_peer_locked(ni, id);
+ peer2 = ksocknal_find_peer_locked(ni, &id);
if (peer2 != NULL) {
ksocknal_peer_decref(peer_ni);
peer_ni = peer2;
} else {
/* peer_ni table takes my ref on peer_ni */
hash_add(ksocknal_data.ksnd_peers, &peer_ni->ksnp_list,
- nidhash(id.nid));
+ nidhash(&id.nid));
}
ksocknal_add_conn_cb_locked(peer_ni, conn_cb);
}
static int
-ksocknal_del_peer(struct lnet_ni *ni, struct lnet_process_id id, __u32 ip)
+ksocknal_del_peer(struct lnet_ni *ni, struct lnet_process_id id4, __u32 ip)
{
LIST_HEAD(zombies);
struct hlist_node *pnxt;
int hi;
int i;
int rc = -ENOENT;
+ struct lnet_processid id;
+
+ id.pid = id4.pid;
+ lnet_nid4_to_nid(id4.nid, &id.nid);
write_lock_bh(&ksocknal_data.ksnd_global_lock);
- if (id.nid != LNET_NID_ANY) {
- lo = hash_min(nidhash(id.nid),
+ if (!LNET_NID_IS_ANY(&id.nid)) {
+ lo = hash_min(nidhash(&id.nid),
HASH_BITS(ksocknal_data.ksnd_peers));
hi = lo;
} else {
if (peer_ni->ksnp_ni != ni)
continue;
- if (!((id.nid == LNET_NID_ANY ||
- peer_ni->ksnp_id.nid == id.nid) &&
+ if (!((LNET_NID_IS_ANY(&id.nid) ||
+ nid_same(&peer_ni->ksnp_id.nid, &id.nid)) &&
(id.pid == LNET_PID_ANY ||
peer_ni->ksnp_id.pid == id.pid)))
continue;
{
rwlock_t *global_lock = &ksocknal_data.ksnd_global_lock;
LIST_HEAD(zombies);
- struct lnet_process_id peerid;
+ struct lnet_process_id peerid4;
u64 incarnation;
struct ksock_conn *conn;
struct ksock_conn *conn2;
/* Active connection sends HELLO eagerly */
hello->kshm_nips = 0;
- peerid = peer_ni->ksnp_id;
+ peerid4 = lnet_pid_to_pid4(&peer_ni->ksnp_id);
write_lock_bh(global_lock);
conn->ksnc_proto = peer_ni->ksnp_proto;
#endif
}
- rc = ksocknal_send_hello(ni, conn, peerid.nid, hello);
+ rc = ksocknal_send_hello(ni, conn, peerid4.nid, hello);
if (rc != 0)
goto failed_1;
} else {
- peerid.nid = LNET_NID_ANY;
- peerid.pid = LNET_PID_ANY;
+ peerid4.nid = LNET_NID_ANY;
+ peerid4.pid = LNET_PID_ANY;
/* Passive, get protocol from peer_ni */
conn->ksnc_proto = NULL;
}
- rc = ksocknal_recv_hello(ni, conn, hello, &peerid, &incarnation);
+ rc = ksocknal_recv_hello(ni, conn, hello, &peerid4, &incarnation);
if (rc < 0)
goto failed_1;
LASSERT(rc == 0 || active);
LASSERT(conn->ksnc_proto != NULL);
- LASSERT(peerid.nid != LNET_NID_ANY);
+ LASSERT(peerid4.nid != LNET_NID_ANY);
- cpt = lnet_cpt_of_nid(peerid.nid, ni);
+ cpt = lnet_cpt_of_nid(peerid4.nid, ni);
if (active) {
ksocknal_peer_addref(peer_ni);
write_lock_bh(global_lock);
} else {
- peer_ni = ksocknal_create_peer(ni, peerid);
+ struct lnet_processid peerid;
+
+ lnet_pid4_to_pid(peerid4, &peerid);
+ peer_ni = ksocknal_create_peer(ni, &peerid);
if (IS_ERR(peer_ni)) {
rc = PTR_ERR(peer_ni);
goto failed_1;
/* called with a ref on ni, so shutdown can't have started */
LASSERT(atomic_read(&((struct ksock_net *)ni->ni_data)->ksnn_npeers) >= 0);
- peer2 = ksocknal_find_peer_locked(ni, peerid);
+ peer2 = ksocknal_find_peer_locked(ni, &peerid);
if (peer2 == NULL) {
/* NB this puts an "empty" peer_ni in the peer_ni
* table (which takes my ref) */
hash_add(ksocknal_data.ksnd_peers,
- &peer_ni->ksnp_list, nidhash(peerid.nid));
+ &peer_ni->ksnp_list, nidhash(&peerid.nid));
} else {
ksocknal_peer_decref(peer_ni);
peer_ni = peer2;
/* Am I already connecting to this guy? Resolve in
* favour of higher NID...
*/
- if (peerid.nid < lnet_nid_to_nid4(&ni->ni_nid) &&
+ if (peerid4.nid < lnet_nid_to_nid4(&ni->ni_nid) &&
ksocknal_connecting(peer_ni->ksnp_conn_cb,
((struct sockaddr *) &conn->ksnc_peeraddr))) {
rc = EALREADY;
!rpc_cmp_addr((struct sockaddr *)&conn_cb->ksnr_addr,
(struct sockaddr *)&conn->ksnc_peeraddr)) {
CERROR("Route %s %pIS connected to %pIS\n",
- libcfs_id2str(peer_ni->ksnp_id),
+ libcfs_idstr(&peer_ni->ksnp_id),
&conn_cb->ksnr_addr,
&conn->ksnc_peeraddr);
}
CDEBUG(D_NET, "New conn %s p %d.x %pIS -> %pISp"
" incarnation:%lld sched[%d]\n",
- libcfs_id2str(peerid), conn->ksnc_proto->pro_version,
+ libcfs_id2str(peerid4), conn->ksnc_proto->pro_version,
&conn->ksnc_myaddr, &conn->ksnc_peeraddr,
incarnation, cpt);
if (!active) {
hello->kshm_nips = 0;
- rc = ksocknal_send_hello(ni, conn, peerid.nid, hello);
+ rc = ksocknal_send_hello(ni, conn, peerid4.nid, hello);
}
LIBCFS_FREE(hello, offsetof(struct ksock_hello_msg,
if (warn != NULL) {
if (rc < 0)
CERROR("Not creating conn %s type %d: %s\n",
- libcfs_id2str(peerid), conn->ksnc_type, warn);
+ libcfs_id2str(peerid4), conn->ksnc_type, warn);
else
CDEBUG(D_NET, "Not creating conn %s type %d: %s\n",
- libcfs_id2str(peerid), conn->ksnc_type, warn);
+ libcfs_id2str(peerid4), conn->ksnc_type, warn);
}
if (!active) {
*/
conn->ksnc_type = SOCKLND_CONN_NONE;
hello->kshm_nips = 0;
- ksocknal_send_hello(ni, conn, peerid.nid, hello);
+ ksocknal_send_hello(ni, conn, peerid4.nid, hello);
}
write_lock_bh(global_lock);
read_unlock(&ksocknal_data.ksnd_global_lock);
if (notify)
- lnet_notify(peer_ni->ksnp_ni, peer_ni->ksnp_id.nid,
+ lnet_notify(peer_ni->ksnp_ni,
+ lnet_nid_to_nid4(&peer_ni->ksnp_id.nid),
false, false, last_alive);
}
last_rcv = conn->ksnc_rx_deadline -
ksocknal_timeout();
CERROR("Completing partial receive from %s[%d], ip %pISp, with error, wanted: %d, left: %d, last alive is %lld secs ago\n",
- libcfs_id2str(conn->ksnc_peer->ksnp_id), conn->ksnc_type,
+ libcfs_idstr(&conn->ksnc_peer->ksnp_id),
+ conn->ksnc_type,
&conn->ksnc_peeraddr,
- conn->ksnc_rx_nob_wanted, conn->ksnc_rx_nob_left,
+ conn->ksnc_rx_nob_wanted, conn->ksnc_rx_nob_left,
ktime_get_seconds() - last_rcv);
if (conn->ksnc_lnet_msg)
conn->ksnc_lnet_msg->msg_health_status =
case SOCKNAL_RX_LNET_HEADER:
if (conn->ksnc_rx_started)
CERROR("Incomplete receive of lnet header from %s, ip %pISp, with error, protocol: %d.x.\n",
- libcfs_id2str(conn->ksnc_peer->ksnp_id),
+ libcfs_idstr(&conn->ksnc_peer->ksnp_id),
&conn->ksnc_peeraddr,
conn->ksnc_proto->pro_version);
break;
- case SOCKNAL_RX_KSM_HEADER:
- if (conn->ksnc_rx_started)
+ case SOCKNAL_RX_KSM_HEADER:
+ if (conn->ksnc_rx_started)
CERROR("Incomplete receive of ksock message from %s, ip %pISp, with error, protocol: %d.x.\n",
- libcfs_id2str(conn->ksnc_peer->ksnp_id),
+ libcfs_idstr(&conn->ksnc_peer->ksnp_id),
&conn->ksnc_peeraddr,
conn->ksnc_proto->pro_version);
- break;
- case SOCKNAL_RX_SLOP:
- if (conn->ksnc_rx_started)
+ break;
+ case SOCKNAL_RX_SLOP:
+ if (conn->ksnc_rx_started)
CERROR("Incomplete receive of slops from %s, ip %pISp, with error\n",
- libcfs_id2str(conn->ksnc_peer->ksnp_id),
+ libcfs_idstr(&conn->ksnc_peer->ksnp_id),
&conn->ksnc_peeraddr);
- break;
- default:
- LBUG ();
- break;
- }
+ break;
+ default:
+ LBUG();
+ break;
+ }
- ksocknal_peer_decref(conn->ksnc_peer);
+ ksocknal_peer_decref(conn->ksnc_peer);
- LIBCFS_FREE (conn, sizeof (*conn));
+ LIBCFS_FREE(conn, sizeof(*conn));
}
int
}
int
-ksocknal_close_matching_conns(struct lnet_process_id id, __u32 ipaddr)
+ksocknal_close_matching_conns(struct lnet_processid *id, __u32 ipaddr)
{
struct ksock_peer_ni *peer_ni;
struct hlist_node *pnxt;
write_lock_bh(&ksocknal_data.ksnd_global_lock);
- if (id.nid != LNET_NID_ANY) {
- lo = hash_min(nidhash(id.nid),
+ if (!LNET_NID_IS_ANY(&id->nid)) {
+ lo = hash_min(nidhash(&id->nid),
HASH_BITS(ksocknal_data.ksnd_peers));
hi = lo;
} else {
&ksocknal_data.ksnd_peers[i],
ksnp_list) {
- if (!((id.nid == LNET_NID_ANY ||
- id.nid == peer_ni->ksnp_id.nid) &&
- (id.pid == LNET_PID_ANY ||
- id.pid == peer_ni->ksnp_id.pid)))
+ if (!((LNET_NID_IS_ANY(&id->nid) ||
+ nid_same(&id->nid, &peer_ni->ksnp_id.nid)) &&
+ (id->pid == LNET_PID_ANY ||
+ id->pid == peer_ni->ksnp_id.pid)))
continue;
count += ksocknal_close_peer_conns_locked(
write_unlock_bh(&ksocknal_data.ksnd_global_lock);
/* wildcards always succeed */
- if (id.nid == LNET_NID_ANY || id.pid == LNET_PID_ANY || ipaddr == 0)
+ if (LNET_NID_IS_ANY(&id->nid) || id->pid == LNET_PID_ANY ||
+ ipaddr == 0)
return 0;
return (count == 0 ? -ENOENT : 0);
/* The router is telling me she's been notified of a change in
* gateway state....
*/
- struct lnet_process_id id = {
- .nid = gw_nid,
+ struct lnet_processid id = {
.pid = LNET_PID_ANY,
};
CDEBUG(D_NET, "gw %s down\n", libcfs_nid2str(gw_nid));
+ lnet_nid4_to_nid(gw_nid, &id.nid);
/* If the gateway crashed, close all open connections... */
- ksocknal_close_matching_conns(id, 0);
+ ksocknal_close_matching_conns(&id, 0);
return;
/* We can only establish new connections
}
static int
-ksocknal_push(struct lnet_ni *ni, struct lnet_process_id id)
+ksocknal_push(struct lnet_ni *ni, struct lnet_processid *id)
{
int lo;
int hi;
int bkt;
int rc = -ENOENT;
- if (id.nid != LNET_NID_ANY) {
- lo = hash_min(nidhash(id.nid),
+ if (!LNET_NID_IS_ANY(&id->nid)) {
+ lo = hash_min(nidhash(&id->nid),
HASH_BITS(ksocknal_data.ksnd_peers));
hi = lo;
} else {
hlist_for_each_entry(peer_ni,
&ksocknal_data.ksnd_peers[bkt],
ksnp_list) {
- if (!((id.nid == LNET_NID_ANY ||
- id.nid == peer_ni->ksnp_id.nid) &&
- (id.pid == LNET_PID_ANY ||
- id.pid == peer_ni->ksnp_id.pid)))
+ if (!((LNET_NID_IS_ANY(&id->nid) ||
+ nid_same(&id->nid,
+ &peer_ni->ksnp_id.nid)) &&
+ (id->pid == LNET_PID_ANY ||
+ id->pid == peer_ni->ksnp_id.pid)))
continue;
if (i++ == peer_off) {
int
ksocknal_ctl(struct lnet_ni *ni, unsigned int cmd, void *arg)
{
- struct lnet_process_id id = {0};
+ struct lnet_process_id id4 = {};
+ struct lnet_processid id = {};
struct libcfs_ioctl_data *data = arg;
int rc;
return rc;
}
- case IOC_LIBCFS_GET_PEER: {
- __u32 myip = 0;
- __u32 ip = 0;
- int port = 0;
- int conn_count = 0;
- int share_count = 0;
+ case IOC_LIBCFS_GET_PEER: {
+ __u32 myip = 0;
+ __u32 ip = 0;
+ int port = 0;
+ int conn_count = 0;
+ int share_count = 0;
- rc = ksocknal_get_peer_info(ni, data->ioc_count,
- &id, &myip, &ip, &port,
- &conn_count, &share_count);
- if (rc != 0)
- return rc;
+ rc = ksocknal_get_peer_info(ni, data->ioc_count,
+ &id4, &myip, &ip, &port,
+ &conn_count, &share_count);
+ if (rc != 0)
+ return rc;
- data->ioc_nid = id.nid;
- data->ioc_count = share_count;
- data->ioc_u32[0] = ip;
- data->ioc_u32[1] = port;
- data->ioc_u32[2] = myip;
- data->ioc_u32[3] = conn_count;
- data->ioc_u32[4] = id.pid;
- return 0;
- }
+ data->ioc_nid = id4.nid;
+ data->ioc_count = share_count;
+ data->ioc_u32[0] = ip;
+ data->ioc_u32[1] = port;
+ data->ioc_u32[2] = myip;
+ data->ioc_u32[3] = conn_count;
+ data->ioc_u32[4] = id4.pid;
+ return 0;
+ }
case IOC_LIBCFS_ADD_PEER: {
struct sockaddr_in sa = {.sin_family = AF_INET};
- id.nid = data->ioc_nid;
- id.pid = LNET_PID_LUSTRE;
+ id4.nid = data->ioc_nid;
+ id4.pid = LNET_PID_LUSTRE;
sa.sin_addr.s_addr = htonl(data->ioc_u32[0]);
sa.sin_port = htons(data->ioc_u32[1]);
- return ksocknal_add_peer(ni, id, (struct sockaddr *)&sa);
+ return ksocknal_add_peer(ni, id4, (struct sockaddr *)&sa);
}
- case IOC_LIBCFS_DEL_PEER:
- id.nid = data->ioc_nid;
- id.pid = LNET_PID_ANY;
- return ksocknal_del_peer (ni, id,
- data->ioc_u32[0]); /* IP */
+ case IOC_LIBCFS_DEL_PEER:
+ id4.nid = data->ioc_nid;
+ id4.pid = LNET_PID_ANY;
+ return ksocknal_del_peer(ni, id4,
+ data->ioc_u32[0]); /* IP */
case IOC_LIBCFS_GET_CONN: {
int txmem;
ksocknal_lib_get_conn_tunables(conn, &txmem, &rxmem, &nagle);
- data->ioc_count = txmem;
- data->ioc_nid = conn->ksnc_peer->ksnp_id.nid;
- data->ioc_flags = nagle;
+ data->ioc_count = txmem;
+ data->ioc_nid = lnet_nid_to_nid4(&conn->ksnc_peer->ksnp_id.nid);
+ data->ioc_flags = nagle;
if (psa->sin_family == AF_INET)
data->ioc_u32[0] = ntohl(psa->sin_addr.s_addr);
else
return 0;
}
- case IOC_LIBCFS_CLOSE_CONNECTION:
- id.nid = data->ioc_nid;
- id.pid = LNET_PID_ANY;
- return ksocknal_close_matching_conns (id,
- data->ioc_u32[0]);
+ case IOC_LIBCFS_CLOSE_CONNECTION:
+ lnet_nid4_to_nid(data->ioc_nid, &id.nid);
+ id.pid = LNET_PID_ANY;
+ return ksocknal_close_matching_conns(&id,
+ data->ioc_u32[0]);
case IOC_LIBCFS_REGISTER_MYNID:
/* Ignore if this is a noop */
libcfs_nidstr(&ni->ni_nid));
return -EINVAL;
- case IOC_LIBCFS_PUSH_CONNECTION:
- id.nid = data->ioc_nid;
- id.pid = LNET_PID_ANY;
- return ksocknal_push(ni, id);
+ case IOC_LIBCFS_PUSH_CONNECTION:
+ lnet_nid4_to_nid(data->ioc_nid, &id.nid);
+ id.pid = LNET_PID_ANY;
+ return ksocknal_push(ni, &id);
- default:
- return -EINVAL;
- }
- /* not reached */
+ default:
+ return -EINVAL;
+ }
+ /* not reached */
}
static void
if (peer_ni->ksnp_ni != ni)
continue;
- CWARN("Active peer_ni on shutdown: %s, ref %d, "
- "closing %d, accepting %d, err %d, zcookie %llu, "
- "txq %d, zc_req %d\n", libcfs_id2str(peer_ni->ksnp_id),
+ CWARN("Active peer_ni on shutdown: %s, ref %d, closing %d, accepting %d, err %d, zcookie %llu, txq %d, zc_req %d\n",
+ libcfs_idstr(&peer_ni->ksnp_id),
refcount_read(&peer_ni->ksnp_refcount),
peer_ni->ksnp_closing,
peer_ni->ksnp_accepting, peer_ni->ksnp_error,