b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER START
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * The contents of this file are subject to the terms of the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Common Development and Distribution License (the "License").
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You may not use this file except in compliance with the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * or http://www.opensolaris.org/os/licensing.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * See the License for the specific language governing permissions
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * and limitations under the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * When distributing Covered Code, include this CDDL HEADER in each
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * If applicable, add the following below this CDDL HEADER, with the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * fields enclosed by brackets "[]" replaced with your own identifying
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * information: Portions Copyright [yyyy] [name of copyright owner]
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER END
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Use is subject to license terms.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#pragma ident "%Z%%M% %I% %E% SMI"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_sc.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_debug.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/types.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/sunddi.h>
8257fab973a69800a3a3309e8af21fc1876d2df9agiri#include <sys/dlpi.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * RDS Path MAP
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * N - Node record, P - Path record
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * rds_path_map -
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * v
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * --------- --------- ---------
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * | N |------>| N |------>| N |------> NULL
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * NULL <-------| |<------| |<------| |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * --------- --------- ---------
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * | | |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * | | |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * v v v
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * -------- --------- ---------
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * | P | | P | | P |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * -------- --------- ---------
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * | ^ | ^ | ^
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * | | | | | |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * v | v | v |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * -------- -------- ---------
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * | P | | P | | P |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * -------- -------- ---------
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * o o o
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * o o o
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * o o o
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiritypedef struct rds_path_record_s {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ipaddr_t libd_ip;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ipaddr_t ribd_ip;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct rds_path_record_s *up;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct rds_path_record_s *downp;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri char lifname[MAXNAMELEN];
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri char rifname[MAXNAMELEN];
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri} rds_path_record_t;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiritypedef struct rds_node_record_s {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct rds_node_record_s *nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ipaddr_t lnode_ip; /* local ip */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ipaddr_t rnode_ip; /* remote ip */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct rds_path_record_s *downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct rds_node_record_s *prevp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri} rds_node_record_t;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
8257fab973a69800a3a3309e8af21fc1876d2df9agirichar sc_device_name[MAXNAMELEN] = "NotInitialized";
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirikmutex_t rds_pathmap_lock;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_node_record_t *rds_pathmap = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri#define RDS_VALIDATE_PATH(p) \
8257fab973a69800a3a3309e8af21fc1876d2df9agiri if ((p->local.iftype != DL_IB) || (p->remote.iftype != DL_IB)) \
8257fab973a69800a3a3309e8af21fc1876d2df9agiri return
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri#define isalpha(ch) (((ch) >= 'a' && (ch) <= 'z') || \
8257fab973a69800a3a3309e8af21fc1876d2df9agiri ((ch) >= 'A' && (ch) <= 'Z'))
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri/*
8257fab973a69800a3a3309e8af21fc1876d2df9agiri * Called by SC to register the Sun Cluster device name
8257fab973a69800a3a3309e8af21fc1876d2df9agiri */
8257fab973a69800a3a3309e8af21fc1876d2df9agirivoid
8257fab973a69800a3a3309e8af21fc1876d2df9agirirds_clif_name(char *name)
8257fab973a69800a3a3309e8af21fc1876d2df9agiri{
8257fab973a69800a3a3309e8af21fc1876d2df9agiri int i;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri ASSERT(name != NULL);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri mutex_enter(&rds_pathmap_lock);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri /* extract the device name from the interface name */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri i = strlen(name) - 1;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri while ((i >= 0) && (!isalpha(name[i]))) i--;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri if (i >= 0) {
8257fab973a69800a3a3309e8af21fc1876d2df9agiri (void) strncpy(sc_device_name, name, i + 1);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri sc_device_name[i + 1] = '\0';
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri }
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri mutex_exit(&rds_pathmap_lock);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri}
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Called by SC on discovering a new path
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_path_up(rds_path_t *path)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_node_record_t *p;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_path_record_t *p1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(path != NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri /* ignore if the end points are not of type DL_IB */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri RDS_VALIDATE_PATH(path);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p = rds_pathmap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while ((p) && ((p->lnode_ip != path->local.node_ipaddr) ||
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (p->rnode_ip != path->remote.node_ipaddr))) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p = p->nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p = (rds_node_record_t *)kmem_alloc(sizeof (rds_node_record_t),
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri KM_SLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1 = (rds_path_record_t *)kmem_alloc(
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sizeof (rds_path_record_t), KM_SLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->nextp = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->lnode_ip = path->local.node_ipaddr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->rnode_ip = path->remote.node_ipaddr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->downp = p1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->prevp = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1->libd_ip = path->local.ipaddr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1->ribd_ip = path->remote.ipaddr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1->up = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1->downp = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) strcpy(p1->lifname, path->local.ifname);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) strcpy(p1->rifname, path->remote.ifname);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rds_pathmap == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_pathmap = p;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* insert this node at the head */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_pathmap->prevp = p;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->nextp = rds_pathmap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_pathmap = p;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* we found a match */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1 = (rds_path_record_t *)kmem_alloc(
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sizeof (rds_path_record_t), KM_SLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1->libd_ip = path->local.ipaddr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1->ribd_ip = path->remote.ipaddr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1->downp = p->downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->downp->up = p1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1->up = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->downp = p1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) strcpy(p1->lifname, path->local.ifname);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) strcpy(p1->rifname, path->remote.ifname);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Called by SC to delete a path
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_path_down(rds_path_t *path)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_node_record_t *p;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_path_record_t *p1, *p1up, *p1downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(path != NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri /* ignore if the end points are not of type DL_IB */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri RDS_VALIDATE_PATH(path);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p = rds_pathmap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while ((p) && ((p->lnode_ip != path->local.node_ipaddr) ||
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (p->rnode_ip != path->remote.node_ipaddr))) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p = p->nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* no match */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_path_down", "Node record not found "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "(0x%x <-> 0x%x)", path->local.node_ipaddr,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri path->remote.node_ipaddr);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1 = p->downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while ((p1) && ((p1->libd_ip != path->local.ipaddr) ||
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (p1->ribd_ip != path->remote.ipaddr))) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1 = p1->downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p1 == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* no match */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_path_down", "Path record not found "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "(0x%x <-> 0x%x)", path->local.ipaddr, path->remote.ipaddr);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* we found the record, remove it */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1up = p1->up;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1downp = p1->downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p1up) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1up->downp = p1downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* this is the first path record */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->downp = p1downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p1downp) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1downp->up = p1up;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri kmem_free(p1, sizeof (rds_path_record_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* remove the node record if there are no path records */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p->downp == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p->prevp) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->prevp->nextp = p->nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* this is the first node record */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(p == rds_pathmap);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rds_pathmap = p->nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p->nextp) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p->nextp->prevp = p->prevp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri kmem_free(p, sizeof (rds_node_record_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_sc_path_lookup(ipaddr_t *localip, ipaddr_t *remip)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_node_record_t *p;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri rds_path_record_t *p1, *p1downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p = rds_pathmap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while ((p) && ((p->lnode_ip != *localip) || (p->rnode_ip != *remip))) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p = p->nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* no match */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_sc_path_lookup", "Node record not found "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "(0x%x <-> 0x%x)", *localip, *remip);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* found a path */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1 = p->downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *localip = p1->libd_ip;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *remip = p1->ribd_ip;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri /*
8257fab973a69800a3a3309e8af21fc1876d2df9agiri * But next time, we want to use a different path record so move this
8257fab973a69800a3a3309e8af21fc1876d2df9agiri * path record to the end.
8257fab973a69800a3a3309e8af21fc1876d2df9agiri */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri p1downp = p1->downp;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri if (p1downp != NULL) {
8257fab973a69800a3a3309e8af21fc1876d2df9agiri p->downp = p1downp;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri p1downp->up = NULL;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri /* walk down to the last path record */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri while (p1downp->downp != NULL) {
8257fab973a69800a3a3309e8af21fc1876d2df9agiri p1downp = p1downp->downp;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri }
8257fab973a69800a3a3309e8af21fc1876d2df9agiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri /* Attach the first path record to the end */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri p1downp->downp = p1;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri p1->up = p1downp;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri p1->downp = NULL;
8257fab973a69800a3a3309e8af21fc1876d2df9agiri }
8257fab973a69800a3a3309e8af21fc1876d2df9agiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriboolean_t
8257fab973a69800a3a3309e8af21fc1876d2df9agirirds_if_lookup_by_name(char *devname)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri /*
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Sun Cluster always names its interconnect virtual network interface
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * as clprivnetx, so return TRUE if there is atleast one node record
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * and the interface name is clprivnet something.
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri */
8257fab973a69800a3a3309e8af21fc1876d2df9agiri if (strcmp(devname, sc_device_name) == 0) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri /* clprivnet address */
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri mutex_exit(&rds_pathmap_lock);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return (B_TRUE);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri }
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&rds_pathmap_lock);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri return (B_FALSE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriboolean_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_if_lookup_by_addr(ipaddr_t addr)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_node_record_t *p;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_path_record_t *p1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p = rds_pathmap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while ((p) && (p->lnode_ip != addr)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1 = p->downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while ((p1) && (p1->libd_ip != addr)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p1 = p1->downp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* we found a match */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p1 != NULL)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* go to the next node record */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri p = p->nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&rds_pathmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (p == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* no match */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_if_lookup_by_addr",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "Addr: 0x%x not found", addr);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (B_FALSE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Found a matching node record */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (B_TRUE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}