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.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <stdio.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <unistd.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <stdlib.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <strings.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <errno.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/types.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/socket.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <netinet/in.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <arpa/inet.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/list.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <netdb.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <ofmt.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <assert.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <libilb.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include "ilbadm.h"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_key_name_t rl_incoming_keys[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_VIP, "vip", ""},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_PORT, "port", ""},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_PROTOCOL, "protocol", "prot"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_BAD, "", ""}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_key_name_t rl_method_keys[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_ALGORITHM, "lbalg", "algo"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_TYPE, "type", "topo"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_SRC, "proxy-src", "nat-src"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_STICKY, "pmask", "persist"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_BAD, "", ""}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_key_name_t rl_outgoing_keys[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_SERVERGROUP, "servergroup", "sg"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_BAD, "", ""}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_key_name_t rl_healthchk_keys[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_HEALTHCHECK, "hc-name", "hcn"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_HCPORT, "hc-port", "hcp"},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_BAD, "", ""}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_key_name_t rl_timer_keys[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_CONNDRAIN, "conn-drain", ""},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_NAT_TO, "nat-timeout", ""},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_STICKY_TO, "persist-timeout", ""},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {ILB_KEY_BAD, "", ""}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_key_name_t *all_keys[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rl_incoming_keys, rl_method_keys, rl_outgoing_keys,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rl_healthchk_keys, rl_timer_keys, NULL
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* field ids for of_* functions */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_IP_VIP 0
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_IP_PROXYSRC 1
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_IP_STICKYMASK 2
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_STR_RNAME 0
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_STR_HCNAME 1
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_STR_SGNAME 2
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_STR_INTERFACE 3
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_PORT 0
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_HCPORT 1
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_T_CONN 0
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_T_NAT 1
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_T_STICKY 2
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_SRV_ID 0
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_SRV_ADDR 1
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_SRV_PORT 2
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_SRV_STATUS 3
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_SRV_RNAME 4
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_SRV_SGNAME 5
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define OF_SRV_HOSTNAME 6
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* some field sizes of ofmt_field_t arrays */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define IPv4_FIELDWIDTH 16
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define IPv6_FIELDWIDTH 39
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILB_HOSTNAMELEN 20
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILB_STATUSFIELD_LEN 7
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct arg_struct {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int flags;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *o_str;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_field_t *o_fields;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_handle_t oh;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} ilbadm_sh_rl_arg_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct ilbadm_rl_exp_arg {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra FILE *fp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} ilbadm_rl_exp_arg_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct ilbadm_rl_list_arg {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} ilbadm_rl_list_arg_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct ilbadm_rl_srvlist_arg {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *sgname;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_server_data_t *sd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int flags;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *o_str;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_field_t *o_fields;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_handle_t oh;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} ilbadm_rl_srvlist_arg_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_algo;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_proto;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_rl_ip;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_rl_mask;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_rport;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_rstatus;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_str;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_time;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_topo;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_cb_t of_rl_srvlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t of_srv2str(ofmt_arg_t *, char *, uint_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t of_port2str(in_port_t, in_port_t, char *, uint_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_field_t rfields_v4[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"RULENAME", ILB_NAMESZ, OF_STR_RNAME, of_str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"STATUS", ILB_STATUSFIELD_LEN, 0, of_rstatus},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PORT", 10, OF_PORT, of_rport},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PROTOCOL", 5, 0, of_proto},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"LBALG", 12, 0, of_algo},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"TYPE", 8, 0, of_topo},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PROXY-SRC", 2*IPv4_FIELDWIDTH+1, OF_IP_PROXYSRC, of_rl_ip},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PMASK", 6, OF_IP_STICKYMASK, of_rl_mask},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"HC-NAME", ILB_NAMESZ, OF_STR_HCNAME, of_str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"HC-PORT", 8, OF_HCPORT, of_rport},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"CONN-DRAIN", 11, OF_T_CONN, of_time},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"NAT-TIMEOUT", 12, OF_T_NAT, of_time},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PERSIST-TIMEOUT", 16, OF_T_STICKY, of_time},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERGROUP", ILB_SGNAME_SZ, OF_STR_SGNAME, of_str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"VIP", IPv4_FIELDWIDTH, OF_IP_VIP, of_rl_ip},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERS", 20, 0, of_rl_srvlist},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {NULL, 0, 0, NULL}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_field_t rfields_v6[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"RULENAME", ILB_NAMESZ, OF_STR_RNAME, of_str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"STATUS", ILB_STATUSFIELD_LEN, 0, of_rstatus},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PORT", 10, OF_PORT, of_rport},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PROTOCOL", 5, 0, of_proto},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"LBALG", 12, 0, of_algo},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"TYPE", 8, 0, of_topo},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PROXY-SRC", IPv6_FIELDWIDTH, OF_IP_PROXYSRC, of_rl_ip},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PMASK", 6, OF_IP_STICKYMASK, of_rl_mask},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"HC-NAME", ILB_NAMESZ, OF_STR_HCNAME, of_str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"HC-PORT", 8, OF_HCPORT, of_rport},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"CONN-DRAIN", 11, OF_T_CONN, of_time},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"NAT-TIMEOUT", 12, OF_T_NAT, of_time},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PERSIST-TIMEOUT", 16, OF_T_STICKY, of_time},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERGROUP", ILB_SGNAME_SZ, OF_STR_SGNAME, of_str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"VIP", IPv6_FIELDWIDTH, OF_IP_VIP, of_rl_ip},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERS", 20, 0, of_rl_srvlist},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {NULL, 0, 0, NULL}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_field_t ssfields_v4[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERID", ILB_NAMESZ, OF_SRV_ID, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"ADDRESS", IPv4_FIELDWIDTH, OF_SRV_ADDR, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PORT", 5, OF_SRV_PORT, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"RULENAME", ILB_NAMESZ, OF_SRV_RNAME, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"STATUS", ILB_STATUSFIELD_LEN, OF_SRV_STATUS, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERGROUP", ILB_SGNAME_SZ, OF_SRV_SGNAME, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"HOSTNAME", ILB_HOSTNAMELEN, OF_SRV_HOSTNAME, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {NULL, 0, 0, NULL}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_field_t ssfields_v6[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERID", ILB_NAMESZ, OF_SRV_ID, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"ADDRESS", IPv6_FIELDWIDTH, OF_SRV_ADDR, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PORT", 5, OF_SRV_PORT, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"RULENAME", ILB_NAMESZ, OF_SRV_RNAME, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"STATUS", ILB_STATUSFIELD_LEN, OF_SRV_STATUS, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERGROUP", ILB_SGNAME_SZ, OF_SRV_SGNAME, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"HOSTNAME", ILB_HOSTNAMELEN, OF_SRV_HOSTNAME, of_srv2str},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {NULL, 0, 0, NULL}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraextern int optind, optopt, opterr;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraextern char *optarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraextern ilbadm_val_type_t algo_types[];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraextern ilbadm_val_type_t topo_types[];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_key_to_opt(ilbadm_key_name_t *n, ilbadm_key_code_t k)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; n[i].k_key != ILB_KEY_BAD; i++)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (n[i].k_key == k)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (n[i].k_name);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrachar *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_key_to_opt(ilbadm_key_code_t k)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *name;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; all_keys[i] != NULL; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra name = i_key_to_opt(all_keys[i], k);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (*name != '\0')
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (name);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * ports are in HOST byte order
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraports2str(short port1, short port2, char *buf, const int sz)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (port2 <= port1)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, sz, "port=%d", port1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, sz, "port=%d-%d", port1, port2);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraproto2str(short proto, char *buf, int sz)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra struct protoent *pe;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra pe = getprotobynumber((int)proto);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (pe != NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, sz, "protocol=%s", pe->p_name);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) sprintf(buf, "(bad proto %d)", proto);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraalgo2str(ilb_algo_t algo, char *buf, int sz)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *s = i_str_from_val((int)algo, &algo_types[0]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, sz, "lbalg=%s", (s && *s) ? s : "(bad algo)");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic int
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraalgo2bare_str(ilb_algo_t algo, char *buf, int sz)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *s = i_str_from_val((int)algo, &algo_types[0]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (snprintf(buf, sz, "%s", (s && *s) ? s : ""));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratopo2str(ilb_topo_t topo, char *buf, int sz)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *s = i_str_from_val((int)topo, &topo_types[0]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, sz, "type=%s", (s && *s) ? s : "(bad type)");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic int
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratopo2bare_str(ilb_topo_t topo, char *buf, int sz)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *s = i_str_from_val((int)topo, &topo_types[0]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (snprintf(buf, sz, "%s", (s && *s) ? s : ""));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_str(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (of_arg->ofmt_id) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_STR_RNAME:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, rd->r_name, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_STR_SGNAME:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, rd->r_sgname, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_STR_HCNAME:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd->r_hcname != NULL && *(rd->r_hcname) != '\0')
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, rd->r_hcname, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_proto(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd->r_proto == IPPROTO_TCP)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, "TCP", bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else if (rd->r_proto == IPPROTO_UDP)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, "UDP", bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_FALSE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_rl_ip(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_ip_addr_t *ip = NULL, *ip2 = NULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (of_arg->ofmt_id) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_IP_VIP:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip = &rd->r_vip;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_IP_PROXYSRC:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip = &rd->r_nat_src_start;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2 = &rd->r_nat_src_end;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_IP_STICKYMASK:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip = &rd->r_stickymask;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* only print something valid */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (ip != NULL && (ip->ia_af == AF_INET || ip->ia_af == AF_INET6))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(ip, buf, bufsize, V6_ADDRONLY);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (ip2 != NULL && (ip2->ia_af == AF_INET || ip2->ia_af == AF_INET6) &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[0] != '\0') {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int sl = strlen(buf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf += sl; bufsize -= sl;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *buf++ = '-'; bufsize--;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(ip2, buf, bufsize, V6_ADDRONLY);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_rl_mask(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_ip_addr_t *ip = NULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra assert(of_arg->ofmt_id == OF_IP_STICKYMASK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (!(rd->r_flags & ILB_FLAGS_RULE_STICKY))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip = &rd->r_stickymask;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "/%d", ilbadm_mask_to_prefixlen(ip));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrahcport_print(ilb_rule_data_t *rd, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd->r_hcport != 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%d", ntohs(rd->r_hcport));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else if (rd->r_hcpflag == ILB_HCI_PROBE_ANY)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "ANY");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[0] = '\0';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_rport(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (of_arg->ofmt_id == OF_PORT)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (of_port2str(rd->r_minport, rd->r_maxport, buf,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra bufsize));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* only print a hcport if there's a hc name as well */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (of_arg->ofmt_id == OF_HCPORT && rd->r_hcname[0] != '\0')
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra hcport_print(rd, buf, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_rstatus(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rd->r_flags & ILB_FLAGS_RULE_ENABLED) == ILB_FLAGS_RULE_ENABLED)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[0] = 'E';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[0] = 'D';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[1] = '\0';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_algo(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (algo2bare_str(rd->r_algo, buf, bufsize) == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_FALSE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_topo(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (topo2bare_str(rd->r_topo, buf, bufsize) == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_FALSE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_time(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (of_arg->ofmt_id) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_T_CONN:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%u", rd->r_conndrain);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_T_NAT:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%u", rd->r_nat_timeout);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_T_STICKY:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%u", rd->r_sticky_timeout);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct rl_showlist_arg {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *buf;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint_t bufsize;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} rl_showlist_arg_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* called by ilb_walk_servers(), cannot get rid of unused args */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrasrv2srvID(ilb_handle_t h, ilb_server_data_t *sd, const char *sgname, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rl_showlist_arg_t *sla = (rl_showlist_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int len;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(sla->buf, sla->bufsize, "%s,", sd->sd_srvID);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra len = strlen(sd->sd_srvID) + 1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sla->buf += len;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sla->bufsize -= len;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_rl_srvlist(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t *ra = (ilbadm_rl_list_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd = (ilb_rule_data_t *)ra->rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rl_showlist_arg_t sla;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sla.buf = buf;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sla.bufsize = bufsize;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_walk_servers(ra->h, srv2srvID, rd->r_sgname,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void *)&sla);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* we're trailing a ',' which we need to remove */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *--sla.buf = '\0';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RMAXCOLS 120 /* enough? */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define SERVER_WIDTH (ILB_NAMESZ+1) /* 1st guess */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_port2str(in_port_t minport, in_port_t maxport, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra in_port_t h_min, h_max;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int len;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra h_min = ntohs(minport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra h_max = ntohs(maxport);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h_min == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_FALSE); /* print "unspec" == "all ports" */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra len = snprintf(buf, bufsize, "%d", h_min);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h_max > h_min)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf + len, bufsize - len, "-%d", h_max);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraip2hostname(ilb_ip_addr_t *ip, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ret;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra struct hostent *he;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (ip->ia_af) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case AF_INET:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra he = getipnodebyaddr((char *)&ip->ia_v4, sizeof (ip->ia_v4),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip->ia_af, &ret);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case AF_INET6:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra he = getipnodebyaddr((char *)&ip->ia_v6, sizeof (ip->ia_v6),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip->ia_af, &ret);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default: return (ILBADM_INVAL_AF);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if we can't resolve this, just return an empty name */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (he == NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[0] = '\0';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, he->h_name, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILBADM_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Since this function is used by libilb routine ilb_walk_rules()
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * it must return libilb errors
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_show_onerule(ilb_handle_t h, ilb_rule_data_t *rd, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_sh_rl_arg_t *larg = (ilbadm_sh_rl_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_status_t oerr;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int oflags = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ocols = RMAXCOLS;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_list_arg_t ra;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra static ofmt_handle_t oh = (ofmt_handle_t)NULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_field_t *fields;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t r_enabled = rd->r_flags & ILB_FLAGS_RULE_ENABLED;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (larg->o_str == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("internal error"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_GENERIC);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * only print rules (enabled/dis-) we're asked to
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * note: both LIST_**ABLED flags can be set at the same time,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * whereas a rule has one state only. therefore the complicated
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * statement.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (!((r_enabled && (larg->flags & ILBADM_LIST_ENABLED)) ||
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (!r_enabled && (larg->flags & ILBADM_LIST_DISABLED))))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (larg->flags & ILBADM_LIST_PARSE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra oflags |= OFMT_PARSABLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (larg->flags & ILBADM_LIST_FULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra oflags |= OFMT_MULTILINE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra bzero(&ra, sizeof (ra));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ra.rd = rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ra.h = h;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (oh == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd->r_vip.ia_af == AF_INET)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fields = rfields_v4;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fields = rfields_v6;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra oerr = ofmt_open(larg->o_str, fields, oflags, ocols, &oh);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (oerr != OFMT_SUCCESS) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char e[80];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("ofmt_open failed: %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_strerror(oh, oerr, e, sizeof (e)));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_GENERIC);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_print(oh, &ra);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char *full_list_rule_hdrs =
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra "RULENAME,STATUS,PORT,PROTOCOL,LBALG,TYPE,PROXY-SRC,PMASK,"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra "HC-NAME,HC-PORT,CONN-DRAIN,NAT-TIMEOUT,"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra "PERSIST-TIMEOUT,SERVERGROUP,VIP,SERVERS";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char *def_list_rule_hdrs =
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra "RULENAME,STATUS,LBALG,TYPE,PROTOCOL,VIP,PORT";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_show_rules(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int c;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t o_opt = B_FALSE, p_opt = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t f_opt = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_sh_rl_arg_t larg = {0, NULL, NULL, NULL};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg.flags = ILBADM_LIST_ENABLED | ILBADM_LIST_DISABLED;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":fpedo:")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'f': larg.flags |= ILBADM_LIST_FULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg.o_str = full_list_rule_hdrs;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra f_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'p': larg.flags |= ILBADM_LIST_PARSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra p_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'o': larg.o_str = optarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra o_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* -e and -d may be repeated - make sure the last one wins */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'e': larg.flags &= ILBADM_LIST_NODISABLED;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg.flags |= ILBADM_LIST_ENABLED;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'd': larg.flags &= ILBADM_LIST_NOENABLED;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg.flags |= ILBADM_LIST_DISABLED;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ':': ilbadm_err(gettext("missing option argument for %c"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (char)optopt);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case '?':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra unknown_opt(argv, optind-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (f_opt && o_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("options -o and -f are mutually"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " exclusive"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (p_opt && !o_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires -o"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (p_opt && larg.o_str != NULL &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (strcasecmp(larg.o_str, "all") == 0)) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires explicit field"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " names for -o"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* no -o option, so we use std. fields */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (!o_opt && !f_opt)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg.o_str = def_list_rule_hdrs;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind >= argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_rules(h, ilbadm_show_onerule, NULL,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void*)&larg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while (optind < argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_rules(h, ilbadm_show_onerule,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra argv[optind++], (void*)&larg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * The show function returns ILB_STATUS_GENERIC after printing
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * out an error message. So we don't need to print it again.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_GENERIC)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_srv2str(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_srvlist_arg_t *larg =
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (ilbadm_rl_srvlist_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_server_data_t *sd = larg->sd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint_t op = of_arg->ofmt_id;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t ret = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sd == NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_FALSE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (op) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_SRV_ID:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, sd->sd_srvID, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_SRV_STATUS:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (ILB_IS_SRV_ENABLED(sd->sd_flags))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[0] = 'E';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[0] = 'D';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[1] = '\0';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_SRV_RNAME:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, larg->rd->r_name, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_SRV_SGNAME:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(buf, larg->sgname, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_SRV_HOSTNAME:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ip2hostname(&sd->sd_addr, buf, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf[0] = '\0';
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ret = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_SRV_PORT:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ret = of_port2str(sd->sd_minport, sd->sd_maxport,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra buf, bufsize);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case OF_SRV_ADDR:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&sd->sd_addr, buf, bufsize, V6_ADDRONLY);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ret);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_show_rl_srv(ilb_handle_t h, ilb_server_data_t *sd, const char *sgname,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_srvlist_arg_t *larg = (ilbadm_rl_srvlist_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg->sd = sd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_print(larg->oh, larg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Since this function is used by libilb routine ilb_walk_rules()
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * it must return libilb errors
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_show_rl_servers(ilb_handle_t h, ilb_rule_data_t *rd, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_status_t oerr;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int oflags = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ocols = RMAXCOLS;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_field_t *fields;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra static ofmt_handle_t oh = (ofmt_handle_t)NULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_srvlist_arg_t *larg = (ilbadm_rl_srvlist_arg_t *)arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * in full mode, we currently re-open ofmt() for every rule; we use
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * a variable number of lines, as we print one for every server
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * attached to a rule.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (larg->o_str == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("internal error"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_GENERIC);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (larg->flags & ILBADM_LIST_PARSE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra oflags |= OFMT_PARSABLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd->r_vip.ia_af == AF_INET)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fields = ssfields_v4;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fields = ssfields_v6;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (oh == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra oerr = ofmt_open(larg->o_str, fields, oflags, ocols, &oh);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (oerr != OFMT_SUCCESS) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char e[80];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("ofmt_open failed: %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_strerror(oh, oerr, e, sizeof (e)));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_GENERIC);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg->oh = oh;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg->rd = rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg->sgname = rd->r_sgname;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilb_walk_servers(h, i_show_rl_srv, rd->r_sgname, (void *)larg));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char *def_show_srv_hdrs =
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra "SERVERID,ADDRESS,PORT,RULENAME,STATUS,SERVERGROUP";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_show_server(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int c;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t o_opt = B_FALSE, p_opt = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_srvlist_arg_t larg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra bzero(&larg, sizeof (larg));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":po:")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'p': larg.flags |= ILBADM_LIST_PARSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra p_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'o': larg.o_str = optarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra o_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ':': ilbadm_err(gettext("missing option argument for %c"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (char)optopt);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case '?':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra unknown_opt(argv, optind-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (p_opt && !o_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires -o"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (p_opt && larg.o_str != NULL &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (strcasecmp(larg.o_str, "all") == 0)) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires explicit"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " field names for -o"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* no -o option, so we use default fields */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (!o_opt)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra larg.o_str = def_show_srv_hdrs;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind >= argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_rules(h, ilbadm_show_rl_servers, NULL,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void*)&larg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while (optind < argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_rules(h, ilbadm_show_rl_servers,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra argv[optind++], (void*)&larg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * The show function returns ILB_STATUS_GENERIC after printing
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * out an error message. So we don't need to print it again.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_GENERIC)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_parse_rl_arg(char *arg, ilb_rule_data_t *rd, ilbadm_key_name_t *keylist)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_optstring(arg, (void *) rd, keylist,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra OPT_PORTS, NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_ilbadm_alloc_rule(ilb_rule_data_t **rdp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *rdp = rd = (ilb_rule_data_t *)calloc(sizeof (*rd), 1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd == NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rd->r_proto = IPPROTO_TCP;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_ilbadm_free_rule(ilb_rule_data_t *rd)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra free(rd);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_destroy_rule(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t all_rules = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int c, i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":a")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'a':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra all_rules = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case '?':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra unknown_opt(argv, optind-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind >= argc && !all_rules) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("usage: delete-rule -a | name"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILBADM_LIBERR);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* either "-a" or rulename, not both */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind < argc && all_rules) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_INVAL_ARGS;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (all_rules) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_destroy_rule(h, NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = optind; i < argc && rclib == ILB_STATUS_OK; i++)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_destroy_rule(h, argv[i]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* This prints the specific errors */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* This prints the generic errors */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilbadm_errstr(rc));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_Xable_rule(int argc, char *argv[], ilbadm_cmd_t cmd)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * by default, en/disable-rule mean "all", and not using
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * a rule name will cause this behaviour to kick in
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (argc < 2) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (cmd == cmd_enable_rule)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_enable_rule(h, NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_disable_rule(h, NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = optind; i < argc && rc == ILBADM_OK; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (cmd == cmd_enable_rule)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_enable_rule(h, argv[i]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_disable_rule(h, argv[i]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_enable_rule(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilbadm_Xable_rule(argc, argv, cmd_enable_rule));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_disable_rule(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ilbadm_Xable_rule(argc, argv, cmd_disable_rule));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * parse and create a rule
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_create_rule(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_handle_t h = ILB_INVALID_HANDLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int c;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib = ILB_STATUS_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_rule_data_t *rd;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t p_opt = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_ilbadm_alloc_rule(&rd);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":ei:m:o:t:h:p")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'e':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rd->r_flags |= ILB_FLAGS_RULE_ENABLED;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'h':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Default value of of r_hcpflag means that if there
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * is a port range, probe any port. If there is only
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * one port, probe that port.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rd->r_hcpflag = ILB_HCI_PROBE_ANY;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_rl_arg(optarg, rd, &rl_healthchk_keys[0]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'o':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_rl_arg(optarg, rd, &rl_outgoing_keys[0]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'm':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_rl_arg(optarg, rd, &rl_method_keys[0]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 't':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_rl_arg(optarg, rd, &rl_timer_keys[0]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'i':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_parse_rl_arg(optarg, rd, &rl_incoming_keys[0]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'p':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra p_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ':':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing option-argument"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " for %c"), (char)optopt);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case '?':
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra unknown_opt(argv, optind-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind >= argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("missing mandatory arguments - please refer"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " to 'ilbadm create-rule' subcommand description in"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " ilbadm(1M)"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (p_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * if user hasn't specified a mask, apply default
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rd->r_flags & ILB_FLAGS_RULE_STICKY) == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *maskstr;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (rd->r_vip.ia_af) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case AF_INET:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra maskstr = "32";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case AF_INET6:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra maskstr = "128";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ilbadm_set_netmask(maskstr, &rd->r_stickymask,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rd->r_vip.ia_af);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("trouble seting default"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " persistence mask"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* use of sticky mask currently mandates "-p" */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rd->r_flags & ILB_FLAGS_RULE_STICKY) != 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("use of stickymask requires"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " -p option"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strlen(argv[optind]) > ILBD_NAMESZ -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("rule name %s is too long -"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " must not exceed %d chars"), argv[optind],
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ILBD_NAMESZ - 1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(rd->r_name, argv[optind], sizeof (rd->r_name));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_check_rule_spec(rd);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_open(&h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_create_rule(h, rd);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_ilbadm_free_rule(rd);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (h != ILB_INVALID_HANDLE)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ilb_close(h);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilb_errstr(rclib));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilbadm_errstr(rc));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Since this function is used by libilb function, ilb_walk_rules()
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * it must return libilb errors
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilb_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_export_rl(ilb_handle_t h, ilb_rule_data_t *rd, void *arg)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char linebuf[128]; /* should be enough */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int sz = sizeof (linebuf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra FILE *fp = ((ilbadm_rl_exp_arg_t *)arg)->fp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint32_t conndrain, nat_timeout, sticky_timeout;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "create-rule ");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd->r_flags & ILB_FLAGS_RULE_ENABLED)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "-e ");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd->r_flags & ILB_FLAGS_RULE_STICKY)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "-p ");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&rd->r_vip, linebuf, sz, V6_ADDRONLY);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "-i vip=%s,", linebuf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) ports2str(ntohs(rd->r_minport), ntohs(rd->r_maxport),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra linebuf, sz);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "%s,", linebuf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra proto2str(rd->r_proto, linebuf, sz);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "%s ", linebuf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra algo2str(rd->r_algo, linebuf, sz);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "-m %s,", linebuf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra topo2str(rd->r_topo, linebuf, sz);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "%s", linebuf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd->r_nat_src_start.ia_af != AF_UNSPEC) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&rd->r_nat_src_start, linebuf, sz, V6_ADDRONLY);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if the address is unspecified, skip it */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (linebuf[0] != '\0') {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, ",proxy-src=%s", linebuf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ip2str(&rd->r_nat_src_end, linebuf, sz, V6_ADDRONLY);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "-%s", linebuf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rd->r_flags & ILB_FLAGS_RULE_STICKY) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, ",pmask=/%d",
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_mask_to_prefixlen(&rd->r_stickymask));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, " ");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (*rd->r_hcname != '\0') {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "-h hc-name=%s", rd->r_hcname);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra hcport_print(rd, linebuf, sizeof (linebuf));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (linebuf[0] != '\0')
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, ",hc-port=%s", linebuf);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, " ");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra conndrain = rd->r_conndrain;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra nat_timeout = rd->r_nat_timeout;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sticky_timeout = rd->r_sticky_timeout;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (conndrain != 0 || nat_timeout != 0 || sticky_timeout != 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int cnt = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "-t ");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (conndrain != 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra cnt++;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "conn-drain=%u", conndrain);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (nat_timeout != 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (cnt > 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, ",");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra cnt++;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "nat-timeout=%u", nat_timeout);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sticky_timeout != 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (cnt > 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, ",");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, "persist-timeout=%u",
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sticky_timeout);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) fprintf(fp, " ");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (fprintf(fp, "-o servergroup=%s %s\n", rd->r_sgname, rd->r_name)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra < 0 || fflush(fp) == EOF)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_WRITE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILB_STATUS_OK);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_export_rules(ilb_handle_t h, FILE *fp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilb_status_t rclib;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_rl_exp_arg_t arg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra arg.fp = fp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rclib = ilb_walk_rules(h, ilbadm_export_rl, NULL, (void *)&arg);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rclib != ILB_STATUS_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}