1*dbed73cbSSangeeta Misra /* 2*dbed73cbSSangeeta Misra * CDDL HEADER START 3*dbed73cbSSangeeta Misra * 4*dbed73cbSSangeeta Misra * The contents of this file are subject to the terms of the 5*dbed73cbSSangeeta Misra * Common Development and Distribution License (the "License"). 6*dbed73cbSSangeeta Misra * You may not use this file except in compliance with the License. 7*dbed73cbSSangeeta Misra * 8*dbed73cbSSangeeta Misra * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*dbed73cbSSangeeta Misra * or http://www.opensolaris.org/os/licensing. 10*dbed73cbSSangeeta Misra * See the License for the specific language governing permissions 11*dbed73cbSSangeeta Misra * and limitations under the License. 12*dbed73cbSSangeeta Misra * 13*dbed73cbSSangeeta Misra * When distributing Covered Code, include this CDDL HEADER in each 14*dbed73cbSSangeeta Misra * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*dbed73cbSSangeeta Misra * If applicable, add the following below this CDDL HEADER, with the 16*dbed73cbSSangeeta Misra * fields enclosed by brackets "[]" replaced with your own identifying 17*dbed73cbSSangeeta Misra * information: Portions Copyright [yyyy] [name of copyright owner] 18*dbed73cbSSangeeta Misra * 19*dbed73cbSSangeeta Misra * CDDL HEADER END 20*dbed73cbSSangeeta Misra */ 21*dbed73cbSSangeeta Misra 22*dbed73cbSSangeeta Misra /* 23*dbed73cbSSangeeta Misra * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*dbed73cbSSangeeta Misra * Use is subject to license terms. 25*dbed73cbSSangeeta Misra */ 26*dbed73cbSSangeeta Misra 27*dbed73cbSSangeeta Misra 28*dbed73cbSSangeeta Misra #include <stdlib.h> 29*dbed73cbSSangeeta Misra #include <strings.h> 30*dbed73cbSSangeeta Misra #include <sys/types.h> 31*dbed73cbSSangeeta Misra #include <sys/socket.h> 32*dbed73cbSSangeeta Misra #include <sys/stropts.h> 33*dbed73cbSSangeeta Misra #include <netinet/in.h> 34*dbed73cbSSangeeta Misra #include <stddef.h> 35*dbed73cbSSangeeta Misra #include "libilb.h" 36*dbed73cbSSangeeta Misra #include "libilb_impl.h" 37*dbed73cbSSangeeta Misra 38*dbed73cbSSangeeta Misra /* ARGSUSED */ 39*dbed73cbSSangeeta Misra static ilb_status_t 40*dbed73cbSSangeeta Misra i_drop_hc(ilb_handle_t h, ilb_hc_info_t *hc, void *arg) 41*dbed73cbSSangeeta Misra { 42*dbed73cbSSangeeta Misra return (ilb_destroy_hc(h, hc->hci_name)); 43*dbed73cbSSangeeta Misra } 44*dbed73cbSSangeeta Misra 45*dbed73cbSSangeeta Misra /* ARGSUSED */ 46*dbed73cbSSangeeta Misra static ilb_status_t 47*dbed73cbSSangeeta Misra i_drop_rule(ilb_handle_t h, ilb_rule_data_t *rd, void *arg) 48*dbed73cbSSangeeta Misra { 49*dbed73cbSSangeeta Misra return (ilb_destroy_rule(h, rd->r_name)); 50*dbed73cbSSangeeta Misra } 51*dbed73cbSSangeeta Misra 52*dbed73cbSSangeeta Misra /* ARGSUSED */ 53*dbed73cbSSangeeta Misra static ilb_status_t 54*dbed73cbSSangeeta Misra i_drop_sg_srvs(ilb_handle_t h, ilb_server_data_t *srv, const char *sgname, 55*dbed73cbSSangeeta Misra void *arg) 56*dbed73cbSSangeeta Misra { 57*dbed73cbSSangeeta Misra return (ilb_rem_server_from_group(h, sgname, srv)); 58*dbed73cbSSangeeta Misra } 59*dbed73cbSSangeeta Misra 60*dbed73cbSSangeeta Misra /* ARGSUSED */ 61*dbed73cbSSangeeta Misra static ilb_status_t 62*dbed73cbSSangeeta Misra i_drop_sg(ilb_handle_t h, ilb_sg_data_t *sg, void *arg) 63*dbed73cbSSangeeta Misra { 64*dbed73cbSSangeeta Misra ilb_status_t rc; 65*dbed73cbSSangeeta Misra 66*dbed73cbSSangeeta Misra rc = ilb_walk_servers(h, i_drop_sg_srvs, sg->sgd_name, (void *)sg); 67*dbed73cbSSangeeta Misra if (rc != ILB_STATUS_OK) 68*dbed73cbSSangeeta Misra return (rc); 69*dbed73cbSSangeeta Misra 70*dbed73cbSSangeeta Misra return (ilb_destroy_servergroup(h, sg->sgd_name)); 71*dbed73cbSSangeeta Misra } 72*dbed73cbSSangeeta Misra 73*dbed73cbSSangeeta Misra ilb_status_t 74*dbed73cbSSangeeta Misra ilb_reset_config(ilb_handle_t h) 75*dbed73cbSSangeeta Misra { 76*dbed73cbSSangeeta Misra ilb_status_t rc; 77*dbed73cbSSangeeta Misra 78*dbed73cbSSangeeta Misra if (h == NULL) 79*dbed73cbSSangeeta Misra return (ILB_STATUS_EINVAL); 80*dbed73cbSSangeeta Misra 81*dbed73cbSSangeeta Misra rc = ilb_walk_rules(h, i_drop_rule, NULL, NULL); 82*dbed73cbSSangeeta Misra if (rc != ILB_STATUS_OK) 83*dbed73cbSSangeeta Misra goto out; 84*dbed73cbSSangeeta Misra 85*dbed73cbSSangeeta Misra rc = ilb_walk_servergroups(h, i_drop_sg, NULL, NULL); 86*dbed73cbSSangeeta Misra if (rc != ILB_STATUS_OK) 87*dbed73cbSSangeeta Misra goto out; 88*dbed73cbSSangeeta Misra 89*dbed73cbSSangeeta Misra rc = ilb_walk_hc(h, i_drop_hc, NULL); 90*dbed73cbSSangeeta Misra out: 91*dbed73cbSSangeeta Misra return (rc); 92*dbed73cbSSangeeta Misra } 93*dbed73cbSSangeeta Misra 94*dbed73cbSSangeeta Misra ilb_status_t 95*dbed73cbSSangeeta Misra ilb_create_rule(ilb_handle_t h, const ilb_rule_data_t *rd) 96*dbed73cbSSangeeta Misra { 97*dbed73cbSSangeeta Misra ilb_status_t rc; 98*dbed73cbSSangeeta Misra ilb_comm_t *ic; 99*dbed73cbSSangeeta Misra size_t ic_sz; 100*dbed73cbSSangeeta Misra ilb_rule_info_t *rl; 101*dbed73cbSSangeeta Misra 102*dbed73cbSSangeeta Misra if (h == ILB_INVALID_HANDLE || rd == NULL || *rd->r_name == '\0') 103*dbed73cbSSangeeta Misra return (ILB_STATUS_EINVAL); 104*dbed73cbSSangeeta Misra 105*dbed73cbSSangeeta Misra if ((ic = i_ilb_alloc_req(ILBD_CREATE_RULE, &ic_sz)) == NULL) 106*dbed73cbSSangeeta Misra return (ILB_STATUS_ENOMEM); 107*dbed73cbSSangeeta Misra rl = (ilb_rule_info_t *)&ic->ic_data; 108*dbed73cbSSangeeta Misra 109*dbed73cbSSangeeta Misra /* 110*dbed73cbSSangeeta Misra * Since the IP address representation in ilb_rule_data_t and 111*dbed73cbSSangeeta Misra * ilb_rule_info_t is different, we need to convert between 112*dbed73cbSSangeeta Misra * them. 113*dbed73cbSSangeeta Misra */ 114*dbed73cbSSangeeta Misra (void) strlcpy(rl->rl_name, rd->r_name, sizeof (rl->rl_name)); 115*dbed73cbSSangeeta Misra (void) strlcpy(rl->rl_sgname, rd->r_sgname, sizeof (rl->rl_sgname)); 116*dbed73cbSSangeeta Misra (void) strlcpy(rl->rl_hcname, rd->r_hcname, sizeof (rl->rl_hcname)); 117*dbed73cbSSangeeta Misra rl->rl_flags = rd->r_flags; 118*dbed73cbSSangeeta Misra rl->rl_proto = rd->r_proto; 119*dbed73cbSSangeeta Misra rl->rl_ipversion = rd->r_vip.ia_af; 120*dbed73cbSSangeeta Misra rl->rl_minport = rd->r_minport; 121*dbed73cbSSangeeta Misra if (ntohs(rd->r_maxport) < ntohs(rd->r_minport)) 122*dbed73cbSSangeeta Misra rl->rl_maxport = rd->r_minport; 123*dbed73cbSSangeeta Misra else 124*dbed73cbSSangeeta Misra rl->rl_maxport = rd->r_maxport; 125*dbed73cbSSangeeta Misra rl->rl_algo = rd->r_algo; 126*dbed73cbSSangeeta Misra rl->rl_topo = rd->r_topo; 127*dbed73cbSSangeeta Misra rl->rl_conndrain = rd->r_conndrain; 128*dbed73cbSSangeeta Misra rl->rl_nat_timeout = rd->r_nat_timeout; 129*dbed73cbSSangeeta Misra rl->rl_sticky_timeout = rd->r_sticky_timeout; 130*dbed73cbSSangeeta Misra rl->rl_hcport = rd->r_hcport; 131*dbed73cbSSangeeta Misra rl->rl_hcpflag = rd->r_hcpflag; 132*dbed73cbSSangeeta Misra 133*dbed73cbSSangeeta Misra IP_COPY_CLI_2_IMPL(&rd->r_vip, &rl->rl_vip); 134*dbed73cbSSangeeta Misra IP_COPY_CLI_2_IMPL(&rd->r_stickymask, &rl->rl_stickymask); 135*dbed73cbSSangeeta Misra IP_COPY_CLI_2_IMPL(&rd->r_nat_src_start, &rl->rl_nat_src_start); 136*dbed73cbSSangeeta Misra IP_COPY_CLI_2_IMPL(&rd->r_nat_src_end, &rl->rl_nat_src_end); 137*dbed73cbSSangeeta Misra 138*dbed73cbSSangeeta Misra rc = i_ilb_do_comm(h, ic, ic_sz, ic, &ic_sz); 139*dbed73cbSSangeeta Misra if (rc != ILB_STATUS_OK) 140*dbed73cbSSangeeta Misra goto out; 141*dbed73cbSSangeeta Misra 142*dbed73cbSSangeeta Misra if (ic->ic_cmd != ILBD_CMD_OK) 143*dbed73cbSSangeeta Misra rc = *(ilb_status_t *)&ic->ic_data; 144*dbed73cbSSangeeta Misra 145*dbed73cbSSangeeta Misra out: 146*dbed73cbSSangeeta Misra free(ic); 147*dbed73cbSSangeeta Misra return (rc); 148*dbed73cbSSangeeta Misra } 149*dbed73cbSSangeeta Misra 150*dbed73cbSSangeeta Misra static ilb_status_t 151*dbed73cbSSangeeta Misra i_ilb_rule_action(ilb_handle_t h, const char *name, ilbd_cmd_t cmd) 152*dbed73cbSSangeeta Misra { 153*dbed73cbSSangeeta Misra ilb_status_t rc; 154*dbed73cbSSangeeta Misra ilb_comm_t *ic; 155*dbed73cbSSangeeta Misra size_t ic_sz; 156*dbed73cbSSangeeta Misra 157*dbed73cbSSangeeta Misra if (h == ILB_INVALID_HANDLE) 158*dbed73cbSSangeeta Misra return (ILB_STATUS_EINVAL); 159*dbed73cbSSangeeta Misra 160*dbed73cbSSangeeta Misra if ((ic = i_ilb_alloc_req(cmd, &ic_sz)) == NULL) 161*dbed73cbSSangeeta Misra return (ILB_STATUS_ENOMEM); 162*dbed73cbSSangeeta Misra 163*dbed73cbSSangeeta Misra if (name == NULL) { 164*dbed73cbSSangeeta Misra bzero(&ic->ic_data, sizeof (ilbd_name_t)); 165*dbed73cbSSangeeta Misra } else { 166*dbed73cbSSangeeta Misra (void) strlcpy((char *)&ic->ic_data, name, 167*dbed73cbSSangeeta Misra sizeof (ilbd_name_t)); 168*dbed73cbSSangeeta Misra } 169*dbed73cbSSangeeta Misra 170*dbed73cbSSangeeta Misra rc = i_ilb_do_comm(h, ic, ic_sz, ic, &ic_sz); 171*dbed73cbSSangeeta Misra if (rc != ILB_STATUS_OK) 172*dbed73cbSSangeeta Misra goto out; 173*dbed73cbSSangeeta Misra 174*dbed73cbSSangeeta Misra if (ic->ic_cmd != ILBD_CMD_OK) 175*dbed73cbSSangeeta Misra rc = *(ilb_status_t *)&ic->ic_data; 176*dbed73cbSSangeeta Misra 177*dbed73cbSSangeeta Misra out: 178*dbed73cbSSangeeta Misra free(ic); 179*dbed73cbSSangeeta Misra return (rc); 180*dbed73cbSSangeeta Misra } 181*dbed73cbSSangeeta Misra 182*dbed73cbSSangeeta Misra ilb_status_t 183*dbed73cbSSangeeta Misra ilb_destroy_rule(ilb_handle_t h, const char *name) 184*dbed73cbSSangeeta Misra { 185*dbed73cbSSangeeta Misra return (i_ilb_rule_action(h, name, ILBD_DESTROY_RULE)); 186*dbed73cbSSangeeta Misra } 187*dbed73cbSSangeeta Misra 188*dbed73cbSSangeeta Misra ilb_status_t 189*dbed73cbSSangeeta Misra ilb_enable_rule(ilb_handle_t h, const char *name) 190*dbed73cbSSangeeta Misra { 191*dbed73cbSSangeeta Misra return (i_ilb_rule_action(h, name, ILBD_ENABLE_RULE)); 192*dbed73cbSSangeeta Misra } 193*dbed73cbSSangeeta Misra 194*dbed73cbSSangeeta Misra ilb_status_t 195*dbed73cbSSangeeta Misra ilb_disable_rule(ilb_handle_t h, const char *name) 196*dbed73cbSSangeeta Misra { 197*dbed73cbSSangeeta Misra return (i_ilb_rule_action(h, name, ILBD_DISABLE_RULE)); 198*dbed73cbSSangeeta Misra } 199*dbed73cbSSangeeta Misra 200*dbed73cbSSangeeta Misra ilb_status_t 201*dbed73cbSSangeeta Misra i_ilb_retrieve_rule_names(ilb_handle_t h, ilb_comm_t **rbuf, size_t *rbufsz) 202*dbed73cbSSangeeta Misra { 203*dbed73cbSSangeeta Misra ilb_status_t rc; 204*dbed73cbSSangeeta Misra ilb_comm_t ic, *tmp_rbuf; 205*dbed73cbSSangeeta Misra 206*dbed73cbSSangeeta Misra *rbufsz = ILBD_MSG_SIZE; 207*dbed73cbSSangeeta Misra if ((tmp_rbuf = malloc(*rbufsz)) == NULL) 208*dbed73cbSSangeeta Misra return (ILB_STATUS_ENOMEM); 209*dbed73cbSSangeeta Misra 210*dbed73cbSSangeeta Misra ic.ic_cmd = ILBD_RETRIEVE_RULE_NAMES; 211*dbed73cbSSangeeta Misra 212*dbed73cbSSangeeta Misra rc = i_ilb_do_comm(h, &ic, sizeof (ic), tmp_rbuf, rbufsz); 213*dbed73cbSSangeeta Misra if (rc != ILB_STATUS_OK) 214*dbed73cbSSangeeta Misra goto out; 215*dbed73cbSSangeeta Misra 216*dbed73cbSSangeeta Misra if (tmp_rbuf->ic_cmd == ILBD_CMD_OK) { 217*dbed73cbSSangeeta Misra *rbuf = tmp_rbuf; 218*dbed73cbSSangeeta Misra return (rc); 219*dbed73cbSSangeeta Misra } 220*dbed73cbSSangeeta Misra rc = *(ilb_status_t *)&tmp_rbuf->ic_data; 221*dbed73cbSSangeeta Misra out: 222*dbed73cbSSangeeta Misra free(tmp_rbuf); 223*dbed73cbSSangeeta Misra *rbuf = NULL; 224*dbed73cbSSangeeta Misra return (rc); 225*dbed73cbSSangeeta Misra } 226*dbed73cbSSangeeta Misra 227*dbed73cbSSangeeta Misra static ilb_status_t 228*dbed73cbSSangeeta Misra i_ilb_walk_one_rule(ilb_handle_t h, rule_walkerfunc_t f, const char *name, 229*dbed73cbSSangeeta Misra void *arg) 230*dbed73cbSSangeeta Misra { 231*dbed73cbSSangeeta Misra ilb_status_t rc = ILB_STATUS_OK; 232*dbed73cbSSangeeta Misra ilb_rule_info_t *rl = NULL; 233*dbed73cbSSangeeta Misra ilb_rule_data_t rd; 234*dbed73cbSSangeeta Misra ilb_comm_t *ic, *rbuf; 235*dbed73cbSSangeeta Misra size_t ic_sz, rbufsz; 236*dbed73cbSSangeeta Misra 237*dbed73cbSSangeeta Misra 238*dbed73cbSSangeeta Misra if ((ic = i_ilb_alloc_req(ILBD_RETRIEVE_RULE, &ic_sz)) == NULL) 239*dbed73cbSSangeeta Misra return (ILB_STATUS_ENOMEM); 240*dbed73cbSSangeeta Misra rbufsz = sizeof (ilb_comm_t) + sizeof (ilb_rule_info_t); 241*dbed73cbSSangeeta Misra if ((rbuf = malloc(rbufsz)) == NULL) { 242*dbed73cbSSangeeta Misra free(ic); 243*dbed73cbSSangeeta Misra return (ILB_STATUS_ENOMEM); 244*dbed73cbSSangeeta Misra } 245*dbed73cbSSangeeta Misra 246*dbed73cbSSangeeta Misra (void) strlcpy((char *)&ic->ic_data, name, sizeof (ilbd_name_t)); 247*dbed73cbSSangeeta Misra rc = i_ilb_do_comm(h, ic, ic_sz, rbuf, &rbufsz); 248*dbed73cbSSangeeta Misra if (rc != ILB_STATUS_OK) 249*dbed73cbSSangeeta Misra goto out; 250*dbed73cbSSangeeta Misra if (rbuf->ic_cmd != ILBD_CMD_OK) { 251*dbed73cbSSangeeta Misra rc = *(ilb_status_t *)&rbuf->ic_data; 252*dbed73cbSSangeeta Misra goto out; 253*dbed73cbSSangeeta Misra } 254*dbed73cbSSangeeta Misra rl = (ilb_rule_info_t *)&rbuf->ic_data; 255*dbed73cbSSangeeta Misra 256*dbed73cbSSangeeta Misra /* 257*dbed73cbSSangeeta Misra * Since the IP address representation in ilb_rule_data_t and 258*dbed73cbSSangeeta Misra * ilb_rule_info_t is different, we need to convert between 259*dbed73cbSSangeeta Misra * them. 260*dbed73cbSSangeeta Misra */ 261*dbed73cbSSangeeta Misra (void) strlcpy(rd.r_name, rl->rl_name, sizeof (rd.r_name)); 262*dbed73cbSSangeeta Misra (void) strlcpy(rd.r_hcname, rl->rl_hcname, sizeof (rd.r_hcname)); 263*dbed73cbSSangeeta Misra (void) strlcpy(rd.r_sgname, rl->rl_sgname, sizeof (rd.r_sgname)); 264*dbed73cbSSangeeta Misra rd.r_flags = rl->rl_flags; 265*dbed73cbSSangeeta Misra rd.r_proto = rl->rl_proto; 266*dbed73cbSSangeeta Misra rd.r_minport = rl->rl_minport; 267*dbed73cbSSangeeta Misra rd.r_maxport = rl->rl_maxport; 268*dbed73cbSSangeeta Misra rd.r_algo = rl->rl_algo; 269*dbed73cbSSangeeta Misra rd.r_topo = rl->rl_topo; 270*dbed73cbSSangeeta Misra rd.r_conndrain = rl->rl_conndrain; 271*dbed73cbSSangeeta Misra rd.r_nat_timeout = rl->rl_nat_timeout; 272*dbed73cbSSangeeta Misra rd.r_sticky_timeout = rl->rl_sticky_timeout; 273*dbed73cbSSangeeta Misra rd.r_hcport = rl->rl_hcport; 274*dbed73cbSSangeeta Misra rd.r_hcpflag = rl->rl_hcpflag; 275*dbed73cbSSangeeta Misra 276*dbed73cbSSangeeta Misra IP_COPY_IMPL_2_CLI(&rl->rl_vip, &rd.r_vip); 277*dbed73cbSSangeeta Misra IP_COPY_IMPL_2_CLI(&rl->rl_nat_src_start, &rd.r_nat_src_start); 278*dbed73cbSSangeeta Misra IP_COPY_IMPL_2_CLI(&rl->rl_nat_src_end, &rd.r_nat_src_end); 279*dbed73cbSSangeeta Misra IP_COPY_IMPL_2_CLI(&rl->rl_stickymask, &rd.r_stickymask); 280*dbed73cbSSangeeta Misra 281*dbed73cbSSangeeta Misra rc = f(h, &rd, arg); 282*dbed73cbSSangeeta Misra 283*dbed73cbSSangeeta Misra out: 284*dbed73cbSSangeeta Misra free(ic); 285*dbed73cbSSangeeta Misra free(rbuf); 286*dbed73cbSSangeeta Misra return (rc); 287*dbed73cbSSangeeta Misra } 288*dbed73cbSSangeeta Misra 289*dbed73cbSSangeeta Misra ilb_status_t 290*dbed73cbSSangeeta Misra ilb_walk_rules(ilb_handle_t h, rule_walkerfunc_t f, const char *name, 291*dbed73cbSSangeeta Misra void *arg) 292*dbed73cbSSangeeta Misra { 293*dbed73cbSSangeeta Misra ilb_status_t rc; 294*dbed73cbSSangeeta Misra ilbd_namelist_t *names; 295*dbed73cbSSangeeta Misra ilb_comm_t *rbuf; 296*dbed73cbSSangeeta Misra size_t rbufsz; 297*dbed73cbSSangeeta Misra int i; 298*dbed73cbSSangeeta Misra 299*dbed73cbSSangeeta Misra if (h == NULL) 300*dbed73cbSSangeeta Misra return (ILB_STATUS_EINVAL); 301*dbed73cbSSangeeta Misra 302*dbed73cbSSangeeta Misra if (name != NULL) 303*dbed73cbSSangeeta Misra return (i_ilb_walk_one_rule(h, f, name, arg)); 304*dbed73cbSSangeeta Misra 305*dbed73cbSSangeeta Misra rc = i_ilb_retrieve_rule_names(h, &rbuf, &rbufsz); 306*dbed73cbSSangeeta Misra if (rc != ILB_STATUS_OK) 307*dbed73cbSSangeeta Misra return (rc); 308*dbed73cbSSangeeta Misra 309*dbed73cbSSangeeta Misra names = (ilbd_namelist_t *)&rbuf->ic_data; 310*dbed73cbSSangeeta Misra for (i = 0; i < names->ilbl_count; i++) { 311*dbed73cbSSangeeta Misra rc = i_ilb_walk_one_rule(h, f, names->ilbl_name[i], arg); 312*dbed73cbSSangeeta Misra /* 313*dbed73cbSSangeeta Misra * The rule may have been removed by another process since 314*dbed73cbSSangeeta Misra * we retrieve all the rule names, just continue. 315*dbed73cbSSangeeta Misra */ 316*dbed73cbSSangeeta Misra if (rc == ILB_STATUS_ENOENT) { 317*dbed73cbSSangeeta Misra rc = ILB_STATUS_OK; 318*dbed73cbSSangeeta Misra continue; 319*dbed73cbSSangeeta Misra } 320*dbed73cbSSangeeta Misra if (rc != ILB_STATUS_OK) 321*dbed73cbSSangeeta Misra break; 322*dbed73cbSSangeeta Misra } 323*dbed73cbSSangeeta Misra 324*dbed73cbSSangeeta Misra free(rbuf); 325*dbed73cbSSangeeta Misra return (rc); 326*dbed73cbSSangeeta Misra } 327