dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * CDDL HEADER START
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * The contents of this file are subject to the terms of the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Common Development and Distribution License (the "License").
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * You may not use this file except in compliance with the License.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * or http://www.opensolaris.org/os/licensing.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * See the License for the specific language governing permissions
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and limitations under the License.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * When distributing Covered Code, include this CDDL HEADER in each
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * If applicable, add the following below this CDDL HEADER, with the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * fields enclosed by brackets "[]" replaced with your own identifying
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * information: Portions Copyright [yyyy] [name of copyright owner]
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * CDDL HEADER END
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Use is subject to license terms.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <stdlib.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <strings.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/types.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/socket.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <inttypes.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <assert.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <libilb.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <libilb_impl.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <locale.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef enum {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra internal,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra external
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} ip_addr_type_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic int
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrasign64(int64_t n)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (n >= 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic int
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrasign32(int32_t n)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (n >= 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * since the difference between two uint64_ts can be greater than
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * what a int64_t can hold, we need to cap the result at +/- INT64_MAX
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * return: < 0: x < y, 0: x == y, > 0: x > y
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic int64_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrasigned_diff64(uint64_t x, uint64_t y)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t ud;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int s = -1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (x == y)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (0);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* make sure we have x < y */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (x > y) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra s = 1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra t = x; x = y; y = t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ud = y - x;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (ud > INT64_MAX)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (INT64_MAX * s);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return ((int64_t)ud * s);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic uint64_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraunsigned_diff64(uint64_t x, uint64_t y, int *sgn)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int s = -1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (x == y)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (0);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* make sure we have x < y */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (x > y) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra s = 1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra t = x; x = y; y = t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *sgn = s;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (y - x);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * compare ip addresses ip1 and ip2 (as unsigned integers)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * return: -1: ip1 < ip2, 0: ip1 == ip2, 1: ip1 > ip2
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * input addresses are assumed to be in network byte order
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * diff contains the difference between the two with the same
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * sign as the comparison result;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * NOTE: since ipv6 address (difference)s can be more than a 64bit
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * value can express, the difference is capped at +/- INT64_MAX
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic int
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_cmp_addr_impl(void *ip1, void *ip2, ip_addr_type_t atype, int64_t *diff)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra struct in6_addr *a6_1, *a6_2;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint32_t i1, i2;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint32_t l1, l2;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int af, sgn;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int64_t d;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (atype == internal) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra af = GET_AF((struct in6_addr *)ip1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (af == AF_INET) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra IN6_V4MAPPED_TO_IPADDR((struct in6_addr *)ip1, i1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra IN6_V4MAPPED_TO_IPADDR((struct in6_addr *)ip2, i2);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra l1 = ntohl(i1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra l2 = ntohl(i2);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra a6_1 = (struct in6_addr *)ip1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra a6_2 = (struct in6_addr *)ip2;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra af = ((ilb_ip_addr_t *)ip1)->ia_af;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (af == AF_INET) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra struct in_addr *a1, *a2;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra a1 = &((ilb_ip_addr_t *)ip1)->ia_v4;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra a2 = &((ilb_ip_addr_t *)ip2)->ia_v4;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra l1 = ntohl((uint32_t)a1->s_addr);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra l2 = ntohl((uint32_t)a2->s_addr);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra a6_1 = &((ilb_ip_addr_t *)ip1)->ia_v6;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra a6_2 = &((ilb_ip_addr_t *)ip2)->ia_v6;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (af == AF_INET) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra d = l1 - l2;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sgn = sign32((int32_t)d);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we're facing the dilemma that 128-bit ipv6 addresses are
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * larger than the largest integer type - int64_t.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we handle this thus:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * 1. seperate high-order and low-order bits (64 each) into
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * *h and *l variables (unsigned).
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * 2. calculate difference for *h and *l:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * low: unsigned
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * high: signed
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * 3. if high-order diff == 0, we can take low-order
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * diff, if necessary cap it, convert it to signed
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and be done
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * 4. if high-order and low-order signs are the same, the low-
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * order bits won't significantly impact high-order
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * difference, so we know that we've overflowed an int64_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * if high-order diff is > 1, any low-order difference won't
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * change the overflow.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * 5. (dh == 1 and l_sign <= 0) or (dh == -1 and l_sign > 0),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * ie, dh == +/- 2^64
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * 5a. if dl < INT64_MAX, the result is still > INT64_MAX, so
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we cap again.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * 5b. dl >= INT64_MAX
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we need to express (for dh == 1):
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * (2^64) + x (where x < 0).
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Since the largest number we have is
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * 2^64 - 1 == UINT64_MAX
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we use
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * (2^64 - 1) + x + 1
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * for dh == -1, all we have is
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * -(2^63 - 1), so to express
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * -(2^64) + x,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we first do (dl - (2^63-1)) (which is then also < 2^63),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * si we can then add that to -(2^63 - 1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t i1h, i1l;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t i2h, i2l;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t dl;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int64_t dh;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int l_sign;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* 1. */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i1h = INV6_N2H_MSB64(a6_1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i1l = INV6_N2H_LSB64(a6_1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i2h = INV6_N2H_MSB64(a6_2);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i2l = INV6_N2H_LSB64(a6_2);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* 2. */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra dh = signed_diff64(i1h, i2h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra dl = unsigned_diff64(i1l, i2l, &l_sign);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* 3. */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (dh == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (dl > INT64_MAX)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra dl = INT64_MAX;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra d = dl * l_sign;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* 4, */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else if (l_sign == sign64(dh) || abs(dh) > 1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (dh > 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra d = INT64_MAX;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra d = -INT64_MAX;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* 5. */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (dl < INT64_MAX) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra d = INT64_MAX;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (dh == 1)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra d = UINT64_MAX - dl + 1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra d = -INT64_MAX - (dl - INT64_MAX) - 1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sgn = sign64(d);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (diff != NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *diff = d;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (d == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (0);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (sgn);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraint
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailb_cmp_in6_addr(struct in6_addr *ip1, struct in6_addr *ip2, int64_t *diff)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int res;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra res = i_cmp_addr_impl(ip1, ip2, internal, diff);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (res);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraint
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailb_cmp_ipaddr(ilb_ip_addr_t *ip1, ilb_ip_addr_t *ip2, int64_t *diff)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int res;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra res = i_cmp_addr_impl(ip1, ip2, external, diff);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (res);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Error strings for error values returned by libilb functions
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraconst char *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailb_errstr(ilb_status_t rc)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (rc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_OK:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "no error"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_INTERNAL:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "error internal to the library"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_EINVAL:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "invalid argument(s) - see"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " man page"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_ENOMEM:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "not enough memory"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " for operation"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_ENOENT:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "no such/no more element(s)"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_SOCKET:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "socket() failed"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_READ:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "read() failed"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_WRITE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "fflush() or send() failed"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_TIMER:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "health check timer"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " create/setup error"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_INUSE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "object is in use,"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " cannot destroy"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_EEXIST:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "object already exists"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_PERMIT:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "no scf permit"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_CALLBACK:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "scf callback error"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_INPROGRESS:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "operation is progress"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_SEND:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "send() failed"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_ENOHCINFO:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "missing healthcheck info"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_INVAL_HCTESTTYPE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "invalid health check"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " test type"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_INVAL_CMD:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "invalid command"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_DUP_RULE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "specified rule name already"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " exists"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_ENORULE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "specified rule does not exist"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_MISMATCHSG:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "address family mismatch with"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " servergroup"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_MISMATCHH:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "address family mismatch"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " with previous hosts in servergroup or with rule"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_SGUNAVAIL:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "cannot find specified"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " server group"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_SGINUSE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "cannot remove server"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " group - its in use with other active rules"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_SGEXISTS:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "servergroup already exists"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_SGFULL:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "servergroup is full - cannot"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " add any more servers to this servergroup"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_SGEMPTY:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "servergroup does not contain"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " any servers"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_NAMETOOLONG:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "servergroup name can"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " only contain a maximum of 14 characters"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_CFGAUTH:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "user is not authorized to"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " execute command"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_CFGUPDATE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "a failure occurred while trying"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " to update persistent config. Panic?"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_BADSG:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "the rule's port range"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " does not match that of the servers' in associated"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " servergroup"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_INVAL_SRVR:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "server cannot be added to the"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " servergroup, as the servergroup is associated to rule(s)"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " with port/port range that is incompatible"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra "with the server's port"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_INVAL_ENBSRVR:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "server cannot be enabled"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " because it's not associated with any rule"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_BADPORT:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "the rule's port value does"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " not match that of the servers' in"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " associated servergroup"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_SRVUNAVAIL:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "cannot find specified server"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_RULE_NO_HC:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "rule does not have health "
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra "check enabled"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_RULE_HC_MISMATCH:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "protocol used in rule and "
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra "health check does not match"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILB_STATUS_HANDLE_CLOSING:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "handle is being closed"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (dgettext(TEXT_DOMAIN, "unknown error"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* Allocate space for a specified request to be sent to ilbd. */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailb_comm_t *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_ilb_alloc_req(ilbd_cmd_t cmd, size_t *ic_sz)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_comm_t *ic;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra size_t sz;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sz = sizeof (ilb_comm_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (cmd) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_CREATE_RULE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sz += sizeof (ilb_rule_info_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_RETRIEVE_RULE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_DESTROY_RULE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_ENABLE_RULE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_DISABLE_RULE:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_RETRIEVE_SG_HOSTS:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_DESTROY_SERVERGROUP:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_CREATE_SERVERGROUP:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_DESTROY_HC:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_GET_HC_INFO:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_GET_HC_SRVS:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sz += sizeof (ilbd_name_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_ENABLE_SERVER:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_DISABLE_SERVER:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_ADD_SERVER_TO_GROUP:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_REM_SERVER_FROM_GROUP:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_SRV_ADDR2ID:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_SRV_ID2ADDR:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sz += sizeof (ilb_sg_info_t) + sizeof (ilb_sg_srv_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBD_CREATE_HC:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sz += sizeof (ilb_hc_info_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* Should not reach here. */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra assert(0);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((ic = calloc(1, sz)) == NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *ic_sz = sz;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ic->ic_cmd = cmd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ic->ic_flags = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ic);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}