components/openvswitch/files/lib/util-solaris.c
author akshay.kale@oracle.com <akshay.kale@oracle.com>
Fri, 05 Aug 2016 17:24:49 -0700
changeset 6556 692ea531a2fc
parent 6538 a53c8be7d7b3
child 6924 e8aaad6b5075
permissions -rw-r--r--
24340559 ping or ssh fails if 200 VNICs are added into VXLAN based OVS (userland changes) 24334693 Introducing ofport ranges to send list of output ports in OVS (Userland changes)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     1
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     2
 * CDDL HEADER START
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     3
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     7
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    11
 * and limitations under the License.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    12
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    18
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    19
 * CDDL HEADER END
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    20
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    21
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    22
/*
5505
9706b0a9e76a 22821891 OVS dumps core after recent changes to RAD
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 5090
diff changeset
    23
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    24
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    25
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    26
#include <config.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    27
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    28
#include <stdio.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    29
#include <stdlib.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    30
#include <ctype.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    31
#include <alloca.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    32
#include <errno.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    33
#include <limits.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    34
#include <string.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    35
#include <strings.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    36
#include <stropts.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    37
#include <sys/types.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    38
#include <sys/stat.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    39
#include <fcntl.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    40
#include <unistd.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    41
#include <inet/ip.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    42
#include <inet/ip6.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    43
#include <arpa/inet.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    44
#include <sys/sockio.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    45
#include <libdlpi.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    46
#include <libdladm.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    47
#include <libdllink.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    48
#include <zone.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    49
#include <net/if_types.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    50
#include <inet/arp.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    51
#include <sys/socket.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    52
#include <netdb.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    53
#include <rad/radclient.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    54
#include <rad/client/1/dlmgr.h>
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    55
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    56
#undef	IP_VERSION
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    57
#include "netlink-protocol.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    58
#include "netlink.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    59
#include "flow.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    60
#include "packets.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    61
#include "util-solaris.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    62
#include "util.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    63
#include "dpif-solaris.h"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    64
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
    65
#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
    66
#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
    67
#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
    68
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    69
static rc_conn_t *rad_conn = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    70
static boolean_t b_true = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    71
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    72
typedef struct {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    73
	uint_t		ifsp_ppa;	/* Physical Point of Attachment */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    74
	uint_t		ifsp_lun;	/* Logical Unit number */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    75
	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
    76
	char		ifsp_devnm[LIFNAMSIZ]; /* only the device name */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    77
} ifspec_t;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    78
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
    79
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
    80
	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
    81
	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
    82
} 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
    83
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    84
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    85
extract_uint(const char *valstr, uint_t *val)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    86
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    87
	char		*ep;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    88
	unsigned long	ul;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    89
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    90
	errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    91
	ul = strtoul(valstr, &ep, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    92
	if (errno != 0 || *ep != '\0' || ul > UINT_MAX)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    93
		return (-1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    94
	*val = (uint_t)ul;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    95
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    96
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    97
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    98
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
    99
 * 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
   100
 * to a uint_t.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   101
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   102
 * 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
   103
 * necessary.
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   106
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
   107
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   108
	const char	*ep = &bp[bpsize - 1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   109
	const char	*tp;
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
	/* Lun must be all digits */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   112
	for (tp = ep; tp > bp && isdigit(*tp); tp--)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   113
		/* Null body */;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   114
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   115
	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
   116
		errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   117
		return (-1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   118
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   119
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   122
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   123
 * 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
   124
 * to a uint_t.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   125
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   126
 * 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
   127
 * necessary.
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   130
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
   131
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   132
	const char	*ep = &bp[bpsize - 1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   133
	const char	*tp;
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
	for (tp = ep; tp >= bp && isdigit(*tp); tp--)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   136
		/* Null body */;
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
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   139
	 * 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
   140
	 * 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
   141
	 * zero, return error.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   142
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   143
	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
   144
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   145
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   146
	if (extract_uint(tp + 1, ppa) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   147
		goto fail;
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
	/* 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
   150
	if (*ppa > UINT_MAX - 1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   151
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   152
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   153
fail:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   154
	errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   155
	return (-1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   156
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   157
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   158
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   159
 * 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
   160
 * 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
   161
 * the driver name will be copied to `driver'.
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
 * 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
   164
 * 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
   165
 * linkname.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   166
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   167
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   168
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
   169
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   170
	char	*tp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   171
	char    linkname[MAXLINKNAMELEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   172
	size_t	len;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   173
	uint_t	lppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   174
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   175
	if (linknamep == NULL || linknamep[0] == '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   176
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   177
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   178
	len = strlcpy(linkname, linknamep, MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   179
	if (len >= MAXLINKNAMELEN)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   180
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   181
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   182
	/* Get PPA */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   183
	if (getppa(linkname, len, &lppa) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   184
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   185
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   186
	/* 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
   187
	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
   188
		*tp = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   189
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   190
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   191
	 * 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
   192
	 * 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
   193
	 * ('_'), hyphen ('-'), and period ('.'). The first character
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   194
	 * 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
   195
	 * character.
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
	if (!isalpha(linkname[0]))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   198
		goto fail;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   199
	for (tp = linkname + 1; *tp != '\0'; tp++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   200
		if (!isalnum(*tp) && *tp != '_' && *tp != '-' && *tp != '.')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   201
			goto fail;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   204
	if (driver != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   205
		(void) strlcpy(driver, linkname, dsize);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   206
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   207
	if (ppa != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   208
		*ppa = lppa;
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
	return (_B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   211
fail:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   212
	errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   213
	return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   214
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   215
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   216
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   217
 * 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
   218
 *	- 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
   219
 *	- 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
   220
 *		for e.g. bge0:34
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   221
 * 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
   222
 * ifspec_t.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   223
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   224
 * 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
   225
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   226
static boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   227
ifparse_ifspec(const char *ifname, ifspec_t *ifsp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   228
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   229
	char	*lp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   230
	char	ifnamecp[LIFNAMSIZ];
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
	if (ifname == NULL || ifname[0] == '\0' ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   233
	    strlcpy(ifnamecp, ifname, LIFNAMSIZ) >= LIFNAMSIZ) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   234
		errno = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   235
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   236
	}
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
	ifsp->ifsp_lunvalid = _B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   239
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   240
	/* Any logical units? */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   241
	lp = strchr(ifnamecp, ':');
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   242
	if (lp != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   243
		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
   244
			return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   245
		*lp = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   246
		ifsp->ifsp_lunvalid = _B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   247
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   248
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   249
	return (dlparse_drvppa(ifnamecp, ifsp->ifsp_devnm,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   250
	    sizeof (ifsp->ifsp_devnm), &ifsp->ifsp_ppa));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   251
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   252
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
 * Issues the ioctl SIOCSLIFNAME to kernel.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   255
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   256
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   257
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
   258
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   259
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   260
	int		status = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   261
	ifspec_t	ifsp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   262
	boolean_t	valid_if;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   263
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   264
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   265
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   266
	/* We should have already validated the interface name. */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   267
	valid_if = ifparse_ifspec(ifname, &ifsp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   268
	ovs_assert(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
	lifr.lifr_ppa = ifsp.ifsp_ppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   271
	lifr.lifr_flags = flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   272
	(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
   273
	if (ioctl(fd, SIOCSLIFNAME, &lifr) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   274
		status = errno;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   277
	return (status);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   278
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   279
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   280
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   281
 * 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
   282
 * Returns: Result from ioctl().
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   283
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   284
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   285
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
   286
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   287
	struct strioctl ioc;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   288
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   289
	(void) memset(&ioc, 0, sizeof (ioc));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   290
	ioc.ic_cmd = cmd;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   291
	ioc.ic_timout = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   292
	ioc.ic_len = buflen;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   293
	ioc.ic_dp = buf;
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
	return (ioctl(s, I_STR, (char *)&ioc));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   296
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   297
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   298
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   299
 * 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
   300
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   301
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   302
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
   303
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   304
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   305
	ifspec_t	ifsp;
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
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   308
	(void) ifparse_ifspec(ifname, &ifsp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   309
	lifr.lifr_ppa = ifsp.ifsp_ppa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   310
	lifr.lifr_flags = flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   311
	(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
   312
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   313
	 * 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
   314
	 * 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
   315
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   316
	if (strioctl(fd, SIOCSLIFNAME, (char *)&lifr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   317
	    sizeof (lifr)) == -1) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   318
		return (errno);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   319
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   320
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   323
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   324
 * 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
   325
 * 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
   326
 * 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
   327
 * the bottom of the stream for tunneling interfaces.
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   330
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
   331
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   332
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   333
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   334
	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
   335
		return (errno);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   336
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   337
	 * 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
   338
	 * 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
   339
	 * 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
   340
	 * 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
   341
	 * 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
   342
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   343
	while (ioctl(*fd, I_POP, 0) != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   344
		;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   345
	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
   346
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   347
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   348
	err = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   349
	(void) close(*fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   350
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   351
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   352
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   353
static char *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   354
solaris_proto2str(uint8_t protocol)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   355
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   356
	if (protocol == IPPROTO_TCP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   357
		return ("tcp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   358
	if (protocol == IPPROTO_UDP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   359
		return ("udp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   360
	if (protocol == IPPROTO_SCTP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   361
		return ("sctp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   362
	if (protocol == IPPROTO_ICMPV6)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   363
		return ("icmpv6");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   364
	if (protocol == IPPROTO_ICMP)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   365
		return ("icmp");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   366
	else
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   367
		return ("");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   368
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   369
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   370
static uint8_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   371
solaris_str2proto(const char *protostr)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   372
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   373
	if (strcasecmp(protostr, "tcp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   374
		return (IPPROTO_TCP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   375
	else if (strcasecmp(protostr, "udp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   376
		return (IPPROTO_UDP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   377
	else if (strcasecmp(protostr, "sctp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   378
		return (IPPROTO_SCTP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   379
	else if (strcasecmp(protostr, "icmpv6") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   380
		return (IPPROTO_ICMPV6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   381
	else if (strcasecmp(protostr, "icmp") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   382
		return (IPPROTO_ICMP);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   383
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   384
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   385
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   386
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   387
 * 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
   388
 * in the buffer pointed to by `flags'.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   389
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   390
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   391
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
   392
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   393
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   394
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   395
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   396
	(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
   397
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   398
	if (ioctl(sock, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   399
		return (errno);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   400
	*flags = lifr.lifr_flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   401
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   402
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   405
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   406
 * 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
   407
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   408
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   409
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
   410
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   411
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   412
	int		error = 0;
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
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   415
	(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
   416
	if (ioctl(sock, SIOCGLIFFLAGS, (caddr_t)&lifr) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   417
		error = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   418
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   419
	if (error == 0 && flags != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   420
		*flags = lifr.lifr_flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   421
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   422
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   423
}
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   426
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
   427
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   428
	int		ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   429
	int		arp_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   430
	int		mux_fd = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   431
	int		muxid_fd = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   432
	char		*udp_dev_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   433
	uint64_t	ifflags = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   434
	boolean_t	changed_arp_muxid = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   435
	struct lifreq	lifr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   436
	int		ret = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   437
	boolean_t	v6 = (af == AF_INET6);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   438
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   439
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   440
	 * 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
   441
	 * the same now for PUNLINK also.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   442
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   443
	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
   444
	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
   445
		ret = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   446
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   447
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   448
	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
   449
	if (ret != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   450
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   451
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   452
	bzero(&lifr, sizeof (lifr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   453
	(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
   454
	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
   455
		ret = errno;
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
	arp_muxid = lifr.lifr_arp_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   459
	ip_muxid = lifr.lifr_ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   460
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   461
	ret = solaris_get_flags(sock, ifname, &ifflags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   462
	if (ret != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   463
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   464
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   465
	 * 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
   466
	 * 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
   467
	 * 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
   468
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   469
	if (arp_muxid != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   470
		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
   471
			if ((errno == EINVAL) &&
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   472
			    (ifflags & (IFF_NOARP | IFF_IPV6))) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   473
				/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   474
				 * Some plumbing utilities set the muxid to
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   475
				 * -1 or some invalid value to signify that
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   476
				 * 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
   477
				 * before trying to unplumb the IP stream.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   478
				 * 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
   479
				 * 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
   480
				 * for consistency of IP-ARP streams.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   481
				 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   482
				lifr.lifr_arp_muxid = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   483
				(void) ioctl(muxid_fd, SIOCSLIFMUXID,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   484
				    (caddr_t)&lifr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   485
				changed_arp_muxid = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   486
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   487
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   488
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   489
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   490
	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
   491
		if (changed_arp_muxid) {
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
			 * Some error occurred, and we need to restore
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   494
			 * everything back to what it was.
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
			ret = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   497
			lifr.lifr_arp_muxid = arp_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   498
			lifr.lifr_ip_muxid = ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   499
			(void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   500
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   501
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   502
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   503
	if (muxid_fd != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   504
		(void) close(muxid_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   505
	if (mux_fd != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   506
		(void) close(mux_fd);
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
	return (ret);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   509
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   510
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   511
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   512
 * Plumbs the interface `ifname'.
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
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   515
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
   516
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   517
	int		ip_muxid;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   518
	int		mux_fd = -1, ip_fd, arp_fd;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   519
	char		*udp_dev_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   520
	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
   521
	uint64_t	ifflags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   522
	uint_t		dlpi_flags;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   523
	int		status = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   524
	const char	*linkname;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   525
	int		ret;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   526
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   527
	if (solaris_if_enabled(sock, ifname, NULL) == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   528
		status = EEXIST;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   529
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   530
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   531
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   532
	dlpi_flags = DLPI_NOATTACH;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   533
	linkname = ifname;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   534
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   535
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   536
	 * 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
   537
	 * itself for DLPI style-2 devices.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   538
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   539
	ret = dlpi_open(linkname, &dh_ip, dlpi_flags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   540
	if (ret != DLPI_SUCCESS) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   541
		ret = (ret == DL_SYSERR) ? errno : EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   542
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   543
	}
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
	ip_fd = dlpi_fd(dh_ip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   546
	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
   547
		status = errno;
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
	if (af == AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   552
		ifflags = IFF_IPV4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   553
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   554
		ifflags = IFF_IPV6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   555
		ifflags |= IFF_NOLINKLOCAL;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   558
	status = slifname(ifname, ifflags, ip_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   559
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   560
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   561
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   562
	/* 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
   563
	status = solaris_get_flags(sock, ifname, &ifflags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   564
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   565
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   566
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   567
	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
   568
	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
   569
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   570
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   571
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   572
	/* Check if arp is not needed */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   573
	if (ifflags & (IFF_NOARP|IFF_IPV6)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   574
		/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   575
		 * 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
   576
		 * without tearing down the stream.
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
		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
   579
			status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   580
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   581
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   582
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
	 * 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
   585
	 * from the interface to ARP.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   586
	 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   587
	 * 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
   588
	 * itself for DLPI style-2 devices.
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
	ret = dlpi_open(linkname, &dh_arp, dlpi_flags);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   591
	if (ret != DLPI_SUCCESS) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   592
		ret = (ret == DL_SYSERR) ? errno : EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   593
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   594
	}
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
	arp_fd = dlpi_fd(dh_arp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   597
	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
   598
		status = errno;
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
	status = slifname_arp(ifname, ifflags, arp_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   602
	if (status != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   603
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   604
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   605
	 * 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
   606
	 * without tearing down the stream.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   607
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   608
	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
   609
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   610
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   611
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   612
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   613
	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
   614
		status = errno;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   615
		(void) ioctl(mux_fd, I_PUNLINK, ip_muxid);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   616
	}
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
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   619
	dlpi_close(dh_ip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   620
	if (dh_arp != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   621
		dlpi_close(dh_arp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   622
	if (mux_fd != -1)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   623
		(void) close(mux_fd);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   624
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   625
	return (status);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   626
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   627
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   628
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   629
solaris_init_rad()
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   630
{
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
   631
	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
   632
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   633
	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
   634
		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
   635
			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
   636
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
		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
   638
		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
   639
		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
   640
			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
   641
		}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
   642
		return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   643
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   644
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   645
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   646
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
   647
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   648
	if (strcmp(key, "class") == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   649
		(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
   650
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   651
	return (RCE_OK);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   652
}
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
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   655
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
   656
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   657
	/* 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
   658
	if (strcmp(key, "over") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   659
		(void) strlcpy((char *)arg, dlval->ddlv_slist[0],
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   660
		    DLADM_STRSIZE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   661
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   662
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   663
	return (RCE_OK);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   664
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   665
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   666
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   667
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
   668
    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
   669
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   670
	dlmgr__rad_dict_string_DLValue_t *linkinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   671
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   672
	rc_instance_t		*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   673
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   674
	char			propstr[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   675
	int			error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   676
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   677
	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
   678
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   679
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   680
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   681
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   684
	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
   685
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   686
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   687
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   688
			    "failed Datalink_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   689
			    netdev_name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   690
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   691
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   692
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   693
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   694
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   695
	propstr[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   696
	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
   697
	    propstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   698
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   699
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   700
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   701
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   702
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   703
	memcpy(info_val, propstr, info_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   704
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   705
	dlmgr__rad_dict_string_DLValue_free(linkinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   706
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   707
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   708
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   709
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   710
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   711
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   712
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
   713
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   714
	dlmgr__rad_dict_string_DLValue_t *linkinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   715
	dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   716
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   717
	rc_instance_t		*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   718
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   719
	int			error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   720
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   721
	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
   722
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   723
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   724
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   725
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   728
	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
   729
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   730
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   731
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   732
			    "failed Physical_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   733
			    netdev_name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   734
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   735
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   736
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   737
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   738
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   739
	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
   740
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   741
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   742
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   743
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   746
	memcpy(name_val, dlval->ddlv_sval, name_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   747
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   748
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   749
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   750
	dlmgr__rad_dict_string_DLValue_free(linkinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   751
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   752
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   753
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   754
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   755
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   756
solaris_get_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
   757
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   758
	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
   759
	    test_dlclass));
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   762
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   763
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
   764
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   765
	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
   766
	    test_dllower));
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   769
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   770
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
   771
    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
   772
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   773
	dlmgr_DLDict_t		**dlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   774
	dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   775
	dlmgr_DatalinkError_t   *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   776
	rc_instance_t		*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   777
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   778
	const char		*props[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   779
	const char		*fields[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   780
	int			ndlist = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   781
	int			error = 0, i = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   782
	char			buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   783
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   784
	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
   785
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   786
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   787
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   788
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   789
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   790
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   791
	props[0] = prop_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   792
	fields[0] = field_name;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   793
	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
   794
	    &dlist, &ndlist, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   795
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   796
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   797
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   798
			    "failed Datalink_getProperties(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   799
			    netdev_name, prop_name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   800
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   801
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   802
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   803
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   804
	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
   805
	    field_name, &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   806
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   807
		error = EINVAL;
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
	switch (dlval->ddlv_type) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   811
	case DDLVT_STRING:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   812
		if (dlval->ddlv_sval == NULL) {
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
		memcpy(prop_value, dlval->ddlv_sval, prop_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   817
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   818
	case DDLVT_STRINGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   819
		if (dlval->ddlv_slist_count == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   820
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   821
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   822
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   823
		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
   824
			(void) snprintf(buf, sizeof (buf), "%s%s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   825
			    (i != 0 ? "," : ""), dlval->ddlv_slist[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   826
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   827
		memcpy(prop_value, buf, prop_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   828
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   829
	case DDLVT_ULONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   830
		if (dlval->ddlv_ulval == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   831
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   832
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   833
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   834
		(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
   835
		memcpy(prop_value, buf, prop_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   836
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   837
	case DDLVT_BOOLEAN:
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   838
		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
   839
			error = EINVAL;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   840
			goto out;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   841
		}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   842
		(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
   843
		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
   844
		break;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   845
	case DDLVT_BOOLEANS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   846
	case DDLVT_LONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   847
	case DDLVT_LONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   848
	case DDLVT_ULONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   849
	case DDLVT_DICTIONARY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   850
	case DDLVT_DICTIONARYS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   851
	default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   852
		ovs_assert(0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   853
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   854
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   855
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   856
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   857
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   858
	dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   859
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   860
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   861
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   862
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   863
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   864
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
   865
    dlmgr_DLValueType_t vtype, boolean_t temp)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   866
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   867
	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
   868
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   869
	dlmgr_DLValue_t			new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   870
	rc_instance_t			*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   871
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   872
	dlmgr_DatalinkError_t   	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   873
	int				error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   874
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   875
	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
   876
	    "name", netdev_name);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   877
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   878
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   879
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   882
	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
   883
	if (sprop_dict == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   884
		status = ENOMEM;
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
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   889
	new_val.ddlv_type = vtype;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   890
	switch (vtype) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   891
	case DDLVT_BOOLEAN:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   892
		new_val.ddlv_bval = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   893
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   894
		    sprop_dict, propname, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   895
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   896
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   897
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   898
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   899
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   900
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   901
	case DDLVT_ULONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   902
		new_val.ddlv_ulval = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   903
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   904
		    sprop_dict, propname, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   905
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   906
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   907
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   908
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   909
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   910
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   911
	case DDLVT_STRING:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   912
		new_val.ddlv_sval = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   913
		status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   914
		    sprop_dict, propname, &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   915
		if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   916
			error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   917
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   918
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   919
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   920
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   921
	case DDLVT_LONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   922
	case DDLVT_LONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   923
	case DDLVT_ULONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   924
	case DDLVT_STRINGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   925
	case DDLVT_BOOLEANS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   926
	case DDLVT_DICTIONARY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   927
	case DDLVT_DICTIONARYS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   928
	default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   929
		ovs_assert(0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   930
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   931
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   932
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   933
	if (temp) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   934
		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
   935
		old_val = NULL;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   936
		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
   937
		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
   938
		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
   939
		    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
   940
		if (status != RCE_OK) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   941
			error = EINVAL;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   942
			goto out;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   943
		}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   944
		dlmgr_DLValue_free(old_val);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   945
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   946
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   947
	status = dlmgr_Datalink_setProperties(link, sprop_dict, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   948
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   949
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   950
			dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   951
			    "failed Datalink_setPropertiess(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   952
			    netdev_name, propname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   953
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   954
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   955
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   956
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   957
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   958
	dlmgr__rad_dict_string_DLValue_free(sprop_dict);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   959
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   960
	return (error);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   963
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   964
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
   965
    void *arg, boolean_t temp)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   966
{
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   967
	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
   968
	    temp));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   969
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   970
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   971
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   972
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
   973
    void *arg, boolean_t temp)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   974
{
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   975
	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
   976
	    temp));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   977
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   978
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   979
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   980
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
   981
    void *arg, boolean_t temp)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   982
{
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
   983
	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
   984
	    temp));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   985
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   986
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   987
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   988
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
   989
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   990
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   991
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   992
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   993
	dlmgr_DLValue_t			name_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   994
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   995
	rc_instance_t			*vnic = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   996
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   997
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
   998
	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
   999
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1000
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1001
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1002
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1003
	prop = dlmgr__rad_dict_string_DLValue_create(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1004
	if (prop == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1005
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1006
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1007
	bzero(&name_val, sizeof (name_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1008
	name_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1009
	/* 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
  1010
	name_val.ddlv_sval = strdupa(linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1011
	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
  1012
	    &name_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1013
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1014
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1015
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1016
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1017
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1018
	status = dlmgr_DatalinkManager_createVNIC(linkmgr, vnicname, prop,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1019
	    &vnic, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1020
	if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1021
		dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1022
		    "failed DatalinkManager_createVNIC(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1023
		    vnicname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1024
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1025
	rc_instance_rele(vnic);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1026
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1027
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1028
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1029
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1030
	return ((status != RCE_OK) ? ENOTSUP : 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1031
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1032
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1033
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1034
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
  1035
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1036
	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
  1037
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1038
	dlmgr_DLValue_t			new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1039
	rc_instance_t			*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1040
	rc_err_t			status;
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
	int				error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1043
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1044
	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
  1045
	    "name", vnicname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1046
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1047
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1048
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1049
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1050
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1051
	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
  1052
	if (sprop_dict == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1053
		status = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1054
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1055
	}
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(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1058
	new_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1059
	new_val.ddlv_sval = strdupa(linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1060
	status = dlmgr__rad_dict_string_DLValue_put(
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1061
	    sprop_dict, "lower-link", &new_val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1062
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1063
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1064
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1065
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1066
	dlmgr_DLValue_free(old_val);
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_Datalink_setProperties(link, sprop_dict, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1069
	if (status != RCE_OK) {
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 Datalink_setPropertiess(%s, lower-link): "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1073
			    " %s", 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
		error = ENOTSUP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1076
	}
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_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1079
	dlmgr__rad_dict_string_DLValue_free(sprop_dict);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1080
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1081
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1082
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1083
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1084
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1085
solaris_delete_vnic(const char *vnicname)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1086
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1087
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1088
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1089
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1090
	int				err = 0;
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
	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
  1093
	    &linkmgr, 0);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1094
	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
  1095
		return (EINVAL);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1096
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1097
	status = dlmgr_DatalinkManager_deleteVNIC(linkmgr, vnicname, NULL,
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1098
	    &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1099
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1100
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1101
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1102
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1103
			dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1104
			    "failed DatalinkManager_deleteVNIC(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1105
			    vnicname, derrp->dde_errmsg);
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
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1109
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1110
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1111
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1112
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1113
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1114
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1115
solaris_create_etherstub(const char *name)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1116
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1117
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1118
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1119
	rc_instance_t			*etherstub = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1120
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1121
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1122
	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
  1123
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1124
	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
  1125
		return (ENOTSUP);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1126
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1127
	status = dlmgr_DatalinkManager_createEtherstub(linkmgr, name, NULL,
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1128
	    &etherstub, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1129
	if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1130
		dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1131
		    "failed DatalinkManager_createEtherstub(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1132
		    name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1133
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1134
	rc_instance_rele(etherstub);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1135
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1136
	rc_instance_rele(linkmgr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1137
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1138
	return ((status != RCE_OK) ? ENOTSUP : 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1139
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1140
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1141
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1142
solaris_delete_etherstub(const char *name)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1143
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1144
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1145
	rc_instance_t			*linkmgr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1146
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1147
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1148
	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
  1149
	    &linkmgr, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1150
	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
  1151
		return (ENOTSUP);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1152
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1153
	status = dlmgr_DatalinkManager_deleteEtherstub(linkmgr, name, NULL,
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1154
	    &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1155
	if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1156
		dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1157
		    "failed DatalinkManager_deleteEtherstub(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1158
		    name, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1159
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1160
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1161
	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
  1162
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1163
	return ((status != RCE_OK) ? ENOTSUP : 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1164
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1165
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1166
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1167
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
  1168
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1169
	uchar_t		*addr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1170
	int		len, err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1171
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1172
	if ((addr = _link_aton(str, &len)) == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1173
		return ((len == -1) ? EINVAL : ENOMEM);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1174
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1175
	if (len != maclen) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1176
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1177
		goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1178
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1179
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1180
	bcopy(addr, f, maclen);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1181
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1182
	free(addr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1183
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1184
}
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
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1187
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
  1188
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1189
	struct in_addr	v4addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1190
	struct in6_addr	v6addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1191
	int		af;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1192
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1193
	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
  1194
		af = AF_INET;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1195
	} 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
  1196
		af = AF_INET6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1197
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1198
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1199
	}
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
	if (af == AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1202
		IN6_INADDR_TO_V4MAPPED(&v4addr, f);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1203
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1204
		*f = v6addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1205
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1206
	*afp = af;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1207
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1208
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1209
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1210
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1211
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
  1212
    char *linkname, size_t size)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1213
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1214
	dlmgr__rad_dict_string_DLValue_t *fdict;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1215
	dlmgr_DLValue_t		*flist = NULL, *dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1216
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1217
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1218
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1219
	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
  1220
	    &flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1221
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1222
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1223
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1224
	fdict = flist->ddlv_dlist[0]->ddld_map;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1225
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1226
	status = dlmgr__rad_dict_string_DLValue_get(fdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1227
	    "linkname", &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1228
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1229
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1230
		goto out;
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
	(void) strlcpy(linkname, dlval->ddlv_sval, size);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1233
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1234
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1235
	dlmgr_DLValue_free(flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1236
	return (err);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1239
static void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1240
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
  1241
    size_t rbuf_len)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1242
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1243
	char *str = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1244
	char *pstr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1245
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1246
	buf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1247
	rbuf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1248
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1249
	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
  1250
		str = _link_ntoa(f, NULL, ETHERADDRL, IFT_ETHER);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1251
		if (str != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1252
			pstr = _link_ntoa(m, NULL, ETHERADDRL, IFT_ETHER);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1253
			if (pstr != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1254
				(void) snprintf(buf, buf_len, "%s", str);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1255
				(void) snprintf(rbuf, rbuf_len, "%s", pstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1256
				free(pstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1257
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1258
			free(str);
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
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1261
}
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
static void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1264
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
  1265
    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
  1266
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1267
	struct in_addr ipaddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1268
	char abuf[INET6_ADDRSTRLEN], mbuf[INET6_ADDRSTRLEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1269
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1270
	buf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1271
	rbuf[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1272
	if ((f6 != NULL) && (m6 != NULL) &&
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1273
	    (!ipv6_addr_equals(f6, &in6addr_any) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1274
	    !ipv6_addr_equals(m6, &in6addr_any))) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1275
		(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
  1276
		(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
  1277
		(void) snprintf(buf, buf_len, "%s", abuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1278
		(void) snprintf(rbuf, rbuf_len, "%s", mbuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1279
	} else if (f4 != 0 || m4 != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1280
		ipaddr.s_addr = f4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1281
		(void) strlcpy(abuf, inet_ntoa(ipaddr), sizeof (abuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1282
		ipaddr.s_addr = m4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1283
		(void) strlcpy(mbuf, inet_ntoa(ipaddr), sizeof (mbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1284
		(void) snprintf(buf, buf_len, "%s", abuf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1285
		(void) snprintf(rbuf, rbuf_len, "%s", mbuf);
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
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1288
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1289
#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
  1290
#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
  1291
#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
  1292
#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
  1293
#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
  1294
#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
  1295
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1296
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
  1297
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
  1298
{
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
  1299
	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
  1300
}
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
  1301
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
  1302
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
  1303
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
  1304
    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
  1305
{
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
  1306
	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
  1307
	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
  1308
	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
  1309
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
  1310
	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
  1311
	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
  1312
		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
  1313
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
  1314
	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
  1315
		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
  1316
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
  1317
	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
  1318
		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
  1319
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
  1320
	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
  1321
	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
  1322
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
  1323
	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
  1324
		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
  1325
			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
  1326
		} 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
  1327
			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
  1328
			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
  1329
		}
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
  1330
	}
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
  1331
	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
  1332
	*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
  1333
	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
  1334
}
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
  1335
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
  1336
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1337
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
  1338
    int nofports)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1339
{
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1340
	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
  1341
	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
  1342
	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
  1343
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1344
	if (nofports == 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
  1345
		if (snprintf(buf, sizeof (buf), "%soutports%cdrop",
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1346
		    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
  1347
		    FP_NAME_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
  1348
			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
  1349
		}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1350
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1351
		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
  1352
			return (ENOBUFS);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1353
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1354
		return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1355
	}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1356
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
  1357
	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
  1358
	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
  1359
		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
  1360
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
  1361
	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
  1362
	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
  1363
		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
  1364
		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
  1365
	}
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
  1366
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
  1367
	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
  1368
	    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
  1369
		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
  1370
	}
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
  1371
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
  1372
	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
  1373
		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
  1374
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
  1375
	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
  1376
		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
  1377
			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
  1378
			    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
  1379
			    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
  1380
				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
  1381
			}
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
  1382
		} 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
  1383
			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
  1384
			    (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
  1385
			    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
  1386
			    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
  1387
			    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
  1388
				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
  1389
			}
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
  1390
		}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1391
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1392
		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
  1393
			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
  1394
	}
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
  1395
	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
  1396
	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
  1397
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
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
  1399
	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
  1400
	return (ENOBUFS);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1401
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1402
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1403
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1404
dlmgr_DLValue_putstring(dlmgr__rad_dict_string_DLValue_t *ddvp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1405
    const char *key, char *buf, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1406
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1407
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1408
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1409
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1410
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1411
	if (strlen(key) != 0) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1412
		bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1413
		new_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1414
		new_val.ddlv_sval = buf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1415
		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
  1416
		    &new_val, &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1417
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1418
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1419
		snprintf(dstr, dstrlen, "%s,%s=%s", dstr, key, buf);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1420
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1421
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1422
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1423
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1424
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1425
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1426
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
  1427
    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
  1428
    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
  1429
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1430
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1431
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1432
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1433
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1434
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1435
		bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1436
		new_val.ddlv_type = DDLVT_STRING;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1437
		new_val.ddlv_sval = buf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1438
		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
  1439
		    &new_val, &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1440
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1441
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1442
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1443
		old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1444
		new_val.ddlv_sval = rbuf;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1445
		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
  1446
		    &new_val, &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1447
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1448
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1449
		dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1450
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1451
		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
  1452
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1453
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1454
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1455
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1456
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1457
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
  1458
    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
  1459
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1460
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1461
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1462
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1463
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1464
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1465
	new_val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1466
	new_val.ddlv_bval = &val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1467
	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
  1468
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1469
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1470
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1471
	snprintf(dstr, dstrlen, "%s,%s=%s", dstr, key,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1472
	    val ? "true" : "false");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1473
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1474
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1475
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1476
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1477
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1478
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
  1479
    uint64_t val, char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1480
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1481
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1482
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1483
	unsigned long long ulval = val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1484
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1485
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1486
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1487
	new_val.ddlv_type = DDLVT_ULONG;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1488
	new_val.ddlv_ulval = &ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1489
	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
  1490
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1491
		return (EINVAL);
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
	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
  1494
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1495
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1498
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1499
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
  1500
    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
  1501
    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
  1502
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1503
	dlmgr_DLValue_t  *old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1504
	dlmgr_DLValue_t  new_val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1505
	unsigned long long f_ulval = f;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1506
	unsigned long long m_ulval = m;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1507
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1508
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1509
	bzero(&new_val, sizeof (new_val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1510
	new_val.ddlv_type = DDLVT_ULONG;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1511
	new_val.ddlv_ulval = &f_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1512
	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
  1513
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1514
		return (EINVAL);
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
	dlmgr_DLValue_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1517
	old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1518
	new_val.ddlv_ulval = &m_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1519
	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
  1520
	    &old_val)) != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1521
		return (EINVAL);
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_free(old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1524
	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
  1525
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1528
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1529
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
  1530
    dlmgr__rad_dict_string_DLValue_t *ddvp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1531
    dlmgr__rad_dict_string_DLValue_t *ddmp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1532
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1533
	char		buf[DLADM_STRSIZE], rbuf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1534
	char		dstr[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1535
	int		err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1536
	boolean_t	is_arp = (ntohs(f->dl_type) == 0x806);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1537
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1538
	dstr[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1539
	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
  1540
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "sap",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1541
		    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
  1542
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1543
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1544
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1545
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1546
	if (is_arp) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1547
		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
  1548
			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
  1549
			    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
  1550
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1551
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1552
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1553
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1554
		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
  1555
		    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1556
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1557
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1558
			    "arp-sender", buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1559
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1560
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1561
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1562
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1563
		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
  1564
		    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1565
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1566
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1567
			    "arp-target", buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1568
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1569
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1570
		}
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
		flow_addr2str(NULL, NULL, f->nw_src, m->nw_src, buf, rbuf,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1573
		    sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1574
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1575
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp, "arp-sip",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1576
			    buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1577
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1578
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1579
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1580
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1581
		flow_addr2str(NULL, NULL, f->nw_dst, m->nw_dst, buf, rbuf,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1582
		    sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1583
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1584
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp, "arp-tip",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1585
			    buf, rbuf,  dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1586
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1587
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1588
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1589
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1590
		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
  1591
			err = dlmgr_DLValue_fm_putulong(ddvp, ddmp, "transport",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1592
			    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
  1593
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1594
				goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1597
		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
  1598
		    buf, rbuf, sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1599
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1600
			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
  1601
			    buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1602
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1603
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1604
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1605
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1606
		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
  1607
		    buf, rbuf, sizeof (buf), sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1608
		if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1609
			err = dlmgr_DLValue_fm_putstring(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1610
			    "remote-ip", buf, rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1611
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1612
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1613
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1614
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1615
		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
  1616
			err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1617
			    "tcp-flags", (uint8_t)(ntohs(f->tcp_flags)),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1618
			    (uint8_t)(ntohs(m->tcp_flags)), dstr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1619
			    sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1620
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1621
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1622
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1623
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1624
		if (f->nw_proto != IPPROTO_ICMP &&
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1625
		    f->nw_proto != IPPROTO_ICMPV6) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1626
			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
  1627
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1628
				    "local-port", ntohs(f->tp_src),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1629
				    ntohs(m->tp_src), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1630
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1631
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1632
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1633
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1634
			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
  1635
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1636
				    "remote-port", ntohs(f->tp_dst),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1637
				    ntohs(m->tp_dst), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1638
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1639
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1640
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1641
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1642
			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
  1643
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1644
				    "icmp-type", ntohs(f->tp_src),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1645
				    ntohs(m->tp_src), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1646
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1647
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1648
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1649
			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
  1650
				err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1651
				    "icmp-code", ntohs(f->tp_dst),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1652
				    ntohs(m->tp_dst), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1653
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1654
					goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1655
			}
6160
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1656
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1657
			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
  1658
			    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
  1659
			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
  1660
				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
  1661
				    "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
  1662
				    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
  1663
				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
  1664
					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
  1665
			}
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1666
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1667
			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
  1668
			    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
  1669
			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
  1670
				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
  1671
				    "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
  1672
				    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
  1673
				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
  1674
					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
  1675
			}
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1676
50085258c4b0 22920349 provide support for Neighbor Discovery for IPv6 in OVS
akshay.kale@oracle.com <akshay.kale@oracle.com>
parents: 6018
diff changeset
  1677
			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
  1678
			    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
  1679
			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
  1680
				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
  1681
				    "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
  1682
				    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
  1683
				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
  1684
					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
  1685
			}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1686
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1687
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1688
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
	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
  1691
	    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1692
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1693
		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
  1694
		    rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1695
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1696
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1697
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1698
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1699
	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
  1700
	    sizeof (rbuf));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1701
	if (strlen(buf) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1702
		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
  1703
		    rbuf, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1704
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1705
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1706
	}
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
	if (f->in_port.odp_port != ODPP_NONE) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1709
		err = dlmgr_DLValue_putulong(ddvp, "srcport",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1710
		    f->in_port.odp_port, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1711
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1712
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1713
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1714
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
  1715
	/*
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
  1716
	 * 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
  1717
	 * 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
  1718
	 * 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
  1719
	 */
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
  1720
	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
  1721
	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
  1722
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1723
		    "vlan-tci", ntohs(f->vlan_tci),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1724
		    ntohs(m->vlan_tci), dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1725
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1726
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1727
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1728
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1729
	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
  1730
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1731
		    "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
  1732
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1733
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1734
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1735
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1736
	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
  1737
		err = dlmgr_DLValue_fm_putulong(ddvp, ddmp,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1738
		    "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
  1739
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1740
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1741
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1742
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
  1743
	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
  1744
		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
  1745
		    "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
  1746
		    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
  1747
		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
  1748
			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
  1749
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
  1750
		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
  1751
		    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
  1752
		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
  1753
			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
  1754
			    "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
  1755
			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
  1756
				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
  1757
		}
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
  1758
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
  1759
		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
  1760
		    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
  1761
		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
  1762
			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
  1763
			    "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
  1764
			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
  1765
				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
  1766
		}
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
  1767
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
  1768
		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
  1769
		    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
  1770
		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
  1771
			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
  1772
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
  1773
		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
  1774
		    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
  1775
		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
  1776
			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
  1777
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
  1778
		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
  1779
		    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
  1780
		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
  1781
			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
  1782
	}
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
  1783
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1784
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1785
	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
  1786
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1787
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1788
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1789
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1790
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
  1791
    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
  1792
    char *dstr, size_t dstrlen)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1793
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1794
	struct smap details;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1795
	const char *max_rate = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1796
	uint64_t maxbw;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1797
	char *endp = NULL;
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  1798
	int err = EINVAL;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1799
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1800
	smap_init(&details);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1801
	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
  1802
		goto done;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1803
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1804
	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
  1805
	    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
  1806
		goto done;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1807
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1808
	/* min-rate and priority not currently used */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1809
	max_rate = smap_get(&details, "max-rate");
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1810
	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
  1811
		goto done;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1812
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1813
	errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1814
	maxbw = strtoull(max_rate, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1815
	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
  1816
		goto done;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1817
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1818
	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
  1819
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1820
done:
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1821
	smap_destroy(&details);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1822
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1823
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1824
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1825
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1826
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
  1827
    const struct ovs_key_ethernet *ek)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1828
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1829
	char *sstr = NULL, *dstr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1830
	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
  1831
	int err = ENOBUFS;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1832
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1833
	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
  1834
	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
  1835
	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
  1836
		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
  1837
		    "%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
  1838
		    (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
  1839
		    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
  1840
		    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
  1841
		    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
  1842
		    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
  1843
			err = 0;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1844
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1845
	free(sstr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1846
	free(dstr);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1847
	if (sstr == NULL || dstr == NULL)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1848
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1849
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1850
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1851
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1852
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1853
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
  1854
    const struct ovs_key_ipv4 *ipv4)
5090
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
	struct in_addr ipaddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1857
	char *cp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1858
	char buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1859
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1860
	ipaddr.s_addr = ipv4->ipv4_src;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1861
	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
  1862
	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
  1863
	    (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
  1864
	    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
  1865
	    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
  1866
		return (ENOBUFS);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1867
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1868
	ipaddr.s_addr = ipv4->ipv4_dst;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1869
	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
  1870
	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
  1871
	    "%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
  1872
	    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
  1873
	    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
  1874
	    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
  1875
	    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
  1876
	    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
  1877
		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
  1878
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1879
	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
  1880
		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
  1881
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
  1882
	return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1883
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1884
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1885
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1886
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
  1887
    const struct ovs_key_ipv6 *ipv6)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1888
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1889
	char abuf[INET6_ADDRSTRLEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1890
	char buf[DLADM_STRSIZE];
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
	(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
  1893
	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
  1894
	    "%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
  1895
	    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
  1896
	    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
  1897
	    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
  1898
		return (ENOBUFS);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1899
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1900
	(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
  1901
	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
  1902
	    "%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
  1903
	    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
  1904
	    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
  1905
	    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
  1906
	    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
  1907
	    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
  1908
	    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
  1909
	    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
  1910
		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
  1911
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1912
	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
  1913
		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
  1914
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
  1915
	return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1916
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1917
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1918
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1919
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
  1920
    uint16_t src, uint16_t dst)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1921
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1922
	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
  1923
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
  1924
	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
  1925
	    "%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
  1926
	    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
  1927
	    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
  1928
	    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
  1929
		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
  1930
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1931
	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
  1932
		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
  1933
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
  1934
	return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1935
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1936
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1937
static int
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1938
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
  1939
    const struct flow_tnl *tnl)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1940
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1941
	struct in_addr ipaddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1942
	char *cp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1943
	char buf[DLADM_STRSIZE];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1944
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1945
	ipaddr.s_addr = tnl->ip_src;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1946
	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
  1947
	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
  1948
	    (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
  1949
	    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
  1950
	    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
  1951
		return (ENOBUFS);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1952
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1953
	ipaddr.s_addr = tnl->ip_dst;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1954
	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
  1955
	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
  1956
	    "%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
  1957
	    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
  1958
	    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
  1959
	    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
  1960
	    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
  1961
	    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
  1962
		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
  1963
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1964
	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
  1965
		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
  1966
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
  1967
	return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1968
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1969
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1970
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1971
solaris_nlattr_to_DLVal(void *cookie,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1972
    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
  1973
    dlmgr__rad_dict_string_DLValue_t *prop)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1974
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1975
	const struct nlattr *a;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1976
	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
  1977
	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
  1978
	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
  1979
	char dstr[MAX_OF_ACTIONS_SIZE];
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1980
	int err = 0, nofports = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1981
	uint32_t ofports[MAC_OF_MAXPORT];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1982
	enum ovs_action_attr type = -1, lasttype;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1983
	uint_t queueid = UINT32_MAX;
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
	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
  1986
	str[0] = '\0';
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1987
	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
  1988
	    sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1989
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1990
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1991
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1992
	/* if actions_len == 0, then the action is drop */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1993
	if (actions_len == 0) {
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  1994
		err = flow_ofports2propstr(str, sizeof (str), ofports, 0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1995
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1996
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1997
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  1998
	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
  1999
		lasttype = type;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2000
		type = nl_attr_type(a);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2001
		if ((type != OVS_ACTION_ATTR_OUTPUT) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2002
		    (lasttype != OVS_ACTION_ATTR_OUTPUT)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2003
			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
  2004
				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
  2005
				    ofports, nofports);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2006
				if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2007
					goto out;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2008
				(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
  2009
				    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
  2010
				    sizeof (dstr));
5090
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
			nofports = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2013
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2014
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2015
		switch ((enum ovs_action_attr) type) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2016
		/* 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
  2017
		case OVS_ACTION_ATTR_OUTPUT:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2018
			if (nofports + 1 > MAC_OF_MAXPORT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2019
				err = ENOBUFS;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2020
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2021
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2022
			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
  2023
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2024
		case OVS_ACTION_ATTR_USERSPACE: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2025
			const struct nlattr *userdata;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2026
			size_t userdata_len;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2027
			union user_action_cookie cookie;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2028
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2029
			userdata = nl_attr_find_nested(a,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2030
			    OVS_USERSPACE_ATTR_USERDATA);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2031
			userdata_len = nl_attr_get_size(userdata);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2032
			memcpy(&cookie, nl_attr_get(userdata), userdata_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2033
			if (userdata_len < sizeof (cookie.type) ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2034
			    userdata_len > sizeof (cookie)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2035
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2036
				dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2037
				    "unexpected action size %"PRIuSIZE,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2038
				    userdata_len);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2039
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2040
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2041
			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
  2042
			    cookie.type != USER_ACTION_COOKIE_SLOW_PATH) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2043
				err = EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2044
				dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2045
				    "userspace action size %"PRIuSIZE" "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2046
				    "type unsupported %d", userdata_len,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2047
				    cookie.type);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2048
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2049
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2050
			if (cookie.slow_path.reason != SLOW_CONTROLLER)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2051
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2052
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
  2053
			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
  2054
			    (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
  2055
			    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
  2056
			    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
  2057
				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
  2058
				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
  2059
			}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2060
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2061
			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
  2062
				err = ENOBUFS;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2063
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2064
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2065
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2066
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2067
		case OVS_ACTION_ATTR_SET: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2068
			const struct nlattr *aset = nl_attr_get(a);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2069
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2070
			switch (nl_attr_type(aset)) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2071
			case OVS_KEY_ATTR_PRIORITY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2072
				queueid = nl_attr_get_u32(aset);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2073
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2074
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2075
			case OVS_KEY_ATTR_ETHERNET: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2076
				const struct ovs_key_ethernet *ek;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2077
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2078
				ek = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2079
				    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
  2080
				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
  2081
				    sizeof (str), ek);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2082
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2083
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2084
			case OVS_KEY_ATTR_IPV4: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2085
				const struct ovs_key_ipv4 *eip4;
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
				eip4 = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2088
				    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
  2089
				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
  2090
				    sizeof (str), eip4);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2091
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2092
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2093
			case OVS_KEY_ATTR_IPV6: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2094
				const struct ovs_key_ipv6 *eip6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2095
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2096
				eip6 = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2097
				    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
  2098
				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
  2099
				    sizeof (str), eip6);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2100
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2101
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2102
			case OVS_KEY_ATTR_TCP: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2103
				const struct ovs_key_tcp *etcp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2104
				etcp = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2105
				    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
  2106
				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
  2107
				    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
  2108
				    etcp->tcp_dst);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2109
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2110
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2111
			case OVS_KEY_ATTR_UDP: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2112
				const struct ovs_key_udp *eudp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2113
				eudp = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2114
				    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
  2115
				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
  2116
				    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
  2117
				    eudp->udp_dst);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2118
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2119
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2120
			case OVS_KEY_ATTR_SCTP: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2121
				const struct ovs_key_sctp *esctp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2122
				esctp = nl_attr_get_unspec(aset,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2123
				    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
  2124
				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
  2125
				    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
  2126
				    esctp->sctp_dst);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2127
				break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2128
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2129
			case OVS_KEY_ATTR_TUNNEL: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2130
				struct flow_tnl tnl;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2131
				enum odp_key_fitness fitness;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2132
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2133
				memset(&tnl, 0, sizeof (tnl));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2134
				fitness = odp_tun_key_from_attr(aset, &tnl);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2135
				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
  2136
				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
  2137
				    str, sizeof (str), &tnl);
5090
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
			default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2141
				err = EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2142
				dpif_log(err, "solaris_nlattr_to_DLVal set "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2143
				    "%d not supported",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2144
				    nl_attr_type(nl_attr_get(a)));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2145
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2146
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2147
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2148
		case OVS_ACTION_ATTR_PUSH_VLAN: {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2149
			const struct ovs_action_push_vlan *vlan;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2150
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2151
			vlan = nl_attr_get_unspec(a,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2152
			    sizeof (struct ovs_action_push_vlan));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2153
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
  2154
			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
  2155
			    (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
  2156
			    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
  2157
			    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
  2158
				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
  2159
				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
  2160
			}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2161
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2162
			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
  2163
				err = ENOBUFS;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2164
				break;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2165
			}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2166
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2167
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2168
		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
  2169
			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
  2170
			    (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
  2171
			    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
  2172
				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
  2173
				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
  2174
			}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2175
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2176
			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
  2177
				err = ENOBUFS;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2178
				break;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2179
			}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2180
			break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2181
		case OVS_ACTION_ATTR_RECIRC:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2182
		case OVS_ACTION_ATTR_HASH:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2183
		case OVS_ACTION_ATTR_PUSH_MPLS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2184
		case OVS_ACTION_ATTR_POP_MPLS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2185
		case OVS_ACTION_ATTR_SAMPLE:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2186
			/* TBD */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2187
			err = EOPNOTSUPP;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2188
			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
  2189
			    "not supported", type);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2190
		case OVS_ACTION_ATTR_UNSPEC:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2191
		case __OVS_ACTION_ATTR_MAX:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2192
			OVS_NOT_REACHED();
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
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2195
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2196
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2197
	if (type == OVS_ACTION_ATTR_OUTPUT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2198
		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
  2199
		    nofports);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2200
		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
  2201
		    ofports, nofports);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2202
		if (err != 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2203
			goto out;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2204
		(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
  2205
		    nofports, queueid, dstr, sizeof (dstr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2206
	}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2207
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2208
	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
  2209
	    sizeof (dstr));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2210
out:
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2211
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
  2212
	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
  2213
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2214
	return (err);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2217
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2218
solaris_add_flow(void *cookie, const char *linkname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2219
    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
  2220
    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
  2221
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2222
	dlmgr_DLDict_t dff, dfm, *dffp, *dfmp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2223
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2224
	rc_instance_t *link = NULL, *flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2225
	dlmgr_DatalinkError_t *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2226
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2227
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2228
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2229
	bzero(&dff, sizeof (dff));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2230
	bzero(&dfm, sizeof (dfm));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2231
	dffp = &dff;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2232
	dfmp = &dfm;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2233
	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
  2234
	    "name", linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2235
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2236
		err = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2237
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2238
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2239
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2240
	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
  2241
	if (dff.ddld_map == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2242
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2243
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2244
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2245
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2246
	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
  2247
	if (dfm.ddld_map == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2248
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2249
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2250
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2251
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2252
	prop = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2253
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2254
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2255
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2256
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2257
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2258
	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
  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
	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
  2263
	    actions_len, prop);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2264
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2265
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2266
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2267
	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
  2268
	    prop, &flow, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2269
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2270
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2271
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2272
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2273
			dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2274
			    "failed Datalink_addFlow(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2275
			    flowname, linkname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2276
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2277
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2278
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2279
	dlmgr_DatalinkError_free(derrp);
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
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2282
	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
  2283
	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
  2284
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2285
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2286
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2287
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2288
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2289
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2290
solaris_modify_flow(void *cookie, const char *flowname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2291
    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
  2292
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2293
	rc_instance_t *flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2294
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2295
	dlmgr_DatalinkError_t *derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2296
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2297
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2298
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2299
	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
  2300
	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
  2301
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2302
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2303
		err = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2304
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2305
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2306
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2307
	prop = dlmgr__rad_dict_string_DLValue_create(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2308
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2309
		err = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2310
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2311
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2312
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2313
	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
  2314
	    actions_len, prop);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2315
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2316
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2317
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2318
	status = dlmgr_Flow_setProperties(flow, prop, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2319
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2320
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2321
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2322
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2323
			dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2324
			    "failed Flow_setProperties(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2325
			    flowname, derrp->dde_errmsg);
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
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2328
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2329
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2330
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2331
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2332
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2333
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2334
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2335
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2336
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2337
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2338
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
  2339
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2340
	dlmgr__rad_dict_string_DLValue_t *prop = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2341
	dlmgr_DatalinkError_t		*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2342
	dlmgr_DLValue_t			*old_val = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2343
	dlmgr_DLValue_t			val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2344
	rc_instance_t			*link = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2345
	rc_err_t			status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2346
	int				error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2347
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2348
	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
  2349
	    "name", linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2350
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2351
		error = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2352
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2353
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2354
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2355
	prop = dlmgr__rad_dict_string_DLValue_create(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2356
	if (prop == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2357
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2358
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2359
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2360
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2361
	bzero(&val, sizeof (val));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2362
	val.ddlv_type = DDLVT_BOOLEAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2363
	val.ddlv_bval = &b_true;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2364
	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
  2365
	    &val, &old_val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2366
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2367
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2368
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2369
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2370
	dlmgr_DLValue_free(old_val);
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
	status = dlmgr_Datalink_removeFlow(link, flowname, prop, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2373
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2374
		error = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2375
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2376
			error = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2377
			dpif_log(error, "failed Datalink_removeFlow(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2378
			    flowname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2379
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2380
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2381
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2382
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2383
	dlmgr__rad_dict_string_DLValue_free(prop);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2384
	rc_instance_rele(link);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2385
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2386
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2387
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2388
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2389
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
  2390
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2391
	struct flow *f = arg;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2392
	in6_addr_t fa;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2393
	struct in_addr v4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2394
	int af, err = 0;
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
	if (strcmp(key, "dst-mac") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2397
		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
  2398
	} else if (strcmp(key, "src-mac") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2399
		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
  2400
	} else if (strcmp(key, "local-ip") == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2401
	    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
  2402
	    strcmp(key, "arp-tip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2403
		err = flow_str2addr(val->ddlv_sval, &fa, &af);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2404
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2405
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2406
		if (af == AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2407
			IN6_V4MAPPED_TO_INADDR(&fa, &v4);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2408
			if (strcmp(key, "local-ip") == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2409
			    strcmp(key, "arp-sip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2410
				f->nw_src = v4.s_addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2411
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2412
				f->nw_dst = v4.s_addr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2413
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2414
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2415
			if (strcmp(key, "local-ip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2416
				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
  2417
			} else if (strcmp(key, "remote-ip") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2418
				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
  2419
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2420
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2421
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2422
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2423
	} else if (strcmp(key, "transport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2424
		f->nw_proto = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2425
	} else if (strcmp(key, "local-port") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2426
		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
  2427
	} else if (strcmp(key, "remote-port") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2428
		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
  2429
	} else if (strcmp(key, "dsfield") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2430
		f->nw_tos = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2431
	} else if (strcmp(key, "srcport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2432
		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
  2433
	} 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
  2434
	    strcmp(key, "nd-tll") == 0) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2435
		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
  2436
	} 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
  2437
	    strcmp(key, "nd-sll") == 0) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2438
		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
  2439
	} else if (strcmp(key, "arp-op") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2440
		f->nw_proto = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2441
	} else if (strcmp(key, "sap") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2442
		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
  2443
	} else if (strcmp(key, "ttl") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2444
		f->nw_ttl = (uint8_t)*val->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2445
	} else if (strcmp(key, "vlan-tci") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2446
		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
  2447
	} else if (strcmp(key, "icmp-type") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2448
		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
  2449
	} else if (strcmp(key, "icmp-code") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2450
		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
  2451
	} 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
  2452
		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
  2453
		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
  2454
			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
  2455
		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
  2456
	} else if (strcmp(key, "tcp-flags") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2457
		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
  2458
	} 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
  2459
		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
  2460
	} 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
  2461
	    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
  2462
		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
  2463
		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
  2464
			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
  2465
		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
  2466
		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
  2467
			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
  2468
		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
  2469
			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
  2470
	} 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
  2471
		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
  2472
	} 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
  2473
		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
  2474
	} 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
  2475
		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
  2476
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2477
out:
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2478
	if (err != 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2479
		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
  2480
	dlmgr_DLValue_free(val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2481
	return (err == 0 ? RCE_OK : -1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2482
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2483
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2484
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2485
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
  2486
    struct flow *f, struct flow *m)
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
	dlmgr__rad_dict_string_DLValue_t *fdict, *mdict;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2489
	dlmgr_DLValue_t  *flist = NULL, *mlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2490
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2491
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2492
	bzero(f, sizeof (*f));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2493
	bzero(m, sizeof (*m));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2494
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2495
	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
  2496
	    &flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2497
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2498
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2499
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2500
	fdict = flist->ddlv_dlist[0]->ddld_map;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2501
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2502
	status = dlmgr__rad_dict_string_DLValue_map(fdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2503
	    solaris_flowinfo2flowmap, f);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2504
	dlmgr_DLValue_free(flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2505
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2506
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2507
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2508
	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
  2509
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2510
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2511
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2512
	mdict = mlist->ddlv_dlist[0]->ddld_map;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2513
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2514
	status = dlmgr__rad_dict_string_DLValue_map(mdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2515
	    solaris_flowinfo2flowmap, m);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2516
	dlmgr_DLValue_free(mlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2517
	if (status != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2518
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2519
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2520
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2521
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2522
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2523
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
  2524
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2525
	dlmgr__rad_dict_string_DLValue_t *flowinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2526
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2527
	rc_instance_t		*flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2528
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2529
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2530
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2531
	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
  2532
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2533
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2534
		return (ENODEV);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2535
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2536
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2537
	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
  2538
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2539
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2540
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2541
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2542
			/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2543
			 * 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
  2544
			 * 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
  2545
			 * issue.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2546
			 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2547
			dpif_log(err == DDLSTATUS_NOT_FOUND ? 0 : err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2548
			    "failed Flow_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2549
			    flowname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2550
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2551
	}
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_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2554
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2555
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2556
	if (err == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2557
		err = solaris_flowinfo2flow(flowinfo, f, m);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2558
		dlmgr__rad_dict_string_DLValue_free(flowinfo);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2561
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2562
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2563
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2564
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
  2565
flow_propval2action_outports_drop(char **propvals, int nval,
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2566
    struct ofpbuf *action)
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2567
{
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
  2568
	int i;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2569
	char *endp = NULL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2570
	int64_t n;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2571
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2572
	if (strcmp(propvals[0], "drop") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2573
		return (0);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2574
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2575
	errno = 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
  2576
	for (i = 0; i < nval; 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
  2577
		n = strtoull(propvals[i], &endp, 10);
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
  2578
		if ((errno != 0) || *endp != '\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
  2579
			return (EINVAL);
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
  2580
		nl_msg_put_u32(action, OVS_ACTION_ATTR_OUTPUT, (uint32_t)n);
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
  2581
	}
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
  2582
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2583
	return (0);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2584
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2585
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2586
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2587
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
  2588
    struct ofpbuf *action OVS_UNUSED)
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
	/* TBD */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2591
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2594
void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2595
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
  2596
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2597
	union user_action_cookie cookie;
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
	cookie.type = USER_ACTION_COOKIE_SLOW_PATH;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2600
	cookie.slow_path.unused = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2601
	cookie.slow_path.reason = reason;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2602
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2603
	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
  2604
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2605
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2606
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2607
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
  2608
    struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2609
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2610
	slowpath_to_actions(SLOW_CONTROLLER, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2611
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2612
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2613
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2614
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2615
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
  2616
    struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2617
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2618
	char *endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2619
	int64_t n;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2620
	struct ovs_action_push_vlan push;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2621
	int tpid = ETH_TYPE_VLAN;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2622
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2623
	errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2624
	n = strtoull(propvals[0], &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2625
	if ((errno != 0) || *endp != '\0' || n > 0xffff)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2626
		return (EINVAL);
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
	push.vlan_tpid = htons(tpid);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2629
	push.vlan_tci = htons((uint16_t)n);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2630
	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
  2631
	    &push, sizeof (push));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2632
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2633
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2634
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2635
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2636
flow_propval2action_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
  2637
    struct ofpbuf *action)
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
	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
  2640
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2641
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2642
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2643
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2644
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
  2645
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2646
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2647
	struct ovs_key_ethernet eth_key;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2648
	uchar_t *etheraddr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2649
	int etheraddrlen;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2650
	boolean_t src_set, dst_set;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2651
	char *sep;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2652
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2653
	uint_t i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2654
	int err = 0;
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
	/*
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2657
	 * 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
  2658
	 * "ether_dst-xxx"
5090
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
	bzero(&eth_key, sizeof (eth_key));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2661
	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
  2662
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2663
	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
  2664
		(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
  2665
		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
  2666
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2667
			goto out;
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
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2670
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2671
		if ((etheraddr = _link_aton(sep, &etheraddrlen)) == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2672
			err = (etheraddrlen == -1) ? EINVAL : ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2673
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2674
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2675
		/* Only ethernet address is supported */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2676
		if (etheraddrlen != ETHERADDRL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2677
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2678
			free(etheraddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2679
			goto out;
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
		if (strcmp(pval, "ether_src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2682
			if (src_set) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2683
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2684
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2685
				bcopy(etheraddr, &eth_key.eth_src, ETHERADDRL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2686
				src_set = _B_TRUE;
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
		} else if (strcmp(pval, "ether_dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2689
			if (dst_set) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2690
				err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2691
			} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2692
				bcopy(etheraddr, &eth_key.eth_dst, ETHERADDRL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2693
				dst_set = _B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2694
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2695
		} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2696
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2697
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2698
		free(etheraddr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2699
		if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2700
			goto out;
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
	if (!src_set || !dst_set) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2703
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2704
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2707
	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
  2708
	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
  2709
	    sizeof (eth_key));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2710
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2711
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2712
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2713
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2714
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2715
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2716
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
  2717
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2718
	struct ovs_key_ipv4 ipv4;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2719
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2720
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2721
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2722
	uint8_t protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2723
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2724
	int err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2725
	boolean_t tos_set = B_FALSE;
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
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2728
	 * 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
  2729
	 * "protocol:xxx" "tos:xxx" "hoplimit:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2730
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2731
	bzero(&ipv4, sizeof (ipv4));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2732
	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
  2733
		(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
  2734
		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
  2735
			err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2736
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2737
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2738
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2739
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2740
		if (strcmp(pval, "src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2741
			if (ipv4.ipv4_src != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2742
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2743
			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
  2744
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2745
		} else if (strcmp(pval, "dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2746
			if (ipv4.ipv4_dst != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2747
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2748
			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
  2749
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2750
		} else if (strcmp(pval, "protocol") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2751
			if (ipv4.ipv4_proto != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2752
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2753
			protocol = solaris_str2proto(sep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2754
			if (protocol == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2755
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2756
			ipv4.ipv4_proto = protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2757
		} else if (strcmp(pval, "tos") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2758
			if (tos_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2759
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2760
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2761
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2762
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2763
			if (errno != 0 || value > 0xff || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2764
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2765
			tos_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2766
			ipv4.ipv4_tos = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2767
		} else if (strcmp(pval, "hoplimit") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2768
			if (ipv4.ipv4_ttl != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2769
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2770
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2771
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2772
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2773
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2774
			    *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2775
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2776
			ipv4.ipv4_ttl = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2777
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2778
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2779
	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
  2780
	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
  2781
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2782
	err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2783
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2784
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2785
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2786
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2787
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2788
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
  2789
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2790
	struct ovs_key_ipv6 ipv6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2791
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2792
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2793
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2794
	uint8_t protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2795
	struct in6_addr in6;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2796
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2797
	int err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2798
	boolean_t tos_set = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2799
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2800
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2801
	 * 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
  2802
	 * "label:0xxxxx" "protocol:xxx" "tos:xxx" "hoplimit:xxx"
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2803
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2804
	bzero(&ipv6, sizeof (ipv6));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2805
	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
  2806
		(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
  2807
		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
  2808
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2809
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2810
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2811
		if (strcmp(pval, "src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2812
			bcopy(&ipv6.ipv6_src, &in6.s6_addr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2813
			    sizeof (struct in6_addr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2814
			if (!IN6_IS_ADDR_UNSPECIFIED(&in6))
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
			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
  2817
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2818
		} else if (strcmp(pval, "dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2819
			bcopy(&ipv6.ipv6_dst, &in6.s6_addr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2820
			    sizeof (struct in6_addr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2821
			if (!IN6_IS_ADDR_UNSPECIFIED(&in6))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2822
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2823
			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
  2824
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2825
		} else if (strcmp(pval, "protocol") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2826
			if (ipv6.ipv6_proto != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2827
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2828
			protocol = solaris_str2proto(sep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2829
			if (protocol == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2830
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2831
			ipv6.ipv6_proto = protocol;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2832
		} else if (strcmp(pval, "tos") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2833
			if (tos_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2834
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2835
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2836
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2837
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2838
			if (errno != 0 || value > 0xff || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2839
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2840
			tos_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2841
			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
  2842
		} else if (strcmp(pval, "hoplimit") == 0) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2843
			if (ipv6.ipv6_hlimit != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2844
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2845
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2846
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2847
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2848
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2849
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2850
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2851
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2852
			ipv6.ipv6_hlimit = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2853
		} else if (strcmp(pval, "label") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2854
			if (ipv6.ipv6_label != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2855
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2856
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2857
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2858
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2859
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2860
			    *endp != '\0') {
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
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2863
			ipv6.ipv6_label = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2864
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2865
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2866
	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
  2867
	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
  2868
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2869
	err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2870
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2871
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2872
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2873
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2874
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2875
flow_propval2action_settransport(char **propvals, int nval,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2876
    uint16_t *sportp, uint16_t *dportp)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2877
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2878
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2879
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2880
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2881
	int err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2882
	uint16_t sport = 0, dport = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2883
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  2884
	/* 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
  2885
	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
  2886
		(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
  2887
		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
  2888
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2889
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2890
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2891
		if (strcmp(pval, "sport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2892
			if (sport != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2893
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2894
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2895
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2896
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2897
			if (errno != 0 || value == 0 || value > 0xffff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2898
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2899
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2900
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2901
			sport = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2902
		} else if (strcmp(pval, "dport") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2903
			if (dport != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2904
				return (DLADM_STATUS_DUPLICATE_ARG);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2905
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2906
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2907
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2908
			if (errno != 0 || value == 0 || value > 0xffff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2909
			    *endp != '\0') {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2910
				goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2911
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2912
			dport = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2913
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2914
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2915
	err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2916
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2917
	*sportp = sport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2918
	*dportp = dport;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2919
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2920
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2921
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2922
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2923
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
  2924
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2925
	struct ovs_key_tcp tcp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2926
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2927
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2928
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2929
	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
  2930
	    &tcp.tcp_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2931
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2932
		return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2933
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2934
	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
  2935
	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
  2936
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2937
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2938
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2939
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2940
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2941
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
  2942
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2943
	struct ovs_key_udp udp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2944
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2945
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2946
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2947
	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
  2948
	    &udp.udp_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2949
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2950
		return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2951
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2952
	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
  2953
	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
  2954
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2955
	return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2958
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2959
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
  2960
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2961
	struct ovs_key_sctp sctp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2962
	size_t start_ofs;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2963
	int err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2964
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2965
	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
  2966
	    &sctp.sctp_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2967
	if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2968
		return (err);
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
	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
  2971
	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
  2972
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2973
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2974
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2975
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2976
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2977
set_addr(char *pval, uint32_t *addrp)
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
	struct addrinfo		hints;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2980
	struct addrinfo		*ai;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2981
	struct addrinfo		*next_ai;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2982
	void			*ptr;
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
	(void) memset(&hints, 0, sizeof (hints));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2985
	hints.ai_family = AF_UNSPEC;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2986
	if (getaddrinfo(pval, NULL, &hints, &ai) != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2987
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2988
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2989
	/* Check if hostname resolves to multiple addresses */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2990
	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
  2991
	    next_ai = next_ai->ai_next) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2992
		if (next_ai->ai_addrlen != ai->ai_addrlen ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2993
		    bcmp(next_ai->ai_addr, ai->ai_addr,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2994
		    ai->ai_addrlen) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2995
			/* maps to more than one address */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2996
			freeaddrinfo(ai);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2997
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2998
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  2999
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3000
	if (ai->ai_family != AF_INET) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3001
		freeaddrinfo(ai);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3002
		return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3003
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3004
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3005
	ptr = ((uint8_t *)ai->ai_addr) +
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3006
	    offsetof(struct sockaddr_in, sin_addr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3007
	memcpy(addrp, ptr, sizeof (struct in_addr));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3008
	freeaddrinfo(ai);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3009
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3010
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3011
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3012
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3013
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
  3014
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3015
	char pval[DLADM_PROP_VAL_MAX];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3016
	char *sep, *endp;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3017
	uint_t i, value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3018
	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
  3019
	size_t start_ofs, tun_key_ofs;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3020
	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
  3021
	int err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3022
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3023
	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
  3024
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3025
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3026
	 * 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
  3027
	 * "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
  3028
	 */
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3029
	bzero(&tnl, sizeof (struct flow_tnl));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3030
	tnl.ip_tos = 0xff;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3031
	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
  3032
		(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
  3033
		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
  3034
			return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3035
		*sep = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3036
		sep++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3037
		if (strcmp(pval, "tun_id") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3038
			if (id_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3039
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3040
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3041
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3042
			value = strtoull(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3043
			if (errno != 0 || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3044
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3045
			tnl.tun_id = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3046
			id_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3047
		} else if (strcmp(pval, "src") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3048
			if (src_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3049
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3050
			err = set_addr(sep, &tnl.ip_src);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3051
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3052
				return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3053
			src_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3054
		} else if (strcmp(pval, "dst") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3055
			if (dst_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3056
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3057
			err = set_addr(sep, &tnl.ip_dst);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3058
			if (err != 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3059
				return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3060
			dst_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3061
		} else if (strcmp(pval, "tos") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3062
			if (tos_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3063
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3064
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3065
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3066
			value = strtoul(sep, &endp, 16);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3067
			if (errno != 0 || value > 0xff || *endp != '\0')
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3068
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3069
			tnl.ip_tos = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3070
			tos_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3071
		} else if (strcmp(pval, "hoplimit") == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3072
			if (ttl_set)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3073
				return (EINVAL);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3074
			errno = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3075
			endp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3076
			value = strtoul(sep, &endp, 10);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3077
			if (errno != 0 || value == 0 || value > 0xff ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3078
			    *endp != '\0') {
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
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3081
			tnl.ip_ttl = value;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3082
			ttl_set = B_TRUE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3083
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3084
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3085
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3086
	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
  3087
	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
  3088
	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
  3089
	    ntohll((uint64_t)tnl.tun_id));
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3090
	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
  3091
	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
  3092
	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
  3093
	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
  3094
	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
  3095
	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
  3096
	nl_msg_end_nested(action, start_ofs);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3097
	return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3098
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3099
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3100
static int
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3101
flow_propstr2vals(char *key, char *val, char ***propvalsp, int *valcntp)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3102
{
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3103
	char **propvals = *propvalsp, *curr;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3104
	int i, j, len;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3105
	char c;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3106
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3107
	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
  3108
	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
  3109
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
  3110
	if (strcmp(key, "outports") == 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
  3111
		char *ofp_min, *ofp_max, *tmp = NULL, *endp = 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
  3112
		char ofport_val[10];
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
  3113
		uint32_t of_min, of_max, i_of;
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
  3114
		boolean_t match, is_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
  3115
		match = is_range = B_FALSE;
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
  3116
		ofp_min = ofp_max = val;
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
  3117
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
  3118
		for (i = 0, j = 0, curr = val; i < len; 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
  3119
			ofp_min = ofp_max = curr;
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
  3120
			c = val[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
  3121
			match = (c == 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
  3122
			    c == 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
  3123
			if (!match && i != len -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
  3124
				continue;
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
  3125
			if (match)
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
  3126
				val[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
  3127
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
  3128
			if (c == 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
  3129
				tmp = curr;
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
  3130
				curr = val + i + 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
  3131
				is_range = B_TRUE;
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
  3132
				continue;
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
  3133
			}
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
  3134
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
  3135
			if (is_range == B_TRUE) {
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
  3136
				ofp_min = tmp;
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
  3137
				is_range = B_FALSE;
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
  3138
			}
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
  3139
			of_min = (uint32_t)strtoul(ofp_min, &endp, 10);
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
  3140
			of_max = (uint32_t)strtoul(ofp_max, &endp, 10);
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
  3141
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
  3142
			for (i_of = of_min; i_of <= of_max; i_of++) {
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
  3143
				bzero(ofport_val, sizeof (ofport_val));
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
  3144
				snprintf(ofport_val, sizeof (ofport_val), "%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
  3145
				    i_of);
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
  3146
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
  3147
				if (strlcpy(propvals[j++], ofport_val,
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
  3148
				    DLADM_PROP_VAL_MAX) >= DLADM_PROP_VAL_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
  3149
					dpif_log(EINVAL, "flow_propstr2vals"
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
  3150
					    "key %s %dth string too long %s",
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
  3151
					    key, j - 1, ofport_val);
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
  3152
					return (EINVAL);
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
  3153
				}
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
  3154
			}
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
  3155
			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
  3156
		}
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
	} 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
  3158
		for (i = 0, j = 0, curr = val; i < len; 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
  3159
			if ((c = val[i]) != 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
  3160
			    i != len -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
  3161
				continue;
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
  3162
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
  3163
			if (c == 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
  3164
				val[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
  3165
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
  3166
			if (strlcpy(propvals[j++], curr, DLADM_PROP_VAL_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
  3167
			    DLADM_PROP_VAL_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
  3168
				dpif_log(EINVAL, "flow_propstr2vals key %s %dth"
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
  3169
				    " string too long %s", key, j - 1, curr);
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
  3170
				return (EINVAL);
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
  3171
			}
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
  3172
			curr = val + i + 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
  3173
		}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3174
	}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3175
	*valcntp = j;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3176
	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
  3177
		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
  3178
		    propvals[i]);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3179
	return (0);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3180
}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3181
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3182
static int
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3183
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
  3184
{
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
  3185
	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
  3186
	char **pvals, *buf = NULL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3187
	size_t len;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3188
	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
  3189
	boolean_t match;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3190
	int nval, err = 0, i;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3191
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3192
	buf = malloc((sizeof (char *) +
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3193
	    DLADM_PROP_VAL_MAX) * DLADM_MAX_PROP_VALCNT);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3194
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3195
	pvals = (char **)(void *)buf;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3196
	for (i = 0; i < DLADM_MAX_PROP_VALCNT; i++) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3197
		pvals[i] = buf + sizeof (char *) * DLADM_MAX_PROP_VALCNT +
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3198
		    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
  3199
	}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3200
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3201
	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
  3202
	    sizeof (ofaction_str)) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3203
		err = EINVAL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3204
		goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3205
	}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3206
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3207
	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
  3208
	curr = ofaction_str;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3209
	key = NULL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3210
	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
  3211
		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
  3212
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3213
		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
  3214
		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
  3215
			continue;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3216
		if (match) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3217
			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
  3218
			if (*curr == '\0') {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3219
				err = EINVAL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3220
				goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3221
			}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3222
		}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3223
		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
  3224
			key = curr;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3225
			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
  3226
			continue;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3227
		}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3228
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3229
		if (key == NULL) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3230
			err = EINVAL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3231
			goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3232
		}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3233
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3234
		err = flow_propstr2vals(key, curr, &pvals, &nval);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3235
		if (err != 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3236
			goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3237
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3238
		if (strcmp(key, "outports") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3239
			err = flow_propval2action_outports_drop(pvals, nval,
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3240
			    action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3241
		else if (strcmp(key, "max-bw") == 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3242
			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
  3243
		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
  3244
			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
  3245
			    action);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3246
		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
  3247
			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
  3248
		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
  3249
			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
  3250
		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
  3251
			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
  3252
		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
  3253
			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
  3254
		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
  3255
			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
  3256
		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
  3257
			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
  3258
		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
  3259
			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
  3260
		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
  3261
			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
  3262
		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
  3263
			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
  3264
		else
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3265
			err = EINVAL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3266
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3267
		if (err != 0)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3268
			goto done;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3269
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3270
		key = NULL;
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3271
		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
  3272
	}
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3273
done:
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3274
	free(buf);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3275
	return (err);
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
/* valcnt must be 1 */
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3279
static rc_err_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3280
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
  3281
    void *arg)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3282
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3283
	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
  3284
	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
  3285
	int valcnt, err = 0;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3286
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3287
	switch (val->ddlv_type) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3288
	case DDLVT_STRING:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3289
		if (val->ddlv_sval == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3290
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3291
		if (strlen(val->ddlv_sval) == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3292
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3293
		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
  3294
		if (strlcpy(propval, val->ddlv_sval, sizeof (propval)) >=
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3295
		    DLADM_STRSIZE)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3296
			goto out;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3297
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3298
	case DDLVT_STRINGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3299
		if (val->ddlv_slist_count == 0)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3300
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3301
		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
  3302
		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
  3303
			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
  3304
		if (strlcpy(propval, val->ddlv_slist[0], sizeof (propval)) >=
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3305
		    DLADM_STRSIZE)
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3306
			goto out;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3307
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3308
	case DDLVT_ULONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3309
		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
  3310
			goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3311
		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
  3312
		(void) snprintf(propval, sizeof (propval), "%llu",
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3313
		    *val->ddlv_ulval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3314
		break;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3315
	case DDLVT_BOOLEAN:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3316
	case DDLVT_BOOLEANS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3317
	case DDLVT_LONG:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3318
	case DDLVT_LONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3319
	case DDLVT_ULONGS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3320
	case DDLVT_DICTIONARY:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3321
	case DDLVT_DICTIONARYS:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3322
	default:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3323
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3324
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3325
	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
  3326
	    propval);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3327
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3328
	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
  3329
		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
  3330
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3331
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3332
	dlmgr_DLValue_free(val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3333
	return (err == 0 ? RCE_OK : -1);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3334
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3335
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3336
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3337
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
  3338
    struct ofpbuf *action)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3339
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3340
	dlmgr__rad_dict_string_DLValue_t *fdict;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3341
	dlmgr_DLValue_t  *flist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3342
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3343
	int err = 0;
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
	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
  3346
	    &flist);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3347
	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
  3348
		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
  3349
		    " %d", status);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3350
		return (EINVAL);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3351
	}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3352
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3353
	fdict = flist->ddlv_dval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3354
	status = dlmgr__rad_dict_string_DLValue_map(fdict,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3355
	    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
  3356
	if (status != RCE_OK) {
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3357
		err = EINVAL;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3358
		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
  3359
		    "failed %d", status);
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3360
	}
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3361
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3362
	dlmgr_DLValue_free(flist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3363
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3364
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3365
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3366
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3367
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
  3368
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3369
	dlmgr__rad_dict_string_DLValue_t *flowinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3370
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3371
	rc_instance_t		*flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3372
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3373
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3374
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3375
	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
  3376
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3377
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3378
		return (ENODEV);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3379
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3380
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3381
	status = dlmgr_Flow_getInfo(flow, NULL, 0, &flowinfo, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3382
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3383
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3384
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3385
			err = derrp->dde_err;
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
			 * 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
  3388
			 * 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
  3389
			 * issue.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3390
			 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3391
			dpif_log(err == DDLSTATUS_NOT_FOUND ? 0 : err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3392
			    "failed Flow_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3393
			    flowname, derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3394
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3395
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3396
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3397
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3398
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3399
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3400
	if (err == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3401
		err = solaris_flowinfo2action(flowinfo, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3402
		dlmgr__rad_dict_string_DLValue_free(flowinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3403
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3404
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3405
	return (err);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3408
static int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3409
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
  3410
    uint64_t *nbytes, uint64_t *lastused)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3411
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3412
	dlmgr__rad_dict_string_DLValue_t *flowstat = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3413
	dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3414
	dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3415
	rc_err_t		status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3416
	int			err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3417
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3418
	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
  3419
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3420
		err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3421
		if (status == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3422
			err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3423
			dpif_log(err, "failed Flow_getStatistics(): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3424
			    derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3425
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3426
		goto out;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3429
#if _TBD_
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3430
	uint16_t tcp_flags; /* bitmaps of tcp_flags */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3431
#endif
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3432
	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
  3433
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3434
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3435
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3436
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3437
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3438
	*npackets = *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3439
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3440
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3441
	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
  3442
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3443
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3444
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3445
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3446
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3447
	*npackets += *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3448
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3449
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3450
	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
  3451
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3452
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3453
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3454
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3455
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3456
	*nbytes = *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3457
	dlmgr_DLValue_free(dlval);
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
	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
  3460
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3461
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3462
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3463
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3464
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3465
	*nbytes += *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3466
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3467
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3468
	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
  3469
	    &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3470
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3471
		err = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3472
		goto out;
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
	*lastused = *dlval->ddlv_ulval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3475
	dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3476
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3477
	dlmgr__rad_dict_string_DLValue_free(flowstat);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3478
	dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3479
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3480
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3481
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3482
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3483
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
  3484
    uint64_t *nbytes, uint64_t *lastused)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3485
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3486
	rc_err_t status;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3487
	rc_instance_t *flow = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3488
	int err;
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
	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
  3491
	    "name", flowname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3492
	if (status != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3493
		err = ENODEV;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3494
		goto out;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3495
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3496
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3497
	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
  3498
out:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3499
	rc_instance_rele(flow);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3500
	return (err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3501
}
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
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3504
kstat_handle_init(kstat2_handle_t *khandlep)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3505
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3506
	kstat2_status_t	stat;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3507
5918
3cbac9806123 23226020 Openvswitch should prepare for kstat2 changes
Martin Walsh<Martin.Walsh@oracle.com>
parents: 5730
diff changeset
  3508
	stat = kstat2_open(khandlep, NULL);
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3509
	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
  3510
}
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
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3513
kstat_handle_update(kstat2_handle_t khandle)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3514
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3515
	kstat2_status_t	stat;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3516
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3517
	stat = kstat2_update(khandle);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3518
	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
  3519
}
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
void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3522
kstat_handle_close(kstat2_handle_t *khandlep)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3523
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3524
	kstat2_close(khandlep);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3525
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3526
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3527
uint64_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3528
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
  3529
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3530
	kstat2_status_t stat;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3531
	kstat2_nv_t val;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3532
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3533
	stat = kstat2_map_get(map, name, &val);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3534
	if (stat != KSTAT2_S_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3535
		(void) printf("can't get value: %s\n",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3536
		    kstat2_status_string(stat));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3537
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3538
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3539
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3540
	if (val->type != KSTAT2_NVVT_INT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3541
		(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
  3542
		return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3545
	return (val->kstat2_integer);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3546
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3547
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3548
void
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3549
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
  3550
    odp_port_t))
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
	adr_name_t	**anamearr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3553
	int		anamecnt = 0, i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3554
	rc_err_t	rerr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3555
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3556
	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
  3557
	    &anamecnt, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3558
	if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3559
		return;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3560
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3561
	if (anamecnt == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3562
		free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3563
		return;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3566
	for (i = 0; i < anamecnt; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3567
		dlmgr_DLDict_t		**dlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3568
		dlmgr_DLValue_t		*dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3569
		const char		*props[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3570
		const char		*fields[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3571
		int			ndlist = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3572
		rc_instance_t		*rip = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3573
		dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3574
		rc_err_t 		rerr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3575
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3576
		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
  3577
		if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3578
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3579
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3580
		props[0] = "ofport";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3581
		fields[0] = "current";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3582
		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
  3583
		    &dlist, &ndlist, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3584
		rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3585
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3586
			if (rerr == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3587
				dpif_log(derrp->dde_err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3588
				    "failed Datalink_getProperties(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3589
				    adr_name_key(anamearr[i], "name"),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3590
				    props[0], derrp->dde_errmsg);
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
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3593
			continue;
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
		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
  3596
		    "current", &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3597
		if (rerr != RCE_OK || dlval->ddlv_sval == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3598
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3599
			dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3600
			dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3601
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3602
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3603
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3604
		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
  3605
			fn(arg, adr_name_key(anamearr[i], "name"),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3606
			    "system", atoi(dlval->ddlv_sval));
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3607
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3608
		dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3609
		dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3610
		dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3611
	}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3612
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3613
	for (i = 0; i < anamecnt; i++)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3614
		adr_name_rele(anamearr[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3615
	free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3616
}
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
uint64_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3619
solaris_flow_walk(void *arg, struct ofpbuf *action, boolean_t no_default,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3620
    void (*fn)(void *, const char *, boolean_t, struct flow *, struct flow *,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3621
    struct ofpbuf *, uint64_t, uint64_t, uint64_t))
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
	adr_name_t	**anamearr = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3624
	int		anamecnt = 0, i;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3625
	rc_err_t	rerr;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3626
	int		err = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3627
	uint64_t	n_flows = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3628
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3629
	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
  3630
	    &anamecnt, 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3631
	if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3632
		return (0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3633
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3634
	if (anamecnt == 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3635
		free(anamearr);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3636
		return (0);
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3639
	for (i = 0; i < anamecnt; i++) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3640
		dlmgr__rad_dict_string_DLValue_t *flowinfo;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3641
		char			linkname[MAXLINKNAMELEN];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3642
		rc_instance_t		*rip = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3643
		dlmgr_DLDict_t		**dlist;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3644
		dlmgr_DLValue_t		*dlval;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3645
		const char		*props[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3646
		const char		*fields[1];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3647
		struct flow		f, m;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3648
		int			ndlist = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3649
		uint64_t		npackets, nbytes, lastused;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3650
		boolean_t		is_default;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3651
		dlmgr_DatalinkError_t	*derrp = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3652
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3653
		flowinfo = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3654
		dlist = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3655
		dlval = NULL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3656
		is_default = B_FALSE;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3657
		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
  3658
		    NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3659
			if (no_default)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3660
				continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3661
			else
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3662
				is_default = B_TRUE;
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3663
		} 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
  3664
		    "sys.of") == NULL) {
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3665
			continue;
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3666
		}
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3667
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3668
		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
  3669
		if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3670
			continue;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3671
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3672
		if ((err = i_solaris_get_flowstats(rip, &npackets, &nbytes,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3673
		    &lastused)) != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3674
			dpif_log(err, "solaris_flow_walk get_flowstats "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3675
			    "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
  3676
			    "name"), err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3677
			rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3678
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3679
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3680
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3681
		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
  3682
		rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3683
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3684
			err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3685
			if (rerr == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3686
				err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3687
				/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3688
				 * XXX For now, log DDLSTATUS_NOT_FOUND as
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3689
				 * debug until we can determine how to handle
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3690
				 * the RAD caching issue.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3691
				 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3692
				dpif_log(err == DDLSTATUS_NOT_FOUND ? 0 : err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3693
				    "failed Flow_getInfo(%s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3694
				    adr_name_key(anamearr[i], "name"),
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3695
				    derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3696
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3697
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3698
			goto done;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3701
		/* 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
  3702
		err = solaris_flowinfo2linkname(flowinfo, linkname,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3703
		    MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3704
		if (err != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3705
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3706
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3707
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3708
		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
  3709
		    1, "name", linkname);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3710
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3711
			goto done;
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
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3714
		props[0] = "openvswitch";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3715
		fields[0] = "current";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3716
		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
  3717
		    &dlist, &ndlist, &derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3718
		rc_instance_rele(rip);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3719
		if (rerr != RCE_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3720
			err = -1;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3721
			if (rerr == RCE_SERVER_OBJECT) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3722
				err = derrp->dde_err;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3723
				dpif_log(err,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3724
				    "failed Datalink_getProperties(%s, %s): %s",
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3725
				    linkname, props[0], derrp->dde_errmsg);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3726
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3727
			dlmgr_DatalinkError_free(derrp);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3728
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3729
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3730
		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
  3731
		    "current", &dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3732
		if (rerr != RCE_OK)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3733
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3734
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3735
		if (!dlval->ddlv_bval)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3736
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3737
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3738
		err = solaris_flowinfo2flow(flowinfo, &f, &m);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3739
		if (err != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3740
			dpif_log(err, "solaris_flow_walk flowinfo2flow "
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3741
			    "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
  3742
			    "name"), err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3743
			goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3744
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3745
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3746
		if (action != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3747
			err = solaris_flowinfo2action(flowinfo, action);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3748
			if (err != 0) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3749
				dpif_log(err, "solaris_flow_walk "
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3750
				    "flowinfo2action failed for %s: %d",
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3751
				    adr_name_key(anamearr[i], "name"), err);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3752
				goto done;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3753
			}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3754
		}
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
		if (fn != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3757
			fn(arg, adr_name_key(anamearr[i], "name"), is_default,
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3758
			    &f, &m, action, npackets, nbytes, lastused);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3759
		}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3760
		n_flows++;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3761
done:
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3762
		dlmgr__rad_dict_string_DLValue_free(flowinfo);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3763
		dlmgr_DLValue_free(dlval);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3764
		dlmgr_DLDict_array_free(dlist, ndlist);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3765
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3766
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3767
	for (i = 0; i < anamecnt; i++)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3768
		adr_name_rele(anamearr[i]);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3769
	free(anamearr);
5730
cca4aa297e68 22590644 OpenvSwitch should be updated to version 2.3.2
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5639
diff changeset
  3770
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3771
	return (n_flows);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3772
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3773
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3774
int
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3775
solaris_dladm_status2error(dladm_status_t status)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3776
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3777
	int error;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3778
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3779
	if (status == DLADM_STATUS_NOMEM) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3780
		error = ENOMEM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3781
	} else if (status == DLADM_STATUS_DENIED) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3782
		error = EPERM;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3783
	} else if (status == DLADM_STATUS_OK) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3784
		error = 0;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3785
	} else if (status == DLADM_STATUS_IOERR) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3786
		error = EIO;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3787
	} else {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3788
		error = EINVAL;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3789
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3790
	return (error);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3791
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3792
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3793
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3794
solaris_is_uplink_class(const char *class)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3795
{
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3796
	return (strcmp("phys", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3797
	    strcmp("aggr", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3798
	    strcmp("etherstub", class) == 0 ||
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3799
	    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
  3800
	    strcmp("veth", class) == 0 ||
5090
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3801
	    strcmp("simnet", class) == 0);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3802
}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3803
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3804
/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3805
 * 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
  3806
 * 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
  3807
 *
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3808
 * 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
  3809
 * 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
  3810
 * 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
  3811
 * value to ALL_ZONES.
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3812
 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3813
boolean_t
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3814
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
  3815
    zoneid_t *zoneidp)
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
	char buffer[MAXLINKNAMESPECIFIER];
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3818
	char *search = "/";
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3819
	char *zonetoken;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3820
	char *linktoken;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3821
	char *last;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3822
	size_t namelen;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3823
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3824
	if (link_name != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3825
		link_name[0] = '\0';
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3826
	if (zoneidp != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3827
		*zoneidp = ALL_ZONES;
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3828
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3829
	if ((namelen = strlcpy(buffer, name, sizeof (buffer))) >=
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3830
	    sizeof (buffer))
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3831
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3832
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3833
	if ((zonetoken = strtok_r(buffer, search, &last)) == NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3834
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3835
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3836
	/* 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
  3837
	if ((linktoken = strtok_r(NULL, search, &last)) == NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3838
		if (namelen >= MAXLINKNAMELEN)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3839
			return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3840
		if (link_name != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3841
			(void) strlcpy(link_name, name, MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3842
		return (_B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3843
	}
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
	/* 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
  3846
	if (strlen(zonetoken) >= ZONENAME_MAX || strlen(linktoken) >=
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3847
	    MAXLINKNAMELEN)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3848
		return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3849
	/*
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3850
	 * 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
  3851
	 * 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
  3852
	 * 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
  3853
	 */
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3854
	if (strtok_r(NULL, search, &last) != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3855
		return (_B_FALSE);
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
	if (link_name != NULL)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3858
		(void) strlcpy(link_name, linktoken, MAXLINKNAMELEN);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3859
	if (zoneidp != NULL) {
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3860
		if ((*zoneidp = getzoneidbyname(zonetoken)) < MIN_ZONEID)
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3861
			return (_B_FALSE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3862
	}
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3863
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3864
	return (_B_TRUE);
5f131162e136 PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff changeset
  3865
}
6018
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3866
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3867
/*
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3868
 * 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
  3869
 * number cannot be determined.
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3870
 */
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3871
void
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3872
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
  3873
{
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3874
	kstat2_handle_t	handle;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3875
	kstat2_status_t	stat;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3876
	kstat2_map_t	map;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3877
	kstat2_nv_t	val;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3878
	char		kuri[1024];
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3879
	int		coreid;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3880
	int		lcoreid = -1;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3881
	int		i;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3882
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3883
	*n_cores = 0;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3884
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3885
	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
  3886
	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
  3887
		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
  3888
		    "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
  3889
		    kstat2_status_string(stat));
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3890
		return;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3891
	}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3892
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3893
	for (i = 0; ; i++) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3894
		(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
  3895
		    "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
  3896
		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
  3897
		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
  3898
			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
  3899
			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
  3900
				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
  3901
				    "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
  3902
				    "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
  3903
				    kstat2_status_string(stat));
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3904
				*n_cores = 0;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3905
				break;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3906
			}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3907
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3908
			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
  3909
				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
  3910
				    "kstat2 value error. "
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3911
				    "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
  3912
				*n_cores = 0;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3913
				break;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3914
			}
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
			coreid = val->kstat2_integer;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3917
			if (coreid != lcoreid) {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3918
				(*n_cores)++;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3919
				lcoreid = coreid;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3920
			}
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3921
		} 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
  3922
			/* no more cores */
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3923
			break;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3924
		} else {
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3925
			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
  3926
			    "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
  3927
			    kstat2_status_string(stat));
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3928
			*n_cores = 0;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3929
			break;
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3930
		}
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
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3933
	kstat2_close(&handle);
b5072b523988 23086193 implicitly created OVS bridge VNIC shows incorrect statistic
Mark Haywood <Mark.Haywood@Oracle.COM>
parents: 5918
diff changeset
  3934
}