da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * CDDL HEADER START
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * The contents of this file are subject to the terms of the
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Common Development and Distribution License (the "License").
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * You may not use this file except in compliance with the License.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * See the License for the specific language governing permissions
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * and limitations under the License.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * When distributing Covered Code, include this CDDL HEADER in each
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * If applicable, add the following below this CDDL HEADER, with the
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * fields enclosed by brackets "[]" replaced with your own identifying
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * information: Portions Copyright [yyyy] [name of copyright owner]
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * CDDL HEADER END
801093905f15f0f1a50095474e8a3f0e5b0cb126Michael Lim * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* max port number for UDP, TCP & SCTP */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic dladm_status_t do_check_port(char *, boolean_t, flow_desc_t *);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define DLADM_MAX_FLOWATTRS (sizeof (attr_table) / sizeof (fattr_desc_t))
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdo_check_local_ip(char *attr_val, flow_desc_t *fdesc)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (do_check_ip_addr(attr_val, B_TRUE, fdesc));
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdo_check_remote_ip(char *attr_val, flow_desc_t *fdesc)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (do_check_ip_addr(attr_val, B_FALSE, fdesc));
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdo_check_ip_addr(char *addr_str, boolean_t local, flow_desc_t *fd)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((prefix_str = strchr(addr_str, '/')) != NULL) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (errno != 0 || prefix_len == 0 || *endp != '\0')
da0006029e69465355313f503741ac6ebe0d513bGirish Moodalbail if (inet_pton(AF_INET, addr_str, &v4addr.s_addr) == 1) {
da0006029e69465355313f503741ac6ebe0d513bGirish Moodalbail } else if (inet_pton(AF_INET6, addr_str, v6addr.s6_addr) == 1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng &(V4_PART_OF_V6((*((in6_addr_t *)(void *)netmask))));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng status = dladm_prefixlen2mask(prefix_len, prefix_max, netmask);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdo_check_protocol(char *attr_val, flow_desc_t *fdesc)
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdo_check_local_port(char *attr_val, flow_desc_t *fdesc)
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Chengdo_check_remote_port(char *attr_val, flow_desc_t *fdesc)
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng return (do_check_port(attr_val, B_FALSE, fdesc));
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdo_check_port(char *attr_val, boolean_t local, flow_desc_t *fdesc)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Check for invalid and/or duplicate attribute specification
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (j = 0; j < DLADM_MAX_FLOWATTRS; j++)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (j = 0; j < DLADM_MAX_FLOWATTRS; j++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * if the attribute did not match any of the attribute in
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * attr_table, then it's an invalid attribute.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Convert an attribute list to a flow_desc_t using the attribute ad_check()
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * functions.
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdladm_flow_attrlist_extract(dladm_arg_list_t *attrlist, flow_desc_t *flowdesc)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (j = 0; j < DLADM_MAX_FLOWATTRS; j++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((aip->ai_val == NULL) || (*aip->ai_val == NULL))
801093905f15f0f1a50095474e8a3f0e5b0cb126Michael Lim * Make sure protocol is specified if either local or
801093905f15f0f1a50095474e8a3f0e5b0cb126Michael Lim * remote port is specified.
801093905f15f0f1a50095474e8a3f0e5b0cb126Michael Lim (FLOW_ULP_PORT_LOCAL | FLOW_ULP_PORT_REMOTE)) != 0 &&
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdladm_parse_flow_attrs(char *str, dladm_arg_list_t **listp, boolean_t novalues)
63a6526d84bd7ea2c75b4b0d009fa5f51a67a22aMichael Lim if (*listp != NULL && flow_attrlist_check(*listp)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (errno != 0 || value == 0 || value > 0xff || *endp != '\0')
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("tcp");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("udp");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("sctp");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("icmpv6");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("icmp");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng else if (strncasecmp(protostr, "icmpv6", 6) == 0)
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdladm_flow_attr_ip2str(dladm_flow_attr_t *attrp, char *buf, size_t buf_len)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) inet_ntop(AF_INET6, &fdesc.fd_local_addr, abuf,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ipaddr.s_addr = fdesc.fd_local_addr._S6_un._S6_u32[3];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) dladm_mask2prefixlen(&fdesc.fd_local_netmask,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) snprintf(buf, buf_len, "LCL:%s/%d ", cp, prefix_len);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) inet_ntop(AF_INET6, &fdesc.fd_remote_addr, abuf,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ipaddr.s_addr = fdesc.fd_remote_addr._S6_un._S6_u32[3];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) dladm_mask2prefixlen(&fdesc.fd_remote_netmask,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) snprintf(buf, buf_len, "RMT:%s/%d ", cp, prefix_len);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdladm_flow_attr_proto2str(dladm_flow_attr_t *attrp, char *buf, size_t buf_len)
da14cebe459d3275048785f25bd869cb09b5307fEric Chengdladm_flow_attr_port2str(dladm_flow_attr_t *attrp, char *buf, size_t buf_len)
25ec3e3dd27cc1038c10efa18ed08f064eab5fbeEric Cheng } else if (fdesc.fd_mask & FLOW_ULP_PORT_REMOTE) {