text: /*
   * CDDL HEADER START
   *
   * The contents of this file are subject to the terms of the
   * Common Development and Distribution License (the "License").
   * You may not use this file except in compliance with the License.
   *
   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   * or http://www.opensolaris.org/os/licensing.
   * See the License for the specific language governing permissions
   * and limitations under the License.
   *
   * When distributing Covered Code, include this CDDL HEADER in each
   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   * If applicable, add the following below this CDDL HEADER, with the
   * fields enclosed by brackets "[]" replaced with your own identifying
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
  /*
   * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
  #ifndef _LIBDLFLOW_IMPL_H
  #define	_LIBDLFLOW_IMPL_H
  
  #include <sys/types.h>
  #include <sys/param.h>
  #include <sys/mac.h>
  #include <libdladm.h>
  
  #ifdef	__cplusplus
  extern "C" {
  #endif
  
  struct fprop_desc;
  struct fattr_desc;
  
  typedef	dladm_status_t	fpd_getf_t(dladm_handle_t, const char *, char **,
  			    uint_t *);
  typedef	dladm_status_t	fpd_setf_t(dladm_handle_t, const char *, val_desc_t *,
  			    uint_t);
  typedef	dladm_status_t	fpd_checkf_t(struct fprop_desc *, char **, uint_t,
  			    val_desc_t **);
  
  typedef struct fprop_desc {
  	char		*pd_name;
  	val_desc_t	pd_defval;
  	val_desc_t	*pd_modval;
  	uint_t		pd_nmodval;
  	boolean_t	pd_temponly;
  	fpd_setf_t	*pd_set;
  	fpd_getf_t	*pd_getmod;
  	fpd_getf_t	*pd_get;
  	fpd_checkf_t	*pd_check;
  } fprop_desc_t;
  
  typedef struct prop_table {
  	fprop_desc_t	*pt_table;
  	uint_t		pt_size;
  } prop_table_t;
  
  typedef enum {
  	DLADM_PROP_VAL_CURRENT = 1,
  	DLADM_PROP_VAL_DEFAULT,
  	DLADM_PROP_VAL_MODIFIABLE,
  	DLADM_PROP_VAL_PERSISTENT
  } prop_type_t;
  
  typedef	dladm_status_t	fad_checkf_t(char *, flow_desc_t *);
  
  extern dladm_status_t	do_check_ip_addr(char *, boolean_t, flow_desc_t *);
  extern dladm_status_t	do_check_dsfield(char *, flow_desc_t *);
  
  typedef struct fattr_desc {
  	const char	*ad_name;
  	fad_checkf_t	*ad_check;
  } fattr_desc_t;
  
  extern dladm_status_t	i_dladm_get_prop_temp(dladm_handle_t, const char *,
  			    prop_type_t, const char *, char **, uint_t *,
  			    prop_table_t *);
  extern dladm_status_t	i_dladm_set_prop_temp(dladm_handle_t, const char *,
  			    const char *, char **, uint_t, uint_t, char **,
  			    prop_table_t *);
  extern boolean_t	i_dladm_is_prop_temponly(const char *prop_name,
  			    char **, prop_table_t *);
  /*
   * Data structures used for implementing persistent properties
   */
  typedef struct prop_val {
  	const char		*lv_name;
  	struct prop_val		*lv_nextval;
  } prop_val_t;
  
  typedef struct prop_db_info {
  	const char		*li_name;
  	struct prop_db_info	*li_nextprop;
  	struct prop_val		*li_val;
  } prop_db_info_t;
  
  typedef struct prop_db_state	prop_db_state_t;
  
  typedef boolean_t (*prop_db_op_t)(dladm_handle_t, prop_db_state_t *,
      char *, prop_db_info_t *, dladm_status_t *);
  
  typedef dladm_status_t (*prop_db_initop_t)(dladm_handle_t, const char *,
      const char *, char **, uint_t, uint_t, char **);
  
  struct prop_db_state {
  	prop_db_op_t		ls_op;
  	const char		*ls_name;
  	const char		*ls_propname;
  	char			**ls_propval;
  	uint_t			*ls_valcntp;
  	prop_db_initop_t	ls_initop;
  };
  
  extern boolean_t	process_prop_set(dladm_handle_t, prop_db_state_t *lsp,
  			    char *buf, prop_db_info_t *listp,
  			    dladm_status_t *statusp);
  extern boolean_t	process_prop_get(dladm_handle_t, prop_db_state_t *lsp,
  			    char *buf, prop_db_info_t *listp,
  			    dladm_status_t *statusp);
  extern boolean_t	process_prop_init(dladm_handle_t, prop_db_state_t *lsp,
  			    char *buf, prop_db_info_t *listp,
  			    dladm_status_t *statusp);
  extern dladm_status_t	process_prop_db(dladm_handle_t, void *arg, FILE *fp,
  			    FILE *nfp);
  
  extern dladm_status_t	i_dladm_init_flowprop_db(dladm_handle_t);
  extern dladm_status_t	i_dladm_set_flow_proplist_db(dladm_handle_t, char *,
  			    dladm_arg_list_t *);
  extern dladm_status_t	i_dladm_flow_check_restriction(datalink_id_t,
  			    flow_desc_t *, mac_resource_props_t *, boolean_t);
  
  extern dladm_status_t	dladm_flow_attrlist_extract(dladm_arg_list_t *,
  			    flow_desc_t *);
  
  #ifdef	__cplusplus
  }
  #endif
  
  #endif	/* _LIBDLFLOW_IMPL_H */
  