45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER START
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * The contents of this file are subject to the terms of the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Common Development and Distribution License (the "License").
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You may not use this file except in compliance with the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * or http://www.opensolaris.org/os/licensing.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * See the License for the specific language governing permissions
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * and limitations under the License.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * When distributing Covered Code, include this CDDL HEADER in each
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * If applicable, add the following below this CDDL HEADER, with the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * fields enclosed by brackets "[]" replaced with your own identifying
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * information: Portions Copyright [yyyy] [name of copyright owner]
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * CDDL HEADER END
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Use is subject to license terms.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * From "misc.c 5.15 00/05/31 SMI; TSOL 2.x"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Miscellaneous user interfaces to trusted label functions.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <ctype.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <stdio.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <stdlib.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <strings.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <errno.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <libintl.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <libtsnet.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <tsol/label.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#include <net/route.h>
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define MAX_ATTR_LEN 1024
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * Parse off an entry from a line. Entry is stored in 'outbuf'. Returned
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * value is a pointer to the first unprocessed input character from 'instr'.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkconst char *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkparse_entry(char *outbuf, size_t outlen, const char *instr,
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk const char *delimit)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk boolean_t escape_state = B_FALSE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk boolean_t any_white;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char chr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk any_white = strchr(delimit, '\n') != NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /*
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * User may specify outlen as 0 to skip over a field without storing
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * it anywhere. Otherwise, we need at least one byte for the
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk * terminating NUL plus one byte to store another byte from instr.
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (outlen != 1 && (chr = *instr++) != '\0') {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!escape_state) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (chr == '\\') {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk escape_state = B_TRUE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strchr(delimit, chr) != NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (any_white && isspace(chr))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk escape_state = B_FALSE;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (outlen > 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *outbuf++ = chr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk outlen--;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (outlen != 1)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk instr--;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (escape_state)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk instr--;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (outlen > 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *outbuf = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (instr);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshirechar *
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshiresl_to_str(const m_label_t *sl)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire char *sl_str = NULL;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire static char unknown_str[] = "UNKNOWN";
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (sl == NULL)
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire return (strdup(unknown_str));
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire if ((label_to_str(sl, &sl_str, M_LABEL, DEF_NAMES) != 0) &&
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire (label_to_str(sl, &sl_str, M_INTERNAL, DEF_NAMES) != 0))
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire return (strdup(unknown_str));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (sl_str);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic const char *rtsa_keywords[] = {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define SAK_MINSL 0
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "min_sl",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define SAK_MAXSL 1
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "max_sl",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define SAK_DOI 2
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "doi",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk#define SAK_CIPSO 3
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "cipso",
e34b029407ed5ec566196ede3f54256d7868dd10wy#define SAK_SL 4
e34b029407ed5ec566196ede3f54256d7868dd10wy "sl",
e34b029407ed5ec566196ede3f54256d7868dd10wy#define SAK_INVAL 5
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk NULL
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk};
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkconst char *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkrtsa_to_str(const struct rtsa_s *rtsa, char *line, size_t len)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk size_t slen;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk uint32_t mask, i;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire char *sl_str = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slen = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *line = '\0';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mask = rtsa->rtsa_mask;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (i = 1; mask != 0 && i != 0 && slen < len - 1; i <<= 1) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!(i & (RTSA_MINSL|RTSA_MAXSL|RTSA_DOI|RTSA_CIPSO)))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!(i & mask))
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk continue;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (slen != 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk line[slen++] = ',';
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk switch (i & mask) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case RTSA_MINSL:
e34b029407ed5ec566196ede3f54256d7868dd10wy if ((mask & RTSA_MAXSL) &&
e34b029407ed5ec566196ede3f54256d7868dd10wy blequal(&rtsa->rtsa_slrange.lower_bound,
e34b029407ed5ec566196ede3f54256d7868dd10wy &rtsa->rtsa_slrange.upper_bound)) {
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sl_str =
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sl_to_str(&rtsa->rtsa_slrange.lower_bound);
e34b029407ed5ec566196ede3f54256d7868dd10wy slen += snprintf(line + slen, len - slen,
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire "sl=%s", sl_str);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire free(sl_str);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sl_str = NULL;
e34b029407ed5ec566196ede3f54256d7868dd10wy mask ^= RTSA_MAXSL;
e34b029407ed5ec566196ede3f54256d7868dd10wy break;
e34b029407ed5ec566196ede3f54256d7868dd10wy }
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sl_str = sl_to_str(&rtsa->rtsa_slrange.lower_bound);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slen += snprintf(line + slen, len - slen, "min_sl=%s",
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sl_str);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire free(sl_str);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sl_str = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case RTSA_MAXSL:
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sl_str = sl_to_str(&rtsa->rtsa_slrange.upper_bound);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slen += snprintf(line + slen, len - slen, "max_sl=%s",
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sl_str);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire free(sl_str);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sl_str = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case RTSA_DOI:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slen += snprintf(line + slen, len - slen, "doi=%d",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk rtsa->rtsa_doi);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case RTSA_CIPSO:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk slen += snprintf(line + slen, len - slen, "cipso");
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (line);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkboolean_t
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkrtsa_keyword(const char *options, struct rtsa_s *sp, int *errp, char **errstrp)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk const char *valptr, *nxtopt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk uint32_t mask = 0, doi;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int key;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire m_label_t *min_sl = NULL, *max_sl = NULL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char attrbuf[MAX_ATTR_LEN];
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk const char **keyword;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk int err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk char *errstr, *cp;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (errp == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk errp = &err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (errstrp == NULL)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk errstrp = &errstr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)options;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk while (*options != '\0') {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk valptr = parse_entry(attrbuf, sizeof (attrbuf), options, ",=");
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (attrbuf[0] == '\0') {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)options;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_ILL_ENTRY;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk for (keyword = rtsa_keywords; *keyword != NULL; keyword++)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (strcmp(*keyword, attrbuf) == 0)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((key = keyword - rtsa_keywords) == SAK_INVAL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)options;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_ILL_KEY;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if ((key == SAK_CIPSO && *valptr == '=') ||
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk (key != SAK_CIPSO && *valptr != '=')) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)valptr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_ILL_VALDELIM;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nxtopt = valptr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*valptr == '=') {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk valptr++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nxtopt = parse_entry(attrbuf, sizeof (attrbuf),
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk valptr, ",=");
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*nxtopt == '=') {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)nxtopt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_ILL_KEYDELIM;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (*nxtopt == ',')
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk nxtopt++;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk switch (key) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case SAK_MINSL:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mask & RTSA_MINSL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)options;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_DUP_KEY;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire m_label_free(min_sl); /* in case of duplicate */
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire min_sl = NULL;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire if (str_to_label(attrbuf, &min_sl, MAC_LABEL,
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire L_NO_CORRECTION, NULL) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)valptr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_ILL_LOWERBOUND;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mask |= RTSA_MINSL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case SAK_MAXSL:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mask & RTSA_MAXSL) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)options;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_DUP_KEY;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire m_label_free(max_sl); /* in case of duplicate */
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire max_sl = NULL;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire if (str_to_label(attrbuf, &max_sl, MAC_LABEL,
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire L_NO_CORRECTION, NULL) != 0) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)valptr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_ILL_UPPERBOUND;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mask |= RTSA_MAXSL;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
e34b029407ed5ec566196ede3f54256d7868dd10wy case SAK_SL:
e34b029407ed5ec566196ede3f54256d7868dd10wy if (mask & (RTSA_MAXSL|RTSA_MINSL)) {
e34b029407ed5ec566196ede3f54256d7868dd10wy *errstrp = (char *)options;
e34b029407ed5ec566196ede3f54256d7868dd10wy *errp = LTSNET_DUP_KEY;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
e34b029407ed5ec566196ede3f54256d7868dd10wy }
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire m_label_free(min_sl); /* in case of duplicate */
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire min_sl = NULL;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire if (str_to_label(attrbuf, &min_sl, MAC_LABEL,
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire L_NO_CORRECTION, NULL) != 0) {
e34b029407ed5ec566196ede3f54256d7868dd10wy *errstrp = (char *)valptr;
e34b029407ed5ec566196ede3f54256d7868dd10wy *errp = LTSNET_ILL_LABEL;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
e34b029407ed5ec566196ede3f54256d7868dd10wy }
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire *max_sl = *min_sl;
e34b029407ed5ec566196ede3f54256d7868dd10wy mask |= (RTSA_MINSL | RTSA_MAXSL);
e34b029407ed5ec566196ede3f54256d7868dd10wy break;
e34b029407ed5ec566196ede3f54256d7868dd10wy
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case SAK_DOI:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mask & RTSA_DOI) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)options;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_DUP_KEY;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk errno = 0;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk doi = strtoul(attrbuf, &cp, 0);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (doi == 0 || errno != 0 || *cp != '\0') {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)valptr;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_ILL_DOI;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mask |= RTSA_DOI;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk case SAK_CIPSO:
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mask & RTSA_CIPSO) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errstrp = (char *)options;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_DUP_KEY;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mask |= RTSA_CIPSO;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk break;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk options = nxtopt;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* Defaults to CIPSO if not specified */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk mask |= RTSA_CIPSO;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* If RTSA_CIPSO is specified, RTSA_DOI must be specified */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!(mask & RTSA_DOI)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_NO_DOI;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* SL range must be specified */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!(mask & (RTSA_MINSL|RTSA_MAXSL))) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_NO_RANGE;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!(mask & RTSA_MINSL)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_NO_LOWERBOUND;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (!(mask & RTSA_MAXSL)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_NO_UPPERBOUND;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk /* SL range must have upper bound dominating lower bound */
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire if (!bldominates(max_sl, min_sl)) {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk *errp = LTSNET_ILL_RANGE;
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire goto out_err;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk }
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mask & RTSA_MINSL)
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sp->rtsa_slrange.lower_bound = *min_sl;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mask & RTSA_MAXSL)
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire sp->rtsa_slrange.upper_bound = *max_sl;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (mask & RTSA_DOI)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk sp->rtsa_doi = doi;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk sp->rtsa_mask = mask;
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire m_label_free(min_sl);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire m_label_free(max_sl);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (B_TRUE);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshireout_err:
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire m_label_free(min_sl);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire m_label_free(max_sl);
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire return (B_FALSE);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk/* Keep in sync with libtsnet.h */
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic const char *tsol_errlist[] = {
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "No error",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "System error",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Empty string or end of list",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Entry is malformed",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Missing name",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Missing attributes",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal name",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal keyword delimiter",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Unknown keyword",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Duplicate keyword",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal value delimiter",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Missing host type",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal host type",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Missing label",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal label",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Missing label range",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal label range",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "No lower bound in range",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal lower bound in range",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "No upper bound in range",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal upper bound in range",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Missing DOI",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal DOI",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Too many entries in set",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Missing address/network",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal address/network",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal flag",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Illegal MLP specification",
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk "Unacceptable keyword for type"
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk};
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkstatic const int tsol_nerr = sizeof (tsol_errlist) / sizeof (*tsol_errlist);
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpkconst char *
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpktsol_strerror(int libtserr, int errnoval)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk{
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (libtserr == LTSNET_SYSERR)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (strerror(errnoval));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk if (libtserr >= 0 && libtserr < tsol_nerr)
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (gettext(tsol_errlist[libtserr]));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk return (gettext("Unknown error"));
45916cd2fec6e79bca5dee0421bd39e3c2910d1ejpk}