components/openvswitch/files/lib/util-solaris.c
author Cathy Zhou <Cathy.Zhou@Oracle.COM>
Thu, 19 Jan 2017 16:57:09 -0800
changeset 7590 5461fab14904
parent 7237 c378a893371d
permissions -rw-r--r--
25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part) 25292405 Open vSwitch latency regression
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
/*
7590
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
    23
 * Copyright (c) 2015, 2017, 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>
7590
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
    50
#include <net/if_arp.h>
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    51
#include <inet/arp.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    52
#include <sys/socket.h>
7590
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
    53
#include <sys/ethernet.h>
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    54
#include <netdb.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    55
#include <rad/radclient.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    56
#include <rad/client/1/dlmgr.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    57
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    58
#undef	IP_VERSION
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    59
#include "netlink-protocol.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    60
#include "netlink.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    61
#include "flow.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    62
#include "packets.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    63
#include "util-solaris.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    64
#include "util.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    65
#include "dpif-solaris.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    66
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
    67
#ifndef	MAX_OF_ACTIONS_SIZE
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
    68
#define	MAX_OF_ACTIONS_SIZE	4096
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
    69
#endif
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
    70
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    71
static rc_conn_t *rad_conn = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    72
static boolean_t b_true = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    73
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    74
typedef struct {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    75
	uint_t		ifsp_ppa;	/* Physical Point of Attachment */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    76
	uint_t		ifsp_lun;	/* Logical Unit number */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    77
	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
    78
	char		ifsp_devnm[LIFNAMSIZ]; /* only the device name */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    79
} ifspec_t;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    80
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
    81
typedef struct {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
    82
	uint32_t ofp_min;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
    83
	uint32_t ofp_max;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
    84
} ofport_range_t;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
    85
7590
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
    86
static ether_addr_t	bcast_addr = {
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
    87
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
    88
};
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
    89
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    90
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    91
extract_uint(const char *valstr, uint_t *val)
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
	char		*ep;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    94
	unsigned long	ul;
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
	errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    97
	ul = strtoul(valstr, &ep, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    98
	if (errno != 0 || *ep != '\0' || ul > UINT_MAX)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    99
		return (-1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   100
	*val = (uint_t)ul;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   101
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   102
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   103
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   104
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   105
 * 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
   106
 * to a uint_t.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   107
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   108
 * 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
   109
 * necessary.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   110
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   111
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   112
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
   113
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   114
	const char	*ep = &bp[bpsize - 1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   115
	const char	*tp;
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
	/* Lun must be all digits */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   118
	for (tp = ep; tp > bp && isdigit(*tp); tp--)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   119
		/* Null body */;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   120
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   121
	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
   122
		errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   123
		return (-1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   124
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   125
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   126
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   127
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
 * 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
   130
 * to a uint_t.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   131
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   132
 * 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
   133
 * necessary.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   134
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   135
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   136
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
   137
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   138
	const char	*ep = &bp[bpsize - 1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   139
	const char	*tp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   140
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   141
	for (tp = ep; tp >= bp && isdigit(*tp); tp--)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   142
		/* Null body */;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   143
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   144
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   145
	 * 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
   146
	 * 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
   147
	 * zero, return error.
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
	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
   150
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   151
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   152
	if (extract_uint(tp + 1, ppa) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   153
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   154
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   155
	/* 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
   156
	if (*ppa > UINT_MAX - 1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   157
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   158
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   159
fail:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   160
	errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   161
	return (-1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   162
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   163
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   164
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   165
 * 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
   166
 * 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
   167
 * the driver name will be copied to `driver'.
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
 * 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
   170
 * 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
   171
 * linkname.
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
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   174
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
   175
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   176
	char	*tp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   177
	char    linkname[MAXLINKNAMELEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   178
	size_t	len;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   179
	uint_t	lppa;
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
	if (linknamep == NULL || linknamep[0] == '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   182
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   183
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   184
	len = strlcpy(linkname, linknamep, MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   185
	if (len >= MAXLINKNAMELEN)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   186
		goto fail;
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
	/* Get PPA */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   189
	if (getppa(linkname, len, &lppa) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   190
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   191
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   192
	/* 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
   193
	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
   194
		*tp = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   195
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   196
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   197
	 * 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
   198
	 * 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
   199
	 * ('_'), hyphen ('-'), and period ('.'). The first character
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   200
	 * 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
   201
	 * character.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   202
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   203
	if (!isalpha(linkname[0]))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   204
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   205
	for (tp = linkname + 1; *tp != '\0'; tp++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   206
		if (!isalnum(*tp) && *tp != '_' && *tp != '-' && *tp != '.')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   207
			goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   208
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   209
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   210
	if (driver != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   211
		(void) strlcpy(driver, linkname, dsize);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   212
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   213
	if (ppa != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   214
		*ppa = lppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   215
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   216
	return (_B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   217
fail:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   218
	errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   219
	return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   220
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   221
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
 * 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
   224
 *	- 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
   225
 *	- 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
   226
 *		for e.g. bge0:34
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   227
 * 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
   228
 * ifspec_t.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   229
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   230
 * 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
   231
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   232
static boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   233
ifparse_ifspec(const char *ifname, ifspec_t *ifsp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   234
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   235
	char	*lp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   236
	char	ifnamecp[LIFNAMSIZ];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   237
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   238
	if (ifname == NULL || ifname[0] == '\0' ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   239
	    strlcpy(ifnamecp, ifname, LIFNAMSIZ) >= LIFNAMSIZ) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   240
		errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   241
		return (_B_FALSE);
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
	ifsp->ifsp_lunvalid = _B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   245
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   246
	/* Any logical units? */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   247
	lp = strchr(ifnamecp, ':');
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   248
	if (lp != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   249
		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
   250
			return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   251
		*lp = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   252
		ifsp->ifsp_lunvalid = _B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   253
	}
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
	return (dlparse_drvppa(ifnamecp, ifsp->ifsp_devnm,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   256
	    sizeof (ifsp->ifsp_devnm), &ifsp->ifsp_ppa));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   257
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   258
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   259
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   260
 * Issues the ioctl SIOCSLIFNAME to kernel.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   261
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   262
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   263
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
   264
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   265
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   266
	int		status = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   267
	ifspec_t	ifsp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   268
	boolean_t	valid_if;
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
	bzero(&lifr, sizeof (lifr));
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
	/* We should have already validated the interface name. */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   273
	valid_if = ifparse_ifspec(ifname, &ifsp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   274
	ovs_assert(valid_if);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   275
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   276
	lifr.lifr_ppa = ifsp.ifsp_ppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   277
	lifr.lifr_flags = flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   278
	(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
   279
	if (ioctl(fd, SIOCSLIFNAME, &lifr) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   280
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   281
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   282
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   283
	return (status);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   284
}
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
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   287
 * 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
   288
 * Returns: Result from ioctl().
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   291
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
   292
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   293
	struct strioctl ioc;
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
	(void) memset(&ioc, 0, sizeof (ioc));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   296
	ioc.ic_cmd = cmd;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   297
	ioc.ic_timout = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   298
	ioc.ic_len = buflen;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   299
	ioc.ic_dp = buf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   300
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   301
	return (ioctl(s, I_STR, (char *)&ioc));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   302
}
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
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   305
 * 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
   306
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   307
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   308
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
   309
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   310
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   311
	ifspec_t	ifsp;
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
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   314
	(void) ifparse_ifspec(ifname, &ifsp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   315
	lifr.lifr_ppa = ifsp.ifsp_ppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   316
	lifr.lifr_flags = flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   317
	(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
   318
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   319
	 * 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
   320
	 * 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
   321
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   322
	if (strioctl(fd, SIOCSLIFNAME, (char *)&lifr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   323
	    sizeof (lifr)) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   324
		return (errno);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   325
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   326
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   329
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   330
 * 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
   331
 * 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
   332
 * 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
   333
 * the bottom of the stream for tunneling interfaces.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   334
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   335
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   336
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
   337
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   338
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   339
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   340
	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
   341
		return (errno);
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
	 * 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
   344
	 * 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
   345
	 * 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
   346
	 * 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
   347
	 * 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
   348
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   349
	while (ioctl(*fd, I_POP, 0) != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   350
		;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   351
	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
   352
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   353
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   354
	err = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   355
	(void) close(*fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   356
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   357
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   358
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   359
static char *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   360
solaris_proto2str(uint8_t protocol)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   361
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   362
	if (protocol == IPPROTO_TCP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   363
		return ("tcp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   364
	if (protocol == IPPROTO_UDP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   365
		return ("udp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   366
	if (protocol == IPPROTO_SCTP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   367
		return ("sctp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   368
	if (protocol == IPPROTO_ICMPV6)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   369
		return ("icmpv6");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   370
	if (protocol == IPPROTO_ICMP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   371
		return ("icmp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   372
	else
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   373
		return ("");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   374
}
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
static uint8_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   377
solaris_str2proto(const char *protostr)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   378
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   379
	if (strcasecmp(protostr, "tcp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   380
		return (IPPROTO_TCP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   381
	else if (strcasecmp(protostr, "udp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   382
		return (IPPROTO_UDP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   383
	else if (strcasecmp(protostr, "sctp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   384
		return (IPPROTO_SCTP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   385
	else if (strcasecmp(protostr, "icmpv6") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   386
		return (IPPROTO_ICMPV6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   387
	else if (strcasecmp(protostr, "icmp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   388
		return (IPPROTO_ICMP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   389
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   390
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   391
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
 * 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
   394
 * in the buffer pointed to by `flags'.
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   397
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
   398
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   399
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   400
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   401
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   402
	(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
   403
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   404
	if (ioctl(sock, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   405
		return (errno);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   406
	*flags = lifr.lifr_flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   407
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   408
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   411
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   412
 * 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
   413
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   414
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   415
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
   416
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   417
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   418
	int		error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   419
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   420
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   421
	(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
   422
	if (ioctl(sock, SIOCGLIFFLAGS, (caddr_t)&lifr) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   423
		error = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   424
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   425
	if (error == 0 && flags != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   426
		*flags = lifr.lifr_flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   427
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   428
	return (error);
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   432
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
   433
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   434
	int		ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   435
	int		arp_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   436
	int		mux_fd = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   437
	int		muxid_fd = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   438
	char		*udp_dev_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   439
	uint64_t	ifflags = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   440
	boolean_t	changed_arp_muxid = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   441
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   442
	int		ret = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   443
	boolean_t	v6 = (af == AF_INET6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   444
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   445
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   446
	 * 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
   447
	 * the same now for PUNLINK also.
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
	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
   450
	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
   451
		ret = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   452
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   453
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   454
	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
   455
	if (ret != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   456
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   457
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   458
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   459
	(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
   460
	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
   461
		ret = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   462
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   463
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   464
	arp_muxid = lifr.lifr_arp_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   465
	ip_muxid = lifr.lifr_ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   466
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   467
	ret = solaris_get_flags(sock, ifname, &ifflags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   468
	if (ret != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   469
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   470
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   471
	 * 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
   472
	 * 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
   473
	 * 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
   474
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   475
	if (arp_muxid != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   476
		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
   477
			if ((errno == EINVAL) &&
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   478
			    (ifflags & (IFF_NOARP | IFF_IPV6))) {
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
				 * Some plumbing utilities set the muxid to
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   481
				 * -1 or some invalid value to signify that
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   482
				 * 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
   483
				 * before trying to unplumb the IP stream.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   484
				 * 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
   485
				 * 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
   486
				 * for consistency of IP-ARP streams.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   487
				 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   488
				lifr.lifr_arp_muxid = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   489
				(void) ioctl(muxid_fd, SIOCSLIFMUXID,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   490
				    (caddr_t)&lifr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   491
				changed_arp_muxid = B_TRUE;
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
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   494
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   495
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   496
	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
   497
		if (changed_arp_muxid) {
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
			 * Some error occurred, and we need to restore
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   500
			 * everything back to what it was.
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
			ret = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   503
			lifr.lifr_arp_muxid = arp_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   504
			lifr.lifr_ip_muxid = ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   505
			(void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   506
		}
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
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   509
	if (muxid_fd != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   510
		(void) close(muxid_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   511
	if (mux_fd != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   512
		(void) close(mux_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   513
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   514
	return (ret);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   515
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   516
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
 * Plumbs the interface `ifname'.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   519
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   520
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   521
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
   522
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   523
	int		ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   524
	int		mux_fd = -1, ip_fd, arp_fd;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   525
	char		*udp_dev_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   526
	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
   527
	uint64_t	ifflags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   528
	uint_t		dlpi_flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   529
	int		status = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   530
	const char	*linkname;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   531
	int		ret;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   532
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   533
	if (solaris_if_enabled(sock, ifname, NULL) == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   534
		status = EEXIST;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   535
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   536
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   537
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   538
	dlpi_flags = DLPI_NOATTACH;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   539
	linkname = ifname;
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
	 * 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
   543
	 * itself for DLPI style-2 devices.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   544
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   545
	ret = dlpi_open(linkname, &dh_ip, dlpi_flags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   546
	if (ret != DLPI_SUCCESS) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   547
		ret = (ret == DL_SYSERR) ? errno : EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   548
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   549
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   550
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   551
	ip_fd = dlpi_fd(dh_ip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   552
	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
   553
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   554
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   555
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   556
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   557
	if (af == AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   558
		ifflags = IFF_IPV4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   559
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   560
		ifflags = IFF_IPV6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   561
		ifflags |= IFF_NOLINKLOCAL;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   564
	status = slifname(ifname, ifflags, ip_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   565
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   566
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   567
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   568
	/* 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
   569
	status = solaris_get_flags(sock, ifname, &ifflags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   570
	if (status != 0)
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
	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
   574
	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
   575
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   576
		goto done;
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
	/* Check if arp is not needed */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   579
	if (ifflags & (IFF_NOARP|IFF_IPV6)) {
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
		 * 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
   582
		 * without tearing down the stream.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   583
		 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   584
		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
   585
			status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   586
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   587
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   588
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   589
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   590
	 * 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
   591
	 * from the interface to ARP.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   592
	 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   593
	 * 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
   594
	 * itself for DLPI style-2 devices.
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
	ret = dlpi_open(linkname, &dh_arp, dlpi_flags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   597
	if (ret != DLPI_SUCCESS) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   598
		ret = (ret == DL_SYSERR) ? errno : EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   599
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   600
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   601
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   602
	arp_fd = dlpi_fd(dh_arp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   603
	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
   604
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   605
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   606
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   607
	status = slifname_arp(ifname, ifflags, arp_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   608
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   609
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   610
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   611
	 * 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
   612
	 * without tearing down the stream.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   613
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   614
	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
   615
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   616
		goto done;
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
	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
   620
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   621
		(void) ioctl(mux_fd, I_PUNLINK, ip_muxid);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   622
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   623
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   624
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   625
	dlpi_close(dh_ip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   626
	if (dh_arp != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   627
		dlpi_close(dh_arp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   628
	if (mux_fd != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   629
		(void) close(mux_fd);
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
	return (status);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   632
}
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   635
solaris_init_rad()
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   636
{
5509
919ef8624a61 22822032 OVS should use rc_connect_uri() instead of rc_connect_unix()
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5505
diff changeset
   637
	rc_uri_t *rc_uri;
919ef8624a61 22822032 OVS should use rc_connect_uri() instead of rc_connect_unix()
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5505
diff changeset
   638
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   639
	if (rad_conn == NULL) {
5509
919ef8624a61 22822032 OVS should use rc_connect_uri() instead of rc_connect_unix()
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5505
diff changeset
   640
		if ((rc_uri = rc_alloc_uri("unix://", RCS_UNIX)) == NULL)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   641
			return (ENODEV); /* Not sure what to return */
5509
919ef8624a61 22822032 OVS should use rc_connect_uri() instead of rc_connect_unix()
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5505
diff changeset
   642
919ef8624a61 22822032 OVS should use rc_connect_uri() instead of rc_connect_unix()
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5505
diff changeset
   643
		rad_conn = rc_connect_uri(rc_uri, NULL);
919ef8624a61 22822032 OVS should use rc_connect_uri() instead of rc_connect_unix()
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5505
diff changeset
   644
		rc_free_uri(rc_uri);
919ef8624a61 22822032 OVS should use rc_connect_uri() instead of rc_connect_unix()
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5505
diff changeset
   645
		if (rad_conn == NULL)
919ef8624a61 22822032 OVS should use rc_connect_uri() instead of rc_connect_unix()
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5505
diff changeset
   646
			return (ENODEV); /* Not sure what to return */
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
   647
		}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
   648
		return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   649
}
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
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   652
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
   653
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   654
	if (strcmp(key, "class") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   655
		(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
   656
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   657
	return (RCE_OK);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   658
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   659
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   660
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   661
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
   662
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   663
	/* 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
   664
	if (strcmp(key, "over") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   665
		(void) strlcpy((char *)arg, dlval->ddlv_slist[0],
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   666
		    DLADM_STRSIZE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   667
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   668
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   669
	return (RCE_OK);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   670
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   671
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   672
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   673
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
   674
    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
   675
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   676
	dlmgr__rad_dict_string_DLValue_t *linkinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   677
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   678
	rc_instance_t		*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   679
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   680
	char			propstr[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   681
	int			error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   682
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   683
	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
   684
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   685
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   686
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   687
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   690
	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
   691
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   692
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   693
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   694
			    "failed Datalink_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   695
			    netdev_name, derrp->dde_errmsg);
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
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   698
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   701
	propstr[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   702
	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
   703
	    propstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   704
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   705
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   706
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   707
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   708
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   709
	memcpy(info_val, propstr, info_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   710
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   711
	dlmgr__rad_dict_string_DLValue_free(linkinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   712
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   713
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   714
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   715
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   716
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   717
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   718
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
   719
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   720
	dlmgr__rad_dict_string_DLValue_t *linkinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   721
	dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   722
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   723
	rc_instance_t		*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   724
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   725
	int			error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   726
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   727
	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
   728
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   729
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   730
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   731
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   732
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   733
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   734
	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
   735
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   736
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   737
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   738
			    "failed Physical_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   739
			    netdev_name, derrp->dde_errmsg);
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
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   742
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   745
	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
   746
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   747
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   748
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   749
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   752
	memcpy(name_val, dlval->ddlv_sval, name_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   753
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   754
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   755
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   756
	dlmgr__rad_dict_string_DLValue_free(linkinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   757
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   758
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   759
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   760
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   761
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   762
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
   763
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   764
	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
   765
	    test_dlclass));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   766
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   767
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   768
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   769
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
   770
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   771
	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
   772
	    test_dllower));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   773
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   774
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   775
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   776
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
   777
    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
   778
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   779
	dlmgr_DLDict_t		**dlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   780
	dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   781
	dlmgr_DatalinkError_t   *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   782
	rc_instance_t		*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   783
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   784
	const char		*props[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   785
	const char		*fields[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   786
	int			ndlist = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   787
	int			error = 0, i = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   788
	char			buf[DLADM_STRSIZE];
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_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
   791
	    "name", netdev_name);
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 = ENODEV;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   797
	props[0] = prop_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   798
	fields[0] = field_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   799
	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
   800
	    &dlist, &ndlist, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   801
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   802
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   803
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   804
			    "failed Datalink_getProperties(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   805
			    netdev_name, prop_name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   806
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   807
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   808
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   809
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   810
	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
   811
	    field_name, &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   812
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   813
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   814
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   815
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   816
	switch (dlval->ddlv_type) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   817
	case DDLVT_STRING:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   818
		if (dlval->ddlv_sval == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   819
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   820
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   821
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   822
		memcpy(prop_value, dlval->ddlv_sval, prop_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   823
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   824
	case DDLVT_STRINGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   825
		if (dlval->ddlv_slist_count == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   826
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   827
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   828
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   829
		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
   830
			(void) snprintf(buf, sizeof (buf), "%s%s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   831
			    (i != 0 ? "," : ""), dlval->ddlv_slist[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   832
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   833
		memcpy(prop_value, buf, prop_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   834
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   835
	case DDLVT_ULONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   836
		if (dlval->ddlv_ulval == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   837
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   838
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   839
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   840
		(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
   841
		memcpy(prop_value, buf, prop_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   842
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   843
	case DDLVT_BOOLEAN:
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   844
		if (dlval->ddlv_bval == NULL) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   845
			error = EINVAL;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   846
			goto out;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   847
		}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   848
		(void) snprintf(buf, sizeof (buf), "%d", *dlval->ddlv_bval);
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   849
		memcpy(prop_value, buf, prop_len);
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   850
		break;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   851
	case DDLVT_BOOLEANS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   852
	case DDLVT_LONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   853
	case DDLVT_LONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   854
	case DDLVT_ULONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   855
	case DDLVT_DICTIONARY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   856
	case DDLVT_DICTIONARYS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   857
	default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   858
		ovs_assert(0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   859
		break;
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
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   862
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   863
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   864
	dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   865
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   866
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   867
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   868
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   869
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   870
solaris_set_dlprop(const char *netdev_name, const char *propname, void *arg,
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   871
    dlmgr_DLValueType_t vtype, boolean_t temp)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   872
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   873
	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
   874
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   875
	dlmgr_DLValue_t			new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   876
	rc_instance_t			*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   877
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   878
	dlmgr_DatalinkError_t   	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   879
	int				error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   880
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   881
	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
   882
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   883
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   884
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   885
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   886
	}
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
	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
   889
	if (sprop_dict == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   890
		status = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   891
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   892
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   893
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   894
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   895
	new_val.ddlv_type = vtype;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   896
	switch (vtype) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   897
	case DDLVT_BOOLEAN:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   898
		new_val.ddlv_bval = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   899
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   900
		    sprop_dict, propname, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   901
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   902
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   903
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   904
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   905
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   906
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   907
	case DDLVT_ULONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   908
		new_val.ddlv_ulval = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   909
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   910
		    sprop_dict, propname, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   911
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   912
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   913
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   914
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   915
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   916
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   917
	case DDLVT_STRING:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   918
		new_val.ddlv_sval = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   919
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   920
		    sprop_dict, propname, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   921
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   922
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   923
			goto out;
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
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   926
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   927
	case DDLVT_LONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   928
	case DDLVT_LONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   929
	case DDLVT_ULONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   930
	case DDLVT_STRINGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   931
	case DDLVT_BOOLEANS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   932
	case DDLVT_DICTIONARY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   933
	case DDLVT_DICTIONARYS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   934
	default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   935
		ovs_assert(0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   936
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   937
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   938
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   939
	if (temp) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   940
		bzero(&new_val, sizeof (new_val));
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   941
		old_val = NULL;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   942
		new_val.ddlv_type = DDLVT_BOOLEAN;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   943
		new_val.ddlv_bval = &b_true;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   944
		status = dlmgr__rad_dict_string_DLValue_put(
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   945
		    sprop_dict, "temporary", &new_val, &old_val);
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   946
		if (status != RCE_OK) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   947
			error = EINVAL;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   948
			goto out;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   949
		}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   950
		dlmgr_DLValue_free(old_val);
5090
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   953
	status = dlmgr_Datalink_setProperties(link, sprop_dict, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   954
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   955
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   956
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   957
			    "failed Datalink_setPropertiess(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   958
			    netdev_name, propname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   959
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   960
		error = ENOTSUP;
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
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   963
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   964
	dlmgr__rad_dict_string_DLValue_free(sprop_dict);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   965
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   966
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   967
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   968
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   969
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   970
solaris_set_dlprop_boolean(const char *netdev_name, const char *propname,
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   971
    void *arg, boolean_t temp)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   972
{
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   973
	return (solaris_set_dlprop(netdev_name, propname, arg, DDLVT_BOOLEAN,
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   974
	    temp));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   975
}
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   978
solaris_set_dlprop_ulong(const char *netdev_name, const char *propname,
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   979
    void *arg, boolean_t temp)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   980
{
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   981
	return (solaris_set_dlprop(netdev_name, propname, arg, DDLVT_ULONG,
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   982
	    temp));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   983
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   984
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   985
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   986
solaris_set_dlprop_string(const char *netdev_name, const char *propname,
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   987
    void *arg, boolean_t temp)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   988
{
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   989
	return (solaris_set_dlprop(netdev_name, propname, arg, DDLVT_STRING,
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   990
	    temp));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   991
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   992
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
   993
static int
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
   994
dlmgr_DLValue_putstring(dlmgr__rad_dict_string_DLValue_t *ddvp,
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
   995
    const char *key, char *buf, char *dstr, size_t dstrlen)
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
   996
{
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
   997
	dlmgr_DLValue_t  *old_val = NULL;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
   998
	dlmgr_DLValue_t  new_val;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
   999
	rc_err_t status;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1001
	if (strlen(key) != 0) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1002
		bzero(&new_val, sizeof (new_val));
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1003
		new_val.ddlv_type = DDLVT_STRING;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1004
		new_val.ddlv_sval = buf;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1005
		if ((status = dlmgr__rad_dict_string_DLValue_put(ddvp, key,
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1006
		    &new_val, &old_val)) != RCE_OK) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1007
			return (EINVAL);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1008
		}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1009
		if (dstr)
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1010
			snprintf(dstr, dstrlen, "%s,%s=%s", dstr, key, buf);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1011
		dlmgr_DLValue_free(old_val);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1012
	}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1013
	return (0);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1014
}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1015
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1016
static int
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1017
dlmgr_DLValue_putdict(dlmgr__rad_dict_string_DLValue_t *ddvp,
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1018
    const char *key, dlmgr__rad_dict_string_DLValue_t *dict)
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1019
{
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1020
	dlmgr_DLValue_t  *old_val = NULL;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1021
	dlmgr_DLValue_t  new_val;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1022
	rc_err_t status;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1023
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1024
	if (strlen(key) != 0) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1025
		bzero(&new_val, sizeof (new_val));
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1026
		new_val.ddlv_type = DDLVT_DICTIONARY;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1027
		new_val.ddlv_dval = dict;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1028
		if ((status = dlmgr__rad_dict_string_DLValue_put(ddvp, key,
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1029
		    &new_val, &old_val)) != RCE_OK) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1030
			return (EINVAL);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1031
		}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1032
		dlmgr_DLValue_free(old_val);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1033
	}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1034
	return (0);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1035
}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1036
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1037
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1038
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
  1039
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1040
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1041
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1042
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1043
	dlmgr_DLValue_t			name_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1044
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1045
	rc_instance_t			*vnic = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1046
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1047
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1048
	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
  1049
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1050
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1051
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1052
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1053
	prop = dlmgr__rad_dict_string_DLValue_create(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1054
	if (prop == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1055
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1056
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1057
	bzero(&name_val, sizeof (name_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1058
	name_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1059
	/* 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
  1060
	name_val.ddlv_sval = strdupa(linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1061
	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
  1062
	    &name_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1063
	if (status != RCE_OK)
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
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1066
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1067
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1068
	status = dlmgr_DatalinkManager_createVNIC(linkmgr, vnicname, prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1069
	    &vnic, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1070
	if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1071
		dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1072
		    "failed DatalinkManager_createVNIC(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1073
		    vnicname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1074
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1075
	rc_instance_rele(vnic);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1076
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1077
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1078
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1079
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1080
	return ((status != RCE_OK) ? ENOTSUP : 0);
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
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1083
/*
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1084
 * Try setting implicit VNIC's mac-addr-type as "fixed", if it fails then try
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1085
 * with "auto" else bail out. This procedure is to ensure vnic migration
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1086
 * succeeds specifically on LDOM's vnet (ensuring it works on other uplinks too)
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1087
 * with any of its config (custom=enable/disable).
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1088
 */
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1089
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1090
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
  1091
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1092
	dlmgr__rad_dict_string_DLValue_t *sprop_dict = NULL;
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1093
	dlmgr__rad_dict_string_DLValue_t *mac_info_dict = NULL;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1094
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1095
	rc_instance_t			*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1096
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1097
	dlmgr_DatalinkError_t   	*derrp = NULL;
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1098
	char				mac_address[DLADM_PROP_VAL_MAX];
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1099
	int				error = 0;
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
	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
  1102
	    "name", vnicname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1103
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1104
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1105
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1106
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1107
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1108
	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
  1109
	if (sprop_dict == NULL) {
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1110
		error = ENOMEM;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1111
		goto out;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1112
	}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1113
	mac_info_dict = dlmgr__rad_dict_string_DLValue_create(link);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1114
	if (mac_info_dict == NULL) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1115
		error = ENOMEM;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1116
		goto out;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1117
	}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1118
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1119
	if ((error = dlmgr_DLValue_putstring(sprop_dict, "lower-link",
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1120
	    strdupa(linkname), NULL, 0)) != 0) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1121
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1122
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1123
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1124
	if ((error = solaris_get_dlprop(vnicname, "mac-address", "current",
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1125
	    mac_address, sizeof (mac_address))) != 0) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1126
		goto out;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1127
	}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1128
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1129
	if ((error = dlmgr_DLValue_putstring(mac_info_dict, "mac-address-type",
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1130
	    "fixed", NULL, 0)) != 0) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1131
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1132
	}
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1133
	if ((error = dlmgr_DLValue_putstring(mac_info_dict, "mac-address",
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1134
	    mac_address, NULL, 0)) != 0) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1135
		goto out;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1136
	}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1137
	if ((error = dlmgr_DLValue_putdict(sprop_dict, "mac-address-info",
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1138
	    mac_info_dict)) != 0) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1139
		goto out;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1140
	}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1141
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1142
	status = dlmgr_Datalink_setProperties(link, sprop_dict, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1143
	if (status != RCE_OK) {
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1144
		/* If it fails with "fixed" as mac-addr-type, try with "auto" */
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1145
		if ((status = dlmgr__rad_dict_string_DLValue_remove(
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1146
		    mac_info_dict, "mac-address", &old_val)) != RCE_OK) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1147
			error = ENOTSUP;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1148
			goto out;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1149
		}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1150
		dlmgr_DLValue_free(old_val);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1151
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1152
		if ((error = dlmgr_DLValue_putstring(mac_info_dict,
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1153
		    "mac-address-type", "auto", NULL, 0))
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1154
		    != 0) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1155
			goto out;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1156
		}
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1157
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1158
		status = dlmgr_Datalink_setProperties(link, sprop_dict,
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1159
		    &derrp);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1160
		if (status != RCE_OK) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1161
			if (status == RCE_SERVER_OBJECT) {
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1162
				dpif_log(derrp->dde_err,
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1163
				    "failed Datalink_setProperties"
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1164
				    "(%s, lower-link): %s",
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1165
				    vnicname, derrp->dde_errmsg);
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1166
			}
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1167
			error = ENOTSUP;
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1168
		}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1169
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1170
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1171
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1172
	dlmgr__rad_dict_string_DLValue_free(sprop_dict);
7000
22f549e6467a 24511676 Connectivity to LDOM with OVS is lost when start/stop of LDOM is performed
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6924
diff changeset
  1173
	dlmgr__rad_dict_string_DLValue_free(mac_info_dict);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1174
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1175
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1176
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1177
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1178
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1179
solaris_delete_vnic(const char *vnicname)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1180
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1181
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1182
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1183
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1184
	int				err = 0;
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
	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
  1187
	    &linkmgr, 0);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1188
	if (status != RCE_OK)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1189
		return (EINVAL);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1190
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1191
	status = dlmgr_DatalinkManager_deleteVNIC(linkmgr, vnicname, NULL,
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1192
	    &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1193
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1194
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1195
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1196
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1197
			dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1198
			    "failed DatalinkManager_deleteVNIC(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1199
			    vnicname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1200
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1201
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1202
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1203
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1204
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1205
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1206
}
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1209
solaris_create_etherstub(const char *name)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1210
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1211
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1212
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1213
	rc_instance_t			*etherstub = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1214
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1215
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1216
	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
  1217
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1218
	if (status != RCE_OK)
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1219
		return (ENOTSUP);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1220
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1221
	status = dlmgr_DatalinkManager_createEtherstub(linkmgr, name, NULL,
5090
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
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1231
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1232
	return ((status != RCE_OK) ? ENOTSUP : 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1233
}
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1236
solaris_delete_etherstub(const char *name)
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
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1239
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1240
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1241
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1242
	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
  1243
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1244
	if (status != RCE_OK)
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1245
		return (ENOTSUP);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1246
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1247
	status = dlmgr_DatalinkManager_deleteEtherstub(linkmgr, name, NULL,
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1248
	    &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1249
	if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1250
		dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1251
		    "failed DatalinkManager_deleteEtherstub(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1252
		    name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1253
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1254
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1255
	rc_instance_rele(linkmgr);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1256
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1257
	return ((status != RCE_OK) ? ENOTSUP : 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1258
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1259
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1260
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1261
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
  1262
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1263
	uchar_t		*addr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1264
	int		len, err = 0;
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
	if ((addr = _link_aton(str, &len)) == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1267
		return ((len == -1) ? EINVAL : ENOMEM);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1268
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1269
	if (len != maclen) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1270
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1271
		goto done;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1274
	bcopy(addr, f, maclen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1275
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1276
	free(addr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1277
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1278
}
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1281
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
  1282
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1283
	struct in_addr	v4addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1284
	struct in6_addr	v6addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1285
	int		af;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1286
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1287
	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
  1288
		af = AF_INET;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1289
	} 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
  1290
		af = AF_INET6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1291
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1292
		return (EINVAL);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1295
	if (af == AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1296
		IN6_INADDR_TO_V4MAPPED(&v4addr, f);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1297
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1298
		*f = v6addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1299
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1300
	*afp = af;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1301
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1304
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1305
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
  1306
    char *linkname, size_t size)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1307
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1308
	dlmgr__rad_dict_string_DLValue_t *fdict;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1309
	dlmgr_DLValue_t		*flist = NULL, *dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1310
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1311
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1312
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1313
	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
  1314
	    &flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1315
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1316
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1317
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1318
	fdict = flist->ddlv_dlist[0]->ddld_map;
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
	status = dlmgr__rad_dict_string_DLValue_get(fdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1321
	    "linkname", &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1322
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1323
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1324
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1325
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1326
	(void) strlcpy(linkname, dlval->ddlv_sval, size);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1327
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1328
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1329
	dlmgr_DLValue_free(flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1330
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1331
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1332
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1333
static void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1334
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
  1335
    size_t rbuf_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1336
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1337
	char *str = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1338
	char *pstr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1339
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1340
	buf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1341
	rbuf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1342
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1343
	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
  1344
		str = _link_ntoa(f, NULL, ETHERADDRL, IFT_ETHER);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1345
		if (str != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1346
			pstr = _link_ntoa(m, NULL, ETHERADDRL, IFT_ETHER);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1347
			if (pstr != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1348
				(void) snprintf(buf, buf_len, "%s", str);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1349
				(void) snprintf(rbuf, rbuf_len, "%s", pstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1350
				free(pstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1351
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1352
			free(str);
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
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1356
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1357
static void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1358
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
  1359
    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
  1360
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1361
	struct in_addr ipaddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1362
	char abuf[INET6_ADDRSTRLEN], mbuf[INET6_ADDRSTRLEN];
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
	buf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1365
	rbuf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1366
	if ((f6 != NULL) && (m6 != NULL) &&
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1367
	    (!ipv6_addr_equals(f6, &in6addr_any) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1368
	    !ipv6_addr_equals(m6, &in6addr_any))) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1369
		(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
  1370
		(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
  1371
		(void) snprintf(buf, buf_len, "%s", abuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1372
		(void) snprintf(rbuf, rbuf_len, "%s", mbuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1373
	} else if (f4 != 0 || m4 != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1374
		ipaddr.s_addr = f4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1375
		(void) strlcpy(abuf, inet_ntoa(ipaddr), sizeof (abuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1376
		ipaddr.s_addr = m4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1377
		(void) strlcpy(mbuf, inet_ntoa(ipaddr), sizeof (mbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1378
		(void) snprintf(buf, buf_len, "%s", abuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1379
		(void) snprintf(rbuf, rbuf_len, "%s", mbuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1380
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1381
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1382
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1383
#define	FP_NAME_VAL_DELIM		'@'
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1384
#define	FP_MULTI_ACTION_DELIM		'#'
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1385
#define	FP_ACTION_NAME_VALUE_DELIM	'-'
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1386
#define	FP_ACTION_PORT_RANGE_DELIM	':'
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1387
#define	FP_ACTION_MULTI_VAL_DELIM	'^'
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1388
#define	FP_MULTI_ACTION_DELIM_STR	"#"
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1389
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1390
static int
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1391
uint32cmp(const void *a, const void *b)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1392
{
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1393
	return (*(uint32_t *)a - *(uint32_t *)b);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1394
}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1395
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1396
static int
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1397
ofport_list2range(uint32_t *ofports, int nofports, ofport_range_t **range,
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1398
    int *range_cnt)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1399
{
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1400
	int		i, nr = 1;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1401
	uint32_t	*sort32;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1402
	ofport_range_t	*ur;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1403
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1404
	sort32 = malloc(nofports * sizeof (uint32_t));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1405
	if (sort32 == NULL)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1406
		return (ENOMEM);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1407
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1408
	for (i = 0; i < nofports; i++)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1409
		sort32[i] =  ofports[i];
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1410
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1411
	if (nofports > 1)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1412
		qsort(sort32, nofports, sizeof (uint32_t), uint32cmp);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1413
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1414
	ur = *range;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1415
	ur->ofp_min = ur->ofp_max = sort32[0];
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1416
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1417
	for (i = 1; i < nofports; i++) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1418
		if (sort32[i] - sort32[i-1] == 1) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1419
			ur->ofp_max = sort32[i];
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1420
		} else {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1421
			ur++; nr++;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1422
			ur->ofp_min = ur->ofp_max = sort32[i];
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1423
		}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1424
	}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1425
	free(sort32);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1426
	*range_cnt = nr;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1427
	return (0);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1428
}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1429
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1430
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1431
flow_ofports2propstr(char *str, size_t strsize, uint32_t *ofports,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1432
    int nofports)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1433
{
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1434
	char	buf[DLADM_STRSIZE];
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1435
	int	i, err, range_cnt;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1436
	ofport_range_t	*ofports_range;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1437
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  1438
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  1439
	if (nofports == 0)
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1440
		return (0);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1441
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1442
	ofports_range = malloc(nofports * sizeof (ofport_range_t));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1443
	if (ofports_range == NULL)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1444
		return (ENOMEM);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1445
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1446
	err = ofport_list2range(ofports, nofports, &ofports_range, &range_cnt);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1447
	if (err != 0) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1448
		free(ofports_range);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1449
		return (err);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1450
	}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1451
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1452
	if (snprintf(buf, sizeof (buf), "%soutports", strlen(str) == 0 ? "" :
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1453
	    FP_MULTI_ACTION_DELIM_STR) >= sizeof (buf)) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1454
		goto no_buffer;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1455
	}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1456
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1457
	if (strlcat(str, buf, strsize) >= strsize)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1458
		goto no_buffer;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1459
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1460
	for (i = 0; i < range_cnt; i++) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1461
		if (ofports_range[i].ofp_min == ofports_range[i].ofp_max) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1462
			if (snprintf(buf, sizeof (buf), "%c%u", (i == 0) ?
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1463
			    FP_NAME_VAL_DELIM : FP_ACTION_MULTI_VAL_DELIM,
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1464
			    ofports_range[i].ofp_min) >= sizeof (buf)) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1465
				goto no_buffer;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1466
			}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1467
		} else {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1468
			if (snprintf(buf, sizeof (buf), "%c%u%c%u",
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1469
			    (i == 0) ? FP_NAME_VAL_DELIM :
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1470
			    FP_ACTION_MULTI_VAL_DELIM, ofports_range[i].ofp_min,
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1471
			    FP_ACTION_PORT_RANGE_DELIM,
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1472
			    ofports_range[i].ofp_max) >= sizeof (buf)) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1473
				goto no_buffer;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1474
			}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1475
		}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1476
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1477
		if (strlcat(str, buf, strsize) >= strsize)
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1478
			goto no_buffer;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1479
	}
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1480
	free(ofports_range);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1481
	return (0);
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1482
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1483
no_buffer:
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1484
	free(ofports_range);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1485
	return (ENOBUFS);
5090
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1489
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
  1490
    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
  1491
    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
  1492
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1493
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1494
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1495
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1496
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1497
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1498
		bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1499
		new_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1500
		new_val.ddlv_sval = buf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1501
		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
  1502
		    &new_val, &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1503
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1504
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1505
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1506
		old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1507
		new_val.ddlv_sval = rbuf;
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(ddmp, 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
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1513
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1514
		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
  1515
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1516
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1519
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1520
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
  1521
    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
  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
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1528
	new_val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1529
	new_val.ddlv_bval = &val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1530
	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
  1531
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1532
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1533
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1534
	snprintf(dstr, dstrlen, "%s,%s=%s", dstr, key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1535
	    val ? "true" : "false");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1536
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1537
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1538
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1539
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1540
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1541
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
  1542
    uint64_t val, char *dstr, size_t dstrlen)
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
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1545
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1546
	unsigned long long ulval = val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1547
	rc_err_t status;
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
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1550
	new_val.ddlv_type = DDLVT_ULONG;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1551
	new_val.ddlv_ulval = &ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1552
	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
  1553
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1554
		return (EINVAL);
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
	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
  1557
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1558
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1559
}
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1562
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
  1563
    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
  1564
    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
  1565
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1566
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1567
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1568
	unsigned long long f_ulval = f;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1569
	unsigned long long m_ulval = m;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1570
	rc_err_t status;
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
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1573
	new_val.ddlv_type = DDLVT_ULONG;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1574
	new_val.ddlv_ulval = &f_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1575
	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
  1576
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1577
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1578
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1579
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1580
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1581
	new_val.ddlv_ulval = &m_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1582
	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
  1583
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1584
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1585
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1586
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1587
	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
  1588
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1589
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1590
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1591
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1592
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
  1593
    dlmgr__rad_dict_string_DLValue_t *ddvp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1594
    dlmgr__rad_dict_string_DLValue_t *ddmp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1595
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1596
	char		buf[DLADM_STRSIZE], rbuf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1597
	char		dstr[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1598
	int		err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1599
	boolean_t	is_arp = (ntohs(f->dl_type) == 0x806);
7590
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1600
	boolean_t	is_rarp = (ntohs(f->dl_type) == 0x8035);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1601
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1602
	dstr[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1603
	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
  1604
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "sap",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1605
		    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
  1606
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1607
			goto out;
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
7590
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1610
	if (is_arp || is_rarp) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1611
		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
  1612
			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
  1613
			    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
  1614
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1615
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1616
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1617
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1618
		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
  1619
		    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1620
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1621
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1622
			    "arp-sender", buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1623
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1624
				goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1627
		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
  1628
		    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1629
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1630
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1631
			    "arp-target", buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1632
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1633
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1634
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1635
7590
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1636
		/* sip and tip of REVARP_REQUEST is undefined */
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1637
		if (f->nw_proto != REVARP_REQUEST) {
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1638
			flow_addr2str(NULL, NULL, f->nw_src, m->nw_src, buf,
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1639
			    rbuf, sizeof (buf), sizeof (rbuf));
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1640
			if (strlen(buf) != 0) {
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1641
				err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1642
				    "arp-sip", buf, rbuf, dstr, sizeof (dstr));
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1643
				if (err != 0)
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1644
					goto out;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1645
			}
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1646
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1647
			flow_addr2str(NULL, NULL, f->nw_dst, m->nw_dst, buf,
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1648
			    rbuf, sizeof (buf), sizeof (rbuf));
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1649
			if (strlen(buf) != 0) {
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1650
				err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1651
				    "arp-tip", buf, rbuf,  dstr, sizeof (dstr));
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1652
				if (err != 0)
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1653
					goto out;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  1654
			}
5090
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
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1657
		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
  1658
			err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "transport",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1659
			    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
  1660
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1661
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1662
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1663
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1664
		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
  1665
		    buf, rbuf, sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1666
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1667
			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
  1668
			    buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1669
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1670
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1671
		}
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
		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
  1674
		    buf, rbuf, sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1675
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1676
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1677
			    "remote-ip", buf, rbuf, 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
		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
  1683
			err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1684
			    "tcp-flags", (uint8_t)(ntohs(f->tcp_flags)),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1685
			    (uint8_t)(ntohs(m->tcp_flags)), dstr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1686
			    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
		if (f->nw_proto != IPPROTO_ICMP &&
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1692
		    f->nw_proto != IPPROTO_ICMPV6) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1693
			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
  1694
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1695
				    "local-port", ntohs(f->tp_src),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1696
				    ntohs(m->tp_src), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1697
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1698
					goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1701
			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
  1702
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1703
				    "remote-port", ntohs(f->tp_dst),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1704
				    ntohs(m->tp_dst), 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
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1709
			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
  1710
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1711
				    "icmp-type", ntohs(f->tp_src),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1712
				    ntohs(m->tp_src), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1713
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1714
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1715
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1716
			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
  1717
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1718
				    "icmp-code", ntohs(f->tp_dst),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1719
				    ntohs(m->tp_dst), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1720
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1721
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1722
			}
6160
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1723
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1724
			flow_mac2str(f->arp_sha, m->arp_sha, buf, rbuf,
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1725
			    sizeof (buf), sizeof (rbuf));
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1726
			if (strlen(buf) != 0) {
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1727
				err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1728
				    "nd-sll", buf, rbuf,
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1729
				    dstr, sizeof (dstr));
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1730
				if (err != 0)
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1731
					goto out;
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1732
			}
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1733
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1734
			flow_mac2str(f->arp_tha, m->arp_tha, buf, rbuf,
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1735
			    sizeof (buf), sizeof (rbuf));
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1736
			if (strlen(buf) != 0) {
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1737
				err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1738
				    "nd-tll", buf, rbuf,
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1739
				    dstr, sizeof (dstr));
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1740
				if (err != 0)
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1741
					goto out;
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1742
			}
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1743
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1744
			flow_addr2str(&f->nd_target, &m->nd_target, 0, 0,
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1745
			    buf, rbuf, sizeof (buf), sizeof (rbuf));
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1746
			if (strlen(buf) != 0) {
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1747
				err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1748
				    "nd-target", buf, rbuf,
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1749
				    dstr, sizeof (dstr));
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1750
				if (err != 0)
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1751
					goto out;
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1752
			}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1753
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1754
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1755
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1756
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1757
	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
  1758
	    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1759
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1760
		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
  1761
		    rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1762
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1763
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1764
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1765
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1766
	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
  1767
	    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1768
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1769
		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
  1770
		    rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1771
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1772
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1773
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1774
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1775
	if (f->in_port.odp_port != ODPP_NONE) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1776
		err = dlmgr_DLValue_putulong(ddvp, "srcport",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1777
		    f->in_port.odp_port, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1778
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1779
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1780
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1781
6538
a53c8be7d7b3 24356657 OVS adds VLAN flows with CFI set, but packets don't have that set
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 6160
diff changeset
  1782
	/*
a53c8be7d7b3 24356657 OVS adds VLAN flows with CFI set, but packets don't have that set
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 6160
diff changeset
  1783
	 * when "f" is filled in by the parse_vlan() function, VLAN_CFI bit is
a53c8be7d7b3 24356657 OVS adds VLAN flows with CFI set, but packets don't have that set
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 6160
diff changeset
  1784
	 * set blindly. Unset this bit now since we don't set this bit in
a53c8be7d7b3 24356657 OVS adds VLAN flows with CFI set, but packets don't have that set
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 6160
diff changeset
  1785
	 * Solaris for VLAN packets.
a53c8be7d7b3 24356657 OVS adds VLAN flows with CFI set, but packets don't have that set
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 6160
diff changeset
  1786
	 */
a53c8be7d7b3 24356657 OVS adds VLAN flows with CFI set, but packets don't have that set
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 6160
diff changeset
  1787
	f->vlan_tci &= htons(~VLAN_CFI);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1788
	if ((f->vlan_tci != 0) || (m->vlan_tci != htons(0xffff))) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1789
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1790
		    "vlan-tci", ntohs(f->vlan_tci),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1791
		    ntohs(m->vlan_tci), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1792
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1793
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1794
	}
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
	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
  1797
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1798
		    "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
  1799
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1800
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1801
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1802
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1803
	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
  1804
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1805
		    "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
  1806
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1807
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1808
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1809
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1810
	if (f->tunnel.ip_dst) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1811
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1812
		    "tun-id", ntohll(f->tunnel.tun_id),
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1813
		    ntohll(m->tunnel.tun_id), dstr, sizeof (dstr));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1814
		if (err != 0)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1815
			goto out;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1816
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1817
		flow_addr2str(NULL, NULL, f->tunnel.ip_src, m->tunnel.ip_src,
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1818
		    buf, rbuf, sizeof (buf), sizeof (rbuf));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1819
		if (strlen(buf) != 0) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1820
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1821
			    "tun-local-ip", buf, rbuf, dstr, sizeof (dstr));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1822
			if (err != 0)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1823
				goto out;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1824
		}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1825
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1826
		flow_addr2str(NULL, NULL, f->tunnel.ip_dst, m->tunnel.ip_dst,
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1827
		    buf, rbuf, sizeof (buf), sizeof (rbuf));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1828
		if (strlen(buf) != 0) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1829
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1830
			    "tun-remote-ip", buf, rbuf, dstr, sizeof (dstr));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1831
			if (err != 0)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1832
				goto out;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1833
		}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1834
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1835
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "tun-dsfield",
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1836
		    f->tunnel.ip_tos, m->tunnel.ip_tos, dstr, sizeof (dstr));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1837
		if (err != 0)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1838
			goto out;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1839
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1840
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "tun-ttl",
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1841
		    f->tunnel.ip_ttl, m->tunnel.ip_ttl, dstr, sizeof (dstr));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1842
		if (err != 0)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1843
			goto out;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1844
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1845
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "tun-flags",
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1846
		    f->tunnel.flags, m->tunnel.flags, dstr, sizeof (dstr));
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1847
		if (err != 0)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1848
			goto out;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1849
	}
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1850
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1851
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1852
	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
  1853
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1854
}
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
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1857
solaris_maxbw_action_to_DLVal(dlmgr__rad_dict_string_DLValue_t *prop,
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1858
    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
  1859
    char *dstr, size_t dstrlen)
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
	struct smap details;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1862
	const char *max_rate = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1863
	uint64_t maxbw;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1864
	char *endp = NULL;
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  1865
	int err = EINVAL;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1866
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1867
	smap_init(&details);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1868
	if (queueid == UINT32_MAX || nofports != 1)
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1869
		goto done;
5090
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
	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
  1872
	    queueid, &details)) != 0) {
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1873
		goto done;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1874
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1875
	/* min-rate and priority not currently used */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1876
	max_rate = smap_get(&details, "max-rate");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1877
	if (max_rate == NULL)
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1878
		goto done;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1879
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1880
	errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1881
	maxbw = strtoull(max_rate, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1882
	if (errno != 0 || *endp != '\0')
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1883
		goto done;
5090
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
	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
  1886
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1887
done:
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1888
	smap_destroy(&details);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1889
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1890
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1891
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1892
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1893
solaris_setether_action_to_str(char *str, size_t strsize,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1894
    const struct ovs_key_ethernet *ek)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1895
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1896
	char *sstr = NULL, *dstr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1897
	char buf[DLADM_STRSIZE];
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1898
	int err = ENOBUFS;
5090
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
	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
  1901
	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
  1902
	if (sstr != NULL && dstr != NULL) {
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1903
		if (snprintf(buf, sizeof (buf),
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1904
		    "%sset-ether%cether_src%c%s%cether_dst%c%s",
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1905
		    (strlen(str) == 0) ? "" : FP_MULTI_ACTION_DELIM_STR,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1906
		    FP_NAME_VAL_DELIM, FP_ACTION_NAME_VALUE_DELIM, sstr,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1907
		    FP_ACTION_MULTI_VAL_DELIM, FP_ACTION_NAME_VALUE_DELIM,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1908
		    dstr) < sizeof (buf) &&
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1909
		    strlcat(str, buf, strsize) < strsize)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1910
			err = 0;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1911
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1912
	free(sstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1913
	free(dstr);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1914
	if (sstr == NULL || dstr == NULL)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1915
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1916
	return (err);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1919
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1920
solaris_setipv4_action_to_str(char *str, size_t strsize,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1921
    const struct ovs_key_ipv4 *ipv4)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1922
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1923
	struct in_addr ipaddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1924
	char *cp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1925
	char buf[DLADM_STRSIZE];
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
	ipaddr.s_addr = ipv4->ipv4_src;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1928
	cp = inet_ntoa(ipaddr);
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1929
	if (snprintf(buf, sizeof (buf), "%sset-ipv4%csrc%c%s%c",
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1930
	    (strlen(str) == 0) ? "" : FP_MULTI_ACTION_DELIM_STR,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1931
	    FP_NAME_VAL_DELIM, FP_ACTION_NAME_VALUE_DELIM, cp,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1932
	    FP_ACTION_MULTI_VAL_DELIM) >= sizeof (buf))
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1933
		return (ENOBUFS);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1934
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1935
	ipaddr.s_addr = ipv4->ipv4_dst;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1936
	cp = inet_ntoa(ipaddr);
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1937
	if (snprintf(buf, sizeof (buf),
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1938
	    "%sdst%c%s%cprotocol%c%s%ctos%c0x%x%choplimit%c%d",
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1939
	    buf, FP_ACTION_NAME_VALUE_DELIM, cp, FP_ACTION_MULTI_VAL_DELIM,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1940
	    FP_ACTION_NAME_VALUE_DELIM, solaris_proto2str(ipv4->ipv4_proto),
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1941
	    FP_ACTION_MULTI_VAL_DELIM, FP_ACTION_NAME_VALUE_DELIM,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1942
	    ipv4->ipv4_tos, FP_ACTION_MULTI_VAL_DELIM,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1943
	    FP_ACTION_NAME_VALUE_DELIM, ipv4->ipv4_ttl) >= sizeof (buf))
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1944
		return (ENOBUFS);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1945
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1946
	if (strlcat(str, buf, strsize) >= strsize)
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1947
		return (ENOBUFS);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1948
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1949
	return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1950
}
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
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1953
solaris_setipv6_action_to_str(char *str, size_t strsize,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1954
    const struct ovs_key_ipv6 *ipv6)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1955
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1956
	char abuf[INET6_ADDRSTRLEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1957
	char buf[DLADM_STRSIZE];
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
	(void) inet_ntop(AF_INET6, ipv6->ipv6_src, abuf, INET6_ADDRSTRLEN);
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1960
	if (snprintf(buf, sizeof (buf),
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1961
	    "%sset-ipv6%csrc%c%s%c", (strlen(str) == 0) ? "" :
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1962
	    FP_MULTI_ACTION_DELIM_STR, FP_NAME_VAL_DELIM,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1963
	    FP_ACTION_NAME_VALUE_DELIM, abuf, FP_ACTION_MULTI_VAL_DELIM) >=
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1964
	    sizeof (buf))
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1965
		return (ENOBUFS);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1966
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1967
	(void) inet_ntop(AF_INET6, ipv6->ipv6_dst, abuf, INET6_ADDRSTRLEN);
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1968
	if (snprintf(buf, sizeof (buf),
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1969
	    "%sdst%c%s%clabel%c0x%x%cprotocol%c%s%ctos%c0x%x%choplimit%c%d",
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1970
	    buf, FP_ACTION_NAME_VALUE_DELIM, abuf, FP_ACTION_MULTI_VAL_DELIM,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1971
	    FP_ACTION_NAME_VALUE_DELIM, ipv6->ipv6_label,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1972
	    FP_ACTION_MULTI_VAL_DELIM, FP_ACTION_NAME_VALUE_DELIM,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1973
	    solaris_proto2str(ipv6->ipv6_proto), FP_ACTION_MULTI_VAL_DELIM,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1974
	    FP_ACTION_NAME_VALUE_DELIM, ipv6->ipv6_tclass,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1975
	    FP_ACTION_MULTI_VAL_DELIM, FP_ACTION_NAME_VALUE_DELIM,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1976
	    ipv6->ipv6_hlimit) >= sizeof (buf))
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1977
		return (ENOBUFS);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1978
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1979
	if (strlcat(str, buf, strsize) >= strsize)
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1980
		return (ENOBUFS);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1981
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1982
	return (0);
5090
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1985
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1986
solaris_settransport_action_to_str(char *str, size_t strsize, const char *key,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1987
    uint16_t src, uint16_t dst)
5090
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
	char buf[DLADM_STRSIZE];
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1990
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1991
	if (snprintf(buf, sizeof (buf),
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1992
	    "%s%s%csport%c%d%cdport%c%d", (strlen(str) == 0) ? "" :
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1993
	    FP_MULTI_ACTION_DELIM_STR, key, FP_NAME_VAL_DELIM,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1994
	    FP_ACTION_NAME_VALUE_DELIM, src, FP_ACTION_MULTI_VAL_DELIM,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1995
	    FP_ACTION_NAME_VALUE_DELIM, dst) >= sizeof (buf))
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1996
		return (ENOBUFS);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1997
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1998
	if (strlcat(str, buf, strsize) >= strsize)
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  1999
		return (ENOBUFS);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2000
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2001
	return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2002
}
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
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2005
solaris_settnl_action_to_str(char *str, size_t strsize,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2006
    const struct flow_tnl *tnl)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2007
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2008
	struct in_addr ipaddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2009
	char *cp;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2012
	ipaddr.s_addr = tnl->ip_src;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2013
	cp = inet_ntoa(ipaddr);
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2014
	if (snprintf(buf, sizeof (buf), "%sset-tunnel%csrc%c%s%c",
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2015
	    (strlen(str) == 0) ? "" : FP_MULTI_ACTION_DELIM_STR,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2016
	    FP_NAME_VAL_DELIM, FP_ACTION_NAME_VALUE_DELIM, cp,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2017
	    FP_ACTION_MULTI_VAL_DELIM) >= sizeof (buf))
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2018
		return (ENOBUFS);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2019
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2020
	ipaddr.s_addr = tnl->ip_dst;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2021
	cp = inet_ntoa(ipaddr);
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2022
	if (snprintf(buf, sizeof (buf),
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2023
	    "%sdst%c%s%ctun_id%c0x%"PRIx64"%ctos%c0x%x%choplimit%c%d",
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2024
	    buf, FP_ACTION_NAME_VALUE_DELIM, cp, FP_ACTION_MULTI_VAL_DELIM,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2025
	    FP_ACTION_NAME_VALUE_DELIM, ntohll(tnl->tun_id),
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2026
	    FP_ACTION_MULTI_VAL_DELIM, FP_ACTION_NAME_VALUE_DELIM,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2027
	    tnl->ip_tos, FP_ACTION_MULTI_VAL_DELIM, FP_ACTION_NAME_VALUE_DELIM,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2028
	    tnl->ip_ttl) >= sizeof (buf))
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2029
		return (ENOBUFS);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2030
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2031
	if (strlcat(str, buf, strsize) >= strsize)
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2032
		return (ENOBUFS);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2033
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2034
	return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2035
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2036
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2037
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2038
solaris_nlattr_to_DLVal(void *cookie,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2039
    const struct nlattr *actions_nlattr, size_t actions_len,
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2040
    dlmgr__rad_dict_string_DLValue_t *prop)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2041
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2042
	const struct nlattr *a;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2043
	unsigned int left;
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2044
	char buf[MAX_OF_ACTIONS_SIZE];
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2045
	char str[MAX_OF_ACTIONS_SIZE];
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2046
	char dstr[MAX_OF_ACTIONS_SIZE];
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2047
	int err = 0, nofports = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2048
	uint32_t ofports[MAC_OF_MAXPORT];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2049
	enum ovs_action_attr type = -1, lasttype;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2050
	uint_t queueid = UINT32_MAX;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2051
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2052
	dstr[0] = '\0';
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2053
	str[0] = '\0';
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2054
	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
  2055
	    sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2056
	if (err != 0)
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
	/* if actions_len == 0, then the action is drop */
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  2060
	if (actions_len == 0)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2061
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2062
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2063
	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
  2064
		lasttype = type;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2065
		type = nl_attr_type(a);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2066
		if ((type != OVS_ACTION_ATTR_OUTPUT) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2067
		    (lasttype != OVS_ACTION_ATTR_OUTPUT)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2068
			if (lasttype == OVS_ACTION_ATTR_OUTPUT) {
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2069
				err = flow_ofports2propstr(str, sizeof (str),
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2070
				    ofports, nofports);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2071
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2072
					goto out;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2073
				(void) solaris_maxbw_action_to_DLVal(prop,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2074
				    cookie, ofports, nofports, queueid, dstr,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2075
				    sizeof (dstr));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2076
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2077
			nofports = 0;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2080
		switch ((enum ovs_action_attr) type) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2081
		/* 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
  2082
		case OVS_ACTION_ATTR_OUTPUT:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2083
			if (nofports + 1 > MAC_OF_MAXPORT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2084
				err = ENOBUFS;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2085
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2086
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2087
			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
  2088
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2089
		case OVS_ACTION_ATTR_USERSPACE: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2090
			const struct nlattr *userdata;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2091
			size_t userdata_len;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2092
			union user_action_cookie cookie;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2093
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2094
			userdata = nl_attr_find_nested(a,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2095
			    OVS_USERSPACE_ATTR_USERDATA);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2096
			userdata_len = nl_attr_get_size(userdata);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2097
			memcpy(&cookie, nl_attr_get(userdata), userdata_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2098
			if (userdata_len < sizeof (cookie.type) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2099
			    userdata_len > sizeof (cookie)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2100
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2101
				dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2102
				    "unexpected action size %"PRIuSIZE,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2103
				    userdata_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2104
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2105
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2106
			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
  2107
			    cookie.type != USER_ACTION_COOKIE_SLOW_PATH) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2108
				err = EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2109
				dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2110
				    "userspace action size %"PRIuSIZE" "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2111
				    "type unsupported %d", userdata_len,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2112
				    cookie.type);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2113
				break;
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
			if (cookie.slow_path.reason != SLOW_CONTROLLER)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2116
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2117
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2118
			if (snprintf(buf, sizeof (buf), "%scontroller%c%u",
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2119
			    (strlen(str) == 0) ? "" : FP_MULTI_ACTION_DELIM_STR,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2120
			    FP_NAME_VAL_DELIM, PORT_PF_PACKET_UPLINK) >=
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2121
			    sizeof (buf)) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2122
				err = ENOBUFS;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2123
				break;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2124
			}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2125
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2126
			if (strlcat(str, buf, sizeof (str)) >= sizeof (str)) {
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2127
				err = ENOBUFS;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2128
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2129
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2130
			break;
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
		case OVS_ACTION_ATTR_SET: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2133
			const struct nlattr *aset = nl_attr_get(a);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2134
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2135
			switch (nl_attr_type(aset)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2136
			case OVS_KEY_ATTR_PRIORITY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2137
				queueid = nl_attr_get_u32(aset);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2138
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2139
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2140
			case OVS_KEY_ATTR_ETHERNET: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2141
				const struct ovs_key_ethernet *ek;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2142
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2143
				ek = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2144
				    sizeof (struct ovs_key_ethernet));
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2145
				err = solaris_setether_action_to_str(str,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2146
				    sizeof (str), ek);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2147
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2148
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2149
			case OVS_KEY_ATTR_IPV4: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2150
				const struct ovs_key_ipv4 *eip4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2151
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2152
				eip4 = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2153
				    sizeof (struct ovs_key_ipv4));
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2154
				err = solaris_setipv4_action_to_str(str,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2155
				    sizeof (str), eip4);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2156
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2157
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2158
			case OVS_KEY_ATTR_IPV6: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2159
				const struct ovs_key_ipv6 *eip6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2160
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2161
				eip6 = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2162
				    sizeof (struct ovs_key_ipv6));
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2163
				err = solaris_setipv6_action_to_str(str,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2164
				    sizeof (str), eip6);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2165
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2166
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2167
			case OVS_KEY_ATTR_TCP: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2168
				const struct ovs_key_tcp *etcp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2169
				etcp = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2170
				    sizeof (struct ovs_key_tcp));
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2171
				err = solaris_settransport_action_to_str(
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2172
				    str, sizeof (str), "set-tcp", etcp->tcp_src,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2173
				    etcp->tcp_dst);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2174
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2175
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2176
			case OVS_KEY_ATTR_UDP: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2177
				const struct ovs_key_udp *eudp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2178
				eudp = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2179
				    sizeof (struct ovs_key_udp));
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2180
				err = solaris_settransport_action_to_str(
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2181
				    str, sizeof (str), "set-udp", eudp->udp_src,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2182
				    eudp->udp_dst);
5090
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
			case OVS_KEY_ATTR_SCTP: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2186
				const struct ovs_key_sctp *esctp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2187
				esctp = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2188
				    sizeof (struct ovs_key_sctp));
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2189
				err = solaris_settransport_action_to_str(str,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2190
				    sizeof (str), "set-sctp", esctp->sctp_src,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2191
				    esctp->sctp_dst);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2192
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2193
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2194
			case OVS_KEY_ATTR_TUNNEL: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2195
				struct flow_tnl tnl;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2196
				enum odp_key_fitness fitness;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2197
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2198
				memset(&tnl, 0, sizeof (tnl));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2199
				fitness = odp_tun_key_from_attr(aset, &tnl);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2200
				ovs_assert(fitness != ODP_FIT_ERROR);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2201
				err = solaris_settnl_action_to_str(
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2202
				    str, sizeof (str), &tnl);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2203
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2204
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2205
			default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2206
				err = EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2207
				dpif_log(err, "solaris_nlattr_to_DLVal set "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2208
				    "%d not supported",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2209
				    nl_attr_type(nl_attr_get(a)));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2210
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2211
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2212
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2213
		case OVS_ACTION_ATTR_PUSH_VLAN: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2214
			const struct ovs_action_push_vlan *vlan;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2215
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2216
			vlan = nl_attr_get_unspec(a,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2217
			    sizeof (struct ovs_action_push_vlan));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2218
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2219
			if (snprintf(buf, sizeof (buf), "%svlan-tag%c%u",
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2220
			    (strlen(str) == 0) ? "" : FP_MULTI_ACTION_DELIM_STR,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2221
			    FP_NAME_VAL_DELIM, ntohs(vlan->vlan_tci)) >=
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2222
			    sizeof (buf)) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2223
				err = ENOBUFS;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2224
				break;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2225
			}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2226
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2227
			if (strlcat(str, buf, sizeof (str)) >= sizeof (str)) {
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2228
				err = ENOBUFS;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2229
				break;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2230
			}
5090
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_ACTION_ATTR_POP_VLAN:
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2234
			if (snprintf(buf, sizeof (buf), "%svlan-strip%c%s",
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2235
			    (strlen(str) == 0) ? "" : FP_MULTI_ACTION_DELIM_STR,
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2236
			    FP_NAME_VAL_DELIM, "on") >= sizeof (buf)) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2237
				err = ENOBUFS;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2238
				break;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2239
			}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2240
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2241
			if (strlcat(str, buf, sizeof (str)) >= sizeof (str)) {
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2242
				err = ENOBUFS;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2243
				break;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2244
			}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2245
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2246
		case OVS_ACTION_ATTR_RECIRC:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2247
		case OVS_ACTION_ATTR_HASH:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2248
		case OVS_ACTION_ATTR_PUSH_MPLS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2249
		case OVS_ACTION_ATTR_POP_MPLS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2250
		case OVS_ACTION_ATTR_SAMPLE:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2251
			/* TBD */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2252
			err = EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2253
			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
  2254
			    "not supported", type);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2255
		case OVS_ACTION_ATTR_UNSPEC:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2256
		case __OVS_ACTION_ATTR_MAX:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2257
			OVS_NOT_REACHED();
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2258
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2259
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2260
			goto out;
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
	if (type == OVS_ACTION_ATTR_OUTPUT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2263
		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
  2264
		    nofports);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2265
		err = flow_ofports2propstr(str, sizeof (str),
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2266
		    ofports, nofports);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2267
		if (err != 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2268
			goto out;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2269
		(void) solaris_maxbw_action_to_DLVal(prop, cookie, ofports,
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2270
		    nofports, queueid, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2271
	}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2272
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2273
	err = dlmgr_DLValue_putstring(prop, "ofaction", str, dstr,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2274
	    sizeof (dstr));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2275
out:
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2276
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2277
	dpif_log(err, "solaris_nlattr_to_DLVal %s %d", dstr, err);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2278
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2279
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2280
}
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2283
solaris_add_flow(void *cookie, const char *linkname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2284
    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
  2285
    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
  2286
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2287
	dlmgr_DLDict_t dff, dfm, *dffp, *dfmp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2288
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2289
	rc_instance_t *link = NULL, *flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2290
	dlmgr_DatalinkError_t *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2291
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2292
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2293
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2294
	bzero(&dff, sizeof (dff));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2295
	bzero(&dfm, sizeof (dfm));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2296
	dffp = &dff;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2297
	dfmp = &dfm;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2298
	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
  2299
	    "name", linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2300
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2301
		err = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2302
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2303
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2304
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2305
	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
  2306
	if (dff.ddld_map == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2307
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2308
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2309
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2310
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2311
	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
  2312
	if (dfm.ddld_map == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2313
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2314
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2315
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2316
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2317
	prop = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2318
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2319
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2320
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2321
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2322
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2323
	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
  2324
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2325
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2326
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2327
	err = solaris_nlattr_to_DLVal(cookie, actions_nlattr,
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2328
	    actions_len, prop);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2329
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2330
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2331
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2332
	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
  2333
	    prop, &flow, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2334
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2335
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2336
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2337
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2338
			dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2339
			    "failed Datalink_addFlow(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2340
			    flowname, linkname, derrp->dde_errmsg);
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
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2344
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2345
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2346
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2347
	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
  2348
	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
  2349
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2350
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2351
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2352
}
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2355
solaris_modify_flow(void *cookie, const char *flowname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2356
    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
  2357
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2358
	rc_instance_t *flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2359
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2360
	dlmgr_DatalinkError_t *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2361
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2362
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2363
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2364
	dpif_log(0, "solaris_modify_flow(%s)", flowname);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2365
	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
  2366
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2367
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2368
		err = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2369
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2370
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2371
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2372
	prop = dlmgr__rad_dict_string_DLValue_create(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2373
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2374
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2375
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2376
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2377
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2378
	err = solaris_nlattr_to_DLVal(cookie, actions_nlattr,
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2379
	    actions_len, prop);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2380
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2381
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2382
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2383
	status = dlmgr_Flow_setProperties(flow, prop, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2384
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2385
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2386
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2387
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2388
			dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2389
			    "failed Flow_setProperties(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2390
			    flowname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2391
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2392
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2393
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2394
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2395
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2396
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2397
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2398
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2399
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2400
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2401
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2402
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2403
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
  2404
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2405
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2406
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2407
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2408
	dlmgr_DLValue_t			val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2409
	rc_instance_t			*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2410
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2411
	int				error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2412
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2413
	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
  2414
	    "name", linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2415
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2416
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2417
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2418
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2419
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2420
	prop = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2421
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2422
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2423
		goto out;
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
	bzero(&val, sizeof (val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2427
	val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2428
	val.ddlv_bval = &b_true;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2429
	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
  2430
	    &val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2431
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2432
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2433
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2434
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2435
	dlmgr_DLValue_free(old_val);
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
	status = dlmgr_Datalink_removeFlow(link, flowname, prop, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2438
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2439
		error = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2440
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2441
			error = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2442
			dpif_log(error, "failed Datalink_removeFlow(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2443
			    flowname, derrp->dde_errmsg);
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
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2446
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2447
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2448
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2449
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2450
	return (error);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2453
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2454
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
  2455
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2456
	struct flow *f = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2457
	in6_addr_t fa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2458
	struct in_addr v4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2459
	int af, err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2460
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2461
	if (strcmp(key, "dst-mac") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2462
		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
  2463
	} else if (strcmp(key, "src-mac") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2464
		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
  2465
	} else if (strcmp(key, "local-ip") == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2466
	    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
  2467
	    strcmp(key, "arp-tip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2468
		err = flow_str2addr(val->ddlv_sval, &fa, &af);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2469
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2470
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2471
		if (af == AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2472
			IN6_V4MAPPED_TO_INADDR(&fa, &v4);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2473
			if (strcmp(key, "local-ip") == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2474
			    strcmp(key, "arp-sip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2475
				f->nw_src = v4.s_addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2476
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2477
				f->nw_dst = v4.s_addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2478
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2479
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2480
			if (strcmp(key, "local-ip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2481
				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
  2482
			} else if (strcmp(key, "remote-ip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2483
				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
  2484
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2485
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2486
			}
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
	} else if (strcmp(key, "transport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2489
		f->nw_proto = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2490
	} else if (strcmp(key, "local-port") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2491
		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
  2492
	} else if (strcmp(key, "remote-port") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2493
		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
  2494
	} else if (strcmp(key, "dsfield") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2495
		f->nw_tos = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2496
	} else if (strcmp(key, "srcport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2497
		f->in_port.odp_port = (odp_port_t)*val->ddlv_ulval;
6160
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  2498
	} else if (strcmp(key, "arp-target") == 0 ||
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  2499
	    strcmp(key, "nd-tll") == 0) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2500
		err = flow_str2mac(val->ddlv_sval, f->arp_tha, 6);
6160
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  2501
	} else if (strcmp(key, "arp-sender") == 0 ||
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  2502
	    strcmp(key, "nd-sll") == 0) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2503
		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
  2504
	} else if (strcmp(key, "arp-op") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2505
		f->nw_proto = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2506
	} else if (strcmp(key, "sap") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2507
		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
  2508
	} else if (strcmp(key, "ttl") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2509
		f->nw_ttl = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2510
	} else if (strcmp(key, "vlan-tci") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2511
		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
  2512
	} else if (strcmp(key, "icmp-type") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2513
		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
  2514
	} else if (strcmp(key, "icmp-code") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2515
		f->tp_dst = htons((uint16_t)*val->ddlv_ulval);
6160
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  2516
	} else if (strcmp(key, "nd-target") == 0) {
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  2517
		err = flow_str2addr(val->ddlv_sval, &fa, &af);
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  2518
		if (err != 0)
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  2519
			goto out;
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  2520
		bcopy(&fa, &f->nd_target, sizeof (f->nd_target));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2521
	} else if (strcmp(key, "tcp-flags") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2522
		f->tcp_flags = htons((uint16_t)*val->ddlv_ulval);
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2523
	} else if (strcmp(key, "tun-id") == 0) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2524
		f->tunnel.tun_id = htonll((uint64_t)*val->ddlv_ulval);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2525
	} else if (strcmp(key, "tun-local-ip") == 0 ||
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2526
	    strcmp(key, "tun-remote-ip") == 0) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2527
		err = flow_str2addr(val->ddlv_sval, &fa, &af);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2528
		if (err != 0 || af != AF_INET)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2529
			goto out;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2530
		IN6_V4MAPPED_TO_INADDR(&fa, &v4);
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2531
		if (strcmp(key, "tun-local-ip") == 0)
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2532
			f->tunnel.ip_src = v4.s_addr;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2533
		else
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2534
			f->tunnel.ip_dst = v4.s_addr;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2535
	} else if (strcmp(key, "tun-dsfield") == 0) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2536
		f->tunnel.ip_tos = (uint8_t)*val->ddlv_ulval;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2537
	} else if (strcmp(key, "tun-ttl") == 0) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2538
		f->tunnel.ip_ttl = (uint8_t)*val->ddlv_ulval;
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2539
	} else if (strcmp(key, "tun-flags") == 0) {
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2540
		f->tunnel.flags = (uint16_t)*val->ddlv_ulval;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2541
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2542
out:
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2543
	if (err != 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2544
		dpif_log(err, "solaris_flowinfo2flowmap %s failed", key);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2545
	dlmgr_DLValue_free(val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2546
	return (err == 0 ? RCE_OK : -1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2547
}
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2550
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
  2551
    struct flow *f, struct flow *m)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2552
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2553
	dlmgr__rad_dict_string_DLValue_t *fdict, *mdict;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2554
	dlmgr_DLValue_t  *flist = NULL, *mlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2555
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2556
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2557
	bzero(f, sizeof (*f));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2558
	bzero(m, sizeof (*m));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2559
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2560
	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
  2561
	    &flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2562
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2563
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2564
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2565
	fdict = flist->ddlv_dlist[0]->ddld_map;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2566
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2567
	status = dlmgr__rad_dict_string_DLValue_map(fdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2568
	    solaris_flowinfo2flowmap, f);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2569
	dlmgr_DLValue_free(flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2570
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2571
		return (EINVAL);
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_get(flowinfo, "masks", &mlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2574
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2575
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2576
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2577
	mdict = mlist->ddlv_dlist[0]->ddld_map;
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_map(mdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2580
	    solaris_flowinfo2flowmap, m);
7590
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  2581
	/* IP fragmentation is not supported, always return 0xff for its mask */
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  2582
	if (is_ip_any(f))
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  2583
		m->nw_frag = 0xff;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2584
	dlmgr_DLValue_free(mlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2585
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2586
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2587
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2588
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2589
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2590
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2591
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
  2592
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2593
	dlmgr__rad_dict_string_DLValue_t *flowinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2594
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2595
	rc_instance_t		*flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2596
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2597
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2598
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2599
	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
  2600
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2601
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2602
		return (ENODEV);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2603
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2604
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2605
	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
  2606
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2607
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2608
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2609
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2610
			/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2611
			 * 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
  2612
			 * 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
  2613
			 * issue.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2614
			 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2615
			dpif_log(err == DDLSTATUS_NOT_FOUND ? 0 : err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2616
			    "failed Flow_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2617
			    flowname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2618
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2619
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2620
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2621
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2622
	rc_instance_rele(flow);
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
	if (err == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2625
		err = solaris_flowinfo2flow(flowinfo, f, m);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2626
		dlmgr__rad_dict_string_DLValue_free(flowinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2627
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2628
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2629
	return (err);
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2633
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
  2634
    struct ofpbuf *action OVS_UNUSED)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2635
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2636
	/* TBD */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2637
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2640
void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2641
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
  2642
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2643
	union user_action_cookie cookie;
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
	cookie.type = USER_ACTION_COOKIE_SLOW_PATH;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2646
	cookie.slow_path.unused = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2647
	cookie.slow_path.reason = reason;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2648
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2649
	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
  2650
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2651
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2652
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2653
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
  2654
    struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2655
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2656
	slowpath_to_actions(SLOW_CONTROLLER, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2657
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2658
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2659
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2660
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2661
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
  2662
    struct ofpbuf *action)
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
	char *endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2665
	int64_t n;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2666
	struct ovs_action_push_vlan push;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2667
	int tpid = ETH_TYPE_VLAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2668
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2669
	errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2670
	n = strtoull(propvals[0], &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2671
	if ((errno != 0) || *endp != '\0' || n > 0xffff)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2672
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2673
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2674
	push.vlan_tpid = htons(tpid);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2675
	push.vlan_tci = htons((uint16_t)n);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2676
	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
  2677
	    &push, sizeof (push));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2678
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2681
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2682
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
  2683
    struct ofpbuf *action)
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
	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
  2686
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2687
}
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2690
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
  2691
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2692
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2693
	struct ovs_key_ethernet eth_key;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2694
	uchar_t *etheraddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2695
	int etheraddrlen;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2696
	boolean_t src_set, dst_set;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2697
	char *sep;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2698
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2699
	uint_t i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2700
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2701
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2702
	/*
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2703
	 * The property value is in the format of "ether_src-xxx"
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2704
	 * "ether_dst-xxx"
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2705
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2706
	bzero(&eth_key, sizeof (eth_key));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2707
	src_set = dst_set = B_FALSE;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2708
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2709
	for (i = 0; i < nval; i++) {
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2710
		(void) strlcpy(pval, propvals[i], sizeof (pval));
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2711
		if ((sep = strchr(pval, FP_ACTION_NAME_VALUE_DELIM)) == NULL) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2712
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2713
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2714
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2715
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2716
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2717
		if ((etheraddr = _link_aton(sep, &etheraddrlen)) == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2718
			err = (etheraddrlen == -1) ? EINVAL : ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2719
			goto out;
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
		/* Only ethernet address is supported */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2722
		if (etheraddrlen != ETHERADDRL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2723
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2724
			free(etheraddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2725
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2726
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2727
		if (strcmp(pval, "ether_src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2728
			if (src_set) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2729
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2730
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2731
				bcopy(etheraddr, &eth_key.eth_src, ETHERADDRL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2732
				src_set = _B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2733
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2734
		} else if (strcmp(pval, "ether_dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2735
			if (dst_set) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2736
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2737
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2738
				bcopy(etheraddr, &eth_key.eth_dst, ETHERADDRL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2739
				dst_set = _B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2740
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2741
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2742
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2743
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2744
		free(etheraddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2745
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2746
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2747
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2748
	if (!src_set || !dst_set) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2749
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2750
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2751
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2752
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2753
	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
  2754
	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
  2755
	    sizeof (eth_key));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2756
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2757
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2758
	return (err);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2761
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2762
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
  2763
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2764
	struct ovs_key_ipv4 ipv4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2765
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2766
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2767
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2768
	uint8_t protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2769
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2770
	int err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2771
	boolean_t tos_set = B_FALSE;
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
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2774
	 * 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
  2775
	 * "protocol:xxx" "tos:xxx" "hoplimit:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2776
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2777
	bzero(&ipv4, sizeof (ipv4));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2778
	for (i = 0; i < nval; i++) {
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2779
		(void) strlcpy(pval, propvals[i], sizeof (pval));
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2780
		if ((sep = strchr(pval, FP_ACTION_NAME_VALUE_DELIM)) == NULL) {
5090
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
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2783
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2784
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2785
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2786
		if (strcmp(pval, "src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2787
			if (ipv4.ipv4_src != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2788
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2789
			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
  2790
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2791
		} else if (strcmp(pval, "dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2792
			if (ipv4.ipv4_dst != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2793
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2794
			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
  2795
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2796
		} else if (strcmp(pval, "protocol") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2797
			if (ipv4.ipv4_proto != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2798
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2799
			protocol = solaris_str2proto(sep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2800
			if (protocol == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2801
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2802
			ipv4.ipv4_proto = protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2803
		} else if (strcmp(pval, "tos") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2804
			if (tos_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2805
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2806
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2807
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2808
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2809
			if (errno != 0 || value > 0xff || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2810
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2811
			tos_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2812
			ipv4.ipv4_tos = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2813
		} else if (strcmp(pval, "hoplimit") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2814
			if (ipv4.ipv4_ttl != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2815
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2816
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2817
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2818
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2819
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2820
			    *endp != '\0')
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
			ipv4.ipv4_ttl = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2823
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2824
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2825
	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
  2826
	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
  2827
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2828
	err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2829
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2830
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2831
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2832
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2833
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2834
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
  2835
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2836
	struct ovs_key_ipv6 ipv6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2837
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2838
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2839
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2840
	uint8_t protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2841
	struct in6_addr in6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2842
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2843
	int err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2844
	boolean_t tos_set = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2845
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2846
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2847
	 * 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
  2848
	 * "label:0xxxxx" "protocol:xxx" "tos:xxx" "hoplimit:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2849
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2850
	bzero(&ipv6, sizeof (ipv6));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2851
	for (i = 0; i < nval; i++) {
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2852
		(void) strlcpy(pval, propvals[i], sizeof (pval));
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2853
		if ((sep = strchr(pval, FP_ACTION_NAME_VALUE_DELIM)) == NULL)
5090
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
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2856
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2857
		if (strcmp(pval, "src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2858
			bcopy(&ipv6.ipv6_src, &in6.s6_addr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2859
			    sizeof (struct in6_addr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2860
			if (!IN6_IS_ADDR_UNSPECIFIED(&in6))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2861
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2862
			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
  2863
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2864
		} else if (strcmp(pval, "dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2865
			bcopy(&ipv6.ipv6_dst, &in6.s6_addr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2866
			    sizeof (struct in6_addr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2867
			if (!IN6_IS_ADDR_UNSPECIFIED(&in6))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2868
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2869
			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
  2870
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2871
		} else if (strcmp(pval, "protocol") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2872
			if (ipv6.ipv6_proto != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2873
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2874
			protocol = solaris_str2proto(sep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2875
			if (protocol == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2876
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2877
			ipv6.ipv6_proto = protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2878
		} else if (strcmp(pval, "tos") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2879
			if (tos_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2880
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2881
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2882
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2883
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2884
			if (errno != 0 || value > 0xff || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2885
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2886
			tos_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2887
			ipv6.ipv6_tclass = value;
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  2888
		} else if (strcmp(pval, "hoplimit") == 0) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2889
			if (ipv6.ipv6_hlimit != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2890
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2891
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2892
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2893
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2894
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2895
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2896
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2897
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2898
			ipv6.ipv6_hlimit = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2899
		} else if (strcmp(pval, "label") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2900
			if (ipv6.ipv6_label != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2901
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2902
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2903
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2904
			value = strtoul(sep, &endp, 16);
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  2905
			if (errno != 0 || value > 0xff || *endp != '\0') {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2906
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2907
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2908
			ipv6.ipv6_label = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2909
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2910
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2911
	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
  2912
	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
  2913
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2914
	err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2915
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2916
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2917
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2918
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2919
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2920
flow_propval2action_settransport(char **propvals, int nval,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2921
    uint16_t *sportp, uint16_t *dportp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2922
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2923
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2924
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2925
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2926
	int err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2927
	uint16_t sport = 0, dport = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2928
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2929
	/* The property value is in the format of "sport-xxx" "dport-xxx" */
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2930
	for (i = 0; i < nval; i++) {
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2931
		(void) strlcpy(pval, propvals[i], sizeof (pval));
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2932
		if ((sep = strchr(pval, FP_ACTION_NAME_VALUE_DELIM)) == NULL)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2933
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2934
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2935
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2936
		if (strcmp(pval, "sport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2937
			if (sport != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2938
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2939
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2940
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2941
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2942
			if (errno != 0 || value == 0 || value > 0xffff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2943
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2944
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2945
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2946
			sport = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2947
		} else if (strcmp(pval, "dport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2948
			if (dport != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2949
				return (DLADM_STATUS_DUPLICATE_ARG);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2950
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2951
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2952
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2953
			if (errno != 0 || value == 0 || value > 0xffff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2954
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2955
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2956
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2957
			dport = value;
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
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2960
	err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2961
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2962
	*sportp = sport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2963
	*dportp = dport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2964
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2965
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2966
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2967
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2968
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
  2969
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2970
	struct ovs_key_tcp tcp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2971
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2972
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2973
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2974
	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
  2975
	    &tcp.tcp_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2976
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2977
		return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2978
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2979
	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
  2980
	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
  2981
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2982
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2983
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2984
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2985
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2986
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
  2987
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2988
	struct ovs_key_udp udp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2989
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2990
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2991
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2992
	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
  2993
	    &udp.udp_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2994
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2995
		return (err);
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
	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
  2998
	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
  2999
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3000
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3001
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3002
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3003
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3004
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
  3005
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3006
	struct ovs_key_sctp sctp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3007
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3008
	int err;
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
	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
  3011
	    &sctp.sctp_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3012
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3013
		return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3014
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3015
	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
  3016
	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
  3017
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3018
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3019
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3020
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3021
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3022
set_addr(char *pval, uint32_t *addrp)
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
	struct addrinfo		hints;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3025
	struct addrinfo		*ai;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3026
	struct addrinfo		*next_ai;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3027
	void			*ptr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3028
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3029
	(void) memset(&hints, 0, sizeof (hints));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3030
	hints.ai_family = AF_UNSPEC;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3031
	if (getaddrinfo(pval, NULL, &hints, &ai) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3032
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3033
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3034
	/* Check if hostname resolves to multiple addresses */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3035
	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
  3036
	    next_ai = next_ai->ai_next) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3037
		if (next_ai->ai_addrlen != ai->ai_addrlen ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3038
		    bcmp(next_ai->ai_addr, ai->ai_addr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3039
		    ai->ai_addrlen) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3040
			/* maps to more than one address */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3041
			freeaddrinfo(ai);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3042
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3043
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3044
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3045
	if (ai->ai_family != AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3046
		freeaddrinfo(ai);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3047
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3048
	}
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
	ptr = ((uint8_t *)ai->ai_addr) +
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3051
	    offsetof(struct sockaddr_in, sin_addr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3052
	memcpy(addrp, ptr, sizeof (struct in_addr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3053
	freeaddrinfo(ai);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3054
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3055
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3056
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3057
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3058
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
  3059
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3060
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3061
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3062
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3063
	struct flow_tnl tnl;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3064
	size_t start_ofs, tun_key_ofs;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3065
	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
  3066
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3067
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3068
	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
  3069
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3070
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3071
	 * 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
  3072
	 * "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
  3073
	 */
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3074
	bzero(&tnl, sizeof (struct flow_tnl));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3075
	tnl.ip_tos = 0xff;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3076
	for (i = 0; i < nval; i++) {
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3077
		(void) strlcpy(pval, propvals[i], sizeof (pval));
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3078
		if ((sep = strchr(pval, FP_ACTION_NAME_VALUE_DELIM)) == NULL)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3079
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3080
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3081
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3082
		if (strcmp(pval, "tun_id") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3083
			if (id_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3084
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3085
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3086
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3087
			value = strtoull(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3088
			if (errno != 0 || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3089
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3090
			tnl.tun_id = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3091
			id_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3092
		} else if (strcmp(pval, "src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3093
			if (src_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3094
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3095
			err = set_addr(sep, &tnl.ip_src);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3096
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3097
				return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3098
			src_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3099
		} else if (strcmp(pval, "dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3100
			if (dst_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3101
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3102
			err = set_addr(sep, &tnl.ip_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3103
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3104
				return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3105
			dst_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3106
		} else if (strcmp(pval, "tos") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3107
			if (tos_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3108
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3109
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3110
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3111
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3112
			if (errno != 0 || value > 0xff || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3113
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3114
			tnl.ip_tos = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3115
			tos_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3116
		} else if (strcmp(pval, "hoplimit") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3117
			if (ttl_set)
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
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3120
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3121
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3122
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3123
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3124
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3125
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3126
			tnl.ip_ttl = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3127
			ttl_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3128
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3129
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3130
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3131
	start_ofs = nl_msg_start_nested(action, OVS_ACTION_ATTR_SET);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3132
	tun_key_ofs = nl_msg_start_nested(action, OVS_KEY_ATTR_TUNNEL);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3133
	nl_msg_put_be64(action, OVS_TUNNEL_KEY_ATTR_ID,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3134
	    ntohll((uint64_t)tnl.tun_id));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3135
	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
  3136
	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
  3137
	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
  3138
	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
  3139
	nl_msg_put_flag(action, OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3140
	nl_msg_end_nested(action, tun_key_ofs);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3141
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3142
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3143
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3144
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3145
static int
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3146
flow_propstr2outports(char *key, char *val, uint32_t outports[], int *valcntp)
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3147
{
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3148
	char *curr;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3149
	int maxcnt = *valcntp, i, j, len;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3150
	char *ofp_min, *ofp_max, *tmp = NULL, *endp = NULL;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3151
	uint32_t of_min, of_max, i_of;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3152
	boolean_t match, is_range;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3153
	char c;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3154
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3155
	dpif_log(0, "flow_propstr2vals key %s val %s", key, val);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3156
	len = strlen(val);
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  3157
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3158
	ovs_assert(strcmp(key, "outports") == 0);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3159
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3160
	match = is_range = B_FALSE;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3161
	ofp_min = ofp_max = val;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3162
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3163
	for (i = 0, j = 0, curr = val; i < len && j < maxcnt; i++) {
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3164
		ofp_min = ofp_max = curr;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3165
		c = val[i];
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3166
		match = (c == FP_ACTION_MULTI_VAL_DELIM ||
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3167
		    c == FP_ACTION_PORT_RANGE_DELIM);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3168
		if (!match && i != len -1)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3169
			continue;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3170
		if (match)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3171
			val[i] = '\0';
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3172
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3173
		if (c == FP_ACTION_PORT_RANGE_DELIM) {
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3174
			tmp = curr;
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  3175
			curr = val + i + 1;
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3176
			is_range = B_TRUE;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3177
			continue;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3178
		}
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3179
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3180
		if (is_range == B_TRUE) {
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3181
			ofp_min = tmp;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3182
			is_range = B_FALSE;
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  3183
		}
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3184
		of_min = (uint32_t)strtoul(ofp_min, &endp, 10);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3185
		of_max = (uint32_t)strtoul(ofp_max, &endp, 10);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3186
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3187
		for (i_of = of_min; i_of <= of_max; i_of++)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3188
			outports[j++] = i_of;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3189
		curr = val + i + 1;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3190
	}
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3191
	if (j >= maxcnt)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3192
		dpif_log(ENOBUFS, "flow_propstr2outports action truncated");
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3193
	*valcntp = j;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3194
	for (i = 0; i < j; i++)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3195
		dpif_log(0, "flow_propstr2outports key %s %dth: %d", key, i+1,
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3196
		    outports[i]);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3197
	return (0);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3198
}
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3199
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3200
static int
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3201
flow_propstr2vals(char *key, char *val, char ***propvalsp, int *valcntp)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3202
{
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3203
	char **propvals = *propvalsp, *curr;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3204
	int maxcnt = *valcntp, i, j, len;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3205
	char c;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3206
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3207
	dpif_log(0, "flow_propstr2vals key %s val %s", key, val);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3208
	len = strlen(val);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3209
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3210
	ovs_assert(strcmp(key, "outports") != 0);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3211
	for (i = 0, j = 0, curr = val; i < len && j < maxcnt; i++) {
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3212
		if ((c = val[i]) != FP_ACTION_MULTI_VAL_DELIM &&
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3213
		    i != len -1)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3214
			continue;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3215
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3216
		if (c == FP_ACTION_MULTI_VAL_DELIM)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3217
			val[i] = '\0';
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3218
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3219
		if (strlcpy(propvals[j++], curr, DLADM_PROP_VAL_MAX) >=
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3220
		    DLADM_PROP_VAL_MAX) {
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3221
			dpif_log(EINVAL, "flow_propstr2vals key %s %dth"
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3222
			    " string too long %s", key, j - 1, curr);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3223
			return (EINVAL);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3224
		}
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3225
		curr = val + i + 1;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3226
	}
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3227
	if (j >= maxcnt)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3228
		dpif_log(ENOBUFS, "flow_propstr2vals action truncated");
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3229
	*valcntp = j;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3230
	for (i = 0; i < j; i++)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3231
		dpif_log(0, "flow_propstr2vals key %s %dth: %s", key, i+1,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3232
		    propvals[i]);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3233
	return (0);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3234
}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3235
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3236
static int
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3237
flow_propval2action_ofaction(char *propval, struct ofpbuf *action)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3238
{
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  3239
	char ofaction_str[4096];
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3240
	char **pvals, *buf = NULL;
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3241
	uint32_t outports[MAC_OF_MAXPORT];
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3242
	size_t len;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3243
	char *curr, *key, c;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3244
	boolean_t match;
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3245
	int nval, err = 0, i, j;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3246
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3247
	buf = malloc((sizeof (char *) + DLADM_PROP_VAL_MAX) *
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3248
	    DLADM_PROP_VAL_MAX);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3249
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3250
	pvals = (char **)(void *)buf;
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3251
	for (i = 0; i < DLADM_PROP_VAL_MAX; i++) {
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3252
		pvals[i] = buf + sizeof (char *) * DLADM_PROP_VAL_MAX +
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3253
		    i * DLADM_PROP_VAL_MAX;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3254
	}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3255
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3256
	if (strlcpy(ofaction_str, propval, sizeof (ofaction_str)) >=
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3257
	    sizeof (ofaction_str)) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3258
		err = EINVAL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3259
		goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3260
	}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3261
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3262
	len = strlen(ofaction_str);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3263
	curr = ofaction_str;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3264
	key = NULL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3265
	for (i = 0; i < len; i++) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3266
		c = ofaction_str[i];
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3267
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3268
		match = (c == FP_NAME_VAL_DELIM || c == FP_MULTI_ACTION_DELIM);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3269
		if (!match && i != len - 1)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3270
			continue;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3271
		if (match) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3272
			ofaction_str[i] = '\0';
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3273
			if (*curr == '\0') {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3274
				err = EINVAL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3275
				goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3276
			}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3277
		}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3278
		if (c == FP_NAME_VAL_DELIM) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3279
			key = curr;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3280
			curr = ofaction_str + i + 1;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3281
			continue;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3282
		}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3283
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3284
		if (key == NULL) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3285
			err = EINVAL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3286
			goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3287
		}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3288
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3289
		if (strcmp(key, "outports") == 0) {
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3290
			nval = MAC_OF_MAXPORT;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3291
			err = flow_propstr2outports(key, curr, outports, &nval);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3292
		} else {
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3293
			nval = DLADM_PROP_VAL_MAX;
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3294
			err = flow_propstr2vals(key, curr, &pvals, &nval);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3295
		}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3296
		if (err != 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3297
			goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3298
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3299
		if (strcmp(key, "outports") == 0) {
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3300
			for (j = 0; j < nval; j++)
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3301
				nl_msg_put_u32(action, OVS_ACTION_ATTR_OUTPUT,
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3302
				    outports[j]);
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3303
		} else if (strcmp(key, "max-bw") == 0)
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3304
			err = flow_propval2action_setpri(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3305
		else if (strcmp(key, "controller") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3306
			err = flow_propval2action_controller(pvals, nval,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3307
			    action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3308
		else if (strcmp(key, "vlan-tag") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3309
			err = flow_propval2action_pushvlan(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3310
		else if (strcmp(key, "vlan-strip") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3311
			err = flow_propval2action_popvlan(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3312
		else if (strcmp(key, "set-ether") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3313
			err = flow_propval2action_setether(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3314
		else if (strcmp(key, "set-ipv4") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3315
			err = flow_propval2action_setipv4(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3316
		else if (strcmp(key, "set-ipv6") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3317
			err = flow_propval2action_setipv6(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3318
		else if (strcmp(key, "set-tcp") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3319
			err = flow_propval2action_settcp(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3320
		else if (strcmp(key, "set-udp") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3321
			err = flow_propval2action_setudp(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3322
		else if (strcmp(key, "set-sctp") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3323
			err = flow_propval2action_setsctp(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3324
		else if (strcmp(key, "set-tunnel") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3325
			err = flow_propval2action_settnl(pvals, nval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3326
		else
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3327
			err = EINVAL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3328
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3329
		if (err != 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3330
			goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3331
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3332
		key = NULL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3333
		curr = ofaction_str + i + 1;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3334
	}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3335
done:
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3336
	free(buf);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3337
	return (err);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3338
}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3339
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3340
/* valcnt must be 1 */
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3341
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3342
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
  3343
    void *arg)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3344
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3345
	struct ofpbuf *action = arg;
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  3346
	char propval[4096];
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3347
	int valcnt, err = 0;
5090
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
	switch (val->ddlv_type) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3350
	case DDLVT_STRING:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3351
		if (val->ddlv_sval == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3352
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3353
		if (strlen(val->ddlv_sval) == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3354
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3355
		valcnt = 1;
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  3356
		if (strlcpy(propval, val->ddlv_sval, sizeof (propval)) >=
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3357
		    sizeof (propval))
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3358
			goto out;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3359
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3360
	case DDLVT_STRINGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3361
		if (val->ddlv_slist_count == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3362
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3363
		valcnt = val->ddlv_slist_count;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3364
		if (valcnt != 1 || strlen(val->ddlv_slist[0]) == 0)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3365
			goto out;
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  3366
		if (strlcpy(propval, val->ddlv_slist[0], sizeof (propval)) >=
6924
e8aaad6b5075 24681506 The OVS drop action does not work as designed - userland part
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6556
diff changeset
  3367
		    sizeof (propval))
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3368
			goto out;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3369
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3370
	case DDLVT_ULONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3371
		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
  3372
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3373
		valcnt = 1;
6556
692ea531a2fc 24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes)
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6538
diff changeset
  3374
		(void) snprintf(propval, sizeof (propval), "%llu",
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3375
		    *val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3376
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3377
	case DDLVT_BOOLEAN:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3378
	case DDLVT_BOOLEANS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3379
	case DDLVT_LONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3380
	case DDLVT_LONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3381
	case DDLVT_ULONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3382
	case DDLVT_DICTIONARY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3383
	case DDLVT_DICTIONARYS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3384
	default:
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
	dpif_log(0, "solaris_flowinfo2actionmap %s:%d %s", key, valcnt,
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3388
	    propval);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3389
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3390
	if (strcmp(key, "ofaction") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3391
		err = flow_propval2action_ofaction(propval, action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3392
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3393
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3394
	dlmgr_DLValue_free(val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3395
	return (err == 0 ? RCE_OK : -1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3396
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3397
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3398
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3399
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
  3400
    struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3401
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3402
	dlmgr__rad_dict_string_DLValue_t *fdict;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3403
	dlmgr_DLValue_t  *flist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3404
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3405
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3406
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3407
	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
  3408
	    &flist);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3409
	if (status != RCE_OK) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3410
		dpif_log(EINVAL, "solaris_flowinfo2action get properties failed"
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3411
		    " %d", status);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3412
		return (EINVAL);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3413
	}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3414
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3415
	fdict = flist->ddlv_dval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3416
	status = dlmgr__rad_dict_string_DLValue_map(fdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3417
	    solaris_flowinfo2actionmap, action);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3418
	if (status != RCE_OK) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3419
		err = EINVAL;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3420
		dpif_log(EINVAL, "solaris_flowinfo2action get walk actionmap "
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3421
		    "failed %d", status);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3422
	}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3423
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3424
	dlmgr_DLValue_free(flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3425
	return (err);
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3429
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
  3430
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3431
	dlmgr__rad_dict_string_DLValue_t *flowinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3432
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3433
	rc_instance_t		*flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3434
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3435
	int			err = 0;
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
	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
  3438
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3439
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3440
		return (ENODEV);
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
	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
  3444
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3445
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3446
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3447
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3448
			/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3449
			 * 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
  3450
			 * 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
  3451
			 * issue.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3452
			 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3453
			dpif_log(err == DDLSTATUS_NOT_FOUND ? 0 : err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3454
			    "failed Flow_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3455
			    flowname, derrp->dde_errmsg);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3459
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3460
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3461
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3462
	if (err == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3463
		err = solaris_flowinfo2action(flowinfo, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3464
		dlmgr__rad_dict_string_DLValue_free(flowinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3465
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3466
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3467
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3468
}
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3471
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
  3472
    uint64_t *nbytes, uint64_t *lastused)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3473
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3474
	dlmgr__rad_dict_string_DLValue_t *flowstat = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3475
	dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3476
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3477
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3478
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3479
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3480
	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
  3481
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3482
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3483
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3484
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3485
			dpif_log(err, "failed Flow_getStatistics(): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3486
			    derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3487
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3488
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3489
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3490
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3491
#if _TBD_
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3492
	uint16_t tcp_flags; /* bitmaps of tcp_flags */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3493
#endif
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3494
	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
  3495
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3496
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3497
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3498
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3499
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3500
	*npackets = *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3501
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3502
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3503
	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
  3504
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3505
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3506
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3507
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3508
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3509
	*npackets += *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3510
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3511
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3512
	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
  3513
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3514
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3515
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3516
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3517
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3518
	*nbytes = *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3519
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3520
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3521
	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
  3522
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3523
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3524
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3525
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3526
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3527
	*nbytes += *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3528
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3529
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3530
	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
  3531
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3532
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3533
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3534
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3535
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3536
	*lastused = *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3537
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3538
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3539
	dlmgr__rad_dict_string_DLValue_free(flowstat);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3540
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3541
	return (err);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3544
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3545
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
  3546
    uint64_t *nbytes, uint64_t *lastused)
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
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3549
	rc_instance_t *flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3550
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3551
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3552
	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
  3553
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3554
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3555
		err = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3556
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3557
	}
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
	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
  3560
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3561
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3562
	return (err);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3565
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3566
kstat_handle_init(kstat2_handle_t *khandlep)
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
	kstat2_status_t	stat;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3569
5918
3cbac9806123 23226020 Openvswitch should prepare for kstat2 changes
Martin Walsh<Martin.Walsh@oracle.com>
parents: 5730
diff changeset
  3570
	stat = kstat2_open(khandlep, NULL);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3571
	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
  3572
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3573
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3574
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3575
kstat_handle_update(kstat2_handle_t khandle)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3576
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3577
	kstat2_status_t	stat;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3578
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3579
	stat = kstat2_update(khandle);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3580
	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
  3581
}
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
void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3584
kstat_handle_close(kstat2_handle_t *khandlep)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3585
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3586
	kstat2_close(khandlep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3587
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3588
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3589
uint64_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3590
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
  3591
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3592
	kstat2_status_t stat;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3593
	kstat2_nv_t val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3594
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3595
	stat = kstat2_map_get(map, name, &val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3596
	if (stat != KSTAT2_S_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3597
		(void) printf("can't get value: %s\n",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3598
		    kstat2_status_string(stat));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3599
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3600
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3601
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3602
	if (val->type != KSTAT2_NVVT_INT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3603
		(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
  3604
		return (0);
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
	return (val->kstat2_integer);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3608
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3609
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3610
void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3611
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
  3612
    odp_port_t))
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
	adr_name_t	**anamearr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3615
	int		anamecnt = 0, i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3616
	rc_err_t	rerr;
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
	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
  3619
	    &anamecnt, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3620
	if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3621
		return;
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
	if (anamecnt == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3624
		free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3625
		return;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3628
	for (i = 0; i < anamecnt; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3629
		dlmgr_DLDict_t		**dlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3630
		dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3631
		const char		*props[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3632
		const char		*fields[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3633
		int			ndlist = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3634
		rc_instance_t		*rip = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3635
		dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3636
		rc_err_t 		rerr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3637
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3638
		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
  3639
		if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3640
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3641
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3642
		props[0] = "ofport";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3643
		fields[0] = "current";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3644
		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
  3645
		    &dlist, &ndlist, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3646
		rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3647
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3648
			if (rerr == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3649
				dpif_log(derrp->dde_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
				    adr_name_key(anamearr[i], "name"),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3652
				    props[0], derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3653
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3654
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3655
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3656
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3657
		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
  3658
		    "current", &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3659
		if (rerr != RCE_OK || dlval->ddlv_sval == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3660
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3661
			dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3662
			dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3663
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3664
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3665
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3666
		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
  3667
			fn(arg, adr_name_key(anamearr[i], "name"),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3668
			    "system", atoi(dlval->ddlv_sval));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3669
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3670
		dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3671
		dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3672
		dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3673
	}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3674
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3675
	for (i = 0; i < anamecnt; i++)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3676
		adr_name_rele(anamearr[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3677
	free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3678
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3679
7237
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3680
void
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3681
solaris_flow_walk(void *arg, struct ofpbuf *action,
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3682
    void (*fn)(void *, const char *, struct flow *, struct flow *,
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3683
    struct ofpbuf *, uint64_t, uint64_t, uint64_t))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3684
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3685
	adr_name_t	**anamearr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3686
	int		anamecnt = 0, i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3687
	rc_err_t	rerr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3688
	int		err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3689
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3690
	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
  3691
	    &anamecnt, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3692
	if (rerr != RCE_OK)
7237
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3693
		return;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3694
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3695
	if (anamecnt == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3696
		free(anamearr);
7237
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3697
		return;
5090
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3700
	for (i = 0; i < anamecnt; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3701
		dlmgr__rad_dict_string_DLValue_t *flowinfo;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3702
		char			linkname[MAXLINKNAMELEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3703
		rc_instance_t		*rip = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3704
		dlmgr_DLDict_t		**dlist;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3705
		dlmgr_DLValue_t		*dlval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3706
		const char		*props[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3707
		const char		*fields[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3708
		struct flow		f, m;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3709
		int			ndlist = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3710
		uint64_t		npackets, nbytes, lastused;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3711
		dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3712
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3713
		flowinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3714
		dlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3715
		dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3716
		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
  3717
		    NULL) {
7237
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3718
			continue;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3719
		} else if (strstr(adr_name_key(anamearr[i], "name"),
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3720
		    "sys.of") == NULL) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3721
			continue;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3722
		}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3723
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3724
		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
  3725
		if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3726
			continue;
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
		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
  3729
		    &lastused)) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3730
			dpif_log(err, "solaris_flow_walk get_flowstats "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3731
			    "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
  3732
			    "name"), err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3733
			rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3734
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3735
		}
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
		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
  3738
		rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3739
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3740
			err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3741
			if (rerr == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3742
				err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3743
				/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3744
				 * XXX For now, log DDLSTATUS_NOT_FOUND as
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3745
				 * debug until we can determine how to handle
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3746
				 * the RAD caching issue.
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
				dpif_log(err == DDLSTATUS_NOT_FOUND ? 0 : err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3749
				    "failed Flow_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3750
				    adr_name_key(anamearr[i], "name"),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3751
				    derrp->dde_errmsg);
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
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3754
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3755
		}
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
		/* 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
  3758
		err = solaris_flowinfo2linkname(flowinfo, linkname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3759
		    MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3760
		if (err != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3761
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3762
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3763
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3764
		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
  3765
		    1, "name", linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3766
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3767
			goto done;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3770
		props[0] = "openvswitch";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3771
		fields[0] = "current";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3772
		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
  3773
		    &dlist, &ndlist, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3774
		rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3775
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3776
			err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3777
			if (rerr == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3778
				err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3779
				dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3780
				    "failed Datalink_getProperties(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3781
				    linkname, props[0], derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3782
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3783
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3784
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3785
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3786
		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
  3787
		    "current", &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3788
		if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3789
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3790
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3791
		if (!dlval->ddlv_bval)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3792
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3793
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3794
		err = solaris_flowinfo2flow(flowinfo, &f, &m);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3795
		if (err != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3796
			dpif_log(err, "solaris_flow_walk flowinfo2flow "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3797
			    "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
  3798
			    "name"), err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3799
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3800
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3801
7237
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3802
		err = solaris_flowinfo2action(flowinfo, action);
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3803
		if (err != 0) {
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3804
			dpif_log(err, "solaris_flow_walk "
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3805
			    "flowinfo2action failed for %s: %d",
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3806
			    adr_name_key(anamearr[i], "name"), err);
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3807
			goto done;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3808
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3809
7237
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3810
		fn(arg, adr_name_key(anamearr[i], "name"), &f, &m, action,
c378a893371d 24844544 dpif flow_rwlock should not be held across RAD call
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 7000
diff changeset
  3811
		    npackets, nbytes, lastused);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3812
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3813
		dlmgr__rad_dict_string_DLValue_free(flowinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3814
		dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3815
		dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3816
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3817
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3818
	for (i = 0; i < anamecnt; i++)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3819
		adr_name_rele(anamearr[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3820
	free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3821
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3822
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3823
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3824
solaris_dladm_status2error(dladm_status_t status)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3825
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3826
	int error;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3827
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3828
	if (status == DLADM_STATUS_NOMEM) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3829
		error = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3830
	} else if (status == DLADM_STATUS_DENIED) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3831
		error = EPERM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3832
	} else if (status == DLADM_STATUS_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3833
		error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3834
	} else if (status == DLADM_STATUS_IOERR) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3835
		error = EIO;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3836
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3837
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3838
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3839
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3840
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3841
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3842
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3843
solaris_is_uplink_class(const char *class)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3844
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3845
	return (strcmp("phys", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3846
	    strcmp("aggr", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3847
	    strcmp("etherstub", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3848
	    strcmp("vxlan", class) == 0 ||
5639
26752cc34636 22777802 OVS should support the newly added VETH datalink as uplink port
Girish Moodalbail <Girish.Moodalbail@oracle.COM>
parents: 5509
diff changeset
  3849
	    strcmp("veth", class) == 0 ||
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3850
	    strcmp("simnet", class) == 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3851
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3852
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3853
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3854
 * 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
  3855
 * 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
  3856
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3857
 * 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
  3858
 * 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
  3859
 * 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
  3860
 * value to ALL_ZONES.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3861
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3862
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3863
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
  3864
    zoneid_t *zoneidp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3865
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3866
	char buffer[MAXLINKNAMESPECIFIER];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3867
	char *search = "/";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3868
	char *zonetoken;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3869
	char *linktoken;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3870
	char *last;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3871
	size_t namelen;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3872
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3873
	if (link_name != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3874
		link_name[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3875
	if (zoneidp != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3876
		*zoneidp = ALL_ZONES;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3877
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3878
	if ((namelen = strlcpy(buffer, name, sizeof (buffer))) >=
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3879
	    sizeof (buffer))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3880
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3881
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3882
	if ((zonetoken = strtok_r(buffer, search, &last)) == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3883
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3884
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3885
	/* 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
  3886
	if ((linktoken = strtok_r(NULL, search, &last)) == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3887
		if (namelen >= MAXLINKNAMELEN)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3888
			return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3889
		if (link_name != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3890
			(void) strlcpy(link_name, name, MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3891
		return (_B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3892
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3893
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3894
	/* 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
  3895
	if (strlen(zonetoken) >= ZONENAME_MAX || strlen(linktoken) >=
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3896
	    MAXLINKNAMELEN)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3897
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3898
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3899
	 * 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
  3900
	 * 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
  3901
	 * 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
  3902
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3903
	if (strtok_r(NULL, search, &last) != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3904
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3905
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3906
	if (link_name != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3907
		(void) strlcpy(link_name, linktoken, MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3908
	if (zoneidp != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3909
		if ((*zoneidp = getzoneidbyname(zonetoken)) < MIN_ZONEID)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3910
			return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3911
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3912
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3913
	return (_B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3914
}
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3915
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3916
/*
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3917
 * Sets *n_cores to the total number of cores on this system, or 0 if the
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3918
 * number cannot be determined.
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3919
 */
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3920
void
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3921
solaris_parse_cpuinfo(long int *n_cores)
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3922
{
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3923
	kstat2_handle_t	handle;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3924
	kstat2_status_t	stat;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3925
	kstat2_map_t	map;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3926
	kstat2_nv_t	val;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3927
	char		kuri[1024];
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3928
	int		coreid;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3929
	int		lcoreid = -1;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3930
	int		i;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3931
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3932
	*n_cores = 0;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3933
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3934
	stat = kstat2_open(&handle, NULL);
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3935
	if (stat != KSTAT2_S_OK) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3936
		dpif_log(1, "solaris_parse_cpuinfo kstat2_open failed (%s). "
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3937
		    "Core count may be inaccurate.",
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3938
		    kstat2_status_string(stat));
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3939
		return;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3940
	}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3941
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3942
	for (i = 0; ; i++) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3943
		(void) snprintf(kuri, sizeof (kuri),
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3944
		    "kstat:/system/cpu/%d/info", i);
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3945
		stat = kstat2_lookup_map(handle, kuri, &map);
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3946
		if (stat == KSTAT2_S_OK) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3947
			stat = kstat2_map_get(map, "core_id", &val);
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3948
			if (stat != KSTAT2_S_OK) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3949
				dpif_log(1, "solaris_parse_cpuinfo"
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3950
				    "kstat2_map_get failed (%s). "
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3951
				    "Core count may be inaccurate.",
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3952
				    kstat2_status_string(stat));
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3953
				*n_cores = 0;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3954
				break;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3955
			}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3956
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3957
			if (val->type != KSTAT2_NVVT_INT) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3958
				dpif_log(1, "solaris_parse_cpuinfo "
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3959
				    "kstat2 value error. "
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3960
				    "Core count may be inaccurate.");
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3961
				*n_cores = 0;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3962
				break;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3963
			}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3964
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3965
			coreid = val->kstat2_integer;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3966
			if (coreid != lcoreid) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3967
				(*n_cores)++;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3968
				lcoreid = coreid;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3969
			}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3970
		} else if (stat == KSTAT2_S_NOT_FOUND) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3971
			/* no more cores */
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3972
			break;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3973
		} else {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3974
			dpif_log(1, "solaris_parse_cpuinfo kstat2_lookup_map "
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3975
			    "failed (%s). Core count may be inaccurate.",
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3976
			    kstat2_status_string(stat));
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3977
			*n_cores = 0;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3978
			break;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3979
		}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3980
	}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3981
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3982
	kstat2_close(&handle);
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3983
}
7590
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3984
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3985
#define	ARH_FIXED_LEN	8
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3986
/*
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3987
 *  Send RARP packet on the given socket using the given MAC addresses.
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3988
 *  Need to work with multiple MAC addresses
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3989
 */
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3990
int
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3991
solaris_send_rarp(int sockfd, const uint8_t *hwaddr)
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3992
{
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3993
	int			count;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3994
	uint8_t			rarp_pkt[ETHERMIN];
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3995
	struct ether_header	*ehp;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3996
	struct arphdr		*arh;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3997
	uint8_t			*cp;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3998
	uint8_t			*cp1;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  3999
	uint8_t			plen = 4;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4000
	int			naddrs = 1;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4001
	int			err;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4002
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4003
	bzero(rarp_pkt, ETHERMIN);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4004
	ehp = (struct  ether_header *)rarp_pkt;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4005
	bcopy(&bcast_addr, &ehp->ether_dhost, ETHERADDRL);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4006
	ehp->ether_type = htons(ETHERTYPE_REVARP);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4007
	arh = (struct arphdr *)(rarp_pkt + sizeof (struct ether_header));
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4008
	cp = (uint8_t *)arh;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4009
	arh->ar_hrd = htons(ARPHRD_ETHER);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4010
	arh->ar_pro = htons(ETHERTYPE_IP);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4011
	arh->ar_hln = ETHERADDRL;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4012
	arh->ar_pln = plen;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4013
	arh->ar_op = htons(REVARP_REQUEST);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4014
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4015
	cp += ARH_FIXED_LEN;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4016
	cp1 = cp;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4017
	/* For now, only one ethernet address is supported */
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4018
	for (count = 0; count < naddrs; count++) {
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4019
		cp = cp1;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4020
		bcopy(hwaddr, &ehp->ether_shost, ETHERADDRL);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4021
		bcopy(hwaddr, cp, ETHERADDRL);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4022
		cp += ETHERADDRL;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4023
		bzero(cp, plen);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4024
		cp += plen;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4025
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4026
		bcopy(hwaddr, cp, ETHERADDRL);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4027
		cp += ETHERADDRL;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4028
		bzero(cp, plen);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4029
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4030
		/*
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4031
		 * Send the packet; Sending only one, we could send
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4032
		 * multiple with an interval between them.
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4033
		 */
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4034
		errno = 0;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4035
		if (send(sockfd, (void *)rarp_pkt, ETHERMIN, 0) < 0) {
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4036
			err = errno;
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4037
			dpif_log(err, "RARP send() failed");
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4038
			return (err);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4039
		}
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4040
	}
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4041
	return (0);
5461fab14904 25375056 Guest LDom packets may not flow w/o in-guest network activity (userland part)
Cathy Zhou <Cathy.Zhou@Oracle.COM>
parents: 7237
diff changeset
  4042
}