components/openvswitch/files/lib/util-solaris.c
author akshay.kale@oracle.com <akshay.kale@oracle.com>
Thu, 25 Feb 2016 13:03:50 -0800
changeset 5505 9706b0a9e76a
parent 5090 5f131162e136
child 5509 919ef8624a61
permissions -rw-r--r--
22821891 OVS dumps core after recent changes to RAD
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     1
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     2
 * CDDL HEADER START
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     3
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     7
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    11
 * and limitations under the License.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    12
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    18
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    19
 * CDDL HEADER END
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    20
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    21
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    22
/*
5505
9706b0a9e76a 22821891 OVS dumps core after recent changes to RAD
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5090
diff changeset
    23
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    24
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    25
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    26
#include <config.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    27
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    28
#include <stdio.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    29
#include <stdlib.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    30
#include <ctype.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    31
#include <alloca.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    32
#include <errno.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    33
#include <limits.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    34
#include <string.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    35
#include <strings.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    36
#include <stropts.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    37
#include <sys/types.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    38
#include <sys/stat.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    39
#include <fcntl.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    40
#include <unistd.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    41
#include <inet/ip.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    42
#include <inet/ip6.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    43
#include <arpa/inet.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    44
#include <sys/sockio.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    45
#include <libdlpi.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    46
#include <libdladm.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    47
#include <libdllink.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    48
#include <zone.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    49
#include <net/if_types.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    50
#include <inet/arp.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    51
#include <sys/socket.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    52
#include <netdb.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    53
#include <rad/radclient.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    54
#include <rad/client/1/dlmgr.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    55
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    56
#undef	IP_VERSION
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    57
#include "netlink-protocol.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    58
#include "netlink.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    59
#include "flow.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    60
#include "packets.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    61
#include "util-solaris.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    62
#include "util.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    63
#include "dpif-solaris.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    64
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    65
static rc_conn_t *rad_conn = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    66
static boolean_t b_true = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    67
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    68
typedef struct {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    69
	uint_t		ifsp_ppa;	/* Physical Point of Attachment */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    70
	uint_t		ifsp_lun;	/* Logical Unit number */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    71
	boolean_t	ifsp_lunvalid;	/* TRUE if lun is valid */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    72
	char		ifsp_devnm[LIFNAMSIZ]; /* only the device name */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    73
} ifspec_t;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    74
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    75
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    76
extract_uint(const char *valstr, uint_t *val)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    77
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    78
	char		*ep;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    79
	unsigned long	ul;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    80
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    81
	errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    82
	ul = strtoul(valstr, &ep, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    83
	if (errno != 0 || *ep != '\0' || ul > UINT_MAX)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    84
		return (-1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    85
	*val = (uint_t)ul;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    86
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    87
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    88
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    89
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    90
 * Given a token with a logical unit spec, return the logical unit converted
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    91
 * to a uint_t.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    92
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    93
 * Returns: 0 for success, nonzero if an error occurred. errno is set if
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    94
 * necessary.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    95
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    96
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    97
getlun(const char *bp, size_t bpsize, uint_t *lun)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    98
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    99
	const char	*ep = &bp[bpsize - 1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   100
	const char	*tp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   101
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   102
	/* Lun must be all digits */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   103
	for (tp = ep; tp > bp && isdigit(*tp); tp--)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   104
		/* Null body */;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   105
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   106
	if (tp == ep || tp != bp || extract_uint(bp + 1, lun) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   107
		errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   108
		return (-1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   109
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   110
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   111
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   112
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   113
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   114
 * Given a single token ending with a ppa spec, return the ppa spec converted
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   115
 * to a uint_t.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   116
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   117
 * Returns: 0 for success, nonzero if an error occurred. errno is set if
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   118
 * necessary.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   119
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   120
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   121
getppa(const char *bp, size_t bpsize, uint_t *ppa)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   122
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   123
	const char	*ep = &bp[bpsize - 1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   124
	const char	*tp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   125
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   126
	for (tp = ep; tp >= bp && isdigit(*tp); tp--)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   127
		/* Null body */;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   128
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   129
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   130
	 * If the device name does not end with a digit or the device
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   131
	 * name is a sequence of numbers or a PPA contains a leading
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   132
	 * zero, return error.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   133
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   134
	if (tp == ep || tp < bp || ((ep - tp) > 1 && *(tp + 1) == '0'))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   135
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   136
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   137
	if (extract_uint(tp + 1, ppa) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   138
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   139
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   140
	/* max value of PPA is 4294967294, which is (UINT_MAX - 1) */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   141
	if (*ppa > UINT_MAX - 1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   142
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   143
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   144
fail:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   145
	errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   146
	return (-1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   147
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   148
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   149
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   150
 * Given a `linkname' of the form drv(ppa), parse it into `driver' and `ppa'.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   151
 * If the `dsize' for the `driver' is not atleast MAXLINKNAMELEN then part of
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   152
 * the driver name will be copied to `driver'.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   153
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   154
 * This function also validates driver name and PPA and therefore callers can
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   155
 * call this function with `driver' and `ppa' set to NULL, to just verify the
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   156
 * linkname.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   157
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   158
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   159
dlparse_drvppa(const char *linknamep, char *driver, uint_t dsize, uint_t *ppa)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   160
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   161
	char	*tp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   162
	char    linkname[MAXLINKNAMELEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   163
	size_t	len;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   164
	uint_t	lppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   165
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   166
	if (linknamep == NULL || linknamep[0] == '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   167
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   168
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   169
	len = strlcpy(linkname, linknamep, MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   170
	if (len >= MAXLINKNAMELEN)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   171
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   172
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   173
	/* Get PPA */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   174
	if (getppa(linkname, len, &lppa) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   175
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   176
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   177
	/* strip the ppa off of the linkname, if present */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   178
	for (tp = &linkname[len - 1]; tp >= linkname && isdigit(*tp); tp--)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   179
		*tp = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   180
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   181
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   182
	 * Now check for the validity of the device name. The legal characters
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   183
	 * in a device name are: alphanumeric (a-z,  A-Z,  0-9), underscore
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   184
	 * ('_'), hyphen ('-'), and period ('.'). The first character
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   185
	 * of the device name cannot be a digit and should be an alphabetic
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   186
	 * character.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   187
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   188
	if (!isalpha(linkname[0]))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   189
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   190
	for (tp = linkname + 1; *tp != '\0'; tp++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   191
		if (!isalnum(*tp) && *tp != '_' && *tp != '-' && *tp != '.')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   192
			goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   193
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   194
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   195
	if (driver != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   196
		(void) strlcpy(driver, linkname, dsize);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   197
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   198
	if (ppa != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   199
		*ppa = lppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   200
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   201
	return (_B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   202
fail:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   203
	errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   204
	return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   205
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   206
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   207
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   208
 * Given an IP interface name, which is either a
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   209
 *	- datalink name (which is driver name plus PPA), for e.g. bge0 or
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   210
 *	- datalink name plus a logical interface identifier (delimited by ':'),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   211
 *		for e.g. bge0:34
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   212
 * the following function validates its form and decomposes the contents into
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   213
 * ifspec_t.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   214
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   215
 * Returns _B_TRUE for success, otherwise _B_FALSE is returned.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   216
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   217
static boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   218
ifparse_ifspec(const char *ifname, ifspec_t *ifsp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   219
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   220
	char	*lp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   221
	char	ifnamecp[LIFNAMSIZ];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   222
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   223
	if (ifname == NULL || ifname[0] == '\0' ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   224
	    strlcpy(ifnamecp, ifname, LIFNAMSIZ) >= LIFNAMSIZ) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   225
		errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   226
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   227
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   228
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   229
	ifsp->ifsp_lunvalid = _B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   230
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   231
	/* Any logical units? */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   232
	lp = strchr(ifnamecp, ':');
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   233
	if (lp != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   234
		if (getlun(lp, strlen(lp), &ifsp->ifsp_lun) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   235
			return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   236
		*lp = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   237
		ifsp->ifsp_lunvalid = _B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   238
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   239
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   240
	return (dlparse_drvppa(ifnamecp, ifsp->ifsp_devnm,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   241
	    sizeof (ifsp->ifsp_devnm), &ifsp->ifsp_ppa));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   242
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   243
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   244
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   245
 * Issues the ioctl SIOCSLIFNAME to kernel.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   246
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   247
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   248
slifname(const char *ifname, uint64_t flags, int fd)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   249
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   250
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   251
	int		status = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   252
	ifspec_t	ifsp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   253
	boolean_t	valid_if;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   254
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   255
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   256
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   257
	/* We should have already validated the interface name. */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   258
	valid_if = ifparse_ifspec(ifname, &ifsp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   259
	ovs_assert(valid_if);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   260
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   261
	lifr.lifr_ppa = ifsp.ifsp_ppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   262
	lifr.lifr_flags = flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   263
	(void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   264
	if (ioctl(fd, SIOCSLIFNAME, &lifr) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   265
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   266
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   267
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   268
	return (status);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   269
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   270
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   271
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   272
 * Wrapper for sending a non-transparent I_STR ioctl().
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   273
 * Returns: Result from ioctl().
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   274
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   275
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   276
strioctl(int s, int cmd, char *buf, uint_t buflen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   277
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   278
	struct strioctl ioc;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   279
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   280
	(void) memset(&ioc, 0, sizeof (ioc));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   281
	ioc.ic_cmd = cmd;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   282
	ioc.ic_timout = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   283
	ioc.ic_len = buflen;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   284
	ioc.ic_dp = buf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   285
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   286
	return (ioctl(s, I_STR, (char *)&ioc));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   287
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   288
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   289
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   290
 * Issues the ioctl SIOCSLIFNAME to kernel on the given ARP stream fd.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   291
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   292
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   293
slifname_arp(const char *ifname, uint64_t flags, int fd)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   294
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   295
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   296
	ifspec_t	ifsp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   297
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   298
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   299
	(void) ifparse_ifspec(ifname, &ifsp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   300
	lifr.lifr_ppa = ifsp.ifsp_ppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   301
	lifr.lifr_flags = flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   302
	(void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   303
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   304
	 * Tell ARP the name and unit number for this interface.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   305
	 * Note that arp has no support for transparent ioctls.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   306
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   307
	if (strioctl(fd, SIOCSLIFNAME, (char *)&lifr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   308
	    sizeof (lifr)) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   309
		return (errno);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   310
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   311
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   312
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   313
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   314
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   315
 * Open "/dev/udp{,6}" for use as a multiplexor to PLINK the interface stream
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   316
 * under. We use "/dev/udp" instead of "/dev/ip" since STREAMS will not let
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   317
 * you PLINK a driver under itself, and "/dev/ip" is typically the driver at
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   318
 * the bottom of the stream for tunneling interfaces.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   319
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   320
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   321
open_arp_on_udp(const char *udp_dev_name, int *fd)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   322
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   323
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   324
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   325
	if ((*fd = open(udp_dev_name, O_RDWR)) == -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   326
		return (errno);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   327
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   328
	 * Pop off all undesired modules (note that the user may have
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   329
	 * configured autopush to add modules above udp), and push the
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   330
	 * arp module onto the resulting stream. This is used to make
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   331
	 * IP+ARP be able to atomically track the muxid for the I_PLINKed
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   332
	 * STREAMS, thus it isn't related to ARP running the ARP protocol.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   333
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   334
	while (ioctl(*fd, I_POP, 0) != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   335
		;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   336
	if (errno == EINVAL && ioctl(*fd, I_PUSH, ARP_MOD_NAME) != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   337
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   338
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   339
	err = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   340
	(void) close(*fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   341
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   342
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   343
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   344
static char *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   345
solaris_proto2str(uint8_t protocol)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   346
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   347
	if (protocol == IPPROTO_TCP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   348
		return ("tcp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   349
	if (protocol == IPPROTO_UDP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   350
		return ("udp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   351
	if (protocol == IPPROTO_SCTP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   352
		return ("sctp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   353
	if (protocol == IPPROTO_ICMPV6)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   354
		return ("icmpv6");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   355
	if (protocol == IPPROTO_ICMP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   356
		return ("icmp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   357
	else
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   358
		return ("");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   359
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   360
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   361
static uint8_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   362
solaris_str2proto(const char *protostr)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   363
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   364
	if (strcasecmp(protostr, "tcp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   365
		return (IPPROTO_TCP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   366
	else if (strcasecmp(protostr, "udp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   367
		return (IPPROTO_UDP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   368
	else if (strcasecmp(protostr, "sctp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   369
		return (IPPROTO_SCTP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   370
	else if (strcasecmp(protostr, "icmpv6") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   371
		return (IPPROTO_ICMPV6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   372
	else if (strcasecmp(protostr, "icmp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   373
		return (IPPROTO_ICMP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   374
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   375
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   376
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   377
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   378
 * Returns the flags value for the logical interface in `lifname'
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   379
 * in the buffer pointed to by `flags'.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   380
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   381
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   382
solaris_get_flags(int sock, const char *lifname, uint64_t *flags)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   383
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   384
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   385
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   386
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   387
	(void) strlcpy(lifr.lifr_name, lifname, sizeof (lifr.lifr_name));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   388
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   389
	if (ioctl(sock, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   390
		return (errno);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   391
	*flags = lifr.lifr_flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   392
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   393
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   394
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   395
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   396
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   397
 * For a given interface name, checks if IP interface exists.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   398
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   399
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   400
solaris_if_enabled(int sock, const char *ifname, uint64_t *flags)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   401
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   402
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   403
	int		error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   404
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   405
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   406
	(void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   407
	if (ioctl(sock, SIOCGLIFFLAGS, (caddr_t)&lifr) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   408
		error = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   409
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   410
	if (error == 0 && flags != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   411
		*flags = lifr.lifr_flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   412
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   413
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   414
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   415
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   416
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   417
solaris_unplumb_if(int sock, const char *ifname, sa_family_t af)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   418
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   419
	int		ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   420
	int		arp_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   421
	int		mux_fd = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   422
	int		muxid_fd = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   423
	char		*udp_dev_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   424
	uint64_t	ifflags = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   425
	boolean_t	changed_arp_muxid = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   426
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   427
	int		ret = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   428
	boolean_t	v6 = (af == AF_INET6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   429
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   430
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   431
	 * We used /dev/udp or udp6 to set up the mux. So we have to use
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   432
	 * the same now for PUNLINK also.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   433
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   434
	udp_dev_name = (v6 ?  UDP6_DEV_NAME : UDP_DEV_NAME);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   435
	if ((muxid_fd = open(udp_dev_name, O_RDWR)) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   436
		ret = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   437
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   438
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   439
	ret = open_arp_on_udp(udp_dev_name, &mux_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   440
	if (ret != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   441
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   442
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   443
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   444
	(void) strlcpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   445
	if (ioctl(muxid_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   446
		ret = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   447
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   448
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   449
	arp_muxid = lifr.lifr_arp_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   450
	ip_muxid = lifr.lifr_ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   451
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   452
	ret = solaris_get_flags(sock, ifname, &ifflags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   453
	if (ret != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   454
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   455
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   456
	 * We don't have a good way of knowing whether the arp stream is
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   457
	 * plumbed. We can't rely on IFF_NOARP because someone could
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   458
	 * have turned it off later using "ifconfig xxx -arp".
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   459
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   460
	if (arp_muxid != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   461
		if (ioctl(mux_fd, I_PUNLINK, arp_muxid) < 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   462
			if ((errno == EINVAL) &&
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   463
			    (ifflags & (IFF_NOARP | IFF_IPV6))) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   464
				/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   465
				 * Some plumbing utilities set the muxid to
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   466
				 * -1 or some invalid value to signify that
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   467
				 * there is no arp stream. Set the muxid to 0
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   468
				 * before trying to unplumb the IP stream.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   469
				 * IP does not allow the IP stream to be
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   470
				 * unplumbed if it sees a non-null arp muxid,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   471
				 * for consistency of IP-ARP streams.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   472
				 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   473
				lifr.lifr_arp_muxid = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   474
				(void) ioctl(muxid_fd, SIOCSLIFMUXID,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   475
				    (caddr_t)&lifr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   476
				changed_arp_muxid = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   477
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   478
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   479
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   480
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   481
	if (ioctl(mux_fd, I_PUNLINK, ip_muxid) < 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   482
		if (changed_arp_muxid) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   483
			/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   484
			 * Some error occurred, and we need to restore
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   485
			 * everything back to what it was.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   486
			 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   487
			ret = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   488
			lifr.lifr_arp_muxid = arp_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   489
			lifr.lifr_ip_muxid = ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   490
			(void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   491
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   492
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   493
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   494
	if (muxid_fd != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   495
		(void) close(muxid_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   496
	if (mux_fd != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   497
		(void) close(mux_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   498
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   499
	return (ret);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   500
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   501
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   502
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   503
 * Plumbs the interface `ifname'.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   504
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   505
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   506
solaris_plumb_if(int sock, const char *ifname, sa_family_t af)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   507
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   508
	int		ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   509
	int		mux_fd = -1, ip_fd, arp_fd;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   510
	char		*udp_dev_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   511
	dlpi_handle_t	dh_arp = NULL, dh_ip = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   512
	uint64_t	ifflags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   513
	uint_t		dlpi_flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   514
	int		status = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   515
	const char	*linkname;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   516
	int		ret;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   517
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   518
	if (solaris_if_enabled(sock, ifname, NULL) == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   519
		status = EEXIST;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   520
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   521
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   522
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   523
	dlpi_flags = DLPI_NOATTACH;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   524
	linkname = ifname;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   525
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   526
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   527
	 * We use DLPI_NOATTACH because the ip module will do the attach
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   528
	 * itself for DLPI style-2 devices.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   529
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   530
	ret = dlpi_open(linkname, &dh_ip, dlpi_flags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   531
	if (ret != DLPI_SUCCESS) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   532
		ret = (ret == DL_SYSERR) ? errno : EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   533
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   534
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   535
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   536
	ip_fd = dlpi_fd(dh_ip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   537
	if (ioctl(ip_fd, I_PUSH, IP_MOD_NAME) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   538
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   539
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   540
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   541
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   542
	if (af == AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   543
		ifflags = IFF_IPV4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   544
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   545
		ifflags = IFF_IPV6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   546
		ifflags |= IFF_NOLINKLOCAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   547
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   548
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   549
	status = slifname(ifname, ifflags, ip_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   550
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   551
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   552
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   553
	/* Get the full set of existing flags for this stream */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   554
	status = solaris_get_flags(sock, ifname, &ifflags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   555
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   556
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   557
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   558
	udp_dev_name = (af == AF_INET6 ? UDP6_DEV_NAME : UDP_DEV_NAME);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   559
	status = open_arp_on_udp(udp_dev_name, &mux_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   560
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   561
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   562
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   563
	/* Check if arp is not needed */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   564
	if (ifflags & (IFF_NOARP|IFF_IPV6)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   565
		/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   566
		 * PLINK the interface stream so that the application can exit
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   567
		 * without tearing down the stream.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   568
		 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   569
		if ((ip_muxid = ioctl(mux_fd, I_PLINK, ip_fd)) == -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   570
			status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   571
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   572
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   573
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   574
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   575
	 * This interface does use ARP, so set up a separate stream
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   576
	 * from the interface to ARP.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   577
	 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   578
	 * We use DLPI_NOATTACH because the arp module will do the attach
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   579
	 * itself for DLPI style-2 devices.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   580
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   581
	ret = dlpi_open(linkname, &dh_arp, dlpi_flags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   582
	if (ret != DLPI_SUCCESS) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   583
		ret = (ret == DL_SYSERR) ? errno : EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   584
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   585
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   586
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   587
	arp_fd = dlpi_fd(dh_arp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   588
	if (ioctl(arp_fd, I_PUSH, ARP_MOD_NAME) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   589
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   590
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   591
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   592
	status = slifname_arp(ifname, ifflags, arp_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   593
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   594
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   595
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   596
	 * PLINK the IP and ARP streams so that we can exit
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   597
	 * without tearing down the stream.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   598
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   599
	if ((ip_muxid = ioctl(mux_fd, I_PLINK, ip_fd)) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   600
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   601
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   602
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   603
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   604
	if (ioctl(mux_fd, I_PLINK, arp_fd) < 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   605
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   606
		(void) ioctl(mux_fd, I_PUNLINK, ip_muxid);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   607
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   608
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   609
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   610
	dlpi_close(dh_ip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   611
	if (dh_arp != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   612
		dlpi_close(dh_arp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   613
	if (mux_fd != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   614
		(void) close(mux_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   615
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   616
	return (status);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   617
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   618
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   619
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   620
solaris_init_rad()
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   621
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   622
	if (rad_conn == NULL) {
5505
9706b0a9e76a 22821891 OVS dumps core after recent changes to RAD
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5090
diff changeset
   623
		rad_conn = rc_connect_unix(NULL, NULL);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   624
		if (rad_conn == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   625
			return (ENODEV); /* Not sure what to return */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   626
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   627
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   628
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   629
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   630
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   631
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   632
test_dlclass(const char *key, dlmgr_DLValue_t *dlval, void *arg)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   633
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   634
	if (strcmp(key, "class") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   635
		(void) strlcpy((char *)arg, dlval->ddlv_sval, DLADM_STRSIZE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   636
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   637
	return (RCE_OK);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   638
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   639
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   640
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   641
test_dllower(const char *key, dlmgr_DLValue_t *dlval, void *arg)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   642
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   643
	/* TODO(gmoodalb): seems like we need physname/devname here */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   644
	if (strcmp(key, "over") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   645
		(void) strlcpy((char *)arg, dlval->ddlv_slist[0],
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   646
		    DLADM_STRSIZE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   647
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   648
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   649
	return (RCE_OK);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   650
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   651
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   652
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   653
solaris_get_dlinfo(const char *netdev_name, char *info_val, size_t info_len,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   654
    rc_err_t (*test_cb)(const char *, dlmgr_DLValue_t *, void *))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   655
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   656
	dlmgr__rad_dict_string_DLValue_t *linkinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   657
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   658
	rc_instance_t		*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   659
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   660
	char			propstr[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   661
	int			error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   662
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   663
	status = dlmgr_Datalink__rad_lookup(rad_conn, B_TRUE, &link, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   664
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   665
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   666
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   667
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   668
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   669
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   670
	status = dlmgr_Datalink_getInfo(link, NULL, 0, &linkinfo, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   671
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   672
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   673
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   674
			    "failed Datalink_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   675
			    netdev_name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   676
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   677
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   678
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   679
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   680
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   681
	propstr[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   682
	status = dlmgr__rad_dict_string_DLValue_map(linkinfo, test_cb,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   683
	    propstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   684
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   685
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   686
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   687
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   688
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   689
	memcpy(info_val, propstr, info_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   690
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   691
	dlmgr__rad_dict_string_DLValue_free(linkinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   692
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   693
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   694
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   695
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   696
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   697
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   698
solaris_get_devname(const char *netdev_name, char *name_val, size_t name_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   699
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   700
	dlmgr__rad_dict_string_DLValue_t *linkinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   701
	dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   702
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   703
	rc_instance_t		*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   704
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   705
	int			error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   706
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   707
	status = dlmgr_Physical__rad_lookup(rad_conn, B_TRUE, &link, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   708
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   709
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   710
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   711
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   712
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   713
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   714
	status = dlmgr_Physical_getInfo(link, NULL, 0, &linkinfo, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   715
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   716
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   717
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   718
			    "failed Physical_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   719
			    netdev_name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   720
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   721
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   722
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   723
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   724
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   725
	status = dlmgr__rad_dict_string_DLValue_get(linkinfo, "device",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   726
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   727
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   728
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   729
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   730
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   731
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   732
	memcpy(name_val, dlval->ddlv_sval, name_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   733
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   734
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   735
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   736
	dlmgr__rad_dict_string_DLValue_free(linkinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   737
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   738
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   739
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   740
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   741
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   742
solaris_get_dlclass(const char *netdev_name, char *class_val, size_t class_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   743
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   744
	return (solaris_get_dlinfo(netdev_name, class_val, class_len,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   745
	    test_dlclass));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   746
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   747
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   748
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   749
solaris_get_dllower(const char *netdev_name, char *lower_val, size_t lower_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   750
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   751
	return (solaris_get_dlinfo(netdev_name, lower_val, lower_len,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   752
	    test_dllower));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   753
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   754
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   755
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   756
solaris_get_dlprop(const char *netdev_name, const char *prop_name,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   757
    const char *field_name, char *prop_value, size_t prop_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   758
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   759
	dlmgr_DLDict_t		**dlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   760
	dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   761
	dlmgr_DatalinkError_t   *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   762
	rc_instance_t		*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   763
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   764
	const char		*props[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   765
	const char		*fields[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   766
	int			ndlist = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   767
	int			error = 0, i = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   768
	char			buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   769
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   770
	status = dlmgr_Datalink__rad_lookup(rad_conn, B_TRUE, &link, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   771
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   772
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   773
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   774
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   775
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   776
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   777
	props[0] = prop_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   778
	fields[0] = field_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   779
	status = dlmgr_Datalink_getProperties(link, props, 1, fields, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   780
	    &dlist, &ndlist, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   781
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   782
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   783
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   784
			    "failed Datalink_getProperties(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   785
			    netdev_name, prop_name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   786
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   787
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   788
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   789
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   790
	status = dlmgr__rad_dict_string_DLValue_get((*dlist)->ddld_map,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   791
	    field_name, &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   792
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   793
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   794
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   795
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   796
	switch (dlval->ddlv_type) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   797
	case DDLVT_STRING:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   798
		if (dlval->ddlv_sval == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   799
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   800
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   801
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   802
		memcpy(prop_value, dlval->ddlv_sval, prop_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   803
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   804
	case DDLVT_STRINGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   805
		if (dlval->ddlv_slist_count == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   806
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   807
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   808
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   809
		for (i = 0; i < dlval->ddlv_slist_count; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   810
			(void) snprintf(buf, sizeof (buf), "%s%s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   811
			    (i != 0 ? "," : ""), dlval->ddlv_slist[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   812
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   813
		memcpy(prop_value, buf, prop_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   814
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   815
	case DDLVT_ULONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   816
		if (dlval->ddlv_ulval == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   817
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   818
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   819
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   820
		(void) snprintf(buf, sizeof (buf), "%llu", *dlval->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   821
		memcpy(prop_value, buf, prop_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   822
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   823
	case DDLVT_BOOLEAN:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   824
	case DDLVT_BOOLEANS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   825
	case DDLVT_LONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   826
	case DDLVT_LONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   827
	case DDLVT_ULONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   828
	case DDLVT_DICTIONARY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   829
	case DDLVT_DICTIONARYS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   830
	default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   831
		ovs_assert(0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   832
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   833
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   834
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   835
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   836
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   837
	dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   838
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   839
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   840
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   841
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   842
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   843
solaris_set_dlprop(const char *netdev_name, const char *propname, void *arg,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   844
    dlmgr_DLValueType_t vtype)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   845
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   846
	dlmgr__rad_dict_string_DLValue_t *sprop_dict = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   847
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   848
	dlmgr_DLValue_t			new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   849
	rc_instance_t			*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   850
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   851
	dlmgr_DatalinkError_t   	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   852
	int				error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   853
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   854
	status = dlmgr_Datalink__rad_lookup(rad_conn, B_TRUE, &link, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   855
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   856
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   857
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   858
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   859
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   860
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   861
	sprop_dict = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   862
	if (sprop_dict == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   863
		status = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   864
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   865
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   866
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   867
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   868
	new_val.ddlv_type = vtype;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   869
	switch (vtype) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   870
	case DDLVT_BOOLEAN:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   871
		new_val.ddlv_bval = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   872
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   873
		    sprop_dict, propname, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   874
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   875
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   876
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   877
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   878
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   879
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   880
	case DDLVT_ULONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   881
		new_val.ddlv_ulval = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   882
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   883
		    sprop_dict, propname, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   884
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   885
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   886
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   887
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   888
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   889
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   890
	case DDLVT_STRING:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   891
		new_val.ddlv_sval = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   892
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   893
		    sprop_dict, propname, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   894
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   895
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   896
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   897
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   898
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   899
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   900
	case DDLVT_LONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   901
	case DDLVT_LONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   902
	case DDLVT_ULONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   903
	case DDLVT_STRINGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   904
	case DDLVT_BOOLEANS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   905
	case DDLVT_DICTIONARY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   906
	case DDLVT_DICTIONARYS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   907
	default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   908
		ovs_assert(0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   909
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   910
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   911
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   912
	/* we need to add temporary flag */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   913
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   914
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   915
	new_val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   916
	new_val.ddlv_bval = &b_true;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   917
	status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   918
	    sprop_dict, "temporary", &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   919
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   920
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   921
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   922
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   923
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   924
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   925
	status = dlmgr_Datalink_setProperties(link, sprop_dict, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   926
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   927
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   928
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   929
			    "failed Datalink_setPropertiess(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   930
			    netdev_name, propname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   931
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   932
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   933
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   934
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   935
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   936
	dlmgr__rad_dict_string_DLValue_free(sprop_dict);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   937
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   938
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   939
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   940
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   941
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   942
solaris_set_dlprop_boolean(const char *netdev_name, const char *propname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   943
    void *arg)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   944
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   945
	return (solaris_set_dlprop(netdev_name, propname, arg, DDLVT_BOOLEAN));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   946
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   947
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   948
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   949
solaris_set_dlprop_ulong(const char *netdev_name, const char *propname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   950
    void *arg)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   951
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   952
	return (solaris_set_dlprop(netdev_name, propname, arg, DDLVT_ULONG));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   953
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   954
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   955
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   956
solaris_set_dlprop_string(const char *netdev_name, const char *propname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   957
    void *arg)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   958
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   959
	return (solaris_set_dlprop(netdev_name, propname, arg, DDLVT_STRING));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   960
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   961
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   962
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   963
solaris_create_vnic(const char *linkname, const char *vnicname)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   964
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   965
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   966
	dlmgr__rad_dict_string_DLValue_t *macaddr_info = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   967
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   968
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   969
	dlmgr_DLValue_t			name_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   970
	dlmgr_DLValue_t			temp_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   971
	dlmgr_DLValue_t			type_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   972
	dlmgr_DLValue_t			macaddr_info_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   973
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   974
	rc_instance_t			*vnic = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   975
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   976
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   977
	status = dlmgr_DatalinkManager__rad_lookup(rad_conn, B_TRUE,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   978
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   979
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   980
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   981
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   982
	prop = dlmgr__rad_dict_string_DLValue_create(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   983
	if (prop == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   984
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   985
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   986
	bzero(&name_val, sizeof (name_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   987
	name_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   988
	/* linkname is 'const char *' and ddlv_sval is 'char *' */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   989
	name_val.ddlv_sval = strdupa(linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   990
	status = dlmgr__rad_dict_string_DLValue_put(prop, "lower-link",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   991
	    &name_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   992
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   993
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   994
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   995
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   996
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   997
	bzero(&temp_val, sizeof (temp_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   998
	temp_val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   999
	temp_val.ddlv_bval = &b_true;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1000
	status = dlmgr__rad_dict_string_DLValue_put(prop, "temporary",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1001
	    &temp_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1002
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1003
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1004
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1005
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1006
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1007
	macaddr_info = dlmgr__rad_dict_string_DLValue_create(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1008
	if (macaddr_info == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1009
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1010
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1011
	bzero(&type_val, sizeof (type_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1012
	type_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1013
	type_val.ddlv_sval = strdupa("auto");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1014
	status = dlmgr__rad_dict_string_DLValue_put(macaddr_info,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1015
	    "mac-address-type", &type_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1016
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1017
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1018
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1019
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1020
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1021
	bzero(&macaddr_info_val, sizeof (macaddr_info_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1022
	macaddr_info_val.ddlv_type = DDLVT_DICTIONARY;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1023
	macaddr_info_val.ddlv_dval = macaddr_info;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1024
	status = dlmgr__rad_dict_string_DLValue_put(prop, "mac-address-info",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1025
	    &macaddr_info_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1026
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1027
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1028
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1029
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1030
	status = dlmgr_DatalinkManager_createVNIC(linkmgr, vnicname, prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1031
	    &vnic, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1032
	if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1033
		dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1034
		    "failed DatalinkManager_createVNIC(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1035
		    vnicname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1036
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1037
	rc_instance_rele(vnic);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1038
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1039
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1040
	dlmgr__rad_dict_string_DLValue_free(macaddr_info);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1041
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1042
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1043
	return ((status != RCE_OK) ? ENOTSUP : 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1044
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1045
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1046
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1047
solaris_modify_vnic(const char *linkname, const char *vnicname)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1048
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1049
	dlmgr__rad_dict_string_DLValue_t *sprop_dict = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1050
	dlmgr__rad_dict_string_DLValue_t *macaddr_info = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1051
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1052
	dlmgr_DLValue_t			new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1053
	dlmgr_DLValue_t			type_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1054
	dlmgr_DLValue_t			macaddr_info_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1055
	rc_instance_t			*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1056
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1057
	dlmgr_DatalinkError_t   	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1058
	int				error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1059
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1060
	status = dlmgr_Datalink__rad_lookup(rad_conn, B_TRUE, &link, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1061
	    "name", vnicname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1062
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1063
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1064
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1065
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1066
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1067
	sprop_dict = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1068
	if (sprop_dict == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1069
		status = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1070
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1071
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1072
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1073
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1074
	new_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1075
	new_val.ddlv_sval = strdupa(linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1076
	status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1077
	    sprop_dict, "lower-link", &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1078
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1079
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1080
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1081
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1082
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1083
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1084
	/* we need to add temporary flag */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1085
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1086
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1087
	new_val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1088
	new_val.ddlv_bval = &b_true;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1089
	status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1090
	    sprop_dict, "temporary", &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1091
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1092
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1093
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1094
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1095
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1096
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1097
	macaddr_info = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1098
	if (macaddr_info == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1099
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1100
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1101
	bzero(&type_val, sizeof (type_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1102
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1103
	type_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1104
	type_val.ddlv_sval = strdupa("auto");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1105
	status = dlmgr__rad_dict_string_DLValue_put(macaddr_info,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1106
	    "mac-address-type", &type_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1107
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1108
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1109
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1110
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1111
	bzero(&macaddr_info_val, sizeof (macaddr_info_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1112
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1113
	macaddr_info_val.ddlv_type = DDLVT_DICTIONARY;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1114
	macaddr_info_val.ddlv_dval = macaddr_info;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1115
	status = dlmgr__rad_dict_string_DLValue_put(sprop_dict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1116
	    "mac-address-info", &macaddr_info_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1117
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1118
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1119
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1120
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1121
	status = dlmgr_Datalink_setProperties(link, sprop_dict, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1122
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1123
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1124
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1125
			    "failed Datalink_setPropertiess(%s, lower-link): "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1126
			    " %s", vnicname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1127
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1128
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1129
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1130
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1131
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1132
	dlmgr__rad_dict_string_DLValue_free(macaddr_info);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1133
	dlmgr__rad_dict_string_DLValue_free(sprop_dict);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1134
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1135
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1136
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1137
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1138
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1139
solaris_delete_vnic(const char *vnicname)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1140
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1141
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1142
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1143
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1144
	dlmgr_DLValue_t			temp_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1145
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1146
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1147
	int				err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1148
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1149
	status = dlmgr_DatalinkManager__rad_lookup(rad_conn, B_TRUE,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1150
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1151
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1152
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1153
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1154
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1155
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1156
	prop = dlmgr__rad_dict_string_DLValue_create(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1157
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1158
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1159
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1160
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1161
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1162
	bzero(&temp_val, sizeof (temp_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1163
	temp_val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1164
	temp_val.ddlv_bval = &b_true;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1165
	status = dlmgr__rad_dict_string_DLValue_put(prop, "temporary",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1166
	    &temp_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1167
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1168
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1169
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1170
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1171
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1172
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1173
	status = dlmgr_DatalinkManager_deleteVNIC(linkmgr, vnicname, prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1174
	    &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1175
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1176
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1177
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1178
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1179
			dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1180
			    "failed DatalinkManager_deleteVNIC(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1181
			    vnicname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1182
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1183
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1184
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1185
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1186
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1187
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1188
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1189
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1190
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1191
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1192
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1193
solaris_create_etherstub(const char *name)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1194
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1195
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1196
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1197
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1198
	dlmgr_DLValue_t			temp_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1199
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1200
	rc_instance_t			*etherstub = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1201
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1202
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1203
	status = dlmgr_DatalinkManager__rad_lookup(rad_conn, B_TRUE,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1204
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1205
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1206
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1207
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1208
	prop = dlmgr__rad_dict_string_DLValue_create(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1209
	if (prop == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1210
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1211
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1212
	bzero(&temp_val, sizeof (temp_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1213
	temp_val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1214
	temp_val.ddlv_bval = &b_true;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1215
	status = dlmgr__rad_dict_string_DLValue_put(prop, "temporary",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1216
	    &temp_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1217
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1218
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1219
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1220
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1221
	status = dlmgr_DatalinkManager_createEtherstub(linkmgr, name, prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1222
	    &etherstub, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1223
	if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1224
		dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1225
		    "failed DatalinkManager_createEtherstub(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1226
		    name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1227
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1228
	rc_instance_rele(etherstub);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1229
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1230
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1231
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1232
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1233
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1234
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1235
	return ((status != RCE_OK) ? ENOTSUP : 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1236
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1237
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1238
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1239
solaris_delete_etherstub(const char *name)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1240
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1241
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1242
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1243
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1244
	dlmgr_DLValue_t			temp_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1245
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1246
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1247
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1248
	status = dlmgr_DatalinkManager__rad_lookup(rad_conn, B_TRUE,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1249
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1250
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1251
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1252
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1253
	prop = dlmgr__rad_dict_string_DLValue_create(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1254
	if (prop == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1255
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1256
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1257
	bzero(&temp_val, sizeof (temp_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1258
	temp_val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1259
	temp_val.ddlv_bval = &b_true;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1260
	status = dlmgr__rad_dict_string_DLValue_put(prop, "temporary",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1261
	    &temp_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1262
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1263
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1264
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1265
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1266
	status = dlmgr_DatalinkManager_deleteEtherstub(linkmgr, name, prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1267
	    &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1268
	if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1269
		dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1270
		    "failed DatalinkManager_deleteEtherstub(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1271
		    name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1272
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1273
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1274
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1275
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1276
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1277
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1278
	return ((status != RCE_OK) ? ENOTSUP : 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1279
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1280
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1281
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1282
solaris_etherstub_exists(const char *name)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1283
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1284
	rc_instance_t	*etherstub = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1285
	boolean_t	exists;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1286
	rc_err_t	status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1287
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1288
	status = dlmgr_Etherstub__rad_lookup(rad_conn, B_TRUE, &etherstub, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1289
	    "name", name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1290
	if (status == RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1291
		dlmgr__rad_dict_string_DLValue_t *linkinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1292
		dlmgr_DatalinkError_t *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1293
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1294
		status = dlmgr_Etherstub_getInfo(etherstub, NULL, 0,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1295
		    &linkinfo, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1296
		if (status == RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1297
			exists = _B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1298
			dlmgr__rad_dict_string_DLValue_free(linkinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1299
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1300
			exists = _B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1301
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1302
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1303
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1304
		exists = _B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1305
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1306
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1307
	rc_instance_rele(etherstub);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1308
	return (exists);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1309
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1310
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1311
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1312
flow_str2mac(const char *str, uchar_t *f, size_t maclen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1313
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1314
	uchar_t		*addr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1315
	int		len, err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1316
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1317
	if ((addr = _link_aton(str, &len)) == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1318
		return ((len == -1) ? EINVAL : ENOMEM);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1319
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1320
	if (len != maclen) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1321
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1322
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1323
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1324
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1325
	bcopy(addr, f, maclen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1326
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1327
	free(addr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1328
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1329
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1330
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1331
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1332
flow_str2addr(const char *str, in6_addr_t *f, int *afp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1333
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1334
	struct in_addr	v4addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1335
	struct in6_addr	v6addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1336
	int		af;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1337
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1338
	if (inet_pton(AF_INET, str, &v4addr.s_addr) == 1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1339
		af = AF_INET;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1340
	} else if (inet_pton(AF_INET6, str, v6addr.s6_addr) == 1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1341
		af = AF_INET6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1342
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1343
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1344
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1345
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1346
	if (af == AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1347
		IN6_INADDR_TO_V4MAPPED(&v4addr, f);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1348
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1349
		*f = v6addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1350
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1351
	*afp = af;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1352
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1353
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1354
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1355
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1356
solaris_flowinfo2linkname(dlmgr__rad_dict_string_DLValue_t *flowinfo,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1357
    char *linkname, size_t size)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1358
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1359
	dlmgr__rad_dict_string_DLValue_t *fdict;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1360
	dlmgr_DLValue_t		*flist = NULL, *dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1361
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1362
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1363
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1364
	status = dlmgr__rad_dict_string_DLValue_get(flowinfo, "filters",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1365
	    &flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1366
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1367
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1368
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1369
	fdict = flist->ddlv_dlist[0]->ddld_map;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1370
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1371
	status = dlmgr__rad_dict_string_DLValue_get(fdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1372
	    "linkname", &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1373
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1374
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1375
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1376
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1377
	(void) strlcpy(linkname, dlval->ddlv_sval, size);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1378
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1379
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1380
	dlmgr_DLValue_free(flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1381
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1382
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1383
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1384
static void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1385
flow_mac2str(uint8_t *f, uint8_t *m, char *buf, char *rbuf, size_t buf_len,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1386
    size_t rbuf_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1387
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1388
	char *str = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1389
	char *pstr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1390
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1391
	buf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1392
	rbuf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1393
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1394
	if (!eth_addr_is_zero(f) || !eth_addr_is_zero(m)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1395
		str = _link_ntoa(f, NULL, ETHERADDRL, IFT_ETHER);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1396
		if (str != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1397
			pstr = _link_ntoa(m, NULL, ETHERADDRL, IFT_ETHER);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1398
			if (pstr != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1399
				(void) snprintf(buf, buf_len, "%s", str);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1400
				(void) snprintf(rbuf, rbuf_len, "%s", pstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1401
				free(pstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1402
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1403
			free(str);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1404
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1405
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1406
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1407
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1408
static void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1409
flow_addr2str(struct in6_addr *f6, struct in6_addr *m6, uint32_t f4,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1410
    uint32_t m4, char *buf, char *rbuf, size_t buf_len, size_t rbuf_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1411
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1412
	struct in_addr ipaddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1413
	char abuf[INET6_ADDRSTRLEN], mbuf[INET6_ADDRSTRLEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1414
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1415
	buf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1416
	rbuf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1417
	if ((f6 != NULL) && (m6 != NULL) &&
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1418
	    (!ipv6_addr_equals(f6, &in6addr_any) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1419
	    !ipv6_addr_equals(m6, &in6addr_any))) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1420
		(void) inet_ntop(AF_INET6, f6, abuf, INET6_ADDRSTRLEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1421
		(void) inet_ntop(AF_INET6, m6, mbuf, INET6_ADDRSTRLEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1422
		(void) snprintf(buf, buf_len, "%s", abuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1423
		(void) snprintf(rbuf, rbuf_len, "%s", mbuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1424
	} else if (f4 != 0 || m4 != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1425
		ipaddr.s_addr = f4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1426
		(void) strlcpy(abuf, inet_ntoa(ipaddr), sizeof (abuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1427
		ipaddr.s_addr = m4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1428
		(void) strlcpy(mbuf, inet_ntoa(ipaddr), sizeof (mbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1429
		(void) snprintf(buf, buf_len, "%s", abuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1430
		(void) snprintf(rbuf, rbuf_len, "%s", mbuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1431
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1432
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1433
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1434
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1435
flow_ofports2propstr(uint32_t *ofports, int nofports, char ***ofportstr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1436
    int *cnt)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1437
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1438
	dladm_status_t		dlstatus;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1439
	mac_propval_range_t	*pv_range = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1440
	mac_propval_uint32_range_t *ur;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1441
	char			buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1442
	int			i, error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1443
	char			**strs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1444
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1445
	*ofportstr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1446
	*cnt = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1447
	if (nofports != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1448
		/* Sort OF port list and convert it to a mac_propval_range */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1449
		dlstatus = dladm_list2range(ofports, nofports,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1450
		    MAC_PROPVAL_UINT32, &pv_range);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1451
		if (dlstatus != DLADM_STATUS_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1452
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1453
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1454
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1455
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1456
		strs = calloc(pv_range->mpr_count, sizeof (char *));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1457
		if (strs == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1458
			error = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1459
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1460
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1461
		/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1462
		 * Write ranges and individual elements into their own
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1463
		 * buffer.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1464
		 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1465
		for (i = 0; i < pv_range->mpr_count; i++, ur++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1466
			ur = &pv_range->mpr_range_uint32[i];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1467
			if (ur->mpur_min == ur->mpur_max) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1468
				/* single element */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1469
				(void) snprintf(buf, sizeof (buf), "%u",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1470
				    ur->mpur_min);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1471
				strs[i] = strdup(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1472
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1473
				/* range of elements */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1474
				(void) snprintf(buf, sizeof (buf), "%u-%u",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1475
				    ur->mpur_min, ur->mpur_max);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1476
				strs[i] = strdup(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1477
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1478
			if (strs[i] == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1479
				while (i >= 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1480
					free(strs[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1481
					i--;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1482
				}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1483
				free(strs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1484
				error = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1485
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1486
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1487
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1488
		*cnt = pv_range->mpr_count;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1489
		*ofportstr = strs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1490
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1491
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1492
	free(pv_range);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1493
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1494
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1495
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1496
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1497
dlmgr_DLValue_putstring(dlmgr__rad_dict_string_DLValue_t *ddvp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1498
    const char *key, char *buf, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1499
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1500
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1501
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1502
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1503
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1504
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1505
		bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1506
		new_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1507
		new_val.ddlv_sval = buf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1508
		if ((status = dlmgr__rad_dict_string_DLValue_put(ddvp, key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1509
		    &new_val, &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1510
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1511
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1512
		snprintf(dstr, dstrlen, "%s,%s=%s", dstr, key, buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1513
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1514
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1515
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1516
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1517
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1518
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1519
dlmgr_DLValue_fm_putstring(dlmgr__rad_dict_string_DLValue_t *ddvp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1520
    dlmgr__rad_dict_string_DLValue_t *ddmp, const char *key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1521
    char *buf, char *rbuf, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1522
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1523
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1524
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1525
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1526
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1527
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1528
		bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1529
		new_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1530
		new_val.ddlv_sval = buf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1531
		if ((status = dlmgr__rad_dict_string_DLValue_put(ddvp, key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1532
		    &new_val, &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1533
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1534
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1535
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1536
		old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1537
		new_val.ddlv_sval = rbuf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1538
		if ((status = dlmgr__rad_dict_string_DLValue_put(ddmp, key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1539
		    &new_val, &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1540
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1541
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1542
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1543
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1544
		snprintf(dstr, dstrlen, "%s,%s=%s/%s", dstr, key, buf, rbuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1545
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1546
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1547
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1548
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1549
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1550
 * Caller allocated "pvals" is freed here
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1551
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1552
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1553
dlmgr_DLValue_putstrings(dlmgr__rad_dict_string_DLValue_t *ddvp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1554
    const char *key, char **pvals, int pvalcnt, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1555
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1556
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1557
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1558
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1559
	int i, err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1560
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1561
	if (pvalcnt != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1562
		bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1563
		new_val.ddlv_type = DDLVT_STRINGS;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1564
		new_val.ddlv_slist = pvals;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1565
		new_val.ddlv_slist_count = pvalcnt;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1566
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1567
		    ddvp, key, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1568
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1569
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1570
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1571
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1572
		for (i = 0; i < pvalcnt; i++)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1573
			snprintf(dstr, dstrlen, "%s,%s=%s", dstr, key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1574
			    pvals[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1575
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1576
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1577
		for (i = 0; i < pvalcnt; i++)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1578
			free(pvals[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1579
		free(pvals);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1580
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1581
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1582
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1583
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1584
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1585
dlmgr_DLValue_putboolean(dlmgr__rad_dict_string_DLValue_t *ddvp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1586
    const char *key, boolean_t val, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1587
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1588
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1589
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1590
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1591
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1592
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1593
	new_val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1594
	new_val.ddlv_bval = &val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1595
	if ((status = dlmgr__rad_dict_string_DLValue_put(ddvp, key, &new_val,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1596
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1597
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1598
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1599
	snprintf(dstr, dstrlen, "%s,%s=%s", dstr, key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1600
	    val ? "true" : "false");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1601
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1602
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1603
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1604
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1605
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1606
dlmgr_DLValue_putulong(dlmgr__rad_dict_string_DLValue_t *ddvp, const char *key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1607
    uint64_t val, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1608
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1609
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1610
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1611
	unsigned long long ulval = val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1612
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1613
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1614
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1615
	new_val.ddlv_type = DDLVT_ULONG;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1616
	new_val.ddlv_ulval = &ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1617
	if ((status = dlmgr__rad_dict_string_DLValue_put(ddvp, key, &new_val,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1618
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1619
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1620
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1621
	snprintf(dstr, dstrlen, "%s,%s=%"PRIu64, dstr, key, val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1622
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1623
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1624
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1625
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1626
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1627
dlmgr_DLValue_fm_putulong(dlmgr__rad_dict_string_DLValue_t *ddvp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1628
    dlmgr__rad_dict_string_DLValue_t *ddmp, const char *key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1629
    uint64_t f, uint64_t m, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1630
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1631
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1632
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1633
	unsigned long long f_ulval = f;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1634
	unsigned long long m_ulval = m;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1635
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1636
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1637
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1638
	new_val.ddlv_type = DDLVT_ULONG;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1639
	new_val.ddlv_ulval = &f_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1640
	if ((status = dlmgr__rad_dict_string_DLValue_put(ddvp, key, &new_val,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1641
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1642
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1643
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1644
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1645
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1646
	new_val.ddlv_ulval = &m_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1647
	if ((status = dlmgr__rad_dict_string_DLValue_put(ddmp, key, &new_val,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1648
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1649
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1650
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1651
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1652
	snprintf(dstr, dstrlen, "%s,%s=%"PRIu64"/%"PRIu64, dstr, key, f, m);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1653
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1654
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1655
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1656
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1657
solaris_flow_to_DLVal(struct flow *f, struct flow *m,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1658
    dlmgr__rad_dict_string_DLValue_t *ddvp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1659
    dlmgr__rad_dict_string_DLValue_t *ddmp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1660
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1661
	char		buf[DLADM_STRSIZE], rbuf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1662
	char		dstr[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1663
	int		err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1664
	boolean_t	is_arp = (ntohs(f->dl_type) == 0x806);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1665
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1666
	dstr[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1667
	if (f->dl_type != htons(FLOW_DL_TYPE_NONE)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1668
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "sap",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1669
		    ntohs(f->dl_type), ntohs(m->dl_type), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1670
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1671
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1672
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1673
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1674
	if (is_arp) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1675
		if (f->nw_proto != 0 || m->nw_proto != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1676
			err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "arp-op",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1677
			    f->nw_proto, m->nw_proto, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1678
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1679
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1680
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1681
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1682
		flow_mac2str(f->arp_sha, m->arp_sha, buf, rbuf, sizeof (buf),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1683
		    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1684
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1685
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1686
			    "arp-sender", buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1687
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1688
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1689
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1690
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1691
		flow_mac2str(f->arp_tha, m->arp_tha, buf, rbuf, sizeof (buf),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1692
		    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1693
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1694
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1695
			    "arp-target", buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1696
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1697
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1698
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1699
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1700
		flow_addr2str(NULL, NULL, f->nw_src, m->nw_src, buf, rbuf,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1701
		    sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1702
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1703
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp, "arp-sip",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1704
			    buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1705
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1706
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1707
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1708
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1709
		flow_addr2str(NULL, NULL, f->nw_dst, m->nw_dst, buf, rbuf,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1710
		    sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1711
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1712
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp, "arp-tip",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1713
			    buf, rbuf,  dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1714
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1715
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1716
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1717
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1718
		if (f->nw_proto != 0 || m->nw_proto != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1719
			err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "transport",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1720
			    f->nw_proto, m->nw_proto, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1721
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1722
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1723
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1724
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1725
		flow_addr2str(&f->ipv6_src, &m->ipv6_src, f->nw_src, m->nw_src,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1726
		    buf, rbuf, sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1727
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1728
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp, "local-ip",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1729
			    buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1730
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1731
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1732
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1733
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1734
		flow_addr2str(&f->ipv6_dst, &m->ipv6_dst, f->nw_dst, m->nw_dst,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1735
		    buf, rbuf, sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1736
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1737
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1738
			    "remote-ip", buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1739
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1740
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1741
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1742
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1743
		if (f->tcp_flags != 0 || m->tcp_flags != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1744
			err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1745
			    "tcp-flags", (uint8_t)(ntohs(f->tcp_flags)),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1746
			    (uint8_t)(ntohs(m->tcp_flags)), dstr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1747
			    sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1748
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1749
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1750
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1751
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1752
		if (f->nw_proto != IPPROTO_ICMP &&
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1753
		    f->nw_proto != IPPROTO_ICMPV6) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1754
			if (f->tp_src != 0 || m->tp_src != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1755
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1756
				    "local-port", ntohs(f->tp_src),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1757
				    ntohs(m->tp_src), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1758
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1759
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1760
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1761
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1762
			if (f->tp_dst != 0 || m->tp_dst != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1763
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1764
				    "remote-port", ntohs(f->tp_dst),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1765
				    ntohs(m->tp_dst), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1766
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1767
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1768
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1769
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1770
			if (f->tp_src != 0 || m->tp_src != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1771
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1772
				    "icmp-type", ntohs(f->tp_src),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1773
				    ntohs(m->tp_src), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1774
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1775
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1776
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1777
			if (f->tp_dst != 0 || m->tp_dst != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1778
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1779
				    "icmp-code", ntohs(f->tp_dst),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1780
				    ntohs(m->tp_dst), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1781
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1782
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1783
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1784
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1785
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1786
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1787
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1788
	flow_mac2str(f->dl_src, m->dl_src, buf, rbuf, sizeof (buf),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1789
	    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1790
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1791
		err = dlmgr_DLValue_fm_putstring(ddvp, ddmp, "src-mac", buf,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1792
		    rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1793
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1794
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1795
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1796
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1797
	flow_mac2str(f->dl_dst, m->dl_dst, buf, rbuf, sizeof (buf),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1798
	    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1799
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1800
		err = dlmgr_DLValue_fm_putstring(ddvp, ddmp, "dst-mac", buf,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1801
		    rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1802
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1803
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1804
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1805
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1806
	if (f->in_port.odp_port != ODPP_NONE) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1807
		err = dlmgr_DLValue_putulong(ddvp, "srcport",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1808
		    f->in_port.odp_port, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1809
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1810
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1811
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1812
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1813
	if (f->vlan_tci != 0 || m->vlan_tci != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1814
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1815
		    "vlan-tci", ntohs(f->vlan_tci),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1816
		    ntohs(m->vlan_tci), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1817
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1818
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1819
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1820
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1821
	if (f->nw_tos != 0 || m->nw_tos != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1822
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1823
		    "dsfield", f->nw_tos, m->nw_tos, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1824
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1825
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1826
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1827
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1828
	if (f->nw_ttl != 0 || m->nw_ttl != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1829
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1830
		    "ttl", f->nw_ttl, m->nw_ttl, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1831
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1832
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1833
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1834
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1835
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1836
	dpif_log(err, "solaris_flow_to_DLVal FLOWATTR: %s", dstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1837
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1838
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1839
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1840
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1841
solaris_outports_action_to_DLVal(dlmgr__rad_dict_string_DLValue_t *prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1842
    void *cookie, uint32_t ofports[], int nofports, uint32_t queueid,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1843
    char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1844
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1845
	struct smap details;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1846
	const char *max_rate = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1847
	uint64_t maxbw;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1848
	char *endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1849
	char **pvals = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1850
	int  pvalcnt, err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1851
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1852
	smap_init(&details);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1853
	if (queueid == UINT32_MAX || nofports != 1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1854
		goto outport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1855
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1856
	if ((err = dpif_solaris_get_priority_details(cookie, ofports[0],
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1857
	    queueid, &details)) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1858
		smap_destroy(&details);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1859
		goto outport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1860
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1861
	/* min-rate and priority not currently used */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1862
	max_rate = smap_get(&details, "max-rate");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1863
	if (max_rate == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1864
		goto outport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1865
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1866
	errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1867
	maxbw = strtoull(max_rate, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1868
	if (errno != 0 || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1869
		goto outport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1870
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1871
	err = dlmgr_DLValue_putulong(prop, "max-bw", maxbw, dstr, dstrlen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1872
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1873
outport:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1874
	err = flow_ofports2propstr(ofports, nofports, &pvals, &pvalcnt);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1875
	if (err == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1876
		err = dlmgr_DLValue_putstrings(prop, "outports", pvals,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1877
		    pvalcnt, dstr, dstrlen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1878
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1879
	smap_destroy(&details);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1880
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1881
	dpif_log(err, "dpif_solaris_to_outport_action PROP: %s", dstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1882
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1883
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1884
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1885
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1886
solaris_setether_action_to_DLVal(dlmgr__rad_dict_string_DLValue_t *prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1887
    const struct ovs_key_ethernet *ek, char *ds, size_t dslen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1888
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1889
	char *sstr = NULL, *dstr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1890
	char **pvals = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1891
	char buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1892
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1893
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1894
	sstr = _link_ntoa(ek->eth_src, NULL, ETHERADDRL, IFT_ETHER);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1895
	dstr = _link_ntoa(ek->eth_dst, NULL, ETHERADDRL, IFT_ETHER);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1896
	if (sstr != NULL && dstr != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1897
		(void) snprintf(buf, sizeof (buf), "ether_src:%s,ether_dst:%s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1898
		    sstr, dstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1899
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1900
	free(sstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1901
	free(dstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1902
	if (sstr == NULL || dstr == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1903
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1904
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1905
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1906
	pvals = calloc(1, sizeof (char *));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1907
	if (pvals == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1908
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1909
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1910
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1911
	pvals[0] = strdup(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1912
	if (pvals[0] == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1913
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1914
		free(pvals);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1915
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1916
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1917
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1918
	/* TODO(gmoodalb): this should be two entries. fix later */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1919
	err = dlmgr_DLValue_putstrings(prop, "set-ether", pvals, 1, ds,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1920
	    dslen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1921
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1922
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1923
	dpif_log(err, "solaris_setether_action_to_DLVal PROP: %s", ds);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1924
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1925
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1926
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1927
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1928
solaris_setipv4_action_to_DLVal(dlmgr__rad_dict_string_DLValue_t *prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1929
    const struct ovs_key_ipv4 *ipv4, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1930
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1931
	struct in_addr ipaddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1932
	char *cp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1933
	char **pvals = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1934
	char buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1935
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1936
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1937
	ipaddr.s_addr = ipv4->ipv4_src;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1938
	cp = inet_ntoa(ipaddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1939
	(void) snprintf(buf, sizeof (buf), "src:%s,", cp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1940
	ipaddr.s_addr = ipv4->ipv4_dst;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1941
	cp = inet_ntoa(ipaddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1942
	(void) snprintf(buf, sizeof (buf),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1943
	    "%sdst:%s,protocol:%s,tos:0x%x,hoplimit:%d",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1944
	    buf, cp, solaris_proto2str(ipv4->ipv4_proto), ipv4->ipv4_tos,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1945
	    ipv4->ipv4_ttl);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1946
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1947
	pvals = calloc(1, sizeof (char *));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1948
	if (pvals == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1949
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1950
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1951
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1952
	pvals[0] = strdup(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1953
	if (pvals[0] == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1954
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1955
		free(pvals);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1956
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1957
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1958
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1959
	err = dlmgr_DLValue_putstrings(prop, "set-ipv4", pvals, 1, dstr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1960
	    dstrlen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1961
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1962
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1963
	dpif_log(err, "solaris_setipv4_action_to_DLVal PROP: %s", dstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1964
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1965
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1966
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1967
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1968
solaris_setipv6_action_to_DLVal(dlmgr__rad_dict_string_DLValue_t *prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1969
    const struct ovs_key_ipv6 *ipv6, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1970
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1971
	char abuf[INET6_ADDRSTRLEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1972
	char **pvals = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1973
	char buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1974
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1975
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1976
	(void) inet_ntop(AF_INET6, ipv6->ipv6_src, abuf, INET6_ADDRSTRLEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1977
	(void) snprintf(buf, sizeof (buf), "src:%s,", abuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1978
	(void) inet_ntop(AF_INET6, ipv6->ipv6_dst, abuf, INET6_ADDRSTRLEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1979
	(void) snprintf(buf, sizeof (buf),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1980
	    "%sdst:%s,label:0x%x,protocol:%s,tos:0x%x,hoplimit:%d", buf, abuf,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1981
	    ipv6->ipv6_label, solaris_proto2str(ipv6->ipv6_proto),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1982
	    ipv6->ipv6_tclass, ipv6->ipv6_hlimit);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1983
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1984
	pvals = calloc(1, sizeof (char *));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1985
	if (pvals == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1986
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1987
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1988
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1989
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1990
	pvals[0] = strdup(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1991
	if (pvals[0] == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1992
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1993
		free(pvals);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1994
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1995
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1996
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1997
	err = dlmgr_DLValue_putstrings(prop, "set-ipv6", pvals, 1, dstr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1998
	    dstrlen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1999
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2000
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2001
	dpif_log(err, "solaris_setipv6_action_to_DLVal PROP: %s", dstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2002
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2003
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2004
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2005
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2006
solaris_settransport_action_to_DLVal(dlmgr__rad_dict_string_DLValue_t *prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2007
    const char *key, uint16_t src, uint16_t dst, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2008
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2009
	char **pvals = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2010
	char buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2011
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2012
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2013
	(void) snprintf(buf, sizeof (buf), "sport:%d,dport:%d", src, dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2014
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2015
	pvals = calloc(1, sizeof (char *));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2016
	if (pvals == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2017
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2018
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2019
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2020
	pvals[0] = strdup(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2021
	if (pvals[0] == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2022
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2023
		free(pvals);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2024
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2025
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2026
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2027
	err = dlmgr_DLValue_putstrings(prop, key, pvals, 1, dstr, dstrlen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2028
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2029
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2030
	dpif_log(err, "solaris_settransport_action_to_DLVal PROP: %s %s", key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2031
	    dstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2032
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2033
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2034
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2035
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2036
solaris_settnl_action_to_DLVal(dlmgr__rad_dict_string_DLValue_t *prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2037
    const struct flow_tnl *tnl, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2038
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2039
	struct in_addr ipaddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2040
	char *cp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2041
	char **pvals = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2042
	char buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2043
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2044
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2045
	ipaddr.s_addr = tnl->ip_src;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2046
	cp = inet_ntoa(ipaddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2047
	(void) snprintf(buf, sizeof (buf), "src:%s,", cp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2048
	ipaddr.s_addr = tnl->ip_dst;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2049
	cp = inet_ntoa(ipaddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2050
	(void) snprintf(buf, sizeof (buf),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2051
	    "%sdst:%s,tun_id:0x%"PRIx64",tos:0x%x,hoplimit:%d",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2052
	    buf, cp, ntohll(tnl->tun_id), tnl->ip_tos, tnl->ip_ttl);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2053
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2054
	pvals = calloc(1, sizeof (char *));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2055
	if (pvals == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2056
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2057
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2058
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2059
	pvals[0] = strdup(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2060
	if (pvals[0] == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2061
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2062
		free(pvals);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2063
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2064
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2065
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2066
	err = dlmgr_DLValue_putstrings(prop, "set-tunnel", pvals, 1, dstr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2067
	    dstrlen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2068
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2069
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2070
	dpif_log(err, "solaris_setipv6_action_to_DLVal PROP: %s", dstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2071
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2072
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2073
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2074
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2075
solaris_nlattr_to_DLVal(void *cookie,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2076
    const struct nlattr *actions_nlattr, size_t actions_len,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2077
    dlmgr__rad_dict_string_DLValue_t **propp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2078
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2079
	const struct nlattr *a;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2080
	unsigned int left;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2081
	dlmgr__rad_dict_string_DLValue_t *prop = *propp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2082
	char buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2083
	char dstr[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2084
	char **pvals;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2085
	int err = 0, nofports = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2086
	uint32_t ofports[MAC_OF_MAXPORT];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2087
	enum ovs_action_attr type = -1, lasttype;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2088
	uint_t queueid = UINT32_MAX;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2089
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2090
	dstr[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2091
	err = dlmgr_DLValue_putboolean(prop, "temporary", B_TRUE, dstr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2092
	    sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2093
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2094
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2095
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2096
	/* if actions_len == 0, then the action is drop */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2097
	if (actions_len == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2098
		pvals = calloc(1, sizeof (char *));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2099
		if (pvals == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2100
			err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2101
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2102
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2103
		(void) snprintf(buf, sizeof (buf), "drop");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2104
		pvals[0] = strdup(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2105
		if (pvals[0] == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2106
			err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2107
			free(pvals);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2108
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2109
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2110
		err = dlmgr_DLValue_putstrings(prop, "outports", pvals, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2111
		    dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2112
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2113
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2114
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2115
	NL_ATTR_FOR_EACH_UNSAFE(a, left, actions_nlattr, actions_len) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2116
		lasttype = type;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2117
		type = nl_attr_type(a);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2118
		if ((type != OVS_ACTION_ATTR_OUTPUT) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2119
		    (lasttype != OVS_ACTION_ATTR_OUTPUT)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2120
			if (lasttype == OVS_ACTION_ATTR_OUTPUT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2121
				dpif_log(0, "solaris_nlattr_to_DLVal outports "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2122
				    "total %d ports", nofports);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2123
				err = solaris_outports_action_to_DLVal(prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2124
				    cookie, ofports, nofports, queueid,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2125
				    dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2126
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2127
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2128
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2129
			nofports = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2130
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2131
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2132
		switch ((enum ovs_action_attr) type) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2133
		/* These only make sense in the context of a datapath. */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2134
		case OVS_ACTION_ATTR_OUTPUT:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2135
			if (nofports + 1 > MAC_OF_MAXPORT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2136
				err = ENOBUFS;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2137
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2138
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2139
			dpif_log(0, "solaris_nlattr_to_DLVal %d ports: %u",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2140
			    nofports+1, nl_attr_get_u32(a));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2141
			ofports[nofports++] = u32_to_odp(nl_attr_get_u32(a));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2142
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2143
		case OVS_ACTION_ATTR_USERSPACE: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2144
			const struct nlattr *userdata;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2145
			size_t userdata_len;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2146
			union user_action_cookie cookie;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2147
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2148
			userdata = nl_attr_find_nested(a,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2149
			    OVS_USERSPACE_ATTR_USERDATA);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2150
			userdata_len = nl_attr_get_size(userdata);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2151
			memcpy(&cookie, nl_attr_get(userdata), userdata_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2152
			if (userdata_len < sizeof (cookie.type) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2153
			    userdata_len > sizeof (cookie)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2154
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2155
				dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2156
				    "unexpected action size %"PRIuSIZE,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2157
				    userdata_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2158
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2159
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2160
			if (userdata_len != MAX(8, sizeof (cookie.slow_path)) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2161
			    cookie.type != USER_ACTION_COOKIE_SLOW_PATH) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2162
				err = EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2163
				dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2164
				    "userspace action size %"PRIuSIZE" "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2165
				    "type unsupported %d", userdata_len,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2166
				    cookie.type);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2167
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2168
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2169
			if (cookie.slow_path.reason != SLOW_CONTROLLER)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2170
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2171
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2172
			pvals = calloc(1, sizeof (char *));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2173
			if (pvals == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2174
				err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2175
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2176
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2177
			(void) snprintf(buf, sizeof (buf), "%u",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2178
			    PORT_PF_PACKET_UPLINK);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2179
			pvals[0] = strdup(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2180
			if (pvals[0] == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2181
				err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2182
				free(pvals);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2183
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2184
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2185
			err = dlmgr_DLValue_putstrings(prop, "controller",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2186
			    pvals, 1, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2187
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2188
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2189
		case OVS_ACTION_ATTR_SET: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2190
			const struct nlattr *aset = nl_attr_get(a);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2191
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2192
			switch (nl_attr_type(aset)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2193
			case OVS_KEY_ATTR_PRIORITY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2194
				queueid = nl_attr_get_u32(aset);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2195
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2196
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2197
			case OVS_KEY_ATTR_ETHERNET: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2198
				const struct ovs_key_ethernet *ek;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2199
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2200
				ek = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2201
				    sizeof (struct ovs_key_ethernet));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2202
				err = solaris_setether_action_to_DLVal(prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2203
				    ek, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2204
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2205
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2206
			case OVS_KEY_ATTR_IPV4: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2207
				const struct ovs_key_ipv4 *eip4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2208
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2209
				eip4 = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2210
				    sizeof (struct ovs_key_ipv4));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2211
				err = solaris_setipv4_action_to_DLVal(prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2212
				    eip4, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2213
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2214
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2215
			case OVS_KEY_ATTR_IPV6: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2216
				const struct ovs_key_ipv6 *eip6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2217
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2218
				eip6 = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2219
				    sizeof (struct ovs_key_ipv6));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2220
				err = solaris_setipv6_action_to_DLVal(prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2221
				    eip6, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2222
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2223
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2224
			case OVS_KEY_ATTR_TCP: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2225
				const struct ovs_key_tcp *etcp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2226
				etcp = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2227
				    sizeof (struct ovs_key_tcp));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2228
				err = solaris_settransport_action_to_DLVal(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2229
				    prop, "set-tcp", etcp->tcp_src,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2230
				    etcp->tcp_dst, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2231
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2232
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2233
			case OVS_KEY_ATTR_UDP: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2234
				const struct ovs_key_udp *eudp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2235
				eudp = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2236
				    sizeof (struct ovs_key_udp));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2237
				err = solaris_settransport_action_to_DLVal(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2238
				    prop, "set-udp", eudp->udp_src,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2239
				    eudp->udp_dst, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2240
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2241
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2242
			case OVS_KEY_ATTR_SCTP: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2243
				const struct ovs_key_sctp *esctp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2244
				esctp = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2245
				    sizeof (struct ovs_key_sctp));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2246
				err = solaris_settransport_action_to_DLVal(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2247
				    prop, "set-sctp", esctp->sctp_src,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2248
				    esctp->sctp_dst, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2249
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2250
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2251
			case OVS_KEY_ATTR_TUNNEL: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2252
				struct flow_tnl tnl;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2253
				enum odp_key_fitness fitness;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2254
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2255
				memset(&tnl, 0, sizeof (tnl));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2256
				fitness = odp_tun_key_from_attr(aset, &tnl);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2257
				ovs_assert(fitness != ODP_FIT_ERROR);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2258
				err = solaris_settnl_action_to_DLVal(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2259
				    prop, &tnl, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2260
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2261
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2262
			default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2263
				err = EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2264
				dpif_log(err, "solaris_nlattr_to_DLVal set "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2265
				    "%d not supported",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2266
				    nl_attr_type(nl_attr_get(a)));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2267
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2268
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2269
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2270
		case OVS_ACTION_ATTR_PUSH_VLAN: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2271
			const struct ovs_action_push_vlan *vlan;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2272
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2273
			vlan = nl_attr_get_unspec(a,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2274
			    sizeof (struct ovs_action_push_vlan));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2275
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2276
			(void) snprintf(buf, sizeof (buf), "%u",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2277
			    ntohs(vlan->vlan_tci));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2278
			err = dlmgr_DLValue_putstring(prop, "vlan-tag", buf,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2279
			    dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2280
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2281
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2282
		case OVS_ACTION_ATTR_POP_VLAN:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2283
			(void) snprintf(buf, sizeof (buf), "on");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2284
			err = dlmgr_DLValue_putstring(prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2285
			    "vlan-strip", buf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2286
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2287
		case OVS_ACTION_ATTR_RECIRC:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2288
		case OVS_ACTION_ATTR_HASH:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2289
		case OVS_ACTION_ATTR_PUSH_MPLS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2290
		case OVS_ACTION_ATTR_POP_MPLS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2291
		case OVS_ACTION_ATTR_SAMPLE:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2292
			/* TBD */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2293
			err = EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2294
			dpif_log(err, "solaris_nlattr_to_DLVal type %d "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2295
			    "not supported", type);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2296
		case OVS_ACTION_ATTR_UNSPEC:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2297
		case __OVS_ACTION_ATTR_MAX:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2298
			OVS_NOT_REACHED();
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2299
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2300
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2301
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2302
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2303
	if (type == OVS_ACTION_ATTR_OUTPUT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2304
		dpif_log(0, "solaris_nlattr_to_DLVal outports total %d ports",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2305
		    nofports);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2306
		err = solaris_outports_action_to_DLVal(prop, cookie, ofports,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2307
		    nofports, queueid, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2308
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2309
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2310
	dpif_log(err, "solaris_nlattr_to_DLVal %s", dstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2311
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2312
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2313
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2314
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2315
solaris_add_flow(void *cookie, const char *linkname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2316
    const char *flowname, struct flow *f, struct flow *m,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2317
    const struct nlattr *actions_nlattr, size_t actions_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2318
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2319
	dlmgr_DLDict_t dff, dfm, *dffp, *dfmp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2320
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2321
	rc_instance_t *link = NULL, *flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2322
	dlmgr_DatalinkError_t *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2323
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2324
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2325
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2326
	bzero(&dff, sizeof (dff));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2327
	bzero(&dfm, sizeof (dfm));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2328
	dffp = &dff;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2329
	dfmp = &dfm;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2330
	status = dlmgr_Datalink__rad_lookup(rad_conn, B_TRUE, &link, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2331
	    "name", linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2332
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2333
		err = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2334
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2335
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2336
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2337
	dff.ddld_map = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2338
	if (dff.ddld_map == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2339
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2340
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2341
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2342
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2343
	dfm.ddld_map = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2344
	if (dfm.ddld_map == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2345
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2346
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2347
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2348
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2349
	prop = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2350
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2351
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2352
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2353
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2354
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2355
	err = solaris_flow_to_DLVal(f, m, dff.ddld_map, dfm.ddld_map);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2356
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2357
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2358
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2359
	err = solaris_nlattr_to_DLVal(cookie, actions_nlattr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2360
	    actions_len, &prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2361
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2362
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2363
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2364
	status = dlmgr_Datalink_addFlow(link, flowname, &dffp, 1, &dfmp, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2365
	    prop, &flow, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2366
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2367
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2368
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2369
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2370
			dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2371
			    "failed Datalink_addFlow(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2372
			    flowname, linkname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2373
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2374
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2375
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2376
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2377
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2378
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2379
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2380
	dlmgr__rad_dict_string_DLValue_free(dfm.ddld_map);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2381
	dlmgr__rad_dict_string_DLValue_free(dff.ddld_map);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2382
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2383
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2384
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2385
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2386
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2387
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2388
solaris_modify_flow(void *cookie, const char *flowname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2389
    const struct nlattr *actions_nlattr, size_t actions_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2390
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2391
	rc_instance_t *flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2392
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2393
	dlmgr_DatalinkError_t *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2394
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2395
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2396
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2397
	status = dlmgr_Flow__rad_lookup(rad_conn, B_TRUE, &flow, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2398
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2399
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2400
		err = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2401
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2402
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2403
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2404
	prop = dlmgr__rad_dict_string_DLValue_create(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2405
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2406
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2407
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2408
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2409
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2410
	err = solaris_nlattr_to_DLVal(cookie, actions_nlattr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2411
	    actions_len, &prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2412
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2413
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2414
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2415
	status = dlmgr_Flow_setProperties(flow, prop, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2416
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2417
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2418
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2419
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2420
			dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2421
			    "failed Flow_setProperties(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2422
			    flowname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2423
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2424
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2425
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2426
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2427
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2428
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2429
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2430
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2431
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2432
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2433
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2434
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2435
solaris_remove_flow(const char *linkname, const char *flowname)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2436
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2437
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2438
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2439
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2440
	dlmgr_DLValue_t			val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2441
	rc_instance_t			*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2442
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2443
	int				error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2444
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2445
	status = dlmgr_Datalink__rad_lookup(rad_conn, B_TRUE, &link, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2446
	    "name", linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2447
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2448
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2449
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2450
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2451
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2452
	prop = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2453
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2454
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2455
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2456
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2457
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2458
	bzero(&val, sizeof (val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2459
	val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2460
	val.ddlv_bval = &b_true;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2461
	status = dlmgr__rad_dict_string_DLValue_put(prop, "temporary",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2462
	    &val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2463
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2464
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2465
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2466
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2467
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2468
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2469
	status = dlmgr_Datalink_removeFlow(link, flowname, prop, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2470
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2471
		error = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2472
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2473
			error = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2474
			dpif_log(error, "failed Datalink_removeFlow(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2475
			    flowname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2476
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2477
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2478
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2479
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2480
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2481
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2482
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2483
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2484
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2485
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2486
solaris_flowinfo2flowmap(const char *key, dlmgr_DLValue_t *val, void *arg)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2487
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2488
	struct flow *f = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2489
	in6_addr_t fa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2490
	struct in_addr v4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2491
	int af, err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2492
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2493
	if (strcmp(key, "dst-mac") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2494
		err = flow_str2mac(val->ddlv_sval, f->dl_dst, 6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2495
	} else if (strcmp(key, "src-mac") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2496
		err = flow_str2mac(val->ddlv_sval, f->dl_src, 6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2497
	} else if (strcmp(key, "local-ip") == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2498
	    strcmp(key, "remote-ip") == 0 || strcmp(key, "arp-sip") == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2499
	    strcmp(key, "arp-tip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2500
		err = flow_str2addr(val->ddlv_sval, &fa, &af);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2501
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2502
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2503
		if (af == AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2504
			IN6_V4MAPPED_TO_INADDR(&fa, &v4);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2505
			if (strcmp(key, "local-ip") == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2506
			    strcmp(key, "arp-sip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2507
				f->nw_src = v4.s_addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2508
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2509
				f->nw_dst = v4.s_addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2510
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2511
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2512
			if (strcmp(key, "local-ip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2513
				bcopy(&fa, &f->ipv6_src, sizeof (f->ipv6_src));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2514
			} else if (strcmp(key, "remote-ip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2515
				bcopy(&fa, &f->ipv6_dst, sizeof (f->ipv6_dst));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2516
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2517
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2518
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2519
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2520
	} else if (strcmp(key, "transport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2521
		f->nw_proto = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2522
	} else if (strcmp(key, "local-port") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2523
		f->tp_src = htons((uint16_t)*val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2524
	} else if (strcmp(key, "remote-port") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2525
		f->tp_dst = htons((uint16_t)*val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2526
	} else if (strcmp(key, "dsfield") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2527
		f->nw_tos = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2528
	} else if (strcmp(key, "srcport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2529
		f->in_port.odp_port = (odp_port_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2530
	} else if (strcmp(key, "arp-target") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2531
		err = flow_str2mac(val->ddlv_sval, f->arp_tha, 6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2532
	} else if (strcmp(key, "arp-sender") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2533
		err = flow_str2mac(val->ddlv_sval, f->arp_sha, 6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2534
	} else if (strcmp(key, "arp-op") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2535
		f->nw_proto = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2536
	} else if (strcmp(key, "sap") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2537
		f->dl_type = htons((uint16_t)*val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2538
	} else if (strcmp(key, "ttl") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2539
		f->nw_ttl = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2540
	} else if (strcmp(key, "vlan-tci") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2541
		f->vlan_tci = htons((uint16_t)*val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2542
	} else if (strcmp(key, "icmp-type") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2543
		f->tp_src = htons((uint16_t)*val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2544
	} else if (strcmp(key, "icmp-code") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2545
		f->tp_dst = htons((uint16_t)*val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2546
	} else if (strcmp(key, "tcp-flags") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2547
		f->tcp_flags = htons((uint16_t)*val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2548
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2549
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2550
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2551
	dlmgr_DLValue_free(val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2552
	return (err == 0 ? RCE_OK : -1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2553
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2554
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2555
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2556
solaris_flowinfo2flow(dlmgr__rad_dict_string_DLValue_t *flowinfo,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2557
    struct flow *f, struct flow *m)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2558
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2559
	dlmgr__rad_dict_string_DLValue_t *fdict, *mdict;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2560
	dlmgr_DLValue_t  *flist = NULL, *mlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2561
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2562
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2563
	bzero(f, sizeof (*f));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2564
	bzero(m, sizeof (*m));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2565
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2566
	status = dlmgr__rad_dict_string_DLValue_get(flowinfo, "filters",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2567
	    &flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2568
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2569
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2570
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2571
	fdict = flist->ddlv_dlist[0]->ddld_map;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2572
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2573
	status = dlmgr__rad_dict_string_DLValue_map(fdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2574
	    solaris_flowinfo2flowmap, f);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2575
	dlmgr_DLValue_free(flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2576
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2577
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2578
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2579
	status = dlmgr__rad_dict_string_DLValue_get(flowinfo, "masks", &mlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2580
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2581
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2582
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2583
	mdict = mlist->ddlv_dlist[0]->ddld_map;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2584
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2585
	status = dlmgr__rad_dict_string_DLValue_map(mdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2586
	    solaris_flowinfo2flowmap, m);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2587
	dlmgr_DLValue_free(mlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2588
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2589
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2590
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2591
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2592
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2593
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2594
solaris_get_flowattr(const char *flowname, struct flow *f, struct flow *m)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2595
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2596
	dlmgr__rad_dict_string_DLValue_t *flowinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2597
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2598
	rc_instance_t		*flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2599
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2600
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2601
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2602
	status = dlmgr_Flow__rad_lookup(rad_conn, B_TRUE, &flow, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2603
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2604
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2605
		return (ENODEV);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2606
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2607
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2608
	status = dlmgr_Flow_getInfo(flow, NULL, 0, &flowinfo, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2609
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2610
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2611
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2612
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2613
			/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2614
			 * XXX For now, log DDLSTATUS_NOT_FOUND as debug until
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2615
			 * we can determine how to handle the RAD caching
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2616
			 * issue.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2617
			 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2618
			dpif_log(err == DDLSTATUS_NOT_FOUND ? 0 : err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2619
			    "failed Flow_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2620
			    flowname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2621
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2622
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2623
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2624
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2625
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2626
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2627
	if (err == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2628
		err = solaris_flowinfo2flow(flowinfo, f, m);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2629
		dlmgr__rad_dict_string_DLValue_free(flowinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2630
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2631
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2632
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2633
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2634
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2635
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2636
flow_propval2action_drop(char **propvals, int nval,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2637
    struct ofpbuf *action OVS_UNUSED)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2638
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2639
	if (nval == 1 && strcmp(propvals[0], "drop") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2640
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2641
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2642
	return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2643
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2644
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2645
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2646
flow_propval2action_outports(char **propvals, int nval, struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2647
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2648
	mac_propval_range_t *pv_range = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2649
	uint32_t ofports[MAC_OF_MAXPORT], i, nofports = MAC_OF_MAXPORT;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2650
	dladm_status_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2651
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2652
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2653
	status = dladm_strs2range(propvals, nval, MAC_PROPVAL_UINT32,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2654
	    &pv_range);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2655
	if (status != DLADM_STATUS_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2656
		return (solaris_dladm_status2error(status));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2657
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2658
	/* Convert mac_propval_range to a single ofports list */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2659
	status = dladm_range2list(pv_range, ofports, &nofports);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2660
	if (status != DLADM_STATUS_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2661
		err = solaris_dladm_status2error(status);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2662
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2663
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2664
	for (i = 0; i < nofports; i++)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2665
		nl_msg_put_u32(action, OVS_ACTION_ATTR_OUTPUT, ofports[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2666
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2667
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2668
	free(pv_range);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2669
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2670
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2671
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2672
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2673
flow_propval2action_setpri(char **propvals OVS_UNUSED, int nval OVS_UNUSED,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2674
    struct ofpbuf *action OVS_UNUSED)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2675
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2676
	/* TBD */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2677
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2678
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2679
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2680
void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2681
slowpath_to_actions(enum slow_path_reason reason, struct ofpbuf *buf)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2682
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2683
	union user_action_cookie cookie;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2684
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2685
	cookie.type = USER_ACTION_COOKIE_SLOW_PATH;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2686
	cookie.slow_path.unused = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2687
	cookie.slow_path.reason = reason;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2688
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2689
	odp_put_userspace_action(0, &cookie, sizeof (cookie.slow_path), buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2690
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2691
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2692
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2693
flow_propval2action_controller(char **propvals OVS_UNUSED, int nval OVS_UNUSED,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2694
    struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2695
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2696
	slowpath_to_actions(SLOW_CONTROLLER, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2697
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2698
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2699
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2700
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2701
flow_propval2action_pushvlan(char **propvals, int nval OVS_UNUSED,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2702
    struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2703
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2704
	char *endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2705
	int64_t n;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2706
	struct ovs_action_push_vlan push;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2707
	int tpid = ETH_TYPE_VLAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2708
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2709
	errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2710
	n = strtoull(propvals[0], &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2711
	if ((errno != 0) || *endp != '\0' || n > 0xffff)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2712
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2713
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2714
	push.vlan_tpid = htons(tpid);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2715
	push.vlan_tci = htons((uint16_t)n);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2716
	nl_msg_put_unspec(action, OVS_ACTION_ATTR_PUSH_VLAN,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2717
	    &push, sizeof (push));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2718
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2719
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2720
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2721
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2722
flow_propval2action_popvlan(char **propvals OVS_UNUSED, int nval OVS_UNUSED,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2723
    struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2724
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2725
	nl_msg_put_flag(action, OVS_ACTION_ATTR_POP_VLAN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2726
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2727
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2728
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2729
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2730
flow_propval2action_setether(char **propvals, int nval, struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2731
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2732
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2733
	struct ovs_key_ethernet eth_key;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2734
	uchar_t *etheraddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2735
	int etheraddrlen;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2736
	boolean_t src_set, dst_set;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2737
	char *sep;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2738
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2739
	uint_t i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2740
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2741
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2742
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2743
	 * The property value is in the format of "ether_src:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2744
	 * "ether_dst:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2745
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2746
	bzero(&eth_key, sizeof (eth_key));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2747
	src_set = dst_set = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2748
	for (i = 0; i < nval; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2749
		bcopy(propvals[i], pval, strlen(propvals[i]) + 1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2750
		if ((sep = strchr(pval, ':')) == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2751
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2752
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2753
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2754
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2755
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2756
		if ((etheraddr = _link_aton(sep, &etheraddrlen)) == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2757
			err = (etheraddrlen == -1) ? EINVAL : ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2758
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2759
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2760
		/* Only ethernet address is supported */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2761
		if (etheraddrlen != ETHERADDRL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2762
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2763
			free(etheraddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2764
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2765
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2766
		if (strcmp(pval, "ether_src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2767
			if (src_set) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2768
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2769
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2770
				bcopy(etheraddr, &eth_key.eth_src, ETHERADDRL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2771
				src_set = _B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2772
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2773
		} else if (strcmp(pval, "ether_dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2774
			if (dst_set) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2775
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2776
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2777
				bcopy(etheraddr, &eth_key.eth_dst, ETHERADDRL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2778
				dst_set = _B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2779
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2780
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2781
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2782
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2783
		free(etheraddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2784
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2785
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2786
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2787
	if (!src_set || !dst_set) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2788
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2789
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2790
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2791
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2792
	start_ofs = nl_msg_start_nested(action, OVS_ACTION_ATTR_SET);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2793
	nl_msg_put_unspec(action, OVS_KEY_ATTR_ETHERNET, &eth_key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2794
	    sizeof (eth_key));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2795
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2796
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2797
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2798
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2799
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2800
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2801
flow_propval2action_setipv4(char **propvals, int nval, struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2802
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2803
	struct ovs_key_ipv4 ipv4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2804
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2805
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2806
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2807
	uint8_t protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2808
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2809
	int err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2810
	boolean_t tos_set = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2811
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2812
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2813
	 * The property value is in the format of "src:xxx" "dst:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2814
	 * "protocol:xxx" "tos:xxx" "hoplimit:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2815
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2816
	bzero(&ipv4, sizeof (ipv4));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2817
	for (i = 0; i < nval; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2818
		bcopy(propvals[i], pval, strlen(propvals[i]) + 1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2819
		if ((sep = strchr(pval, ':')) == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2820
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2821
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2822
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2823
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2824
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2825
		if (strcmp(pval, "src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2826
			if (ipv4.ipv4_src != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2827
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2828
			if (inet_pton(AF_INET, sep, &ipv4.ipv4_src) != 1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2829
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2830
		} else if (strcmp(pval, "dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2831
			if (ipv4.ipv4_dst != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2832
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2833
			if (inet_pton(AF_INET, sep, &ipv4.ipv4_dst) != 1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2834
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2835
		} else if (strcmp(pval, "protocol") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2836
			if (ipv4.ipv4_proto != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2837
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2838
			protocol = solaris_str2proto(sep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2839
			if (protocol == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2840
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2841
			ipv4.ipv4_proto = protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2842
		} else if (strcmp(pval, "tos") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2843
			if (tos_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2844
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2845
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2846
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2847
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2848
			if (errno != 0 || value > 0xff || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2849
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2850
			tos_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2851
			ipv4.ipv4_tos = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2852
		} else if (strcmp(pval, "hoplimit") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2853
			if (ipv4.ipv4_ttl != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2854
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2855
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2856
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2857
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2858
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2859
			    *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2860
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2861
			ipv4.ipv4_ttl = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2862
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2863
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2864
	start_ofs = nl_msg_start_nested(action, OVS_ACTION_ATTR_SET);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2865
	nl_msg_put_unspec(action, OVS_KEY_ATTR_IPV4, &ipv4, sizeof (ipv4));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2866
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2867
	err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2868
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2869
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2870
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2871
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2872
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2873
flow_propval2action_setipv6(char **propvals, int nval, struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2874
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2875
	struct ovs_key_ipv6 ipv6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2876
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2877
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2878
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2879
	uint8_t protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2880
	struct in6_addr in6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2881
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2882
	int err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2883
	boolean_t tos_set = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2884
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2885
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2886
	 * The property value is in the format of "src:xxx" "dst:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2887
	 * "label:0xxxxx" "protocol:xxx" "tos:xxx" "hoplimit:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2888
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2889
	bzero(&ipv6, sizeof (ipv6));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2890
	for (i = 0; i < nval; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2891
		bcopy(propvals[i], pval, strlen(propvals[i]) + 1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2892
		if ((sep = strchr(pval, ':')) == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2893
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2894
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2895
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2896
		if (strcmp(pval, "src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2897
			bcopy(&ipv6.ipv6_src, &in6.s6_addr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2898
			    sizeof (struct in6_addr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2899
			if (!IN6_IS_ADDR_UNSPECIFIED(&in6))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2900
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2901
			if (inet_pton(AF_INET6, sep, ipv6.ipv6_src) != 1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2902
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2903
		} else if (strcmp(pval, "dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2904
			bcopy(&ipv6.ipv6_dst, &in6.s6_addr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2905
			    sizeof (struct in6_addr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2906
			if (!IN6_IS_ADDR_UNSPECIFIED(&in6))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2907
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2908
			if (inet_pton(AF_INET6, sep, ipv6.ipv6_dst) != 1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2909
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2910
		} else if (strcmp(pval, "protocol") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2911
			if (ipv6.ipv6_proto != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2912
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2913
			protocol = solaris_str2proto(sep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2914
			if (protocol == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2915
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2916
			ipv6.ipv6_proto = protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2917
		} else if (strcmp(pval, "tos") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2918
			if (tos_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2919
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2920
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2921
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2922
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2923
			if (errno != 0 || value > 0xff || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2924
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2925
			tos_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2926
			ipv6.ipv6_tclass = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2927
		} else if (strcmp(pval, "ttl") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2928
			if (ipv6.ipv6_hlimit != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2929
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2930
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2931
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2932
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2933
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2934
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2935
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2936
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2937
			ipv6.ipv6_hlimit = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2938
		} else if (strcmp(pval, "label") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2939
			if (ipv6.ipv6_label != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2940
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2941
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2942
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2943
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2944
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2945
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2946
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2947
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2948
			ipv6.ipv6_label = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2949
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2950
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2951
	start_ofs = nl_msg_start_nested(action, OVS_ACTION_ATTR_SET);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2952
	nl_msg_put_unspec(action, OVS_KEY_ATTR_IPV6, &ipv6, sizeof (ipv6));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2953
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2954
	err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2955
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2956
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2957
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2958
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2959
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2960
flow_propval2action_settransport(char **propvals, int nval,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2961
    uint16_t *sportp, uint16_t *dportp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2962
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2963
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2964
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2965
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2966
	int err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2967
	uint16_t sport = 0, dport = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2968
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2969
	/* The property value is in the format of "sport:xxx" "dport:xxx" */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2970
	for (i = 0; i < nval; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2971
		bcopy(propvals, pval, strlen(propvals[i]) + 1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2972
		if ((sep = strchr(pval, ':')) == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2973
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2974
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2975
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2976
		if (strcmp(pval, "sport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2977
			if (sport != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2978
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2979
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2980
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2981
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2982
			if (errno != 0 || value == 0 || value > 0xffff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2983
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2984
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2985
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2986
			sport = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2987
		} else if (strcmp(pval, "dport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2988
			if (dport != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2989
				return (DLADM_STATUS_DUPLICATE_ARG);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2990
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2991
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2992
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2993
			if (errno != 0 || value == 0 || value > 0xffff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2994
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2995
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2996
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2997
			dport = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2998
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2999
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3000
	err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3001
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3002
	*sportp = sport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3003
	*dportp = dport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3004
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3005
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3006
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3007
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3008
flow_propval2action_settcp(char **propvals, int nval, struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3009
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3010
	struct ovs_key_tcp tcp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3011
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3012
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3013
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3014
	err = flow_propval2action_settransport(propvals, nval, &tcp.tcp_src,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3015
	    &tcp.tcp_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3016
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3017
		return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3018
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3019
	start_ofs = nl_msg_start_nested(action, OVS_ACTION_ATTR_SET);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3020
	nl_msg_put_unspec(action, OVS_KEY_ATTR_TCP, &tcp, sizeof (tcp));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3021
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3022
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3023
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3024
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3025
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3026
flow_propval2action_setudp(char **propvals, int nval, struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3027
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3028
	struct ovs_key_udp udp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3029
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3030
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3031
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3032
	err = flow_propval2action_settransport(propvals, nval, &udp.udp_src,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3033
	    &udp.udp_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3034
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3035
		return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3036
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3037
	start_ofs = nl_msg_start_nested(action, OVS_ACTION_ATTR_SET);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3038
	nl_msg_put_unspec(action, OVS_KEY_ATTR_UDP, &udp, sizeof (udp));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3039
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3040
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3041
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3042
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3043
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3044
flow_propval2action_setsctp(char **propvals, int nval, struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3045
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3046
	struct ovs_key_sctp sctp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3047
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3048
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3049
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3050
	err = flow_propval2action_settransport(propvals, nval, &sctp.sctp_src,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3051
	    &sctp.sctp_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3052
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3053
		return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3054
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3055
	start_ofs = nl_msg_start_nested(action, OVS_ACTION_ATTR_SET);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3056
	nl_msg_put_unspec(action, OVS_KEY_ATTR_SCTP, &sctp, sizeof (sctp));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3057
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3058
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3059
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3060
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3061
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3062
set_addr(char *pval, uint32_t *addrp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3063
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3064
	struct addrinfo		hints;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3065
	struct addrinfo		*ai;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3066
	struct addrinfo		*next_ai;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3067
	void			*ptr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3068
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3069
	(void) memset(&hints, 0, sizeof (hints));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3070
	hints.ai_family = AF_UNSPEC;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3071
	if (getaddrinfo(pval, NULL, &hints, &ai) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3072
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3073
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3074
	/* Check if hostname resolves to multiple addresses */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3075
	for (next_ai = ai->ai_next; next_ai != NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3076
	    next_ai = next_ai->ai_next) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3077
		if (next_ai->ai_addrlen != ai->ai_addrlen ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3078
		    bcmp(next_ai->ai_addr, ai->ai_addr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3079
		    ai->ai_addrlen) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3080
			/* maps to more than one address */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3081
			freeaddrinfo(ai);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3082
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3083
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3084
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3085
	if (ai->ai_family != AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3086
		freeaddrinfo(ai);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3087
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3088
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3089
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3090
	ptr = ((uint8_t *)ai->ai_addr) +
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3091
	    offsetof(struct sockaddr_in, sin_addr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3092
	memcpy(addrp, ptr, sizeof (struct in_addr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3093
	freeaddrinfo(ai);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3094
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3095
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3096
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3097
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3098
flow_propval2action_settnl(char **propvals, int nval, struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3099
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3100
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3101
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3102
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3103
	struct flow_tnl tnl;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3104
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3105
	boolean_t id_set, src_set, dst_set, tos_set, ttl_set;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3106
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3107
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3108
	id_set = src_set = dst_set = tos_set = ttl_set = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3109
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3110
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3111
	 * The property value is in the format of "src:xxx" "dst:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3112
	 * "tun_id:0x%x" "tos:0x%x" "hoplimit:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3113
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3114
	tnl.ip_tos = 0xff;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3115
	for (i = 0; i < nval; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3116
		bcopy(propvals[i], pval, strlen(propvals[i]) + 1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3117
		if ((sep = strchr(pval, ':')) == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3118
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3119
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3120
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3121
		if (strcmp(pval, "tun_id") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3122
			if (id_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3123
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3124
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3125
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3126
			value = strtoull(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3127
			if (errno != 0 || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3128
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3129
			tnl.tun_id = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3130
			id_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3131
		} else if (strcmp(pval, "src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3132
			if (src_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3133
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3134
			err = set_addr(sep, &tnl.ip_src);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3135
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3136
				return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3137
			src_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3138
		} else if (strcmp(pval, "dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3139
			if (dst_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3140
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3141
			err = set_addr(sep, &tnl.ip_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3142
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3143
				return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3144
			dst_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3145
		} else if (strcmp(pval, "tos") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3146
			if (tos_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3147
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3148
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3149
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3150
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3151
			if (errno != 0 || value > 0xff || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3152
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3153
			tnl.ip_tos = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3154
			tos_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3155
		} else if (strcmp(pval, "hoplimit") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3156
			if (ttl_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3157
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3158
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3159
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3160
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3161
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3162
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3163
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3164
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3165
			tnl.ip_ttl = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3166
			ttl_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3167
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3168
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3169
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3170
	start_ofs = nl_msg_start_nested(action, OVS_ACTION_ATTR_SET);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3171
	nl_msg_put_be64(action, OVS_TUNNEL_KEY_ATTR_ID, (uint64_t)tnl.tun_id);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3172
	nl_msg_put_be32(action, OVS_TUNNEL_KEY_ATTR_IPV4_SRC, tnl.ip_src);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3173
	nl_msg_put_be32(action, OVS_TUNNEL_KEY_ATTR_IPV4_DST, tnl.ip_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3174
	nl_msg_put_u8(action, OVS_TUNNEL_KEY_ATTR_TOS, tnl.ip_tos);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3175
	nl_msg_put_u8(action, OVS_TUNNEL_KEY_ATTR_TTL, tnl.ip_ttl);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3176
	nl_msg_put_flag(action, OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3177
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3178
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3179
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3180
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3181
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3182
solaris_flowinfo2actionmap(const char *key, dlmgr_DLValue_t *val,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3183
    void *arg)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3184
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3185
	struct ofpbuf *action = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3186
	char **propvals, *buf = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3187
	int valcnt, err = 0, i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3188
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3189
	buf = malloc((sizeof (char *) +
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3190
	    DLADM_PROP_VAL_MAX) * DLADM_MAX_PROP_VALCNT);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3191
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3192
	propvals = (char **)(void *)buf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3193
	for (i = 0; i < DLADM_MAX_PROP_VALCNT; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3194
		propvals[i] = buf + sizeof (char *) * DLADM_MAX_PROP_VALCNT +
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3195
		    i * DLADM_PROP_VAL_MAX;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3196
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3197
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3198
	switch (val->ddlv_type) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3199
	case DDLVT_STRING:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3200
		if (val->ddlv_sval == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3201
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3202
		if (strlen(val->ddlv_sval) == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3203
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3204
		valcnt = 1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3205
		memcpy(propvals[0], val->ddlv_sval, DLADM_PROP_VAL_MAX);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3206
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3207
	case DDLVT_STRINGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3208
		if (val->ddlv_slist_count == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3209
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3210
		valcnt = val->ddlv_slist_count;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3211
		if (valcnt == 1 && strlen(val->ddlv_slist[0]) == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3212
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3213
		for (i = 0; i < val->ddlv_slist_count; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3214
			memcpy(propvals[i], val->ddlv_slist[i],
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3215
			    DLADM_PROP_VAL_MAX);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3216
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3217
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3218
	case DDLVT_ULONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3219
		if (val->ddlv_ulval == NULL || *val->ddlv_ulval == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3220
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3221
		valcnt = 1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3222
		(void) snprintf(propvals[0], DLADM_PROP_VAL_MAX, "%llu",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3223
		    *val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3224
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3225
	case DDLVT_BOOLEAN:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3226
	case DDLVT_BOOLEANS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3227
	case DDLVT_LONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3228
	case DDLVT_LONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3229
	case DDLVT_ULONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3230
	case DDLVT_DICTIONARY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3231
	case DDLVT_DICTIONARYS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3232
	default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3233
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3234
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3235
	dpif_log(0, "solaris_flowinfo2actionmap %s:%d %s", key, valcnt,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3236
	    propvals[0]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3237
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3238
	if (strcmp(key, "outports") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3239
		err = flow_propval2action_drop(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3240
		if (err == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3241
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3242
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3243
		err = flow_propval2action_outports(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3244
	} else if (strcmp(key, "max-bw") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3245
		err = flow_propval2action_setpri(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3246
	} else if (strcmp(key, "controller") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3247
		err = flow_propval2action_controller(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3248
	} else if (strcmp(key, "vlan-tag") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3249
		err = flow_propval2action_pushvlan(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3250
	} else if (strcmp(key, "vlan-strip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3251
		err = flow_propval2action_popvlan(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3252
	} else if (strcmp(key, "set-ether") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3253
		err = flow_propval2action_setether(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3254
	} else if (strcmp(key, "set-ipv4") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3255
		err = flow_propval2action_setipv4(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3256
	} else if (strcmp(key, "set-ipv6") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3257
		err = flow_propval2action_setipv6(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3258
	} else if (strcmp(key, "set-tcp") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3259
		err = flow_propval2action_settcp(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3260
	} else if (strcmp(key, "set-udp") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3261
		err = flow_propval2action_setudp(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3262
	} else if (strcmp(key, "set-sctp") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3263
		err = flow_propval2action_setsctp(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3264
	} else if (strcmp(key, "set-tunnel") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3265
		err = flow_propval2action_settnl(propvals, valcnt, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3266
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3267
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3268
	dlmgr_DLValue_free(val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3269
	free(buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3270
	return (err == 0 ? RCE_OK : -1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3271
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3272
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3273
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3274
solaris_flowinfo2action(dlmgr__rad_dict_string_DLValue_t *flowinfo,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3275
    struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3276
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3277
	dlmgr__rad_dict_string_DLValue_t *fdict;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3278
	dlmgr_DLValue_t  *flist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3279
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3280
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3281
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3282
	status = dlmgr__rad_dict_string_DLValue_get(flowinfo, "properties",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3283
	    &flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3284
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3285
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3286
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3287
	fdict = flist->ddlv_dval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3288
	status = dlmgr__rad_dict_string_DLValue_map(fdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3289
	    solaris_flowinfo2actionmap, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3290
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3291
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3292
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3293
	dlmgr_DLValue_free(flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3294
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3295
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3296
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3297
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3298
solaris_get_flowaction(const char *flowname, struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3299
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3300
	dlmgr__rad_dict_string_DLValue_t *flowinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3301
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3302
	rc_instance_t		*flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3303
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3304
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3305
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3306
	status = dlmgr_Flow__rad_lookup(rad_conn, B_TRUE, &flow, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3307
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3308
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3309
		return (ENODEV);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3310
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3311
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3312
	status = dlmgr_Flow_getInfo(flow, NULL, 0, &flowinfo, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3313
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3314
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3315
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3316
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3317
			/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3318
			 * XXX For now, log DDLSTATUS_NOT_FOUND as debug until
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3319
			 * we can determine how to handle the RAD caching
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3320
			 * issue.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3321
			 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3322
			dpif_log(err == DDLSTATUS_NOT_FOUND ? 0 : err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3323
			    "failed Flow_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3324
			    flowname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3325
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3326
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3327
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3328
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3329
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3330
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3331
	if (err == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3332
		err = solaris_flowinfo2action(flowinfo, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3333
		dlmgr__rad_dict_string_DLValue_free(flowinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3334
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3335
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3336
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3337
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3338
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3339
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3340
i_solaris_get_flowstats(rc_instance_t *flow, uint64_t *npackets,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3341
    uint64_t *nbytes, uint64_t *lastused)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3342
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3343
	dlmgr__rad_dict_string_DLValue_t *flowstat = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3344
	dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3345
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3346
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3347
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3348
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3349
	status = dlmgr_Flow_getStatistics(flow, NULL, 0, &flowstat, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3350
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3351
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3352
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3353
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3354
			dpif_log(err, "failed Flow_getStatistics(): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3355
			    derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3356
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3357
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3358
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3359
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3360
#if _TBD_
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3361
	uint16_t tcp_flags; /* bitmaps of tcp_flags */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3362
#endif
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3363
	status = dlmgr__rad_dict_string_DLValue_get(flowstat, "ipackets",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3364
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3365
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3366
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3367
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3368
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3369
	*npackets = *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3370
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3371
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3372
	status = dlmgr__rad_dict_string_DLValue_get(flowstat, "opackets",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3373
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3374
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3375
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3376
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3377
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3378
	*npackets += *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3379
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3380
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3381
	status = dlmgr__rad_dict_string_DLValue_get(flowstat, "ibytes",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3382
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3383
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3384
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3385
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3386
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3387
	*nbytes = *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3388
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3389
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3390
	status = dlmgr__rad_dict_string_DLValue_get(flowstat, "obytes",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3391
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3392
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3393
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3394
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3395
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3396
	*nbytes += *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3397
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3398
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3399
	status = dlmgr__rad_dict_string_DLValue_get(flowstat, "lastused",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3400
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3401
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3402
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3403
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3404
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3405
	*lastused = *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3406
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3407
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3408
	dlmgr__rad_dict_string_DLValue_free(flowstat);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3409
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3410
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3411
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3412
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3413
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3414
solaris_get_flowstats(const char *flowname, uint64_t *npackets,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3415
    uint64_t *nbytes, uint64_t *lastused)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3416
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3417
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3418
	rc_instance_t *flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3419
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3420
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3421
	status = dlmgr_Flow__rad_lookup(rad_conn, B_TRUE, &flow, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3422
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3423
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3424
		err = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3425
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3426
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3427
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3428
	err = i_solaris_get_flowstats(flow, npackets, nbytes, lastused);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3429
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3430
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3431
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3432
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3433
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3434
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3435
kstat_handle_init(kstat2_handle_t *khandlep)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3436
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3437
	kstat2_status_t	stat;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3438
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3439
	stat = kstat2_open(khandlep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3440
	return (stat != KSTAT2_S_OK ? B_FALSE: B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3441
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3442
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3443
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3444
kstat_handle_update(kstat2_handle_t khandle)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3445
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3446
	kstat2_status_t	stat;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3447
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3448
	stat = kstat2_update(khandle);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3449
	return (stat != KSTAT2_S_OK ? B_FALSE: B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3450
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3451
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3452
void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3453
kstat_handle_close(kstat2_handle_t *khandlep)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3454
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3455
	kstat2_close(khandlep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3456
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3457
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3458
uint64_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3459
get_nvvt_int(kstat2_map_t map, char *name)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3460
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3461
	kstat2_status_t stat;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3462
	kstat2_nv_t val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3463
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3464
	stat = kstat2_map_get(map, name, &val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3465
	if (stat != KSTAT2_S_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3466
		(void) printf("can't get value: %s\n",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3467
		    kstat2_status_string(stat));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3468
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3469
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3470
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3471
	if (val->type != KSTAT2_NVVT_INT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3472
		(void) printf("%s is not KSTAT2_NVVT_INT type\n", name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3473
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3474
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3475
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3476
	return (val->kstat2_integer);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3477
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3478
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3479
void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3480
solaris_port_walk(void *arg, void (*fn)(void *, const char *, char *,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3481
    odp_port_t))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3482
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3483
	adr_name_t	**anamearr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3484
	int		anamecnt = 0, i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3485
	rc_err_t	rerr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3486
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3487
	rerr = dlmgr_Datalink__rad_list(rad_conn, B_FALSE, NS_GLOB, &anamearr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3488
	    &anamecnt, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3489
	if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3490
		return;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3491
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3492
	if (anamecnt == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3493
		free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3494
		return;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3495
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3496
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3497
	for (i = 0; i < anamecnt; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3498
		dlmgr_DLDict_t		**dlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3499
		dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3500
		const char		*props[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3501
		const char		*fields[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3502
		int			ndlist = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3503
		rc_instance_t		*rip = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3504
		dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3505
		rc_err_t 		rerr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3506
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3507
		rerr = rc_lookup(rad_conn, anamearr[i], NULL, B_FALSE, &rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3508
		if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3509
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3510
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3511
		props[0] = "ofport";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3512
		fields[0] = "current";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3513
		rerr = dlmgr_Datalink_getProperties(rip, props, 1, fields, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3514
		    &dlist, &ndlist, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3515
		rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3516
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3517
			if (rerr == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3518
				dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3519
				    "failed Datalink_getProperties(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3520
				    adr_name_key(anamearr[i], "name"),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3521
				    props[0], derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3522
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3523
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3524
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3525
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3526
		rerr = dlmgr__rad_dict_string_DLValue_get((*dlist)->ddld_map,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3527
		    "current", &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3528
		if (rerr != RCE_OK || dlval->ddlv_sval == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3529
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3530
			dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3531
			dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3532
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3533
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3534
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3535
		if (dlval->ddlv_sval != NULL && dlval->ddlv_sval[0] != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3536
			fn(arg, adr_name_key(anamearr[i], "name"),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3537
			    "system", atoi(dlval->ddlv_sval));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3538
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3539
		dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3540
		dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3541
		dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3542
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3543
	for (i = 0; i < anamecnt; i++)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3544
		adr_name_rele(anamearr[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3545
	free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3546
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3547
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3548
uint64_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3549
solaris_flow_walk(void *arg, struct ofpbuf *action, boolean_t no_default,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3550
    void (*fn)(void *, const char *, boolean_t, struct flow *, struct flow *,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3551
    struct ofpbuf *, uint64_t, uint64_t, uint64_t))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3552
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3553
	adr_name_t	**anamearr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3554
	int		anamecnt = 0, i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3555
	rc_err_t	rerr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3556
	int		err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3557
	uint64_t	n_flows = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3558
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3559
	rerr = dlmgr_Flow__rad_list(rad_conn, B_FALSE, NS_GLOB, &anamearr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3560
	    &anamecnt, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3561
	if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3562
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3563
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3564
	if (anamecnt == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3565
		free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3566
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3567
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3568
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3569
	for (i = 0; i < anamecnt; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3570
		dlmgr__rad_dict_string_DLValue_t *flowinfo;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3571
		char			linkname[MAXLINKNAMELEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3572
		rc_instance_t		*rip = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3573
		dlmgr_DLDict_t		**dlist;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3574
		dlmgr_DLValue_t		*dlval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3575
		const char		*props[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3576
		const char		*fields[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3577
		struct flow		f, m;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3578
		int			ndlist = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3579
		uint64_t		npackets, nbytes, lastused;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3580
		boolean_t		is_default;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3581
		dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3582
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3583
		flowinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3584
		dlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3585
		dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3586
		is_default = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3587
		if (strstr(adr_name_key(anamearr[i], "name"), "defflow") !=
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3588
		    NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3589
			if (no_default)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3590
				continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3591
			else
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3592
				is_default = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3593
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3594
		rerr = rc_lookup(rad_conn, anamearr[i], NULL, B_FALSE, &rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3595
		if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3596
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3597
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3598
		if ((err = i_solaris_get_flowstats(rip, &npackets, &nbytes,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3599
		    &lastused)) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3600
			dpif_log(err, "solaris_flow_walk get_flowstats "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3601
			    "failed for %s: %d", adr_name_key(anamearr[i],
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3602
			    "name"), err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3603
			rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3604
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3605
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3606
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3607
		rerr = dlmgr_Flow_getInfo(rip, NULL, 0, &flowinfo, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3608
		rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3609
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3610
			err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3611
			if (rerr == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3612
				err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3613
				/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3614
				 * XXX For now, log DDLSTATUS_NOT_FOUND as
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3615
				 * debug until we can determine how to handle
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3616
				 * the RAD caching issue.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3617
				 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3618
				dpif_log(err == DDLSTATUS_NOT_FOUND ? 0 : err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3619
				    "failed Flow_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3620
				    adr_name_key(anamearr[i], "name"),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3621
				    derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3622
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3623
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3624
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3625
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3626
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3627
		/* See whether this flow is created over of enabled link */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3628
		err = solaris_flowinfo2linkname(flowinfo, linkname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3629
		    MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3630
		if (err != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3631
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3632
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3633
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3634
		rerr = dlmgr_Datalink__rad_lookup(rad_conn, B_TRUE, &rip,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3635
		    1, "name", linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3636
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3637
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3638
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3639
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3640
		props[0] = "openvswitch";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3641
		fields[0] = "current";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3642
		rerr = dlmgr_Datalink_getProperties(rip, props, 1, fields, 1,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3643
		    &dlist, &ndlist, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3644
		rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3645
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3646
			err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3647
			if (rerr == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3648
				err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3649
				dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3650
				    "failed Datalink_getProperties(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3651
				    linkname, props[0], derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3652
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3653
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3654
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3655
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3656
		rerr = dlmgr__rad_dict_string_DLValue_get((*dlist)->ddld_map,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3657
		    "current", &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3658
		if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3659
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3660
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3661
		if (!dlval->ddlv_bval)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3662
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3663
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3664
		err = solaris_flowinfo2flow(flowinfo, &f, &m);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3665
		if (err != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3666
			dpif_log(err, "solaris_flow_walk flowinfo2flow "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3667
			    "failed for %s: %d", adr_name_key(anamearr[i],
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3668
			    "name"), err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3669
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3670
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3671
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3672
		if (action != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3673
			err = solaris_flowinfo2action(flowinfo, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3674
			if (err != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3675
				dpif_log(err, "solaris_flow_walk "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3676
				    "flowinfo2flow failed for %s: %d",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3677
				    adr_name_key(anamearr[i], "name"), err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3678
				goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3679
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3680
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3681
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3682
		if (fn != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3683
			fn(arg, adr_name_key(anamearr[i], "name"), is_default,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3684
			    &f, &m, action, npackets, nbytes, lastused);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3685
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3686
		n_flows++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3687
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3688
		dlmgr__rad_dict_string_DLValue_free(flowinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3689
		dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3690
		dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3691
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3692
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3693
	for (i = 0; i < anamecnt; i++)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3694
		adr_name_rele(anamearr[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3695
	free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3696
	return (n_flows);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3697
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3698
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3699
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3700
solaris_dladm_status2error(dladm_status_t status)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3701
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3702
	int error;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3703
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3704
	if (status == DLADM_STATUS_NOMEM) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3705
		error = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3706
	} else if (status == DLADM_STATUS_DENIED) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3707
		error = EPERM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3708
	} else if (status == DLADM_STATUS_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3709
		error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3710
	} else if (status == DLADM_STATUS_IOERR) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3711
		error = EIO;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3712
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3713
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3714
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3715
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3716
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3717
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3718
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3719
solaris_is_uplink_class(const char *class)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3720
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3721
	return (strcmp("phys", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3722
	    strcmp("aggr", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3723
	    strcmp("etherstub", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3724
	    strcmp("vxlan", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3725
	    strcmp("simnet", class) == 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3726
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3727
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3728
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3729
 * This is a copy of dlparse_zonelinkname() function in libinetutil. libinetutil
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3730
 * is not a public interface, therefore we make a copy here.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3731
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3732
 * Given a linkname that can be specified using a zonename prefix retrieve
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3733
 * the optional linkname and/or zone ID value. If no zonename prefix was
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3734
 * specified we set the optional linkname and set optional zone ID return
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3735
 * value to ALL_ZONES.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3736
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3737
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3738
solaris_dlparse_zonelinkname(const char *name, char *link_name,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3739
    zoneid_t *zoneidp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3740
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3741
	char buffer[MAXLINKNAMESPECIFIER];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3742
	char *search = "/";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3743
	char *zonetoken;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3744
	char *linktoken;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3745
	char *last;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3746
	size_t namelen;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3747
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3748
	if (link_name != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3749
		link_name[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3750
	if (zoneidp != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3751
		*zoneidp = ALL_ZONES;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3752
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3753
	if ((namelen = strlcpy(buffer, name, sizeof (buffer))) >=
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3754
	    sizeof (buffer))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3755
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3756
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3757
	if ((zonetoken = strtok_r(buffer, search, &last)) == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3758
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3759
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3760
	/* If there are no other strings, return given name as linkname */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3761
	if ((linktoken = strtok_r(NULL, search, &last)) == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3762
		if (namelen >= MAXLINKNAMELEN)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3763
			return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3764
		if (link_name != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3765
			(void) strlcpy(link_name, name, MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3766
		return (_B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3767
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3768
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3769
	/* First token is the zonename. Check zone and link lengths */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3770
	if (strlen(zonetoken) >= ZONENAME_MAX || strlen(linktoken) >=
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3771
	    MAXLINKNAMELEN)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3772
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3773
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3774
	 * If there are more '/' separated strings in the input
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3775
	 * name  then we return failure. We only support a single
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3776
	 * zone prefix or a devnet directory (f.e. net/bge0).
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3777
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3778
	if (strtok_r(NULL, search, &last) != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3779
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3780
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3781
	if (link_name != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3782
		(void) strlcpy(link_name, linktoken, MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3783
	if (zoneidp != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3784
		if ((*zoneidp = getzoneidbyname(zonetoken)) < MIN_ZONEID)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3785
			return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3786
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3787
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3788
	return (_B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3789
}