static const struct lnet_lnd the_ksocklnd;
struct ksock_nal_data ksocknal_data;
-static struct ksock_interface *
-ksocknal_index2iface(struct lnet_ni *ni, int index)
-{
- struct ksock_net *net = ni->ni_data;
- struct ksock_interface *iface;
-
- iface = &net->ksnn_interface;
-
- if (iface->ksni_index == index)
- return iface;
-
- return NULL;
-}
-
static int ksocknal_ip2index(__u32 ipaddress, struct lnet_ni *ni)
{
struct net_device *dev;
conn_cb->ksnr_retry_interval = 0; /* OK to connect at any time */
conn_cb->ksnr_ipaddr = ipaddr;
conn_cb->ksnr_port = port;
- conn_cb->ksnr_myiface = -1;
conn_cb->ksnr_scheduled = 0;
conn_cb->ksnr_connecting = 0;
conn_cb->ksnr_connected = 0;
struct ksock_conn_cb *conn_cb;
int i;
int rc = -ENOENT;
+ struct ksock_net *net;
read_lock(&ksocknal_data.ksnd_global_lock);
} else {
*id = peer_ni->ksnp_id;
ksocknal_dump_peer_debug_info(peer_ni);
- rc = choose_ipv4_src(myip, conn_cb->ksnr_myiface,
+ net = ni->ni_data;
+ rc = choose_ipv4_src(myip,
+ net->ksnn_interface.ksni_index,
conn_cb->ksnr_ipaddr,
ni->ni_net_ns);
*peer_ip = conn_cb->ksnr_ipaddr;
ksocknal_associate_cb_conn_locked(struct ksock_conn_cb *conn_cb,
struct ksock_conn *conn)
{
- struct ksock_peer_ni *peer_ni = conn_cb->ksnr_peer;
int type = conn->ksnc_type;
- struct ksock_interface *iface;
- int conn_iface = ksocknal_ip2index(conn->ksnc_myipaddr,
- conn_cb->ksnr_peer->ksnp_ni);
conn->ksnc_conn_cb = conn_cb;
ksocknal_conn_cb_addref(conn_cb);
-
- if (conn_cb->ksnr_myiface != conn_iface) {
- if (conn_cb->ksnr_myiface < 0) {
- /* route wasn't bound locally yet (the initial route) */
- CDEBUG(D_NET, "Binding %s %pI4h to interface %d\n",
- libcfs_id2str(peer_ni->ksnp_id),
- &conn_cb->ksnr_ipaddr,
- conn_iface);
- } else {
- CDEBUG(D_NET,
- "Rebinding %s %pI4h from interface %d to %d\n",
- libcfs_id2str(peer_ni->ksnp_id),
- &conn_cb->ksnr_ipaddr,
- conn_cb->ksnr_myiface,
- conn_iface);
-
- iface = ksocknal_index2iface(peer_ni->ksnp_ni,
- conn_cb->ksnr_myiface);
- if (iface)
- iface->ksni_nroutes--;
- }
- conn_cb->ksnr_myiface = conn_iface;
- iface = ksocknal_index2iface(peer_ni->ksnp_ni,
- conn_cb->ksnr_myiface);
- if (iface)
- iface->ksni_nroutes++;
- }
-
ksocknal_incr_conn_count(conn_cb, type);
/* Successful connection => further attempts can
conn_cb->ksnr_peer = peer_ni;
ksocknal_peer_addref(peer_ni);
- /* set the conn_cb's interface to the current net's interface */
- conn_cb->ksnr_myiface = net->ksnn_interface.ksni_index;
- net->ksnn_interface.ksni_nroutes++;
-
/* peer_ni's route list takes over my ref on 'route' */
peer_ni->ksnp_conn_cb = conn_cb;
+ net->ksnn_interface.ksni_nroutes++;
list_for_each(tmp, &peer_ni->ksnp_conns) {
conn = list_entry(tmp, struct ksock_conn, ksnc_list);
if (conn->ksnc_ipaddr != conn_cb->ksnr_ipaddr)
continue;
-
+ CDEBUG(D_NET, "call ksocknal_associate_cb_conn_locked\n");
ksocknal_associate_cb_conn_locked(conn_cb, conn);
/* keep going (typed conns) */
}
ksocknal_del_conn_cb_locked(struct ksock_conn_cb *conn_cb)
{
struct ksock_peer_ni *peer_ni = conn_cb->ksnr_peer;
- struct ksock_interface *iface;
struct ksock_conn *conn;
struct ksock_conn *cnxt;
+ struct ksock_net *net;
LASSERT(!conn_cb->ksnr_deleted);
ksocknal_close_conn_locked(conn, 0);
}
- if (conn_cb->ksnr_myiface >= 0) {
- iface = ksocknal_index2iface(peer_ni->ksnp_ni,
- conn_cb->ksnr_myiface);
- if (iface)
- iface->ksni_nroutes--;
- }
+ net = (struct ksock_net *)(peer_ni->ksnp_ni->ni_data);
+ net->ksnn_interface.ksni_nroutes--;
+ LASSERT(net->ksnn_interface.ksni_nroutes >= 0);
conn_cb->ksnr_deleted = 1;
ksocknal_conn_cb_decref(conn_cb); /* drop peer_ni's ref */